歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

u-boot 1.1.6 在 MINI2440 上的 NorFlash移植

開發環境:

目標板         : mini2440

uboot版本   :  u-boot-1.1.6

交叉編譯工具 :  rm-linux-gcc-4.4.3

U-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)\n");
                       break;
                   case (AMD_ID_LV800B & FLASH_TYPEMASK):
                       printf ("1x Amd29LV800BB (8Mbit)\n");
                       break;
                  case (AMD_ID_LV160B &FLASH_TYPEMASK):
                       printf ("1x S29AL016J(2Mbyte ,16bit  ,Bottom Boot Device) \n");
                       break;
                   default:
                      printf ("Unknown Chip Type\n");
                       goto Done;
                       break;
               }

                ···

            }

3.  在 /u-boot-1.1.6/board/mini2440/Makefile 中 ,查看是否已經增加了 flash.o 依賴

    COBJS := mini2440.o flash.o
     SOBJS := lowlevel_init.o

4.  編譯,燒錄到開發板後,測試是否移植成功

    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~

Copyright © Linux教程網 All Rights Reserved