天嵌 ARM开发社区

 找回密码
 注册
查看: 5003|回复: 3

关于移植uboot中的EN29LV160AB NOR FLASH芯片的一些问题

[复制链接]
changxy 发表于 2010-8-25 18:58:53 | 显示全部楼层 |阅读模式
最近一直研究UBOOT的移植。。。有几个问题比较困惑
EN29LV160AB 是TQ2440选的NOR FLASH芯片,是BOTTOM boot sector类型,最初的 1个16K ,2个8K,一个32K,的sector在0x0000000-0x0ffff这里。
1.UBOOT 如果烧写是应该烧写在这里对吗?如果是TOP BOOT SECTOR 那么UBOOT就会写到高地址上去了对吗?那么在启动的时候第一个指令跳转执行NOR FLASH 0X000000上不是寻找不到UBOOT了吗?
2.环境变量存储在什么地方?看到别的文章上说,环境变量存储在另外的sector上。定义一个基地址,和一个偏移地址,写到另外的sector上?(如使用扇区34,不用最初的三个扇区?)
摘抄网上某段话:
3.bottom sect,是第一个64KB大小的块,被分为4个独立的块。第一个16KB,用于少量的系统初始化代码。而2个8KB的块用于存储参数,余下的32KB的块叫做Main Block,用于存储应用程序的代码。
读数据手册就没看到说第一个块被分为3个块。好像他们是相互平等的关系,而不是第一个块分为4个块?
4.如果环境变量是写到前四个扇区上,应该是使用哪个呢?(若不是,这个就不用解释了。)

谢谢。。。。
 楼主| changxy 发表于 2010-8-25 20:58:56 | 显示全部楼层
PS: 翻看天嵌带的UBOOT 里面对主频设置是1:2:4 貌似是200MHZ的?
回复

使用道具 举报

 楼主| changxy 发表于 2010-8-26 09:31:52 | 显示全部楼层
看你们的uboot 在 include  configs 的 Embedsky。h 这个文件
定义的sector总数是19 手册上的是35
sector 最大是64K 0x10000
你们好像用的是  0xc000
不知道说的对吗。。。好像你们对nor 的设置没怎么该
回复

使用道具 举报

clever0725 发表于 2010-8-26 09:55:53 | 显示全部楼层
1、修改命令提示符为自己的

vi include/configs/smdk2440.h

第118行修改为

#define CONFIG_SYS_PROMPT   "[SMDK2440]#"  //将命令行前的名字改成[SMDK2440]

2、通常,在嵌入式bootloader中,有两种方式来引导启动内核:从Nor Flash启动和从Nand Flash启动。u-boot中默认是从Nor Flash启动的。

3、TQ2440的所用的Norflash为EN29LV160AB。接线同AM29LV160DB如下图:







翻开此芯片的datasheet看到



TQ2440原理图上的第47脚 BYTE#是接高电平的,so 此芯片工作于16位模式(半字模式)
A0-A19是地址线,在半字模式下,D0-D15做为数据输入输出口。因为数据位是16位,A0-A19可以选择2^20 = 1M *2BYTE = 2Mbyte。正好是AM29LV160DB的容量。S3C2440的ADDR1要接AM29LV160DB的A0。上图中AM29LV160DB的A20,A21是空脚,分别接的是LADDR21,LADDR22。这应该是为了以后方便扩展NOR FLASH的容量。LADDR21,LADDR22对AM29LV160DB是没用的。


<1>2048K * 8bit / 1024K * 16bit Flash Memory Boot Sector Flash Memory

<2>Flexible Sector Architecture:

-One 16-Kbyte, two 8-Kbyte, one 32-Kbyte, and thirty-one 64-Kbyte sectors(byte mode)

-One 8-Kword, two 4-Kword, one 16-Kword,and thirty-one 32-Kword sectors(word mode)

无论哪种模式总扇区是 35 sectors。

4、修改Norflash参数

vi include/configs/smdk2440.h

/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#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

#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 */
#endif
#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 */
#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 + 0x80000) //暂设置环境变量的首地址为0x80000 //在256K处放uboot参数

5、添加Norflash的information

vi include/flash.h



第181行添加

#define EON_ID_LV160AB   0x22492249

6、修改norflash的驱动,在u-boot中对Nor Flash的操作分别有初始化、擦除和写入,所以我们主要修改与硬件密切相关的三个函数flash_init、flash_erase、write_hword。

vi board/samsung/smdk2440/flash.c

由-One 8-Kword, two 4-Kword, one 16-Kword,and thirty-one 32-Kword sectors(word mode)

可知主要扇区大小为32k,so修改第31行

#define MAIN_SECT_SIZE     0x8000  //定义为32k,主要扇区的大小

#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上的缘故。

由数据手册可知EN29LV160AB第0扇区大小为8K,第1、2为4K,第3为16K,后面31扇区为32K。前面4个扇区加起来刚好是主要扇区的大小 = 32K, 所以修改87行下如下

for (j = 0; j < flash_info.sector_count; j++)
{
    if (j <= 3)
   {
        /* 1st one is 8 KB */
       if (j == 0)
      {
             flash_info.start[j] = flashbase + 0;
      }

      /* 2nd and 3rd are both 4 KB */
      if ((j == 1) || (j == 2))
     {
           flash_info.start[j] = flashbase + 0x2000 + (j - 1) * 0x1000;
     }

     /* 4th 16 KB */
     if (j == 3)
    {
           flash_info.start[j] = flashbase + 0x4000;
     }
}
else
{
       flash_info.start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;
}
}
size += flash_info.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;

7、至此,uboot关于Norflash已经移植好

make distclean

make smdk2440_config

make即可生成u-boot.bin

下载到板子的Norflash,在命令台输入saveenv即可

[SMDK2440]# saveenv

Saving Environment to Flash...

Un-Protected 2 sectors

Erasing Flash...Erasing sector 19 ... ok.

Erasing sector 20 ... ok.

Erased 2 sectors

Writing to Flash... done

Protected 2 sectors

[SMDK2440]# flinfo


Bank # 1: EON: 1x EN29LV160AB (16Mbit)

  Size: 2 MB in 35 Sectors

  Sector Start Addresses:

    00000000 (RO) 00002000 (RO) 00003000 (RO) 00004000 (RO) 00008000 (RO)

    00010000 (RO) 00018000 (RO) 00020000      00028000      00030000     

    00038000      00040000      00048000      00050000      00058000     

    00060000      00068000      00070000      00078000      00080000     

    00088000      00090000      00098000      000A0000      000A8000     

    000B0000      000B8000      000C0000      000C8000      000D0000     

    000D8000      000E0000      000E8000      000F0000      000F8000     

[SMDK2440]#

/*

关于Norflash的好文章

http://blog.csdn.net/zhaocj/archive/2010/07/04/5712259.aspx

*/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2025-6-18 07:32 , Processed in 2.035304 second(s), 20 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表