Uboot201106的Ubifs文件系统移植mini6410过程详细记录

时间:2020-12-03 06:33:35

转载地址: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、

Uboot201106的Ubifs文件系统移植mini6410过程详细记录

一定看清你是单独定义的,这个文件里边好多的这些定义:

 

#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、

Uboot201106的Ubifs文件系统移植mini6410过程详细记录

这里的打印信息可以在内核源码中找到设置的地方:

图3、

Uboot201106的Ubifs文件系统移植mini6410过程详细记录

位置是在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、

Uboot201106的Ubifs文件系统移植mini6410过程详细记录

 

下面创建分区:

#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、

Uboot201106的Ubifs文件系统移植mini6410过程详细记录

 

好啦,搞定了。下面准备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 bootargsinit=/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、

Uboot201106的Ubifs文件系统移植mini6410过程详细记录

这个过程,学到好多东西,好像我的yaffs文件系统镜像启动不起来就是和源码中底层的设置有关,时间紧迫,就没多去验证。

 

UBIFS文件系统就算是搞定了。