关于 uboot 的 UBI 的移植几乎没有说明介绍,移植首先要保证你的 flash 驱动能够跑起来,我是在 nand flash 上跑的 UBI 。刚开始的时候我也没有什么头绪,只能够从 uboot 的 readme 开始查找一些蛛丝马迹。
- MTD Support (mtdparts command, UBI support)
CONFIG_MTD_DEVICE
Adds the MTD device infrastructure from the Linux kernel.
Needed for mtdparts command support.
CONFIG_MTD_PARTITIONS
Adds the MTD partitioning infrastructure from the Linux
kernel. Needed for UBI support.
因此 , 要 UBI 支持首先得要 MTD 支持,因此在配置文件中要添加以上两项的定义。
要移植 UBI 还要添加 :
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_UBI
总的关于 UBI 的部分是以下几个宏 :
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define CONFIG_RBTREE
#define CONFIG_LZO
同时要给 NAND 建立个默认的分区 , 方便以后操作。分区如下:
#define MTDIDS_DEFAULT "nand0=nand0"
#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootfs),-(reserved)"
#define MTD_ACTIVE_PART "nand0,2"
以上的配置都在 uboot_imx/include/configs/mx51_vdphone.h 文件中进行配置。
需要注意的是增加 UBI 的支持之后 uboot 会增大到 300 多 KB ,在 NAND 中启动,需要修改 以下文件 uboot-imx/cpu/arm_cortexa8/mx51/mxc_nand_load.S
add r6, r0, #0x1E00
ldr r5, =_end /* Try get right image size */
add r5, r2, #0x00060000 /* Fixme to get actual image size */
这里使用 0x60000 ( 384K )大小,已经足够,如果实际有变化,可以进行相应调节。 如果 uboot 传给 Copy_Good_Blk 拷贝 的 uboot 的 大小 小于 uboot 的长度的话, uboot 跑不起来,移植的时候被这个问题 必须注意 。
这个时候就可以 make 了, 执行以下命令:
make clean
make mx51_vdphone_config
make all
如果 正常 的话会编译出 u-boot.bin 在根目录下。
通过 mtdpart 命令配置 u-boot 下的 nand 分区,本项目已经在配置头文件里面设置了默认 nand 分区,
#define MTDPARTS_DEFAULT "mtdparts=nand0:0x100000@0x0(u-boot),0x300000@0x120000(kernel),0x7b00000@0x420000(rootfs),-(reserved)"
如果需要修改,可以通过修改默认分区列表,也可以通过命令 mtdpart 进行重新分区。这里使用默认分区,通过以下命令使默认分区生效:
mtdpart default // 设置默认分区
saveevn // 保存分区信息
通过以上的配置编译,如果成功生成 u-boot.bin ,那就可以通过 SD 卡启动,直接烧写 u-boot.bin 到 nand flash 了。操作步骤如下:
1) 下载 u-boot.bin 到内存
tftp 0x90800000 /tftpboot/mx51/u-boot.bin
2) 擦除 u-boot 分区
nand erase u-boot
3) 烧写 u-boot 到 nand flash 分区
nand write 0x90800000 u-boot 0x60000
内核的烧写和平常烧写方式一样,只需用 nand 命令写入 nand 即可 , 操作步骤如下:
1) 擦除 kernel 分区
nand erase kernel
2) 下载 kernel 到内存
tftp 0x90800000 /tftpboot/mx51/uImage 将内核通过 tftp 下载到内存中
3) 烧写 kernel 到 nand kernel 分区
nand write 0x90800000 kernel 0x300000
本项目使用的文件系统将根文件系统和 system 文件系统整合在一起。所以,只需要烧写整合后的文件系统即可。如果要使用 ubifs 文件系统作为根文件系统,在烧写之前必须通过 mkfs.ubifs 工具将做好的文件系统制作镜像文件。 mkfs.ubifs 工具是通过编译 mtd-utils 工具下的 mkfs.ubifs 目录即可生成的 PC 端 UBIFS 文件系统镜像制作工具。 操作步骤如下:
1) 制作根文件系统
mkfs.ubifs -r root/ -m 2048 -e 129024 -c 2364 -o root-fs.img
root 目录为整合 android root 和 system 文件系统后的目录,应当能够通过 NFS 系统的
2) 擦除 root 分区
nand erase root
3) 对 root 分区进行 ubi 格式化
ubi part root
4) 将文件系统下载到内存
tftp 0x90800000 ubifs.img
5) 将文件系统烧写到 rootfs 中
ubi write 0x90800000 rootfs 0x339600
设置 bootargs :
setenv bootargs ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs console=ttymxc0,115200 wvga calibration init=/init rw
启动拨码开关 5,8 位置设置为 ON ,上电重新启动,即可从 Nand flash 启动。