免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1250 | 回复: 0
打印 上一主题 下一主题

uboot-1.1.1在at91rm9200dk上的移植过程 (norflash部分 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-03-30 22:01 |只看该作者 |倒序浏览


现在叙述一下,关于norflash部分的移植工作吧。
修改flash.c
      根据不同的flash芯片采用不同的flash程序接口,本开发板选用的是atmel的AT49BV322A。由于芯片不同所以需要根据datasheet对flash.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
         #define MEM_FLASH_ADDR2       (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AAA

         #define IDENT_FLASH_ADDR1 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000555
         #define IDENT_FLASH_ADDR2 (*(volatile u16 *)(CFG_FLASH_BASE + (0x0000AAA

      修改为:
        
         #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
         #define MEM_FLASH_ADDR2       (*(volatile u16 *)(CFG_FLASH_BASE + (0x00002AA

         #define IDENT_FLASH_ADDR1 (*(volatile u32 *)(CFG_FLASH_BASE + (0x0000555
         #define IDENT_FLASH_ADDR2 (*(volatile u32 *)(CFG_FLASH_BASE + (0x0000AAA
再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
                flash_identification (&flash_info);在这别忘了添加flash_info.size = FLASH_BANK_SIZE;然后后面的全部注释掉。直接也添加自己的代码,我的如下: flash_info.sector_count = CFG_MAX_FLASH_SECT ;
                        memset (flash_info.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.flash_id & FLASH_TYPEMASK)……到else  144行-152行。

      4.2.3  修改 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,然后放到内存跑跑吧。祝你成功。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/63379/showart_512114.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP