如果你刚刚使用仿真器的方式烧录了uboot镜像,你肯定会感叹实在是太慢了,先别叹气,看完本节你将爱上烧录程序。
2.6.1添加MTD分区
MTD(memory Teachno Device)中文翻译为“内存技术设备”,是Linux系统对“NorFlash”,“NandFlash”等存储设备抽象出来的一个设备层,它向上提供统一的访问接口,屏蔽底层硬件的操作,而uboot中分区只是为了方便操作,例如我想将SPIFlash地址0x00010000处偏移量为1M的数据加载到内存地址0xC2000000处,一般情况,我们都是这样写:
sf read 0xC2000000 0x00010000 100000
但如果有了uboot的分区,我们可以写
sf read 0xC2000000 uboot
一言以蔽之“uboot中的mtd分区只是代码的一种手段,方便我们使用,用名字代替一些数字”
2.6.1.1 修改uboot代码,支持MTD分区
Driver/mtd/spi/sf_mtd.c文件,增加以下代码,添加MTD设备,由于我们使用的是SPIFlash,属于norflash,故将此命名为“nor0”。
2.6.2.2 添加MTD配置
代码修改完成了,但现在还是不能编译的,不信你编译一下看看driver/mtd/spi目录下是否有sf_mtd.o文件,接下来我们要做的是通过make menuconfig图形界面将MTD相关的模块添加进编译链接。
首先> Device Drivers > SPI Flash Support> [*]SPI Flash MTD support
然后> SPL / TPL> [*] Support MTD drivers
然后保存退出,编译完成后,暂时先不要烧录。
2.6.2.3 两个重要的环境变量
对于目前的U-boot而言,设置了mtdparts变量之后,你可以在sf read/write/erase命令中直接使用分区的名字而不必指定分区的偏移位置.
按照上述代码修改,我们已经将SPIFlash添加进MTD,然后我们就可以根据自己项目的需要,对SPIFlash进行分区了,以639B项目为例,我想要将SPIFlash按照下表描述进行MTD分区。
不必修改代码,只要修改两个环境变量即可完成上述分区,uboot命令行下按照顺序输入下图红线标识的命令。
set mtdids nor0=639b_nor0
set mtdparts mtdparts=639b_nor0:64k@0(spl),512k@64k(uboot),64k@576k(env),3m@1m(kernel),1m@4m(arm_app),1m@5m(dsp_ubl),1m@6m(dsp_app),3m@7m(rootfs)
首先解释下mtdids环境变量,该变量注册了一块MTD设备,该设备是norflash类型,编号为0,该MTD设备命名为“639b_nor0”。
mtdids是对整块Flash设备进行MTD描述,那么mtdparts就是对这块MTD设备进行分区描述了,以上设置的意思是:以SPIFlash 0x0地址为参考,从第0K开始连续64k空间命名为“spl”分区,从第64K开始连续512K空间命名为“uboot”分区,从第576K开始连续64K空间命名为“env”分区,从第1M开始连续3M空间命名为“kernel”分区,从第4M开始连续1M空间命名为“arm_app”分区,从第5M开始连续1M空间命名为“dsp_ubl”分区,从第6M开始连续1M空间命名为“arm_app”分区, ,从第7M开始连续3M空间命名为“rootfs”分区。
uboot命令行下,输入“mtd”命令,分区显示如下。