Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / u-boot 1.1.6 在 MINI2440 上的 NorFlash移植

开发环境:目标板         : mini2440uboot版本   :  u-boot-1.1.6交叉编译工具 :  rm-linux-gcc-4.4.3U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm通过查阅S29AL016的datasheet 以及 mini2440开发板原理图可知:    a. 这是SPANSION公司的一个 2 M x 8-Bit/1 M x 16-Bit 的NorFlash芯片    b. 有35个SECTOR    c. 通过J-Link查看S92AL106XXXXXX2的芯片16bit ID为12249,与/u-boot-1.1.6/include/flash.h中的AMD_ID_LV160B相同.    d. 支持BYTE /WORD 编程 ,通过引脚 BYTE# 配置, 逻辑1位WORD编程,0为BYTE. 此处被上拉至Vcc,所以为WORD编程.    e. S29AL016 的 擦除、读取时序、命令 与 /u-boot-1.1.6/board/mini2440/falsh.c 相符合.移植过程:1. 在/u-boot-1.1.6/include/configs/mini2440.h中配置加入对S29AL106芯片的支持:    由于u-boot-1.1.6中的配置文件(/u-boot-1.1.6/include/configs/mini2440.h)中默认只有两个宏 :    CONFIG_AMD_LV400 , CONFIG_AMD_LV400.     但是我的开发板的上的NorFLash芯片型号为S29AL016, 怎么办?     1.1. 屏蔽对CONFIG_AMD_LV400 , CONFIG_AMD_LV400这两个宏,增加AMD_ID_LV160B宏,以及修改相应参数设置,其中           CFG_ENV_ADDR 宏为环境变量地址,在这里我把它设为 0x1E0000                 #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_AMD_LV160 1
           #ifdef   CONFIG_AMD_LV160
           #define PHYS_FLASH_SIZE 0x00200000 /* 2MB */
           #define CFG_MAX_FLASH_SECT (35) /* max number of sectors on one chip */
           #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x1E0000) /* addr of environment */
           #endif     1.2. 检查是否已经配置了环境变量的储存位置以及大小               #define CFG_ENV_IS_IN_FLASH 1
           #define CFG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */2. 在/u-boot-1.1.6/board/mini2440/flash.c 作修改,使得识别出S29AL016芯片:    2.1. 在 ulong flash_init (void) 这个函数里面增加宏,使得 id 被赋值为 12249                    ulong flash_init (void) {              int i, j;
              ulong size = 0;
              /* mini2440.h /#define CFG_MAX_FLASH_BANKS 1 */
              for (i = 0; i < CFG_MAX_FLASH_BANKS; i++) {
              ulong flashbase = 0;              flash_info[i].flash_id =               #if defined(CONFIG_AMD_LV400)
                     (AMD_MANUFACT & FLASH_VENDMASK) |
                     (AMD_ID_LV400B & FLASH_TYPEMASK);
              #elif defined(CONFIG_AMD_LV800)
                     (AMD_MANUFACT & FLASH_VENDMASK) |
                     (AMD_ID_LV800B & FLASH_TYPEMASK);
              #elif defined(CONFIG_AMD_LV160)
                     (AMD_MANUFACT & FLASH_VENDMASK)|
                     (AMD_ID_LV160B & FLASH_TYPEMASK);              ··· }    2.2. 修改 void flash_print_info (flash_info_t * info) 函数,使得其可以打印出芯片信息:           void flash_print_info (flash_info_t * info)
           {
               int i;
               switch (info->flash_id & FLASH_VENDMASK) {
                   case (AMD_MANUFACT & FLASH_VENDMASK):
                       printf ("AMD: ");
                       break;
                   default:
                       printf ("Unknown Vendor ");
                       break;
             }             switch (info->flash_id & FLASH_TYPEMASK) {
                   case (AMD_ID_LV400B & FLASH_TYPEMASK):
                       printf ("1x Amd29LV400BB (4Mbit) ");
                       break;
                   case (AMD_ID_LV800B & FLASH_TYPEMASK):
                       printf ("1x Amd29LV800BB (8Mbit) ");
                       break;
                 case (AMD_ID_LV160B &FLASH_TYPEMASK):
                       printf ("1x S29AL016J(2Mbyte ,16bit  ,Bottom Boot Device) ");
                       break;
                   default:
                     printf ("Unknown Chip Type ");
                       goto Done;
                       break;
              }                ···            }3.  在 /u-boot-1.1.6/board/mini2440/Makefile 中 ,查看是否已经增加了 flash.o 依赖   COBJS := mini2440.o flash.o
     SOBJS := lowlevel_init.o4.  编译,烧录到开发板后,测试是否移植成功    4.1.  开机打印信息如下                 4.2.  输入 flinfo ,打印信息如下                       35个sector与理论相同,001E0000 处为 RO ,是环境变量储存区,正确. 芯片打印信息,正确.     4.3. 设置 ip 地址 ,然后保存,打印信息如下              4.4. 重启开发板,用 printenv 打印环境变量,看看地址是否已经更改为 192.168.1.17,并且消除了 3.1 中的 bad crc 警告         重启打印信息如下,可以看出已经消除了 3.1 中 打印的 bad crc 警告信息                   输入 printenv 查看环境变量,可以看出地址已经修改为 192.168.1.17         5.  至此,移植成功. Done!     这次的移植遇到了很多问题,一开始本来是想用cfi 接口的,后来为了更深入熟悉norflash...  So~    在移植过程中,遇到问题可以打开uboot的调试信息,在mini2440.h中 定义 #define DEBUG 1 即可    遇到问题的过程中可以自己添加调试信息,一路追踪.    加油! Osu~本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-12/126800.htm