Chinaunix首页 | 论坛 | 博客
  • 博客访问: 629145
  • 博文数量: 112
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 1406
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-25 18:46
文章分类
文章存档

2011年(1)

2010年(5)

2009年(25)

2008年(81)

我的朋友

分类: LINUX

2008-04-26 11:39:36

现在叙述一下,关于norflash部分的移植工作吧。

 修改flash.c

      根据不同的flash芯片采用不同的flash程序接口,本开发板选用的是atmelAT49BV322A。由于芯片不同所以需要根据datasheetflash.c进行修改。

 

     ① 修改扇区大小和数目的定义

         OrgDef OrgAT49BV16x4A[] =

            {

              { 8, 8*1024 }, /* 8 * 8kBytes sectors */

              { 31, 64*1024 } /* 31 * 64kBytes sectors */

            };

         改为

         OrgDef OrgAT49BV16x4A[]=

            {

              { 8,  8*1024 }, /* 8 * 64kBytes sectors */

              { 63,  64*1024 } /* 63 *8kBytes sectors */

      };

      本芯片为71个扇区。

 

       ② 根据datasheet修改关于地址和读写命令的宏定义。

          #define FLASH_BANK_SIZE 0x200000    /* 2 MB */

          改为 #define FLASH_BANK_SIZE 0x400000  /* 4 MB */

 

         /* AT49BV1614A Codes */

         #define FLASH_CODE1       0xAA

         #define FLASH_CODE2       0x55

         #define ID_IN_CODE        0x90

         #define ID_OUT_CODE       0xF0

 

         #define CMD_READ_ARRAY    0x00F0

         #define CMD_UNLOCK1       0x00AA

         #define CMD_UNLOCK2       0x0055

         #define CMD_ERASE_SETUP       0x0080

         #define CMD_ERASE_CONFIRM    0x0030

         #define CMD_PROGRAM          0x00A0

         #define CMD_UNLOCK_BYPASS    0x0020

 

         #define MEM_FLASH_ADDR1       (*(volatile u16 *)(CFG_FLASH_BASE + (0x00005555<<1)))

         #define MEM_FLASH_ADDR2       (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AAA<<1)))

 

         #define IDENT_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000555<<1)))

         #define IDENT_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000AAA<<1)))

 

      修改为:

        

         #define FLASH_CODE1       0x00AA00aa

         #define FLASH_CODE2       0x00550055

         #define ID_IN_CODE     0x00900090

         #define ID_OUT_CODE       0x00F000f0

      

         #define CMD_READ_ARRAY    0x00F000F0

         #define CMD_UNLOCK1       0x00AA

         #define CMD_UNLOCK2       0x0055

         #define CMD_ERASE_SETUP       0x0080

         #define CMD_ERASE_CONFIRM 0x0030

         #define CMD_PROGRAM       0x00A0

         #define CMD_UNLOCK_BYPASS 0x00200020

 

         #define MEM_FLASH_ADDR1       (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000555<<1)))

         #define MEM_FLASH_ADDR2       (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AA<<1)))

 

         #define IDENT_FLASH_ADDR1 (*(volatile u32 *)(CFG_FLASH_BASE + (0x0000555<<2)))

         #define IDENT_FLASH_ADDR2 (*(volatile u32 *)(CFG_FLASH_BASE + (0x0000AAA<<2)))

 

1.1.4 后要注意加一个

#define  CMD_SECTOR_UNLOCK       0x0070

#define  FLASH_BANK_SIZE            0x400000

然后在 flash_identification()中,来个直接的,呵呵呵,

把 /* Vendor type */下面的全部删除,直接写上自己的代码,我的如下:

info->flash_id = ATM_MANUFACT & FLASH_VENDMASK;
        printf ("flash_302: ");

   if ((device_code & FLASH_TYPEMASK) == (ATM_ID_BV1614 & FLASH_TYPEMASK))

 {

     if ((add_device_code & FLASH_TYPEMASK) ==
                     (ATM_ID_BV1614A & FLASH_TYPEMASK))

       {
       info->flash_id |= ATM_ID_BV1614A & FLASH_TYPEMASK;
                        printf ("AT49BV1614A (16Mbit)\n");
             }

        }

  else {     

                           /* AT49BV1614 Flash */
         info->flash_id |= ATM_ID_BV1614 & FLASH_TYPEMASK;
                printf ("flash_302 (32Mbit)\n");
        }

然后修改flash_init部分,把这个 

         int i, j, k;
        unsigned int flash_nb_blocks, sector;
        unsigned int start_address;
        OrgDef *pOrgDef;

        ulong size = 0;

        for (i = 0; i < CFG_MAX_FLASH_BANKS; i++)

            {
                ulong flashbase = 0;

                flash_identification (&flash_info[i]);

  在这别忘了添加flash_info[i].size = FLASH_BANK_SIZE;

 然后后面的全部注释掉,直接也添加自己的代码,我的如下: flash_info[i].sector_count = CFG_MAX_FLASH_SECT ;
 memset (flash_info[i].protect, 0, CFG_MAX_FLASH_SECT );

 pOrgDef = OrgAT49BV16x4A;
flash_nb_blocks = sizeof (OrgAT49BV16x4A) / sizeof (OrgDef);
然后保存推出,OK

别忘记还要添加一个头文件,就是在include/common.h里添加板子的头文件:#include ,包含与硬件相关的寄存器的定义,这个跟uboot版本有关系,注意还有一个没有定义,在1.1.4以后没有定义,需要自己去手动定义上就可以了。其他的我看了,也没什么不一样的了。不然会缺少定义等等的错误,就是这个罪魁祸首了。呵呵 !

      去掉芯片自动识别,防治出以外错误。

  注视掉if ((flash_info[i].flash_id & FLASH_TYPEMASK)……else  144行-152行。

 

修改 config.mk

    TEXT_BASE = 0x21f80000 修改为  TEXT_BASE = 0x21f00000这个地址是要根一级boot中定义保持一致。因为 Boot中的main.c定义如下:

   #define DST 0x21f00000  //UBOOT被解压缩后载入到SDRAM中的位置。

 

修改 include下面的头文件at91rm9200dk.h,

    #define CONFIG_NR_DRAM_BANKS 1            //SDRAM bank

    #define PHYS_SDRAM 0x20000000               //基地址

    #define PHYS_SDRAM_SIZE 0x2000000           //大小  32M

 

    #define PHYS_FLASH_1 0x10000000             //基地址

    #define PHYS_FLASH_SIZE 0x400000            //大小 4M

    #define CFG_FLASH_BASE    PHYS_FLASH_1      //别名

    #define CFG_MAX_FLASH_BANKS 1           //bank

    #define CFG_MAX_FLASH_SECT 71           //扇区总数

里面还可以添加一些环境变量。比如网络部分:
#define    CONFIG_DEFAULT_ENVIRONMENT
#define    CONFIG_BOARDNAME        "AT91RM9200DK"
#define    CONFIG_ETHADDR        "00:11:22:33:44:55"
#define    CONFIG_IPADDR            "192.168.0.110"
#define    CONFIG_SERVERIP        "192.168.0.100"
#define    CONFIG_GATEWAYIP        "192.168.0.1"
#define CONFIG_BOOTCOMMAND    "tftp 0x20008000 uImage; tftp 0x21000000 ramdisk; go 0x20008000"
#define    CONFIG_DEFAULT_KERNEL    "2.6.17"

然后保存退出,make mrproper,make at91rm9200dk_config,make CROSS_COMPILE=arm-linux-哗哗的满屏跑着,运气好的话,就会有一个u-boot.bin,然后放到内存跑跑吧。祝你成功。
阅读(1659) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~