S3C2440 U-Boot移植--Norflash驱动支持- S29AL016

时间:2022-09-06 06:33:12

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    

与理论相同,正确。