U-Boot移植——Nor Flash

来源:互联网 发布:java程序员 图书 编辑:程序博客网 时间:2024/04/29 04:53

0 开发环境
    宿主机:Ubuntu14.04
    开发板:Mini2440
    U-Boot:u-boot-1.1.6 
    编译器:arm-linux-gcc

1 Nor Flash型号 

    根据《U-Boot移植——添加新开发板》的方法添加Mini2440的配置文件,并且通过《U-Boot移植——设置系统时钟》设置系统时钟后,可以将U-Boot编译并且下载到Mini2440开发板的Nor Flash上运行。然而,虽然这时候可以从Nor Flash启动U-Boot,但是还不能通过U-Boot对Nor Flash进行擦写操作,因为相关参数还没有设置好[1]p272。为了使得U-Boot可以操作Nor Flash,需要进一步修改其Nor Flash型号信息。

    根据参考资料[1]p272的提示,smdk2410使用的Nor Flash型号为AM29LV400。而参考资料[2]p26则说明,Mini2440使用的Nor Flash型号为SST39VF1601,大小为16Mbit(2MB)。

2 include/configs/mini2440.h

    smdk2410.h中默认提供了AM29LV400AM29LV800两个型号的Nor Flash供选择:

/*-----------------------------------------------------------------------* FLASH and environment organization*/ #define CONFIG_AMD_LV400    1   /* uncomment this if you have a LV400 flash */#if 0#define CONFIG_AMD_LV800    1   /* uncomment this if you have a LV800 flash */#endif #define CFG_MAX_FLASH_BANKS 1   /* max number of memory banks */#ifdef CONFIG_AMD_LV800#define PHYS_FLASH_SIZE     0x00100000 /* 1MB */#define CFG_MAX_FLASH_SECT  (19)    /* max number of sectors on one chip */#define CFG_ENV_ADDR        (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */#endif#ifdef CONFIG_AMD_LV400#define PHYS_FLASH_SIZE     0x00080000 /* 512KB */#define CFG_MAX_FLASH_SECT  (11)    /* max number of sectors on one chip */#define CFG_ENV_ADDR        (CFG_FLASH_BASE + 0x070000) /* addr of environment */#endif

   可以根据上述信息添加SST39VF1601型号Nor Flash的配置信息。先将上面CONFIG_AMD_LV400CONFIG_AMD_LV800的宏定义都注释,然后在其下面添加:

#define CONFIG_SST_xF1601    1   /* Added for SST39VF1601 Flash */
    仿照前面AMD_LV800的配置信息添加:

#ifdef CONFIG_SST_xF1601#define PHYS_FLASH_SIZE     0x00200000 /* 2MB */#define CFG_MAX_FLASH_SECT  (19)    /* max number of sectors on one chip */#define CFG_ENV_ADDR        (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */#endif

3 board/mini2440/flash.c

    经过上述修改,配置并且编译时提示错误:


    定位到错误的行:


    由上图可见,条件编译只是对CONFIG_AMD_LV400宏定义和CONFIG_AMD_LV800宏定义进行了判断,由于本文在第2章中将这两个宏都注释了,取而代之添加了CONFIG_SST_xF1601,因此可以添加一个条件判断分枝即可解决上述错误:

    上图红色方框的内容为新添的AMD_MANUFACTSST_MANUFACTSST_ID_xF1601在已经在include/fash.h中预定义了。

4 flinfo命令测试

    经过上述修改之后U-Boot可以成功编译,将其下载到开发板中运行,可以正确显示Nor Flash的大小为2MB


    输入flinfo命令查看For Flash的信息,结果提示Unknown Vendor Unknown Chip Type

    在U-Boot源码中搜索关键字Unknow Vendor可以定位到board/mini2440/flash.cflash_print_info()函数:


    由上图可见,在输出Nor Flash信息时通过switch分枝判断生产商和芯片型号,由于只做了AMD Nor Flash的判断,而没有判断是否存在SST Nor Flash,因此导致flinfo命令无法找到生存厂商和芯片型号信息。

    根据上图已有的信息,添加SST Nor Flash的判断分枝即可解决上述问题:


    上图红色框内的代码是新添的。重新编译U-Boot并下载到开发板上运行,然后执行flinfo命令结果如下:


参考资料

[1]韦东山. 嵌入式Linux应用开发完全手册,人民邮电出版社,2012

[2]MINI2440用户手册 

0 0
原创粉丝点击