U-Boot在44B0X開發(fā)板上的移植以及代碼分析復(fù)習(xí)過程_第1頁
U-Boot在44B0X開發(fā)板上的移植以及代碼分析復(fù)習(xí)過程_第2頁
U-Boot在44B0X開發(fā)板上的移植以及代碼分析復(fù)習(xí)過程_第3頁
U-Boot在44B0X開發(fā)板上的移植以及代碼分析復(fù)習(xí)過程_第4頁
U-Boot在44B0X開發(fā)板上的移植以及代碼分析復(fù)習(xí)過程_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、Good is good, but better carries it.精益求精,善益求善。U-Boot在44B0X開發(fā)板上的移植以及代碼分析-U-Boot在44B0X開發(fā)板上的移植以及代碼分析章永陽2003-10-301.u-boot介紹u-boot是一個(gè)opensource的bootloader,目前版本是0.4.0。u-boot是在ppcboot以及armboot的基礎(chǔ)上發(fā)展而來,雖然宣稱是0.4.0版本,卻相當(dāng)?shù)某墒旌头€(wěn)定,已經(jīng)在許多嵌入式系統(tǒng)開發(fā)過程中被采用。由于其開發(fā)源代碼,其支持的開發(fā)板眾多。唯一遺憾的是并不支持我們現(xiàn)在學(xué)習(xí)所用samsung44B0X的開發(fā)板。為什么我們需要u-

2、boot?顯然可以將ucLinux直接燒入flash,從而不需要額外的引導(dǎo)裝載程序(bootloader)。但是從軟件升級(jí)的角度以及程序修補(bǔ)的來說,軟件的自動(dòng)更新非常重要。事實(shí)上,引導(dǎo)裝載程序(bootloader)的用途不僅如此,但僅從軟件的自動(dòng)更新的需要就說明我們的開發(fā)是必要的。同時(shí),u-boot移植的過程也是一個(gè)對(duì)嵌入式系統(tǒng)包括軟硬件以及操作系統(tǒng)加深理解的一個(gè)過程。2.u-boot移植的框架移植u-boot到新的開發(fā)板上僅需要修改和硬件相關(guān)的部分。在代碼結(jié)構(gòu)上:在board目錄下創(chuàng)建ev44b0ii目錄,創(chuàng)建ev44b0ii.c以及flash.c,memsetup.S,u-boot.ld

3、s等。不需要從零開始,可選擇一個(gè)相似的目錄,直接復(fù)制過來,修改文件名以及內(nèi)容。我在移植u-boot過程中,選擇的是ep7312目錄。由于u-boot已經(jīng)包含基于s3c24b0的開發(fā)板目錄,作為參考,也可以復(fù)制相應(yīng)的目錄。在cpu目錄下創(chuàng)建arm7tdmi目錄,主要包含start.S,interrupts.c以及cpu.c,serial.c幾個(gè)文件。同樣不需要從零開始建立文件,直接從arm720t復(fù)制,然后修改相應(yīng)內(nèi)容。在include/configs目錄下添加ev44b0ii.h,在這里放上全局的宏定義等。找到u-boot根目錄下Makefile修改加入ev44b0ii_config:unco

4、nfig./mkconfig$(:_config=)armarm7tdmiev44b0ii運(yùn)行makeev44bii_config,如果沒有錯(cuò)誤就可以開始硬件相關(guān)代碼移植的工作3.u-boot的體系結(jié)構(gòu)1)總體結(jié)構(gòu)u-boot是一個(gè)層次式結(jié)構(gòu)。從上圖也可以看出,做移植工作的軟件人員應(yīng)當(dāng)提供串口驅(qū)動(dòng)(UARTDriver),以太網(wǎng)驅(qū)動(dòng)(EthernetDriver),Flash驅(qū)動(dòng)(Flash驅(qū)動(dòng)),USB驅(qū)動(dòng)(USBDriver)。目前,通過USB口下載程序顯得不是十分必要,所以暫時(shí)沒有移植USB驅(qū)動(dòng)。驅(qū)動(dòng)層之上是u-boot的應(yīng)用,command通過串口提供人機(jī)界面。我們可以使用一些命令做一

5、些常用的工作,比如內(nèi)存查看命令md。Kermit應(yīng)用主要用來支持使用串口通過超級(jí)終端下載應(yīng)用程序。TFTP則是通過網(wǎng)絡(luò)方式來下載應(yīng)用程序,例如uclinux操作系統(tǒng)。2)內(nèi)存分布在flashrom中內(nèi)存分布圖ev44b0ii的flash大小2M(8bits),現(xiàn)在將0-40000共256k作為u-boot的存儲(chǔ)空間。由于u-boot中有一些環(huán)境變量,例如ip地址,引導(dǎo)文件名等,可在命令行通過setenv配置好,通過saveenv保存在40000-50000(共64k)這段空間里。如果存在保存好的環(huán)境變量,u-boot引導(dǎo)將直接使用這些環(huán)境變量。正如從代碼分析中可以看到,我們會(huì)把flash引導(dǎo)代

6、碼搬移到DRAM中運(yùn)行。下圖給出u-boot的代碼在DRAM中的位置。引導(dǎo)代碼u-boot將從0 x00000000處搬移到0 x0C700000處。特別注意的由于ev44b0iiuclinux中斷向量程序地址在0 x0c000000處,所以不能將程序下載到0 x0c000000出,通常下載到0 x0c080000處。4.start.S代碼結(jié)構(gòu)1)定義入口一個(gè)可執(zhí)行的Image必須有一個(gè)入口點(diǎn)并且只能有一個(gè)唯一的全局入口,通常這個(gè)入口放在Rom(flash)的0 x0地址。例如start.S中的.globl_start_start:值得注意的是你必須告訴編譯器知道這個(gè)入口,這個(gè)工作主要是修改連

7、接器腳本文件(lds)。2)設(shè)置異常向量(ExceptionVector)異常向量表,也可稱為中斷向量表,必須是從0地址開始,連續(xù)的存放。如下面的就包括了復(fù)位(reset),未定義處理(undef),軟件中斷(SWI),預(yù)去指令錯(cuò)誤(Pabort),數(shù)據(jù)錯(cuò)誤(Dabort),保留,以及IRQ,FIQ等。注意這里的值必須與uclinux的vector_base一致。這就是說如果uclinux中vector_base(在include/armnommu/proc-armv/system.h)定義為0 x0c000000,則HandleUndef應(yīng)該在0 x0c000004。breset/forde

8、bugldrpc,=HandleUndefldrpc,=HandleSWIldrpc,=HandlePabortldrpc,=HandleDabortb.ldrpc,=HandleIRQldrpc,=HandleFIQldrpc,=HandleEINT0/*mGAH/Winterruptvectortable*/ldrpc,=HandleEINT1ldrpc,=HandleEINT2ldrpc,=HandleEINT3ldrpc,=HandleEINT4567ldrpc,=HandleTICK/*mGA*/b.b.ldrpc,=HandleZDMA0/*mGB*/ldrpc,=HandleZD

9、MA1ldrpc,=HandleBDMA0ldrpc,=HandleBDMA1ldrpc,=HandleWDTldrpc,=HandleUERR01/*mGB*/b.b.ldrpc,=HandleTIMER0/*mGC*/ldrpc,=HandleTIMER1ldrpc,=HandleTIMER2ldrpc,=HandleTIMER3ldrpc,=HandleTIMER4ldrpc,=HandleTIMER5/*mGC*/b.b.ldrpc,=HandleURXD0/*mGD*/ldrpc,=HandleURXD1ldrpc,=HandleIICldrpc,=HandleSIOldrpc,=H

10、andleUTXD0ldrpc,=HandleUTXD1/*mGD*/b.b.ldrpc,=HandleRTC/*mGKA*/b.b.b.b.b./*mGKA*/b.b.ldrpc,=HandleADC/*mGKB*/b.b.b.b.b./*mGKB*/b.b.ldrpc,=EnterPWDN作為對(duì)照:請(qǐng)看以上標(biāo)記的值:.equHandleReset,0 xc000000.equHandleUndef,0 xc000004.equHandleSWI,0 xc000008.equHandlePabort,0 xc00000c.equHandleDabort,0 xc000010.equHandl

11、eReserved,0 xc000014.equHandleIRQ,0 xc000018.equHandleFIQ,0 xc00001c/*thevalueisdifferentwithanaddressyouthinkitmaybe.*IntVectorTable*/.equHandleADC,0 xc000020.equHandleRTC,0 xc000024.equHandleUTXD1,0 xc000028.equHandleUTXD0,0 xc00002c.equHandleSIO,0 xc000030.equHandleIIC,0 xc000034.equHandleURXD1,0

12、 xc000038.equHandleURXD0,0 xc00003c.equHandleTIMER5,0 xc000040.equHandleTIMER4,0 xc000044.equHandleTIMER3,0 xc000048.equHandleTIMER2,0 xc00004c.equHandleTIMER1,0 xc000050.equHandleTIMER0,0 xc000054.equHandleUERR01,0 xc000058.equHandleWDT,0 xc00005c.equHandleBDMA1,0 xc000060.equHandleBDMA0,0 xc000064

13、.equHandleZDMA1,0 xc000068.equHandleZDMA0,0 xc00006c.equHandleTICK,0 xc000070.equHandleEINT4567,0 xc000074.equHandleEINT3,0 xc000078.equHandleEINT2,0 xc00007c.equHandleEINT1,0 xc000080.equHandleEINT0,0 xc0000843)初始化CPU相關(guān)的pll,clock,中斷控制寄存器依次為關(guān)閉watchdogtimer,關(guān)閉中斷,設(shè)置LockTime,PLL(phaselockloop),以及時(shí)鐘。這些值

14、(除了LOCKTIME)都可從Samsung44b0的手冊(cè)中查到。ldrr0,WTCON/watchdogdisableldrr1,=0 x0strr1,r0ldrr0,INTMSKldrr1,MASKALL/allinterruptdisablestrr1,r0/*Setclockcontrolregisters*/ldrr0,LOCKTIMEldrr1,=800/count=t_lock*Fin(t_lock=200us,Fin=4MHz)=800strr1,r0ldrr0,PLLCON/*temporarysettingofPLL*/ldrr1,PLLCON_DAT/*Fin=10MHz

15、,Fout=40MHzor60MHz*/strr1,r0ldrr0,CLKCONldrr1,=0 x7ff8/AllunitblockCLKenablestrr1,r04)初始化內(nèi)存控制器內(nèi)存控制器,主要通過設(shè)置13個(gè)從1c80000開始的寄存器來設(shè)置,包括總線寬度,8個(gè)內(nèi)存bank,bank大小,sclk,以及兩個(gè)bankmode。/*Setmemorycontrolregisters*/memsetup:adrr0,SMRDATAldmiar0,r1-r13ldrr0,=0 x01c80000/BWSCONAddressstmiar0,r1-r135)將rom中的程序復(fù)制到RAM中首先利用

16、PC取得bootloader在flash的起始地址,再通過標(biāo)號(hào)之差計(jì)算出這個(gè)程序代碼的大小。這些標(biāo)號(hào),編譯器會(huì)在連接(link)的時(shí)候生成正確的分布的值。取得正確信息后,通過寄存器(r3到r10)做為復(fù)制的中間媒介,將代碼復(fù)制到RAM中。relocate:/*relocatearmboottoRAM*/adrr0,_start/*r0-currentpositionofcode*/ldrr2,_armboot_startldrr3,_armboot_endsubr2,r3,r2/*r2-sizeofarmboot*/ldrr1,_TEXT_BASE/*r1-destinationaddress

17、*/addr2,r0,r2/*r2baudrate)+0.5)-1)計(jì)算得出。這可以在手冊(cè)中查到。其他的函數(shù)包括發(fā)送,接收。這個(gè)時(shí)候沒有中斷,是通過循環(huán)等待來判斷是否動(dòng)作完成。例如,接收函數(shù):while(!(rUTRSTAT0&0 x1);/ReceivedatareadreturnRdURXH0();2.時(shí)鐘部分實(shí)現(xiàn)了延時(shí)函數(shù)udelay。這里的get_timer由于沒有使用中斷,是使用全局變量來累加的。3.flash部分flash作為內(nèi)存的一部分,讀肯定沒有問題,關(guān)鍵是flash的寫部分。Flash的寫必須先擦除,然后再寫。unsignedlongflash_init(void)inti;

18、u16manId,devId;/firstweinititasunknown,evenifyouforgetassignitbelow,itsnotaproblemfor(i=0;iCFG_MAX_FLASH_BANKS;+i)flash_infoi.flash_id=FLASH_UNKNOWN;flash_infoi.sector_count=CFG_MAX_FLASH_SECT;/*checkmanId,devId*/_RESET();_WR(0 x555,0 xaa);_WR(0 x2aa,0 x55);_WR(0 x555,0 x90);manId=_RD(0 x0);_WR(0 x5

19、55,0 xaa);_WR(0 x2aa,0 x55);_WR(0 x555,0 x90);devId=_RD(0 x1);_RESET();printf(flashn);printf(ManufactureID=%4x(0 x0004),DeviceID(0 x22c4)=%4xn,manId,devId);if(manId!=0 x0004&devId!=0 x22c4)printf(flashcheckfaliluren);return0;elsefor(i=0;i=CFG_FLASH_BASE/onitorprotectionONbydefaultflash_protect(FLAG_

20、PROTECT_SET,CFG_MONITOR_BASE,CFG_MONITOR_BASE+monitor_flash_len-1,&flash_info0);#endif*/flash_info0.size=PHYS_FLASH_SIZE;return(PHYS_FLASH_SIZE);flash_init完成初始化部分,這里的主要目的是檢驗(yàn)flash的型號(hào)是否正確。intflash_erase(flash_info_t*info,ints_first,ints_last)volatileunsignedchar*addr=(volatileunsignedchar*)(info-start

21、0);intflag,prot,sect,l_sect;/ulongstart,now,last;u32targetAddr;u32targetSize;/*zyynote:Itisrequiredandcantbeomitted*/rNCACHBE0=(0 x200000012)12);/flasharea(Bank0)mustbenon-cachablearea.rSYSCFG=rSYSCFG&(0 x8);/writebufferhastobeoffforpropertiming.if(s_firsts_last)if(info-flash_id=FLASH_UNKNOWN)printf

22、(-missingn);elseprintf(-nosectorstoerasen);return1;if(info-flash_id=FLASH_UNKNOWN)|(info-flash_idFLASH_AMD_COMP)printf(Canteraseunknownflashtype-abortedn);return1;prot=0;for(sect=s_first;sectprotectsect)prot+;if(prot)printf(-Warning:%dprotectedsectorswillnotbeerased!n,prot);elseprintf(n);l_sect=-1;/*Disableinterruptswhichmightcauseatimeouthere*/flag=disable_interrupts();/*Starteraseonunprotectedsectors*/for(sect=s_first;sectprotectsect=0)/*notprotected*/targetAddr=0 x10000*sect;if(targetAddr0 x1F0000)targetSize=0 x10000;elseif(targetA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論