U-Boot版本:1.1.6 開發板: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 zsf,for mini2440*/
#define CONFIG_AMD_LV160 1 //NOR FLASH S29AL016J
#define PHYS_FLASH_SIZE 0x00200000 /* 芯片大小2MB */
#define CFG_MAX_FLASH_SECT (35) /* 扇區數爲35 */
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x1F0000) /* addr of environment 0x00000000+0x1f0000 向後預留64KB,1個扇區空間*/
//#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)函數中
在switch (info->flash_id & FLASH_VENDMASK)中將
printf ("AMD: ");
變更爲
printf("SPANSION:")
在
case (AMD_ID_LV400B &FLASH_TYPEMASK):
printf ("1xAmd29LV400BB (4Mbit)\n");
break;
case (AMD_ID_LV800B & FLASH_TYPEMASK):
printf ("1xAmd29LV800BB (8Mbit)\n");
break;
之後加入
/*add by zsf,for mini2440*/
case (AMD_ID_LV160B & FLASH_TYPEMASK):
printf ("1x S29AL016J[16Mbit(2MByte) ,Bottom Boot Device] \n");
break;
如此便完成了移植工作,重新編譯即可。
通過jlink下載到開發板測試:
MINI2440 # flinfo
Bank # 1: SPANSION: 1x S29AL016J[16Mbit(2MByte) ,Bottom Boot Device]
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
與理論相同,正確。