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

移植U-Boot-2009.08到mini2440(三) NorFlash設置

一、環境

目標板:mini2440

u-boot版本:u-boot-2009.08

交叉編譯器:arm-linux-gcc-4.3.2

操作系統:Linux(Ubuntu-11.10)

相關閱讀:  植U-Boot-2009.08到mini2440 基礎配置篇 http://www.linuxidc.com/Linux/2011-12/50388.htm

二、目的

從上一節的成果我們觀察到Flash的信息不正確,mini2440板子上為2M的Nor Flash(型號為SST39VF1601),還有就是提示*** Warning - bad CRC, using default environment的警告。

本節,筆者主要完成這2項的修改工作。


三、修改Flash配置

1、 修改命令行前的名字

這個一般是在.h文件裡面定義,首先筆者查找了include/configs/mini2440.h。在115行找到如下語句

#define    CONFIG_SYS_PROMPT            "SMDK2410 # "    /* Monitor Command Prompt       */

我們將其修改為

#define    CONFIG_SYS_PROMPT            "mini2440/care # " /* Monitor Command Prompt       */

2、 修改flash部分代碼

使用source insight 閱讀源代碼,我們可以找到Flash:512KB的打印信息所對應的函數位置。

lib_arm/board.c [214行] void display_flash_config (ulongsize)函數

找到調用該函數的地方,在本文件329行

  1. #ifndef CONFIG_SYS_NO_FLASH   
  2.     /* configure available FLASH banks */  
  3.     display_flash_config (flash_init ());  
  4. #endif /* CONFIG_SYS_NO_FLASH *  

flash_init()函數定義在board/samsung/mini2440/flash.c

  1.         flash_info[i].flash_id =  
  2. #if defined(CONFIG_AMD_LV400)   
  3.             (AMD_MANUFACT & FLASH_VENDMASK) |  
  4.             (AMD_ID_LV400B & FLASH_TYPEMASK);  
  5. #elif defined(CONFIG_AMD_LV800)   
  6.             (AMD_MANUFACT & FLASH_VENDMASK) |  
  7.             (AMD_ID_LV800B & FLASH_TYPEMASK);  
  8. #else   
  9. #error "Unknown flash configured"   
  10. #endif  

CONFIG_AMD_LV400並不是mini2440的NorFlash id。

接下來,我們修改mini2440.h關於NorFlash 的一些定義
include/configs/mini2440.h

#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

在176行後添加

  1. #define CONFIG_SST_39VF1601        1           
  2. #define PHYS_FLASH_SIZE            0x200000 //2m NorFlash    
  3. #define CONFIG_SYS_MAX_FLASH_SECT  (512)        //扇區大小,一扇區4k       
  4. #define CONFIG_ENV_ADDR            (CONFIG_SYS_FLASH_BASE + 0x040000)  
修改board/samsung/mini2440/flash.c norflash的參數宏定義
  1. #define MAIN_SECT_SIZE  0x1000  /* 4 KB */   
  2. #define MEM_FLASH_ADDR1     (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00005555 << 1)))   
  3. #define MEM_FLASH_ADDR2     (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00002AAA << 1)))  
修改flash_init()函數
  1. #if defined(CONFIG_AMD_LV400)   
  2.             (AMD_MANUFACT & FLASH_VENDMASK) |  
  3.             (AMD_ID_LV400B & FLASH_TYPEMASK);  
  4. #elif defined(CONFIG_AMD_LV800)   
  5.             (AMD_MANUFACT & FLASH_VENDMASK) |  
  6.             (AMD_ID_LV800B & FLASH_TYPEMASK);  
  7. #elif defined(CONFIG_SST_39VF1601)   //添加CONFIG_SST_39VF1601 定義           
  8.             (SST_MANUFACT & FLASH_VENDMASK) |  
  9.             (SST_ID_xF1601 & FLASH_TYPEMASK);  
  10. #else   
  11. #error "Unknown flash configured"   
  12. #endif  
 
  1. for (j = 0; j < flash_info[i].sector_count; j++)   
  2. {  
  3. flash_info[i].start[j] = flashbase + j * MAIN_SECT_SIZE;  
  4. }  

修改flash_print_info函數

  1. switch (info->flash_id & FLASH_VENDMASK) {  
  2.     case (AMD_MANUFACT & FLASH_VENDMASK):  
  3.         printf ("AMD: ");  
  4.         break;  
  5.     case (SST_MANUFACT & FLASH_VENDMASK):    //添加SST39VF1601   
  6.     printf ("SST: ");  
  7.     break;  
  8.     default:  
  9.         printf ("Unknown Vendor ");  
  10.         break;  
  11.     }  
  12.   
  13.     switch (info->flash_id & FLASH_TYPEMASK) {  
  14.     case (AMD_ID_LV400B & FLASH_TYPEMASK):  
  15.         printf ("1x Amd29LV400BB (4Mbit)\n");  
  16.         break;  
  17.     case (AMD_ID_LV800B & FLASH_TYPEMASK):  
  18.         printf ("1x Amd29LV800BB (8Mbit)\n");  
  19.         break;  
  20.     case (SST_ID_xF1601 & FLASH_TYPEMASK):   //添加SST39VF1601的   
  21.     printf ("1x SST39VF1610 (16Mbit)\n");  
  22.     break;  
  23.     default:  
  24.         printf ("Unknown Chip Type\n");  
  25.         goto Done;  
  26.         break;  
  27.     }  
Copyright © Linux教程網 All Rights Reserved