U-boot移植-norflash

一,norflash看代码,明白需要修改的地方。
二,相关知识点
三,我的移植步骤

一,看代码
EN29LV160AB是bottom boot norflash,从它的命名中"B"字母可以知道。Byte# pin在原理图上接高电平,所以是word模

式。共有35个sector。
把 flash_init,write_hword和flash_erase看了。发现flash_init函数中需要修改。
另外,需要修改一个配置定义.
二,相关知识点
理论基础:Bottom/Top Boot Sect(底部/顶部 启动块)
所谓的boot sect,是指的是Nor Flash和Nand Flash不太一样。Nand Flash从开始到最后,都是由同样大小的page所组

成的。
而Nor Flash,一般都是有个boot sect,好像是由于历史原因,常将Nor Flash用于作为存储启动代码的设备,也就是

从Nor Flash启动,所以,这个boot sect块,专门设计出来,用于存放启动代码。如果详细解释,按照datasheet中的

描述就是,第一个或最后一个,此处是bottom sect,所以是最后一个64KB大小的块,被分为4个独立的块。第一个16KB

,用于少量的系统初始化代码。而2个8KB的块用于存储参数,余下的32KB的块叫做Main Block,用于存储应用程序的代

码。
Sector(扇区)
此处的sector(扇区)也就是flash里面的最小的擦除单位:块(block)。
#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。
而之所以又把norflash中的地址向左移一位(即乘以2),是因为我们是把s3c2440的ADDR1连接到了norflash的A0上的

缘故。
三,我的norflash移植步骤
1,修改include/configs/apple2440.h
#if 0    //注释掉下面两个类型的Nor Flash设置,因为不是我们所使用的型号
#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
//第175行添加如下内容
#define CONFIG_EON_29LV160AB     1        //添加TQ2440开发板Nor Flash设置
#define PHYS_FLASH_SIZE            0x200000 //我们开发板的Nor Flash是2M
#define CONFIG_SYS_MAX_FLASH_SECT  (35)     //根据EN29LV160AB的芯片手册描述,共35个扇区
#define CONFIG_ENV_ADDR            (CONFIG_SYS_FLASH_BASE + 0xF0000) //暂设置环境变量的首地址为0xF0000

//在此处放uboot参数

2,在include/flash.h添加
在181行添加
#define EON_ID_LV160AB   0x22492249

3,在board/samsung/smdk2440/flash.c中修改
#define MAIN_SECT_SIZE     0x8000  //定义为32k,主要扇区的大小
============================================================
由数据手册可知EN29LV160AB第0扇区大小为8K,第1、2为4K,第3为16K,后面31扇区为32K。前面4个扇区加起来刚好是

主要扇区的大小 = 32K, 所以修改87行下如下

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 ");
  break;
 }

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

 default:
  printf ("Unknown Chip Type\n");
  goto Done;
  break;
 }

================================================
修改int flash_erase (flash_info_t * info, int s_first, int s_last)

if ((info->flash_id & FLASH_VENDMASK) !=
     (EON_MANUFACT & FLASH_VENDMASK)) {
  return ERR_UNKNOWN_FLASH_VENDOR;

=========================================
75行处添加
#elif defined(CONFIG_EON_29LV160AB)   //在CONFIG_AMD_LV800后面添加EON_ID_LV160AB     
            (EON_MANUFACT & FLASH_VENDMASK) |
            (EON_ID_LV160AB & FLASH_TYPEMASK);


下载到sdram效果很好。
可是我又下载了一次后,电脑出现了蓝屏,后来发现dnw.exe我的usb下载软件坏了。网上查了下,蛮麻烦的。现在要想

办法把dnw彻底卸载。这是我常用的工具,不能出问题啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值