前言:这节继续移植uboot,让它支持mtd分区
一、mtd分区规划及其作用
uboot支持各种设备之后,接下来的工作就是烧写内核、烧写文件系统,所以需要对整块Nand Flash的空间作以规划,大致分为以下四个空间即可:
bootloader空间
内核参数空间
内核空间
文件系统空间
但是目前我们仅知道uboot.bin被裁剪到了217KB,而不知道其它三个空间的信息,而且是第一次移植,对内核参数占用空间、内核空间的大小没有概念,所以我们需要借助别人已经制作好的内核和文件系统来查看这个信息。
启动JZ2440官方提供的uImage_4.3内核之后可以看到对整块Nand Flash的MTD分区信息:
mtd的作用仅仅是给地址起个别名,方便使用,比如要烧写内核时要写0x00060000这个地址,就可以用 mtd2 这个名字代替,使代码变得更加通用。
二、 开启mtdparts命令支持
2.1添加宏CONFIG_CMD_MTDPARTS
mtdparts命令的相关实现在common/cmd_mtdparts.c文件中,目前uboot命令中无此命令,所以查看其同目录的makefile文件,将此文件加入工程中编译。
这里编译该文件需要CONFIG_CMD_MTDPARTS这个宏,所以我们在单板的配置文件中加入该宏,这个宏之前被我们屏蔽掉了 ,现在打开:
2.2. 添加宏CONFIG_MTD_DEVICE
上面添加mtd之后编译发现报错,如下:
发现错误是命令实现文件中有函数未定义,找到该函数定义在 drivers/mtd/mtdcore.c 文件中,说明此文件没有包含到工程中,继续查看mtdcore.c 文件目录中的makefile,可以看到需要定义宏CONFIG_MTD_DEVICE:
我们接着打开这个宏,然后编译,发现编译成功,烧写到开发板,发现已经支持mtdparts命令了。
2.3. 添加默认配置宏
我们在串口下使用mtdparts命令,发下报错,提示mtdids没有定义,当前没有默认值。搜索此mtdids,查找问题,果然在文件common/cmd_mtdparts.c中找到结果:
既然需要这两个宏,我们就在配置文件中添加这两个宏,仿照别的文件添加就行
再次编译,下载到开发板进行测试:
这次mtd_parts正常打印出了刚刚设置的默认mtdids和mtdparts信息。
2.4. 测试mtdparts分区表是否可以正常使用
首先使用如下命令设置默认分区表,接着擦除四个分区:
擦除没有问题,再进行内核烧写测试:
nand write 30000000 kernel
2.5自动执行mtdparts default命令
这里我们想不用先手动执行mtdparts default,所以在main_loop之前添加这行代码,自动执行命令:
三、测试
上面修改后我们直接编译,烧写,上电之后执行mtdparts查看分区表,分区表已经设置成功,正常打印:
再来测试使用mtd分区名称烧写内核:
接着重新上电,从nand flash中读取出内核: