目标板 : mini2440
uboot版本 : u-boot-1.1.6
交叉编译工具 : rm-linux-gcc-4.4.3
通过查阅S29AL016的datasheet 以及 mini2440开发板原理图可知:
a. 这是SPANSION公司的一个 2 M x 8-Bit/1 M x 16-Bit 的NorFlash芯片
b. 有35个SECTOR
c. 通过J-Link查看S92AL106XXXXXX2的芯片16bit ID为12249,与/u-boot-1.1.6/include/flash.h中的AMD_ID_LV160B相同.
d. 支持BYTE /WORD 编程 ,通过引脚 BYTE# 配置, 逻辑1位WORD编程,0为BYTE. 此处被上拉至Vcc,所以为WORD编程.
e. S29AL016 的 擦除、读取时序、命令 与 /u-boot-1.1.6/board/mini2440/falsh.c 相符合.
移植过程:
1. 在/u-boot-1.1.6/include/configs/mini2440.h中配置加入对S29AL106芯片的支持:
由于u-boot-1.1.6中的配置文件(/u-boot-1.1.6/include/configs/mini2440.h)中默认只有两个宏 :
CONFIG_AMD_LV400 , CONFIG_AMD_LV400.
但是我的开发板的上的NorFLash芯片型号为S29AL016, 怎么办?
1.1. 屏蔽对CONFIG_AMD_LV400 , CONFIG_AMD_LV400这两个宏,增加AMD_ID_LV160B宏,以及修改相应参数设置,其中
CFG_ENV_ADDR 宏为环境变量地址,在这里我把它设为 0x1E0000
#if 0
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#endif
#define CONFIG_AMD_LV160 1
#ifdef CONFIG_AMD_LV160
#define PHYS_FLASH_SIZE 0x00200000 /* 2MB */
#define CFG_MAX_FLASH_SECT (35) /* max number of sectors on one chip */
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x1E0000) /* addr of environment */
#endif
1.2. 检查是否已经配置了环境变量的储存位置以及大小
#define CFG_ENV_IS_IN_FLASH 1
#define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
2. 在/u-boot-1.1.6/board/mini2440/flash.c 作修改,使得识别出S29AL016芯片:
2.1. 在 ulong flash_init (void) 这个函数里面增加宏,使得 id 被赋值为 12249
ulong flash_init (void) {
int i, j;
ulong size = 0;
/* mini2440.h /#define CFG_MAX_FLASH_BANKS 1 */
for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
ulong flashbase = 0;
flash_info[i].flash_id =
#if defined(CONFIG_AMD_LV400)
(AMD_MANUFACT & FLASH_VENDMASK) |
(AMD_ID_LV400B & FLASH_TYPEMASK);
#elif defined(CONFIG_AMD_LV800)
(AMD_MANUFACT & FLASH_VENDMASK) |
(AMD_ID_LV800B & FLASH_TYPEMASK);
#elif defined(CONFIG_AMD_LV160)
(AMD_MANUFACT & FLASH_VENDMASK)|
(AMD_ID_LV160B & FLASH_TYPEMASK);
··· }
2.2. 修改 void flash_print_info (flash_info_t * info) 函数,使得其可以打印出芯片信息: