转载地址:http://blog.chinaunix.net/uid-28392723-id-3471441.html
环境及源码:
Uboot201106源码
mini6410开发板h43LCD显示
Nandflash blocksize 128Kib,Page size 2048,Oob size 64
FriendlyARM公司CD-A提供的linux-2.6.38内核源码
Arm-linux-gcc为4.5.1,FriendlyARM提供的
原本我一直想做yaffs文件系统的移植。不过后来出现了连续的假坏块,让我一直得不到解决。如果有哪位高手知道方法真心希望能向你求教。QQ441033523。
至于UBI的Uboot支持,网上很多教程和方法。嗯,我也是借鉴的。在这里我根据自己的实践另写一份详细记录,以便以后自己查阅,同时也希望对你有所帮助。
在文件include/configs/smdk6410.h中定义这几个宏:
图1、
一定看清你是单独定义的,这个文件里边好多的这些定义:
#if defiend(..........)
........
#endif
至于这几个宏定义的含义就自个查资料好了。
还有MTD默认分区的宏定义:
----------------------------------------------------------------------------------------------------------
#define MTDPARTS_DEFAULT "mtdparts=nand0:0x80000@0x0(Bootloader),0x500000@0x80000(Kernel),0xc800000@0x580000(rtfs),-(reserved)"
#define MTD_ACTIVE_PART "nand0,2"
#define MTDIDS_DEFAULT "nand0=nand0"
----------------------------------------------------------------------------------------------------------
/*这里我分了三个:
Bootloader,Kernel,rtfs。
不过如果你要分区的话要看你的内核是怎么分的,可以看内核的打印信息获得数据。
图2、
这里的打印信息可以在内核源码中找到设置的地方:
图3、
位置是在arch/arm/mach-s3c64xx/mach-mini6410.c约186行
至于你想怎么分区就自个决定吧。我没有过多的更改,目的是先实现了UBI文件系统的挂载。
记住,上图的分区一定和你定义的宏分区一致。所谓的一致是【绝对地址】一致。*/
另外,Uboot201106的环境变量保存到Nandflash0x80000这个位置了,而我烧写内核的时候也是并且分区地址都是0x80000,每次烧内核的时候就会破坏环境变量的数据,我把它改为和mini6410一样的存储位置0x40000。
那么现在,你可以编译Uboot201106了。
烧写SD卡,启动Uboot,依次执行下面命令(这里先不烧写内核,Nandflash最好格式化过),看看有什么变化:
#help
#printenv
#mtdpart
#mtdpart default
#sav
#mtdpart
如果help没显示如下图命令UBI和UBIFS,那么你完了:UBI开关的宏定义已经打开,这时候没显示还是再找个Uboot201106吧。
图4、
下面创建分区:
#ubi part rtfs
如果打印下边类似信息,那么MTD获取分区信息工作已经搞定了、至于信息是否和内核匹配,后边再说。
Creating 1 MTD partitions on "nand0":
0x000000580000-0x00000cd80000 : "mtd=2"
UBI: attaching mtd1 to ubi0
UBI: physical eraseblock size: 131072 bytes (128 KiB)
UBI: logical eraseblock size: 126976 bytes
UBI: smallest flash I/O unit: 2048
UBI: VID header offset: 2048 (aligned 2048)
UBI: data offset: 4096
UBI: empty MTD device detected
UBI: create volume table (copy #1)
UBI: create volume table (copy #2)
UBI: attached mtd1 to ubi0
UBI: MTD device name: "mtd=2"
UBI: MTD device size: 200 MiB
UBI: number of good PEBs: 1599
UBI: number of bad PEBs: 1
UBI: max. allowed volumes: 128
UBI: wear-leveling threshold: 4096
UBI: number of internal volumes: 1
UBI: number of user volumes: 0
UBI: available PEBs: 1580
UBI: total number of reserved PEBs: 19
UBI: number of PEBs reserved for bad PEB handling: 15
UBI: max/mean erase counter: 1/0
不过这里一步,你最好还是把信息截个图先放着吧,后边有用的。主要是上边的红色部分。
#ubi create rtfs
图5、
好啦,搞定了。下面准备UBI文件系统——这个可以提前做,和Nandflash UBI分区不挂钩。
制作UBI文件系统工具是mkfs.ubifs,额这个工具可以在Ubuntn上sudo apt-get安装,还可以找源码安装,具体的方法我会尽快另加文章单独说明。
使用命令:
mkfs.ubifs -r rootfs/ -m 2048 -e 126976 -c 992 rootfs.ubi
参数解释:
-r 代表目录,rootfs/是我的文件系统目录
-m 指定了最小I/O操作的大小
-e 是逻辑擦除块的大小
-c 最大逻辑块数
最后一个rootfs.ubi是你要生成的镜像文件名字。
那么这些参数的设置应该怎么设?看建议你截的图,一目了然。
不过最后那个-c参数992是我随便写的,但有一个原则:该值乘以-e参数126976大于你文件系统目录(这里我的是rootfs/)的字节数。呵呵呵,我这里是远大于了。
把制作好的镜像下载到开发板内存中,可以tftp啊SD卡啊什么的,下边接着上边命令ubi create rtfs继续,比如我下到0x50108000这个地址了,
#ubi write 0x50108000 rtfs 0x2d69000
这个命令应该都会使,和nand write命令一样,只是中间的offset地址变成分区卷标rtfs了。
写完顺便检查一下烧到里面的玩意儿吧、
#ubifsmount rtfs
#ubifsls
这里就会列出来你原目录rootfs/中的文件,放心,这一定是从你Nandflash中找到的数据列出来的。
#ubifsumount
完成。。。。
话说,还没烧内核。。。。哈哈哈
Uboot201106启动FriendlyARM提供的linux-2.6.38内核源码直接编译出来的内核我的上一篇文章中已经提过,最好处理一下。
然后
#set bootargs“init=/linuxrc root=ubi0:rtfs rootfstype=ubi console=ttySAC0,115200”
#sav
烧写内核的时候,烧写地址和分区一样。
如果是FriendlyARM提供的linux-2.6.38内核你未进行任何修改,想直接挂载上Uboot201106烧的ubifs文件系统,那是不可能的。
我跟踪源码三天,找到一处不匹配的地方,气的直骂FriendlyARM,不过也怪自己笨。直接大胆改掉就好:
Drivers/mtd/nand/s3c_nand.c文件740行左右函数s3c_nand_probe()这个函数中,下图显示512
,设为2048你试试,编译烧写就可以完成挂载了。
图6、
这个过程,学到好多东西,好像我的yaffs文件系统镜像启动不起来就是和源码中底层的设置有关,时间紧迫,就没多去验证。
UBIFS文件系统就算是搞定了。