加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

uboot移植中的NOR FLASH配置

发布时间:2020-12-15 07:07:16 所属栏目:百科 来源:网络整理
导读:移植环境: 主芯片:SAMSUNG s3c2440A 开发板:GT2440 uboot版本:u-boot1.1.6 NOR Flash型号:EN29LV160AB。 硬件连接原理图 如下图所示: ?? EN29LV160支持半字、单字节访问方式。如上图Pin47BYTE#为high时,采用Word Mode。Flash芯片的地址线A0-A19与s3c2

移植环境:

主芯片:SAMSUNG s3c2440A

开发板:GT2440

uboot版本:u-boot1.1.6

NOR Flash型号:EN29LV160AB。

硬件连接原理图如下图所示:

??


EN29LV160支持半字、单字节访问方式。如上图Pin47BYTE#为high时,采用Word Mode。Flash芯片的地址线A0-A19与s3c2440地址线的ADDR1-ADDR20连接。因为Flash是half word访问模式,s3c2440是按照单字节方式访问。故地址线错位连接。这点在s3c2440的datasheet中有描述。例如当s3c2440读取地址0处的数据时,发送的地址为0000 0000 0000 0000 0000b,地址线错位连接后,Flash芯片接收的地址为0。当s3c2440读取地址1处的数据时,发送的地址为0000 0000 0000 0000 0001,地址线错位连接后,Flash芯片接收的地址依然为0。这样为的是解决存储单元不匹配的问题。

EN29LV160AB的扇区分配,datasheet描述如下:

Flexible sector architecture(复杂的扇区结构)

One 16-KByte、two 8-KByte、one 32-KByte and third-one 64-KByte sectors(byte mode)?

One 8-KWord、two 4-KWord、One 16-KWord and third-one 32-KWord sectors(Word mode)


软件修改

在/include/configs/2440.h中,

//注释原程序采用的两块nor Flash的配置?

#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_SYS_MAX_FLASH_BANKS 1??/* max number of memory banks */

#ifdef CONFIG_AMD_LV800

#define PHYS_FLASH_SIZE? ?? ?? ?? ?0x00100000??/* 1MB */

#define CONFIG_SYS_MAX_FLASH_SECT??(19)? ?? ???/* max number of sectors on one chip */

#define CONFIG_ENV_ADDR? ?? ?? ?? ?(CONFIG_SYS_FLASH_BASE + 0x0F0000) /* addr of environment */

#ifdef CONFIG_AMD_LV400

#define PHYS_FLASH_SIZE? ?? ?? ?? ?0x00080000??/* 512KB */

#define CONFIG_SYS_MAX_FLASH_SECT??(11)? ?? ???/* max number of sectors on one chip */

#define CONFIG_ENV_ADDR? ?? ?? ?? ?(CONFIG_SYS_FLASH_BASE + 0x070000) /* addr of environment */

//第175行添加如下内容

#define CONFIG_EON_29LV160AB? ???1? ?? ???//添加芯片

#define PHYS_FLASH_SIZE? ?? ?? ?? ?0x200000 //Flash芯片的总容量

#define CONFIG_SYS_MAX_FLASH_SECT??(35)? ???//根据EN29LV160AB的芯片手册描述,共35个扇区

#define CFG_ENV_ADDR?????(CONFIG_SYS_FLASH_BASE + 0x060000) //暂设置环境变量的首地址为0x060000(即:384Kb)? ? ??? ?


在/include/flash.c中,添加Flash的ID和厂商代码,添加代码:

#define EON_ID_LV160AB? ?0x22492249

#define EON_MANUFACT 0x001c001c

在/board/2440/flash.c中修改nor FLASH的驱动,该文件中包括对FLASH的初始化、扇区的擦除和写入。主要是对flash_init、flash_erase、write_hword三个函数的修改。

#define MAIN_SECT_SIZE? ???0x8000??// 根据EON29LV160AB的datasheet描述,主扇区大小为32K,以word mode方式访问

#define MEM_FLASH_ADDR1??(*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))

#define MEM_FLASH_ADDR2??(*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))

由于我们是把norflash连接到了s3c2440的bank0上,因此norflash中的地址相对于s3c2440来说基址为0x00000000,即CONFIG_SYS_FLASH_BASE??= 0。

EN29LV160AB手册要求将解锁码写到指定的地址0x555和0x2AA上,所以s3c2440发送的地址应该向左移动一位,保证nor FLASH的正确接收地址信息。
由数据手册可知EN29LV160AB第0扇区大小为8K,第1、2为4K,第3为16K,后面31扇区为32K。所以需要按照描述修改程序中的前面4个扇区的大小

// 增加的代码

#elif defined(CONFIG_EON_29LV160AB) // 参考原FLASH描述进行修改,改与EN29LV160AB相关

(EON_MANUFACT & FLASH_VENDMASK) |

(EON_ID_LV160AB & FLASH_TYPEMASK);

#else

#error "Unknow flash configured"

#endif


for (j = 0; j < flash_info[i].sector_count; j++)?
{
? ? if (j <= 3)?
? ?{
? ??????/* 1st one is 8 KB */
? ?? ? if (j == 0)?
? ?? ?{
? ?? ?? ?? ? flash_info[i].start[j] = flashbase + 0;
? ?? ?}
? ?? ?/* 2nd and 3rd are both 4 KB */
? ?? ?if ((j == 1) || (j == 2))?
? ???{
? ?? ?? ???flash_info[i].start[j] = flashbase + 0x2000 + (j - 1) * 0x1000;
? ???}
? ???/* 4th 16 KB */
? ???if (j == 3)?
? ? {
? ?? ?? ???flash_info[i].start[j] = flashbase + 0x4000;
? ???}
}?
else?
{
? ?? ? flash_info[i].start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;
}
}
size += flash_info[i].size;


修改flash_print_info,添加EN29LV160AB相关信息如下:
switch (info->flash_id & FLASH_VENDMASK) {
case (AMD_MANUFACT & FLASH_VENDMASK):
??printf ("AMD: ");
??break;
case (EON_MANUFACT & FLASH_VENDMASK):
??printf ("EON: ");

??break;
default:
??printf ("Unknown Vendor ");
}
switch (info->flash_id & FLASH_TYPEMASK) {
case (AMD_ID_LV400B & FLASH_TYPEMASK):
??printf ("1x Amd29LV400BB (4Mbit)n");
case (AMD_ID_LV800B & FLASH_TYPEMASK):
??printf ("1x Amd29LV800BB (8Mbit)n");
case (EON_ID_LV160AB & FLASH_TYPEMASK):
??printf ("1x EN29LV160AB (16Mbit)n");

??printf ("Unknown Chip Typen");
??goto Done;
修改int flash_erase (flash_info_t * info,int s_first,int s_last)
if ((info->flash_id & FLASH_VENDMASK) != // ?由于我们使用的是EN29LV160AB的FLASH芯片,所以其他型号为未知型号
? ???(EON_MANUFACT & FLASH_VENDMASK)) {
??return ERR_UNKNOWN_FLASH_VENDOR;

4.????? 至此,uboot关于Norflash已经移植好.

http://blog.csdn.net/quannii/article/details/8861572

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读