Uboot移植步驟詳解_第1頁
Uboot移植步驟詳解_第2頁
Uboot移植步驟詳解_第3頁
Uboot移植步驟詳解_第4頁
Uboot移植步驟詳解_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1 U-Boot簡介U-Boot,全稱Universal Boot Loader,是遵循GPL條款的開放源碼項(xiàng)目。從FADSROM、8xxROM、PPCBOOT逐步發(fā)展演化而來。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是相應(yīng)的Linux內(nèi)核源程序的簡化,尤其是一些設(shè)備的驅(qū)動(dòng)程序,這從U-Boot源碼的注釋中能體現(xiàn)這一點(diǎn)。但是U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo),當(dāng)前,它還支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)是OpenBSD, NetBSD, FreeBSD

2、,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。這是U-Boot中Universal的一層含義,另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持MIPS、x86、ARM、NIOS、XScale等諸多常用系列的處理器。這兩個(gè)特點(diǎn)正是U-Boot項(xiàng)目的開發(fā)目標(biāo),即支持盡可能多的嵌入式處理器和嵌入式操作系統(tǒng)。就目前來看,U-Boot對(duì)PowerPC系列處理器支持最為豐富,對(duì)Linux的支持最完善。其它系列的處理器和操作系統(tǒng)基

3、本是在2002年11月PPCBOOT改名為U-Boot后逐步擴(kuò)充的。從PPCBOOT向U-Boot的順利過渡,很大程度上歸功于U-Boot的維護(hù)人德國DENX軟件工程中心Wolfgang Denk以下簡稱W.D本人精湛專業(yè)水平和持著不懈的努力。當(dāng)前,U-Boot項(xiàng)目正在他的領(lǐng)軍之下,眾多有志于開放源碼BOOT LOADER移植工作的嵌入式開發(fā)人員正如火如荼地將各個(gè)不同系列嵌入式處理器的移植工作不斷展開和深入,以支持更多的嵌入式操作系統(tǒng)的裝載與引導(dǎo)。選擇U-Boot的理由: 開放源碼; 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS

4、, LynxOS; 支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale; 較高的可靠性和穩(wěn)定性; 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等; 豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等; 較為豐富的開發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持;2 U-Boot主要目錄結(jié)構(gòu)- board 目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動(dòng);- common 獨(dú)立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測;- cpu 與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、L

5、CD驅(qū)動(dòng)及中斷初始化等文件;- driver 通用設(shè)備驅(qū)動(dòng),如CFI FLASH驅(qū)動(dòng)(目前對(duì)INTEL FLASH支持較好)- doc U-Boot的說明文檔;- examples可在U-Boot下運(yùn)行的示例程序;如hello_world.c,timer.c;- include U-Boot頭文件;尤其configs子目錄下與目標(biāo)板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件;- lib_xxx 處理器體系相關(guān)的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;- net 與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;- post 上電

6、自檢文件目錄。尚有待于進(jìn)一步完善;- rtc RTC驅(qū)動(dòng)程序;- tools 用于創(chuàng)建U-Boot S-RECORD和BIN鏡像文件的工具; 3 U-Boot支持的主要功能U-Boot可支持的主要功能列表系統(tǒng)引導(dǎo) 支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng)支持NFS掛載、從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核;基本輔助功能 強(qiáng)大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤對(duì)Linux支持最為強(qiáng)勁;支持目標(biāo)板環(huán)境參數(shù)多種存儲(chǔ)方式,如FLASH、NVRAM、EEPROM;CRC32校驗(yàn),可校驗(yàn)FLASH中內(nèi)核、RAM

7、DISK鏡像文件是否完好;設(shè)備驅(qū)動(dòng) 串口、SDRAM、FLASH、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動(dòng)支持;上電自檢功能 SDRAM、FLASH大小自動(dòng)檢測;SDRAM故障檢測;CPU型號(hào);特殊功能 XIP內(nèi)核引導(dǎo);4 移植前的準(zhǔn)備(1)、首先讀讀uboot自帶的readme文件,了解了一個(gè)大概。(2)、看看common.h,這個(gè)文件定義了一些基本的東西,并包含了一些必要的頭文件。再看看flash.h,這個(gè)文件里面定義了flash_info_t為一個(gè)struct。包含了flash的一些屬性定義。并且定義了所有的flash的屬性,其中,AMD

8、的有:AMD_ID_LV320B,定義為“#define AMD_ID_LV320B 0x22F922F9”。(3)、對(duì)于“./borad/at91rm9200dk/flash.c”的修改,有以下的方面:“void flash_identification(flash_info_t *info)”這個(gè)函數(shù)的目的是確認(rèn)flash的型號(hào)。注意的是,這個(gè)函數(shù)里面有一些宏定義,直接讀寫了flash。并獲得ID號(hào)。(4)、修改:”./board/at91rm9200dk/config.mk”為TEXT_BASE=0x21f80000 為TEXT_BASE=0x21f00000 (當(dāng)然,你應(yīng)該根據(jù)自己的板

9、子來修改,和一級(jí)boot的定義的一致即可)。(5)、再修改”./include/configs/at91rm9200dk.h”為修改flash和SDRAM的大小。(6)、另外一個(gè)要修改的文件是:./borad/at91rm9200dk/flash.c。這個(gè)文件修改的部分比較的多。       a 首先是OrgDef的定義,加上目前的flash。       b 接下來,修改”#define FLASH_BANK_SIZE 0x200000”為自己flash的  容量

10、       c 在修改函數(shù)flash_identification(flash_info_t * info)里面的打印信息,這部分將在u-boot啟動(dòng)的時(shí)候顯示。       d 然后修改函數(shù)flash_init(void)里面對(duì)一些變量的賦值。       e 最后修改的是函數(shù)flash_print_info(flash_info_t * info)里面實(shí)際打印的函數(shù)信息。   &#

11、160;   f 還有一個(gè)函數(shù)需要修改,就是:“flash_erase”,這個(gè)函數(shù)要檢測先前知道的flash類型是否匹配,否則,直接就返回了。把這里給注釋掉。(7)、接下來看看SDRAM的修改。這個(gè)里面對(duì)于“SIZE”的定義都是基于字節(jié)計(jì)算的。只要修改”./include/configs/at91rm9200dk.h”里面的“#define PHYS_SDRAM_SIZE 0X200000”就可以了。注意,SIZE是以字節(jié)為單位的。(8)、還有一個(gè)地方要注意就是按照目前的設(shè)定,一級(jí)boot把u_boot加載到了SDRAM的空間為:21F00000 -> 21F16B1

12、0,這恰好是SDRAM的高端部分。另外,BSS為21F1AE34。(9)、編譯后,可以寫入flash了。     a 壓縮這個(gè)u-boot.bin“gzip c u-boot.bin > u-boot.gz”壓縮后的文件大小為:43Kbytes      b 接著把boot.bin和u-boot.gz燒到flash里面去。Boot.bin大約11kBytes,在flash的0x1000 0000 0x1000 3fff 5 U-Boot移植過程 獲得發(fā)布的最新版本U-Boot源碼,與Lin

13、ux內(nèi)核源碼類似,也是 bzip2的壓縮格式??蓮腢-Boot的官方網(wǎng)站上獲得; 閱讀相關(guān)文檔,主要是U-Boot源碼根目錄下的README文檔和U-Boot官方網(wǎng)站的DULG(The DENX U-Boot and Linux Guide)文檔。尤其是DULG文檔,從如何安裝建立交叉開發(fā)環(huán)境和解決U-Boot移植中常見問題都一一給出詳盡的說明; 訂閱U-Boot用戶郵件列表。在移植U-Boot過程中遇有問題,在參考相關(guān)文檔和搜索U-Boot-User郵件檔案庫仍不能解決的情況下,第一時(shí)間提交所遇到的這些問題,眾多熱心的U-Boot開發(fā)人員會(huì)樂于迅速排查問題,而且很有可能,W.D本人會(huì)直接參與

14、指導(dǎo); 在建立的開發(fā)環(huán)境下進(jìn)行移植工作。絕大多數(shù)的開發(fā)環(huán)境是交叉開發(fā)環(huán)境。在這方面,DENX 和MontaVista均提供了完整的開發(fā)工具集; 在目標(biāo)板與開發(fā)主機(jī)間接入硬件調(diào)試器。這是進(jìn)行U-Boot移植應(yīng)當(dāng)具備且非常關(guān)鍵的調(diào)試工具。因?yàn)樵谡麄€(gè)U-Boot的移植工作中,尤其是初始階段,硬件調(diào)試器是我們了解目標(biāo)板真實(shí)運(yùn)行狀態(tài)的唯一途徑。在這方面,W.D本人和眾多嵌入式開發(fā)人員傾向于使用BDI2000。一方面,其價(jià)格不如ICE調(diào)試器昂貴,同時(shí)其可靠性高,功能強(qiáng)大,完全能勝任移植和調(diào)試U-Boot。另外,網(wǎng)上也有不少關(guān)于BDI2000調(diào)試方面的參考文檔。 如果在參考開發(fā)板上移植U-Boot,可能需要

15、移除目標(biāo)板上已有的BOOT LOADER??梢愿鶕?jù)板上BOOT LOADER的說明文檔,先著手解決在移除當(dāng)前BOOT LOADER的情況下,如何進(jìn)行恢復(fù)。以便今后在需要場合能重新裝入原先的BOOT LOADER。6. U-Boot移植方法當(dāng)前,對(duì)于U-Boot的移植方法,大致分為兩種。一種是先用BDI2000創(chuàng)建目標(biāo)板初始運(yùn)行環(huán)境,將U-Boot鏡像文件u-boot.bin下載到目標(biāo)板RAM中的指定位置,然后,用BDI2000進(jìn)行跟蹤調(diào)試。其好處是不用將U-Boot鏡像文件燒寫到FLASH中去。但弊端在于對(duì)移植開發(fā)人員的移植調(diào)試技能要求較高,BDI2000的配置文件較為復(fù)雜。另外一種

16、方法是用BDI2000先將U-Boot鏡像文件燒寫到FLASH中去,然后利用GDB和BDI2000進(jìn)行調(diào)試。這種方法所用BDI2000的配置文件較為簡單,調(diào)試過程與U-Boot移植后運(yùn)行過程相吻合,即U-Boot先從FLASH中運(yùn)行,再重載至RAM中相應(yīng)位置,并從那里正式投入運(yùn)行。唯一感到有些麻煩的就是需要不斷燒寫FLASH。但考慮到FLASH常規(guī)擦寫次數(shù)基本為10萬次左右,作為移植U-Boot,不會(huì)占用太多的次數(shù),應(yīng)該不會(huì)為FLASH燒寫有什么擔(dān)憂。同時(shí),W. D本人也極力推薦使用后一種方法。筆者建議,除非U-Boot移植資深人士或有強(qiáng)有力的技術(shù)支持,建議采用第二種移植方法。7. 

17、U-Boot移植主要修改的文件從移植U-Boot最小要求U-Boot能正常啟動(dòng)的角度出發(fā),主要考慮修改如下文件: <目標(biāo)板>.h頭文件,如include/configs/RPXlite.h。可以是U-Boot源碼中已有的目標(biāo)板頭文件,也可以是新命名的配置頭文件;大多數(shù)的寄存器參數(shù)都是在這一文件中設(shè)置完成的; <目標(biāo)板>.c文件,如board/RPXlite/RPXlite.c。它是SDRAM的驅(qū)動(dòng)程序,主要完成SDRAM的UPM表設(shè)置,上電初始化。 FLASH的驅(qū)動(dòng)程序,如board/RPXlite/flash.c,或common/cfi_flash.c??稍趨⒖家延蠪

18、LASH驅(qū)動(dòng)的基礎(chǔ)上,結(jié)合目標(biāo)板FLASH數(shù)據(jù)手冊,進(jìn)行適當(dāng)修改; 串口驅(qū)動(dòng),如修改cpu/mpc8xx/serial.c串口收發(fā)器芯片使能部分。8. U-Boot移植要點(diǎn) BDI2000的配置文件。如果采用第二種移植方法,即先燒入FLASH的方法,配置項(xiàng)只需很少幾個(gè),就可以進(jìn)行U-Boot的燒寫與調(diào)試了。對(duì)PPC 8xx系列的主板,可參考DULG文檔中TQM8xx的配置文件進(jìn)行相應(yīng)的修改。下面,筆者以美國Embedded Planet公司的RPXlite DW板為例,給出在嵌入式Linux交叉開發(fā)環(huán)境下的BDI2000參考配置文件以作參考:; bdiGDB configuratio

19、n file for RPXlite DW or LITE_DW; -INIT; init core registerWSPR 149 0x2002000F ;DER : set debug enable register; WSPR 149 0x2006000F ;DER : enable SYSIE for BDI flash programWSPR 638 0xFA200000 ;IMMR : internal memory at 0xFA200000WM32 0xFA200004 0xFFFFFF89 ;SYPCRTARGETCPUCLOCK 40000000 ;the CPU clo

20、ck rate after processing the init listBDIMODE AGENT ;the BDI working mode (LOADONLY | AGENT)BREAKMODE HARD ;SOFT or HARD, HARD uses PPC hardware breakpointsHOSTIP FILE uImage.litedw FORMAT BINLOAD MANUAL ;load code MANUAL or AUTO after resetDEBUGPORT 2001START 0x0100FLASHCHIPTYPE AM29BX8

21、 ;Flash type (AM29F | AM29BX8 | AM29BX16 | I28BX8 | I28BX16)CHIPSIZE 0x400000 ;The size of one flash chip in bytesBUSWIDTH 32 ;The width of the flash memory bus in bits (8 | 16 | 32)WORKSPACE 0xFA202000 ; RAM buffer for fast flash programmingFILE u-boot.bin ;The file to programFORMAT BIN 0x00000000E

22、RASE 0x00000000 BLOCKERASE 0x00008000 BLOCKERASE 0x00010000 BLOCKERASE 0x00018000 BLOCKREGSDMM1 0xFA200000FILE reg823.def U-Boot移植參考板。這是進(jìn)行U-Boot移植首先要明確的??梢愿鶕?jù)目標(biāo)板上CPU、FLASH、SDRAM的情況,以盡可能相一致為原則,先找出一個(gè)與所移植目標(biāo)板為同一個(gè)或同一系列處理器的U-Boot支持板為移植參考板。如RPXlite DW板可選擇U-Boot源碼中RPXlite板作為U-Boot移植參考板。對(duì)U-Boot移植新手,建議依照循序漸進(jìn)的原

23、則,目標(biāo)板文件名暫時(shí)先用移植參考板的名稱,在逐步熟悉U-Boot移植基礎(chǔ)上,再考慮給目標(biāo)板重新命名。在實(shí)際移植過程中,可用Linux命令查找移植參考板的特定代碼,如grep r RPXlite ./ 可確定出在U-Boot中與RPXlite板有關(guān)的代碼,依此對(duì)照目標(biāo)板實(shí)際進(jìn)行屏蔽或修改。同時(shí)應(yīng)不局限于移植參考板中的代碼,要廣泛借鑒U-Boot中已有的代碼更好地實(shí)現(xiàn)一些具體的功能。 U-Boot燒寫地址。不同目標(biāo)板,對(duì)U-Boot在FLASH中存放地址要求不盡相同。事實(shí)上,這是由處理器中斷復(fù)位向量來決定的,與主板硬件相關(guān),對(duì)MPC8xx主板來講,就是由硬件配置字(HRCW)決定的。也就是說,U-

24、Boot燒寫具體位置是由硬件決定的,而不是程序設(shè)計(jì)來選擇的。程序中相應(yīng)U-Boot起始地址必須與硬件所確定的硬件復(fù)位向量相吻合;如RPXlite DW板的中斷復(fù)位向量設(shè)置為0x00000100。因此, U-Boot 的BIN鏡像文件必須燒寫到FLASH的起始位置。事實(shí)上,大多數(shù)的PPC系列的處理器中斷復(fù)位向量是0x00000100和0xfff00100。這也是一般所說的高位啟動(dòng)和低位啟動(dòng)的BOOT LOADER所在位置。可通過修改U-Boot源碼<目標(biāo)板>.h頭文件中CFG_MONITOR_BASE 和board/<目標(biāo)板>/config.mk中的TEXT_BASE的設(shè)

25、置來與硬件配置相對(duì)應(yīng)。 CPU寄存器參數(shù)設(shè)置。根據(jù)處理器系列、類型不同,寄存器名稱與作用有一定差別。必須根據(jù)目標(biāo)板的實(shí)際,進(jìn)行合理配置。一個(gè)較為可行和有效的方法,就是借鑒參考移植板的配置,再根據(jù)目標(biāo)板實(shí)際,進(jìn)行合理修改。這是一個(gè)較費(fèi)功夫和考驗(yàn)?zāi)土Φ倪^程,需要仔細(xì)對(duì)照處理器各寄存器定義、參考設(shè)置、目標(biāo)板實(shí)際作出選擇并不斷測試。MPC8xx處理器較為關(guān)鍵的寄存器設(shè)置為SIUMCR、PLPRCR、SCCR、BRx、ORx。 串口調(diào)試。能從串口輸出信息,即使是亂碼,也可以說U-Boot移植取得了實(shí)質(zhì)性突破。依據(jù)筆者調(diào)試經(jīng)歷,串口是否有輸出,除了與串口驅(qū)動(dòng)相關(guān)外,還與FLASH相關(guān)的寄存器設(shè)置有關(guān)。因?yàn)?/p>

26、U-Boot是從FLASH中被引導(dǎo)啟動(dòng)的,如果FLASH設(shè)置不正確,U-Boot代碼讀取和執(zhí)行就會(huì)出現(xiàn)一些問題。因此,還需要就FLASH的相關(guān)寄存器設(shè)置進(jìn)行一些參數(shù)調(diào)試。同時(shí),要注意串口收發(fā)芯片相關(guān)引腳工作波形。依據(jù)筆者調(diào)試情況,如果串口無輸出或出現(xiàn)亂碼,一種可能就是該芯片損壞或工作不正常。 與啟動(dòng) FLASH相關(guān)的寄存器BR0、OR0的參數(shù)設(shè)置。應(yīng)根據(jù)目標(biāo)板FLASH的數(shù)據(jù)手冊與BR0和OR0的相關(guān)位含義進(jìn)行合理設(shè)置。這不僅關(guān)系到FLASH能否正常工作,而且與串口調(diào)試有直接的關(guān)聯(lián)。 關(guān)于CPLD電路。目標(biāo)板上是否有CPLD電路絲毫不會(huì)影響U-Boot的移植與嵌入式操作系統(tǒng)的正常運(yùn)行。事實(shí)上,

27、CPLD電路是一個(gè)集中將板上電路的一些邏輯關(guān)系可編程設(shè)置的一種實(shí)現(xiàn)方法。其本身所起的作用就是實(shí)現(xiàn)一些目標(biāo)板所需的脈沖信號(hào)和電路邏輯,其功能完全可以用一些邏輯電路與CPU口線來實(shí)現(xiàn)。 SDRAM的驅(qū)動(dòng)。串口能輸出以后,U-Boot移植是否順利基本取決于SDRAM的驅(qū)動(dòng)是否正確。與串口調(diào)試相比,這部分工作更為核心,難度更大。MPC8xx目標(biāo)板SDRAM驅(qū)動(dòng)涉及三部分。一是相關(guān)寄存器的設(shè)置;二是UPM表;三是SDRAM上電初始化過程。任何一部分有問題,都會(huì)影響U-Boot、嵌入式操作系統(tǒng)甚至應(yīng)用程序的穩(wěn)定、可靠運(yùn)行。所以說,SDRAM的驅(qū)動(dòng)不僅關(guān)系到U-Boot本身能否正常運(yùn)行,而且還與后續(xù)部分相關(guān)

28、,是相當(dāng)關(guān)鍵的部分。 補(bǔ)充功能的添加。在獲得一個(gè)能工作的U-Boot后,就可以根據(jù)目標(biāo)板和實(shí)際開發(fā)需要,添加一些其它功能支持。如以太網(wǎng)、LCD、NVRAM等。與串口和SDRAM調(diào)試相比,在已有基礎(chǔ)之上,這些功能添加還是較為容易的。大多只是在參考現(xiàn)有源碼的基礎(chǔ)上,進(jìn)行一些修改和配置。另外,如果在自主設(shè)計(jì)的主板上移植U-Boot,那么除了考慮上述軟件因素以外,還需要排查目標(biāo)板硬件可能存在的問題。如原理設(shè)計(jì)、PCB布線、元件好壞。在移植過程中,敏銳判斷出故障態(tài)是硬件還是軟件問題,往往是關(guān)系到項(xiàng)目進(jìn)度甚至移植成敗的關(guān)鍵,相應(yīng)難度會(huì)增加許多。     &

29、#160;  下面以移植u-boot 到44B0開發(fā)板的步驟為例,移植中上僅需要修改和硬件相關(guān)的部分。在代碼結(jié)構(gòu)上:1) 在board 目錄下創(chuàng)建ev44b0ii 目錄,創(chuàng)建ev44b0ii.c 以及flash.c,memsetup.S,u-boot.lds等。不需要從零開始,可選擇一個(gè)相似的目錄,直接復(fù)制過來,修改文件名以及內(nèi)容。我在移植u-boot 過程中,選擇的是ep7312 目錄。由于u-boot 已經(jīng)包含基于s3c24b0 的開發(fā)板目錄,作為參考,也可以復(fù)制相應(yīng)的目錄。2) 在cpu 目錄下創(chuàng)建arm7tdmi 目錄,主要包含start.S,interrupts.c 以及c

30、pu.c,serial.c幾個(gè)文件。同樣不需要從零開始建立文件,直接從arm720t 復(fù)制,然后修改相應(yīng)內(nèi)容。3) 在include/configs 目錄下添加ev44b0ii.h,在這里放上全局的宏定義等。4) 找到u-boot 根目錄下Makefile 修改加入ev44b0ii_config : unconfig./mkconfig $(:_config=) arm arm7tdmi ev44b0ii5) 運(yùn)行make ev44bii_config,如果沒有錯(cuò)誤就可以開始硬件相關(guān)代碼移植的工作3. u-boot 的體系結(jié)構(gòu)1) 總體結(jié)構(gòu)u-boot 是一個(gè)層次式結(jié)構(gòu)。從上圖也可以看出,做移

31、植工作的軟件人員應(yīng)當(dāng)提供串口驅(qū)動(dòng)(UART Driver),以太網(wǎng)驅(qū)動(dòng)(Ethernet Driver),Flash 驅(qū)動(dòng)(Flash 驅(qū)動(dòng)),USB 驅(qū)動(dòng)(USB Driver)。目前,通過USB 口下載程序顯得不是十分必要,所以暫時(shí)沒有移植USB 驅(qū)動(dòng)。驅(qū)動(dòng)層之上是u-boot 的應(yīng)用,command 通過串口提供人機(jī)界面。我們可以使用一些命令做一些常用的工作,比如內(nèi)存查看命令md。Kermit 應(yīng)用主要用來支持使用串口通過超級(jí)終端下載應(yīng)用程序。TFTP 則是通過網(wǎng)絡(luò)方式來下載應(yīng)用程序,例如uclinux 操作系統(tǒng)。2) 內(nèi)存分布在flash rom 中內(nèi)存分布圖ev44b0ii 的fla

32、sh 大小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)代碼搬移到DRAM 中運(yùn)行。下圖給出u-boot 的代碼在DRAM中的位置。引導(dǎo)代碼u-boot 將從0x0000 0000 處搬移到0x0C700000 處。特別注意的由于ev44b0ii uclinux 中斷向

33、量程序地址在0x0c00 0000 處,所以不能將程序下載到0x0c00 0000 出,通常下載到0x0c08 0000 處。4. start.S 代碼結(jié)構(gòu)1) 定義入口一個(gè)可執(zhí)行的Image 必須有一個(gè)入口點(diǎn)并且只能有一個(gè)唯一的全局入口,通常這個(gè)入口放在Rom(flash)的0x0 地址。例如start.S 中的.globl _start_start:值得注意的是你必須告訴編譯器知道這個(gè)入口,這個(gè)工作主要是修改連接器腳本文件(lds)。2) 設(shè)置異常向量(Exception Vector)異常向量表,也可稱為中斷向量表,必須是從0 地址開始,連續(xù)的存放。如下面的就包括了復(fù)位(reset),未

34、定義處理(undef),軟件中斷(SWI),預(yù)去指令錯(cuò)誤(Pabort),數(shù)據(jù)錯(cuò)誤(Dabort),保留,以及IRQ,FIQ 等。注意這里的值必須與uclinux 的vector_base 一致。這就是說如果uclinux 中vector_base(include/armnommu/proc-armv/system.h)定義為0x0c00 0000,則HandleUndef 應(yīng)該在0x0c00 0004。b reset /for debugldr pc,=HandleUndefldr pc,=HandleSWIldr pc,=HandlePabortldr pc,=HandleDabortb

35、.ldr pc,=HandleIRQldr pc,=HandleFIQldr pc,=HandleEINT0 /*mGA H/W interrupt vector table*/ldr pc,=HandleEINT1ldr pc,=HandleEINT2ldr pc,=HandleEINT3ldr pc,=HandleEINT4567ldr pc,=HandleTICK /*mGA*/b .b .ldr pc,=HandleZDMA0 /*mGB*/ldr pc,=HandleZDMA1ldr pc,=HandleBDMA0ldr pc,=HandleBDMA1ldr pc,=HandleWD

36、Tldr pc,=HandleUERR01 /*mGB*/b .b .ldr pc,=HandleTIMER0 /*mGC*/ldr pc,=HandleTIMER1ldr pc,=HandleTIMER2ldr pc,=HandleTIMER3ldr pc,=HandleTIMER4ldr pc,=HandleTIMER5 /*mGC*/b .b .ldr pc,=HandleURXD0 /*mGD*/ldr pc,=HandleURXD1ldr pc,=HandleIICldr pc,=HandleSIOldr pc,=HandleUTXD0ldr pc,=HandleUTXD1 /*mG

37、D*/b .b .ldr pc,=HandleRTC /*mGKA*/b .b .b .b .b . /*mGKA*/b .b .ldr pc,=HandleADC /*mGKB*/b .b .b .b .b . /*mGKB*/b .b .ldr pc,=EnterPWDN作為對(duì)照:請(qǐng)看以上標(biāo)記的值:.equ HandleReset, 0xc000000.equ HandleUndef,0xc000004.equ HandleSWI, 0xc000008.equ HandlePabort, 0xc00000c.equ HandleDabort, 0xc000010.equ HandleRes

38、erved, 0xc000014.equ HandleIRQ, 0xc000018.equ HandleFIQ, 0xc00001c/*the value is different with an address you think it may be.*IntVectorTable */.equ HandleADC, 0xc000020.equ HandleRTC, 0xc000024.equ HandleUTXD1, 0xc000028.equ HandleUTXD0, 0xc00002c.equ HandleSIO, 0xc000030.equ HandleIIC, 0xc000034.

39、equ HandleURXD1, 0xc000038.equ HandleURXD0, 0xc00003c.equ HandleTIMER5, 0xc000040.equ HandleTIMER4, 0xc000044.equ HandleTIMER3, 0xc000048.equ HandleTIMER2, 0xc00004c.equ HandleTIMER1, 0xc000050.equ HandleTIMER0, 0xc000054.equ HandleUERR01, 0xc000058.equ HandleWDT, 0xc00005c.equ HandleBDMA1, 0xc00006

40、0.equ HandleBDMA0, 0xc000064.equ HandleZDMA1, 0xc000068.equ HandleZDMA0, 0xc00006c.equ HandleTICK, 0xc000070.equ HandleEINT4567, 0xc000074.equ HandleEINT3, 0xc000078.equ HandleEINT2, 0xc00007c.equ HandleEINT1, 0xc000080.equ HandleEINT0, 0xc0000843) 初始化CPU 相關(guān)的pll,clock,中斷控制寄存器依次為關(guān)閉watch dog timer,關(guān)閉中

41、斷,設(shè)置LockTime,PLL(phase lock loop),以及時(shí)鐘。這些值(除了LOCKTIME)都可從Samsung 44b0 的手冊中查到。ldr r0,WTCON /watch dog disableldr r1,=0x0str r1,r0ldr r0,INTMSKldr r1,MASKALL /all interrupt disablestr r1,r0/* Set clock control registers */ldr r0,LOCKTIMEldr r1,=800 / count = t_lock * Fin (t_lock=200us, Fin=4MHz) = 800

42、str r1,r0ldr r0,PLLCON /*temporary setting of PLL*/ldr r1,PLLCON_DAT /*Fin=10MHz,Fout=40MHz or 60MHz*/str r1,r0ldr r0,CLKCONldr r1,=0x7ff8 /All unit block CLK enablestr r1,r04) 初始化內(nèi)存控制器內(nèi)存控制器,主要通過設(shè)置13 個(gè)從1c80000 開始的寄存器來設(shè)置,包括總線寬度,8 個(gè)內(nèi)存bank,bank 大小,sclk,以及兩個(gè)bank mode。/* Set memory control registers */me

43、msetup:adr r0,SMRDATAldmia r0,r1-r13ldr r0,=0x01c80000 /BWSCON Addressstmia r0,r1-r135) 將rom 中的程序復(fù)制到RAM 中首先利用PC 取得bootloader 在flash 的起始地址,再通過標(biāo)號(hào)之差計(jì)算出這個(gè)程序代碼的大小。這些標(biāo)號(hào),編譯器會(huì)在連接(link)的時(shí)候生成正確的分布的值。取得正確信息后,通過寄存器(r3 到r10)做為復(fù)制的中間媒介,將代碼復(fù)制到RAM 中。relocate:/* relocate armboot to RAM*/adr r0, _start /* r0 <- cur

44、rent position of code */ldr r2, _armboot_startldr r3, _armboot_endsub r2, r3, r2 /* r2 <- size of armboot */ldr r1, _TEXT_BASE /* r1 <- destination address */add r2, r0, r2 /* r2 <- source end address */* r0 = source address* r1 = target address* r2 = source end address*/copy_loop:ldmia r0!

45、, r3-r10stmia r1!, r3-r10cmp r0, r2ble copy_loop6) 初始化堆棧進(jìn)入各種模式設(shè)置相應(yīng)模式的堆棧。InitStacks:/*Don't use DRAM,such as stmfd,ldmfd.SVCstack is initialized before*/mrs r0,cpsrbic r0,r0,#0X1Forr r1,r0,#0xDB /*UNDEFMODE|NOINT*/msr cpsr,r1 /*UndefMode*/ldr sp,UndefStackorr r1,r0,#0XD7 /*ABORTMODE|NOINT*/msr cp

46、sr,r1 /*AbortMode*/ldr sp,AbortStackorr r1,r0,#0XD2 /*IRQMODE|NOINT*/msr cpsr,r1 /*IRQMode*/ldr sp,IRQStackorr r1,r0,#0XD1 /*FIQMODE|NOINT*/msr cpsr,r1 /*FIQMode*/ldr sp,FIQStackbic r0,r0,#0XDF /*MODEMASK|NOINT*/orr r1,r0,#0X13msr cpsr,r1 /*SVCMode*/ldr sp,SVCStack7) 轉(zhuǎn)到RAM 中執(zhí)行使用指令ldr,pc,RAM 中C 函數(shù)地址就

47、可以轉(zhuǎn)到RAM 中去執(zhí)行。5. 系統(tǒng)初始化部分1. 串口部分串口的設(shè)置主要包括初始化串口部分,值得注意的串口的Baudrate 與時(shí)鐘MCLK 有很大關(guān)系,是通過:rUBRDIV0=( (int)(MCLK/16./(gd ->baudrate) + 0.5) -1 )計(jì)算得出。這可以在手冊中查到。其他的函數(shù)包括發(fā)送,接收。這個(gè)時(shí)候沒有中斷,是通過循環(huán)等待來判斷是否動(dòng)作完成。例如,接收函數(shù):while(!(rUTRSTAT0 & 0x1); /Receive data readreturn RdURXH0();2. 時(shí)鐘部分實(shí)現(xiàn)了延時(shí)函數(shù)udelay。這里的get_timer 由

48、于沒有使用中斷,是使用全局變量來累加的。3. flash 部分flash 作為內(nèi)存的一部分,讀肯定沒有問題,關(guān)鍵是flash 的寫部分。Flash 的寫必須先擦除,然后再寫。unsigned long flash_init (void)int i;u16 manId,devId;/first we init it as unknown,even if you forget assign it below,it's not a problemfor (i=0; i < CFG_MAX_FLASH_BANKS; +i)flash_infoi.flash_id = FLASH_UNKN

49、OWN;flash_infoi.sector_count=CFG_MAX_FLASH_SECT;/*check manId,devId*/_RESET();_WR(0x555,0xaa);_WR(0x2aa,0x55);_WR(0x555,0x90);manId=_RD(0x0);_WR(0x555,0xaa);_WR(0x2aa,0x55);_WR(0x555,0x90);devId=_RD(0x1);_RESET();printf("flashn");printf("Manufacture ID=%4x(0x0004), Device ID(0x22c4)=%

50、4xn",manId,devId);if(manId!=0x0004 && devId!=0x22c4)printf("flash check faliluren");return 0;elsefor (i=0; i < CFG_MAX_FLASH_BANKS; +i)flash_infoi.flash_id=FLASH_AM160T;/*In fact it is fujitu,I only don't want tomodify common files*/* Setup offsets */flash_get_offsets (

51、CFG_FLASH_BASE, &flash_info0);/* zhangyy comment#if CFG_MONITOR_BASE >= CFG_FLASH_BASE/onitor protection ON by defaultflash_protect(FLAG_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

52、_init 完成初始化部分,這里的主要目的是檢驗(yàn)flash 的型號(hào)是否正確。int flash_erase (flash_info_t *info, int s_first, int s_last)volatile unsigned char *addr = (volatile unsigned char *)(info->start0);int flag, prot, sect, l_sect;/ulong start, now, last;u32 targetAddr;u32 targetSize;/*zyy note:It is required and can't be

53、omitted*/rNCACHBE0=( (0x2000000>>12)<<16 )|(0>>12); /flash area(Bank0) must be non-cachablearea.rSYSCFG=rSYSCFG & (0x8); /write buffer has to be off for proper timing.if (s_first < 0) | (s_first > s_last) if (info->flash_id = FLASH_UNKNOWN) printf ("- missingn"); else printf ("- no sectors to erasen");return 1;if (info->flash_id = FLASH_UNKNOWN) |(info->flash_id > FLASH_AMD_COMP) printf ("Can't erase unknown flash type - abortedn");return 1;prot = 0;

溫馨提示

  • 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)論