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中默认提供了
AM29LV400和
AM29LV800两个型号的
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_LV400和
CONFIG_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,因此可以添加一个条件判断分枝即可解决上述错误:
上图红 {MOD}方框的内容为新添的
AMD_MANUFACT、
SST_MANUFACT、
SST_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.c的
flash_print_info()函数:
由上图可见,在输出
Nor Flash信息时通过
switch分枝判断生产商和芯片型号,由于只做了
AMD Nor Flash的判断,而没有判断是否存在
SST Nor Flash,因此导致
flinfo命令无法找到生存厂商和芯片型号信息。
根据上图已有的信息,添加SST Nor Flash的判断分枝即可解决上述问题:
上图红 {MOD}框内的代码是新添的。重新编译U-Boot并下载到开发板上运行,然后执行
flinfo命令结果如下:
参考资料
[1]韦东山. 嵌入式Linux应用开发完全手册,人民邮电出版社,2012
[2]MINI2440用户手册