一、環境
目標板: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行
- #ifndef CONFIG_SYS_NO_FLASH
- /* configure available FLASH banks */
- display_flash_config (flash_init ());
- #endif /* CONFIG_SYS_NO_FLASH *
flash_init()函數定義在board/samsung/mini2440/flash.c
- 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);
- #else
- #error "Unknown flash configured"
- #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行後添加
- #define CONFIG_SST_39VF1601 1
- #define PHYS_FLASH_SIZE 0x200000 //2m NorFlash
- #define CONFIG_SYS_MAX_FLASH_SECT (512) //扇區大小,一扇區4k
- #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x040000)
修改board/samsung/mini2440/flash.c norflash的參數宏定義
- #define MAIN_SECT_SIZE 0x1000 /* 4 KB */
- #define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00005555 << 1)))
- #define MEM_FLASH_ADDR2 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00002AAA << 1)))
修改flash_init()函數
- #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_SST_39VF1601) //添加CONFIG_SST_39VF1601 定義
- (SST_MANUFACT & FLASH_VENDMASK) |
- (SST_ID_xF1601 & FLASH_TYPEMASK);
- #else
- #error "Unknown flash configured"
- #endif
- for (j = 0; j < flash_info[i].sector_count; j++)
- {
- flash_info[i].start[j] = flashbase + j * MAIN_SECT_SIZE;
- }
修改flash_print_info函數
- switch (info->flash_id & FLASH_VENDMASK) {
- case (AMD_MANUFACT & FLASH_VENDMASK):
- printf ("AMD: ");
- break;
- case (SST_MANUFACT & FLASH_VENDMASK): //添加SST39VF1601
- printf ("SST: ");
- 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 (SST_ID_xF1601 & FLASH_TYPEMASK): //添加SST39VF1601的
- printf ("1x SST39VF1610 (16Mbit)\n");
- break;
- default:
- printf ("Unknown Chip Type\n");
- goto Done;
- break;
- }