U-Boot版本:2008.10 开发板:Mini2440
之前根据国嵌的实验手册移植了很久都没有成功,关键是国嵌手册上的Norflash型号是SST1601,而我的Mini2440开发板上配置的是Spansion公司的S29AL016J芯片,两者型号不同,修改的地方差异很大。后来通过在网上查资料发现S29AL016J芯片与smdk2410默认使用的芯片(AMD的AM29LV400)除了大小不一样外,其他如命令序列,操作方式都是一样的(也难怪在做完国嵌实验手册的2.4以后就可以进行环境变量的保存)。所以根据AM29LV400来移植的话所做的修改不多。
查询datasheet后,得到如下信息;
该Norflash芯片,分成35个扇区,(Bottom Boot Device)前4个扇区的大小分别为16KB,8KB,8KB,32KB,后31个扇区的大小都是64K,加起来总共2MByte。芯片id为0x2249,厂商id为0x01。
根据Mini2440的原理图得知Norflah的 A0引脚接在s3c2440的LADDR1上,所以为字模式。
另外由于在 include/flash.h中没有找到Spansion的厂商id和S29AL016J芯片id的定义,而找到了如下的AMD厂商id和芯片id 的定义。
#define AMD_MANUFACT 0x00010001
`
`
#define AMD_ID_LV160B 0x22492249
正好与S29AL016J的厂商id和芯片id相同,那我们就可以直接根据AM29LV160B来移植。我们定义NORFLASH型号为:AM29LV160。
修改板级配置:include/configs/mini2440.h
注释掉AM29LV400和AM29LV800的定义,加入AM29LV160的定义:
/*delete by xxx,for 2440***************************************************************/
#if 0
#define CONFIG_AMD_LV4001 /* uncomment this if you have a LV400 flash */
#define CONFIG_AMD_LV8001 /* uncomment this if you have a LV800 flash */
#endif
/*add by xxx,for 2440*****************************************************************/
#define CONFIG_AMD_LV160 1
#definePHYS_FLASH_SIZE 0x00200000 /* 芯片大小2MB */
#defineCONFIG_SYS_MAX_FLASH_SECT (35) /* 扇区数为35 */
#define CONFIG_ENV_ADDR(CONFIG_SYS_FLASH_BASE + CONFIG_ENV_OFFSET) /* 环境变量存放地址 */
修改 board/mini2440/flash.c
一:flash_init (void) 函数中
#if defined(CONFIG_AMD_LV400)
(AMD_MANUFACT &FLASH_VENDMASK) |
(AMD_ID_LV400B &FLASH_TYPEMASK);
#elif defined(CONFIG_AMD_LV1800)
(AMD_MANUFACT &FLASH_VENDMASK) |
(AMD_ID_LV800B &FLASH_TYPEMASK);
之后 加入
/*modified by xxxxxi ,for2440***********************************************/
#elif defined(CONFIG_AMD_LV160)
(AMD_MANUFACT &FLASH_VENDMASK) |
(AMD_ID_LV160B &FLASH_TYPEMASK);
二:flash_print_info (flash_info_t *info)函数中
case (AMD_ID_LV400B &FLASH_TYPEMASK):
printf ("1xAmd29LV400BB (4Mbit)\n");
break;
case (AMD_ID_LV800B & FLASH_TYPEMASK):
printf ("1xAmd29LV800BB (8Mbit)\n");
break;
之后加入
/*add by xxx ,for2440*******************************************************************/
case (AMD_ID_LV160B &FLASH_TYPEMASK):
printf ("1x S29AL016J(16Mbit ,Bottom Boot Device) \n");
break;
如此便完成了移植工作,重新编译即可。
通过jlink下载到开发板测试:
MINI2440 # flinfo
Bank # 1: SPANSION:1x S29AL016J(16Mbit)
Size: 2 MB in 35 Sectors
Sector Start Addresses:
00000000 00004000 00006000 00008000 00010000
00020000 00030000 00040000 00050000 00060000
00070000 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 00100000
00110000 00120000 00130000 00140000 00150000
00160000 00170000 00180000 00190000 001A0000
001B0000 001C0000 001D0000 001E0000 001F0000
MINI2440_Dazhi #
观察到总共35个扇区,第一个扇区大小为0x4000=16KB,第二个,第三个扇区大小为0x2000=8KB,第四个扇区大小为0x80000=32KB,剩下31个扇区大小都为0x10000=64KB,与芯片实际情况相同。
测试写保护:
MINI2440 # protect on 4000 5ffff
Protected 8 sectors
MINI2440_Dazhi # flinfo
Bank # 1: SPANSION:1x S29AL016J (16Mbit)
Size:2 MB in 35 Sectors
Sector Start Addresses:
00000000 00004000 (RO)00006000 (RO) 00008000 (RO) 00010000 (RO)
00020000 (RO) 00030000 (RO) 00040000 (RO) 00050000 (RO) 00060000
00070000 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 00100000
00110000 00120000 00130000 00140000 00150000
00160000 00170000 00180000 00190000 001A0000
001B0000 001C0000 001D0000 001E0000 001F0000
与理论相同,正确。