赞
踩
如果你刚刚使用仿真器的方式烧录了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”。
struct mtd_partition mapl138_spiflash_partition[] = { { .name = "nor0", .offset = 0x00000000, .size = MTDPART_SIZ_FULL, .mask_flags = 0, }, } int spi_flash_mtd_register(struct spi_flash *flash) { memset(&sf_mtd_info, 0, sizeof(sf_mtd_info)); sprintf(sf_mtd_name, "nor%d", spi_flash_mtd_number()); debug("sf_mtd_name = %s\n",sf_mtd_name); sf_mtd_info.name = sf_mtd_name; sf_mtd_info.type = MTD_NORFLASH; sf_mtd_info.flags = MTD_CAP_NORFLASH; sf_mtd_info.writesize = 1; sf_mtd_info.writebufsize = flash->page_size; sf_mtd_info._erase = spi_flash_mtd_erase; sf_mtd_info._read = spi_flash_mtd_read; sf_mtd_info._write = spi_flash_mtd_write; sf_mtd_info._sync = spi_flash_mtd_sync; sf_mtd_info.size = flash->size; sf_mtd_info.priv = flash;
/* Only uniform flash devices for now */ sf_mtd_info.numeraseregions = 0; sf_mtd_info.erasesize = flash->sector_size; return add_mtd_partitions(&sf_mtd_info,mapl138_spiflash_partition,1); }
|
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分区。
SpiFlash地址 | 分区名 | 分区大小 |
0x0000_0000 ~ 0x0000_FFFF | uboot_spl | 64K |
0x0001_0000 ~ 0x0008_FFFF | uboot | 512K |
0x0009_0000 ~ 0x0009_FFFF | Env | 64K |
0x0010_0000 ~ 0x003F_0000 | Kernel | 3M |
0x0040_0000 ~ 0x004F_FFFF | arm_app | 1M |
0x0050_0000 ~ 0x005F_FFFF | dsp_app | 1M |
剩下所有余量 | rootfs |
|
不必修改代码,只要修改两个环境变量即可完成上述分区,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”命令,分区显示如下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。