首先在uboot 里面对nand flash进行分区设置,源文件在/include/configs/smdk2440.h:
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define MTDIDS_DEFAULT "nand0=smdk2440-0"
/* Size must be a multiple of Nand erase size (524288 b) */
#define MTDPARTS_DEFAULT "mtdparts=smdk2440-0:2m(uboot)," \
"128k(u-boot-env)," \
"4m(kernel),-(rootfs)"
-rootfs指的是后面的空间全部留给rootfs
如果制作的ubi 映像使用了压缩格式,还需要把下面的选项选上:
#define CONFIG_BZIP2
#define CONFIG_LZO
#define CONFIG_LZMA
然后修改内核文件,使得mtd分区表和uboot中的设置一致/arch/arm/mach-s3c24xx/smdk2440.h:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "uboot",
.size = SZ_2M,
.offset = 0,
},
[1] = {
.name = "u-boot-env",
.offset = SZ_2M,
.size = SZ_128K,
},
[2] = {
.name = "kernel",
.offset = SZ_128K+SZ_2M,
.size = SZ_4M,
},
[3] = {
.name = "rootfs",
.offset = SZ_128K+SZ_2M+SZ_4M,
.size = MTDPART_SIZ_FULL,
}
};
然后配置linux kernel,把前面设置的initramfs的根目录设置为空,并且把内核mtd和ubi 文件系统相关的选项都选上。
然后设置 uboot的启动参数,rw是以可读可写方式挂载文件系统,如果不设置,默认采用只读方式挂载
set bootargs console=ttySAC0,115200 ubi.mtd=3 root=ubi0:rootfs rw rootfstype=ubifs
制作ubi img:
mkfs.ubifs -r rootfs -m 2048 -e 126KiB -c 2048 -o rootfs.img
这边具体参数的含义说明一下,如果ubi 挂载不成功,多半是参数设置不对。
先看一下我这边nandflash的参数图:
-m 最小 I/O 单元大小,一般是页大小, 是2K,2048
-r 是指定哪个文件系统作为文件系统。
-e 是可擦除逻辑块大小,一般等于 (每块的页数 - 2)* 页大小 = 126K
-c 是最大可擦除逻辑块总数,这边总共是2048
-o 生成的 ubifs.img
如果这边参数设置不对,在linux挂载根文件系统的过程中也会出现相应的错误提示:网上有些资料设置-e 为124KiB,结果会出现如下错误:
可以看到,会提示real size,应该使用126KiB。
现在可以开始把ubi映像加载到nand flash了。
1 在uboot 中使用 mtdparts指令,可以看到分区信息:
2 然后使用nand erase.part rootfs 命令,擦除rootfs 块,为写入做准备。
3 ubi part rootfs 512
attach ubi,并且使用rootfs 分区,后面带的512这个参数很重要,这个是ubi vid header,就是上图nand flash 结构里面sub page的大小,64B,等于512b,比较奇怪的是,使用2048大小时,在uboot 里面可以使用ubifsmount ubi0:rootfs 挂载成功,但是在kernel 里面加载的时候就会报错:
可以看到,kernel 希望传入的是512.
当执行完ubi part命令以后,uboot 会show 出一些nand flash的信息,这些信息如果不看nand flash 结构图,对于使用mkfs.ubifs 工具生成rootfs 映像文件也是有帮助的:
4 ubi create rootfs 生成ubi 卷,按理说格式正确的话使用 ubifsmount ubi0:rootfs 可以挂载成功,但是这边使用512 attach分区的情况下失败了,没有深究
5 tftpboot rootfs.img 把rootfs映像下载到ram中,地址为0x31000000,
ubi write 0x31000000 rootfs size 把ram中的数据写到ubi 卷中。
tftpboot uImage下载kernel,bootm 0x31000000,启动内核,可以看到,内核挂载根文件系统成功:
下面贴一个链接,讲解了如何设置了ubi part rootfs 参数,并且列举了一些ubi 挂载过程中使用错误的参数会导致的问题: