omapl138移植uboot系列之添加MTD分区(第七篇)

    如果你刚刚使用仿真器的方式烧录了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[] = {

扫描二维码关注公众号,回复: 3657588 查看本文章

         {

                   .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”命令,分区显示如下。

猜你喜欢

转载自blog.csdn.net/weixin_42314225/article/details/83241230