Uboot在S3C2440上的移植詳解(二)
主 機(jī):VMWare--Fedora 9
本文引用地址:http://butianyuan.cn/article/201611/318065.htm開(kāi)發(fā)板:Mini2440--64MB Nand,Kernel:2.6.30.4
編譯器:arm-linux-gcc-4.3.2.tgz
u-boot:u-boot-2009.08.tar.bz2
二、移植步驟
4)準(zhǔn)備進(jìn)入u-boot的第二階段(在u-boot中添加對(duì)我們開(kāi)發(fā)板上Nor Flash的支持)。
通常,在嵌入式bootloader中,有兩種方式來(lái)引導(dǎo)啟動(dòng)內(nèi)核:從Nor Flash啟動(dòng)和從Nand Flash啟動(dòng)。u-boot中默認(rèn)是從Nor Flash啟動(dòng),再?gòu)纳弦还?jié)這個(gè)運(yùn)行結(jié)果圖中看,還發(fā)現(xiàn)幾個(gè)問(wèn)題:第一,我開(kāi)發(fā)板的Nor Flash是2M的,而這里顯示的是512kB;第二,出現(xiàn)Warning - bad CRC, using default environment的警告信息。不是u-boot默認(rèn)是從Nor Flash啟動(dòng)的嗎?為什么會(huì)有這些錯(cuò)誤信息呢?這是因?yàn)槲覀冞€沒(méi)有添加對(duì)我們自己的Nor Flash的支持,u-boot默認(rèn)的是其他型號(hào)的Nor Flash,而我們的Nor Flash的型號(hào)是SST39VF1601。另外怎樣將命令行提示符前面的SMDK2410變成我自己定義的呢?
下面我們一一來(lái)解決這些問(wèn)題,讓u-boot完全對(duì)我們Nor Flash的支持。首先我們修改頭文件代碼如下:
#gedit include/configs/my2440.h //修改命令行前的名字和Nor Flash參數(shù)部分的定義 |
#define CONFIG_SYS_PROMPT "[MY2440]#" //將命令行前的名字改成[MY2440] /*----------------------------------------------------------------------- #defineCONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */ #ifdef CONFIG_AMD_LV800 |
然后添加對(duì)我們mini2440開(kāi)發(fā)板上2M的Nor Flash(型號(hào)為SST39VF1601)的支持。在u-boot中對(duì)Nor Flash的操作分別有初始化、擦除和寫(xiě)入,所以我們主要修改與硬件密切相關(guān)的三個(gè)函數(shù)flash_init、flash_erase、write_hword,修改代碼如下:
#gedit board/samsung/my2440/flash.c |
//修改定義部分如下: //#define MAIN_SECT_SIZE 0x10000 //#define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1))) //修改flash_init函數(shù)如下: // /* 2nd and 3rd are both 8 KB */ // /* 4th 32 KB */ flash_info[i].start[j]= flashbase + j * MAIN_SECT_SIZE; //修改flash_print_info函數(shù)如下: case(AMD_MANUFACT & FLASH_VENDMASK): case(AMD_ID_LV800B & FLASH_TYPEMASK): //修改flash_erase函數(shù)如下: ///* wait until flash is ready */ // if (!chip // if (!chip //MEM_FLASH_ADDR1 = CMD_READ_ARRAY; //if (chip == ERR) { //if (chip == TMO) { if(*addr & 0x80) //修改write_hword函數(shù)如下: ///* wait until flash is ready */ // if (!chip && ((result & 0x80) == (data & 0x80))) // if (!chip && ((result & 0xFFFF) & BIT_PROGRAM_ERROR)) { // if ((result & 0x80) == (data & 0x80)) //*addr = CMD_READ_ARRAY; //if (chip == ERR || *addr != data) if((*addr & 0x80)==(data & 0x80)) |
修改完后重新編譯u-boot,下載到RAM中運(yùn)行結(jié)果如下圖:
從運(yùn)行結(jié)果圖看,Nor Flash的大小可以正確檢測(cè)到了,命令行前面的名字也由原來(lái)的SMDK2410改成我自己定義的[MY2440]了,但是還會(huì)出現(xiàn)bad CRC的警告信息,其實(shí)這并不是什么問(wèn)題,只是還沒(méi)有將環(huán)境變量設(shè)置到Nor Flash中,我們執(zhí)行一下u-boot的:saveenv命令就可以了。如下圖:
再重新下載u-boot.bin文件到RAM中運(yùn)行,可以觀察到不會(huì)出現(xiàn)警告信息了,這時(shí)候u-boot已經(jīng)對(duì)我們開(kāi)發(fā)板上的Nor Flash完全支持了。如下:
評(píng)論