移植嵌入式Linux到ARM處理器基本概念_第1頁
移植嵌入式Linux到ARM處理器基本概念_第2頁
移植嵌入式Linux到ARM處理器基本概念_第3頁
移植嵌入式Linux到ARM處理器基本概念_第4頁
移植嵌入式Linux到ARM處理器基本概念_第5頁
已閱讀5頁,還剩68頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、移植嵌入式Linux到ARM處理器:基本概念引言ARM是Advanced RISC Machines(高級精簡指令系統(tǒng)處理器)的縮寫,是ARM公司提供的一種微處理器知識產(chǎn)權(quán)(IP)核。ARM的應(yīng)用已遍及工業(yè)控制、消費類電子產(chǎn)品、通信系統(tǒng)、網(wǎng)絡(luò)系統(tǒng)、無線系統(tǒng)等各類產(chǎn)品市場?;贏RM 技術(shù)的微處理器應(yīng)用約占據(jù)了32位RISC 微處理器75以上的市場份額。揭開你的手機、MP3、 PDA,嘿嘿,里面多半藏著一個基于ARM的微處理器!ARM內(nèi)核的數(shù)個系列(ARM7、ARM9、ARM9E、ARM10E、SecurCore、Xscale、StrongARM),各自滿足不同應(yīng)用領(lǐng)域的需求,無孔不入的滲入嵌入

2、式系統(tǒng)各個角落的應(yīng)用。這是一個ARM的時代!下面的圖片顯示了ARM的隨處可見:有人的地方就有江湖(武林外傳),有嵌入式系統(tǒng)的地方就有ARM。構(gòu)建一個復(fù)雜的嵌入式系統(tǒng),僅有硬件是不夠的,我們還需要進行操作系統(tǒng)的移植。我們通常在ARM平臺上構(gòu)建Windows CE、Linux、Palm OS等操作系統(tǒng),其中Linux具有開放源代碼的優(yōu)點。下圖顯示了基于ARM嵌入式系統(tǒng)中軟件與硬件的關(guān)系:日前,筆者作為某嵌入式ARM(硬件)/Linux(軟件)系統(tǒng)的項目負責(zé)人,帶領(lǐng)項目組成員進行了下述工作:(1)基于ARM920T內(nèi)核S3C2410A CPU的電路板設(shè)計;(2)ARM處理下底層軟件平臺搭建:a.Bo

3、otloader的移植; b.嵌入式Linux操作系統(tǒng)內(nèi)核的移植;c.嵌入式Linux操作系統(tǒng)根文件系統(tǒng)的創(chuàng)建;d.電路板上外設(shè)Linux驅(qū)動程序的編寫。 本文將真實地再現(xiàn)本項目開發(fā)過程中作者的心得,以便與廣大讀者共勉。第一章將簡單地介紹本ARM開發(fā)板的硬件設(shè)計,第二章分析Bootloader的移 植方法,第三章敘述嵌入式mizi Linux的移植及文件系統(tǒng)的構(gòu)建方法,第四章講解外設(shè)的驅(qū)動程序設(shè)計,第五章給出一個已構(gòu)建好的軟硬件平臺上應(yīng)用開發(fā)的實例。如果您有嵌入式系統(tǒng)的開發(fā)基礎(chǔ),您將非常容易領(lǐng)會本文講解地內(nèi)容。即便是您從來沒有嵌入式系統(tǒng)的開發(fā)經(jīng)歷,本文讀起來也不會生澀。您可以通過如下email

4、與作者聯(lián)系:21cnbao。2.ARM體系結(jié)構(gòu)作為一種RISC體系結(jié)構(gòu)的微處理器,ARM微處理器具有RISC體系結(jié)構(gòu)的典型特征。還具有如下增強特點:(l)在每條數(shù)據(jù)處理指令當(dāng)中,都控制算術(shù)邏輯單元(ALU)和移位器,以使ALU和移位器獲得最大的利用率;(2)自動遞增和自動遞減的尋址模式,以優(yōu)化程序中的循環(huán);(3)同時Load和Store多條指令,以增加數(shù)據(jù)吞吐量;(4)所有指令都條件執(zhí)行,以增大執(zhí)行吞吐量。ARM體系結(jié)構(gòu)的字長為32位,它們都支持Byte(8位)、Halfword(16位)和Word(32位)3種數(shù)據(jù)類型。ARM處理器支持7種處理器模式,如下表:大部分應(yīng)用程序都在User模式下

5、運行。當(dāng)處理器處于User模式下時,執(zhí)行的程序無法訪問一些被保護的系統(tǒng)資源,也不能改變模式,否則就會導(dǎo)致一次異常。對系統(tǒng)資源的使用由操作系統(tǒng)來控制。 User模式之外的其它幾種模式也稱為特權(quán)模式,它們可以完全訪問系統(tǒng)資源,可以自由地改變模式。其中的FIQ、IRQ、supervisor、 Abort和undefined 5種模式也被稱為異常模式。在處理特定的異常時,系統(tǒng)進入這幾種模式。這5種異常模式都有各自的額外的寄存器,用于避免在發(fā)生異常的時候與用戶模式下的程 序發(fā)生沖突。還有一種模式是system模式,任何異常都不會導(dǎo)致進入這一模式,而且它使用的寄存器和User模式下基本相同。它是一種特權(quán)模

6、式,用于有訪問系統(tǒng)資源請求而又需要避免使用額外的寄存器的操作系統(tǒng)任務(wù)。程序員可見的ARM寄存器共有37個:31個通用寄存器以及6個針對ARM處理器的不同工作模式所設(shè)立的專用狀態(tài)寄存器,如下圖:ARM9采用5級流水線操作:指令預(yù)取、譯碼、執(zhí)行、數(shù)據(jù)緩沖、寫回。ARM9設(shè)置了16個字的數(shù)據(jù)緩沖和4個字的地址緩沖。這5級流水已被很多的RISC處理器所采用,被看作RISC結(jié)構(gòu)的"經(jīng)典"。3.硬件設(shè)計3.1 S3C2410A微控制器電路板上的ARM微控制器 S3C2410A采用了ARM920T核,它由ARM9TDMI、存儲管理單元MMU和高速緩存三部分組成。其中,MMU可以管理虛擬內(nèi)

7、存,高速緩存由獨 立的16KB地址和16KB數(shù)據(jù)高速Cache組成。ARM920T有兩個內(nèi)部協(xié)處理器:CP14和CP15。CP14用于調(diào)試控制,CP15用于存儲系 統(tǒng)控制以及測試控制。 S3C2410A集成了大量的內(nèi)部電路和外圍接口:·LCD控制器(支持STN和TFT帶有觸摸屏的液晶顯示屏)·SDRAM控制器·3個通道的UART·4個通道的DMA·4個具有PWM功能的計時器和一個內(nèi)部時鐘·8通道的10位ADC·觸摸屏接口·I2C總線接口·12S總線接口·兩個USB主機接口·一個USB設(shè)

8、備接口 ·兩個SPI接口·SD接口·MMC卡接口 S3C2410A集成了一個具有日歷功能的RTC和具有PLL(MPLL和UPLL)的芯片時鐘發(fā)生器。MPLL產(chǎn)生主時鐘,能夠使處理器工作頻率最高 達到203MHz。這個工作頻率能夠使處理器輕松運行WinCE、Linux等操作系統(tǒng)以及進行較為復(fù)雜的信息處理。UPLL則產(chǎn)生實現(xiàn)USB模塊的時 鐘。下圖顯示了S3C2410A的集成資源和外圍接口: 我們需要對上圖中的AHB總線和APB總線的概念進行一番解釋。ARM核開發(fā)的目的,是使其作為復(fù)雜片上系統(tǒng)的一個處理單元來應(yīng)用的,所以還必須提供一 個ARM與其它片上宏單元通信的接口

9、。為了減少不必要的設(shè)計資源的浪費,ARM公司定義了AMBA(Advanced Microcontroller Bus Architecture)總線規(guī)范,它是一組針對基于ARM核的、片上系統(tǒng)之間通信而設(shè)計的、標準的、開放協(xié)議。在AMBA總線規(guī)范中,定義了3種總線:(l)AHB-Advanced High Performace Bus,用于高性能系統(tǒng)模塊的連接,支持突發(fā)模式數(shù)據(jù)傳輸和事務(wù)分割;(2)ASB-Advanced System Bus,也用于高性能系統(tǒng)模塊的連接,支持突發(fā)模式數(shù)據(jù)傳輸,這是較老的系統(tǒng)總線格式,后來由AHB總線替代;(3)APB-Advanced PeriPheral B

10、us,用于較低性能外設(shè)的簡單連接,一般是接在AHB或ASB系統(tǒng)總線上的第二級總線。典型的AMBA總線系統(tǒng)如下圖: S3C2410A將系統(tǒng)的存儲空間分成8個bank,每個bank的大小是128M字節(jié),共1G字節(jié)。Bank0到bank5的開始地址是固定的,用于 ROM或SRAM。bank6和bank7可用于ROM、SRAM或SDRAM。所有內(nèi)存塊的訪問周期都可編程,外部Wait也能擴展訪問周期。下圖給出 了S3C2410A的內(nèi)存組織:下圖給出了S3C2410A的數(shù)據(jù)總線、地址總線和片選電路:SDRAM控制信號、集成USB接口電路:內(nèi)核與存儲單元供電電路(S3C2410A對于片內(nèi)的各個部件采用了獨立

11、的電源供給,內(nèi)核采用1.8V供電,存儲單元采用3.3V獨立供電):JTAG標準通過邊界掃描技術(shù)提供了對電路板上每一元件的功能、互聯(lián)及相互間影響進行測試的方法,極大地方便了系統(tǒng)電路的調(diào)試。測試接入端口TAP的管腳定義如下:·TCK:專用的邏輯測試時鐘,時鐘上升沿按串行方式對測試指令、數(shù)據(jù)及控制信號進行移位操作,下降沿用于對輸出信號移位操作;·TMS:測試模式選擇,在TCK上升沿有效的邏輯測試控制信號;·TDI:測試數(shù)據(jù)輸入,用于接收測試數(shù)據(jù)與測試指令;·TDO:測試數(shù)據(jù)輸出,用于測試數(shù)據(jù)的輸出。S3C2410A調(diào)試用JTAG接口電路:3.2 SDRAM存儲

12、器SDRAM被用來存放操作系統(tǒng)(從FLASH解壓縮拷入)以及存放各類動態(tài)數(shù)據(jù),采用SAMSUNG公司 的K4S561632,它是4Mxl6bitx4bank的同步DRAM,容量為32MB。用2片K4S561632實現(xiàn)位擴展,使數(shù)據(jù)總線寬度達到 32bit,總?cè)萘窟_到64MB,將其地址空間映射在S3C2410A的bank6。SDRAM 所有的輸入和輸出都與系統(tǒng)時鐘CL K上升沿同步,由輸入信號RA S、CA S、WE組合產(chǎn)生SDRAM 控制命令,其基本的控制命令如下: SDRAM 在具體操作之前首先必須通過MRS命令設(shè)置模式寄存器,以便確定SDRAM 的列地址延遲、突發(fā)類型、突發(fā)長度等工作模式;

13、再通過ACT命令激活對應(yīng)地址的組,同時輸入行地址;然后通過RD 或WR 命令輸入列地址,將相應(yīng)數(shù)據(jù)讀出或?qū)懭雽?yīng)的地址;操作完成后用PCH 命令或BT 命令中止讀或?qū)懖僮鳌T跊]有操作的時候,每隔一段時間必須用ARF命令刷新數(shù)據(jù),防止數(shù)據(jù)丟失。下圖給出了SDRAM的連接電路:3.3 FLASH存儲器NOR和NAND是現(xiàn)在市場上兩種主要的非易失閃存技術(shù)。NOR的特點是芯片內(nèi)執(zhí)行(XIP,Execute In Place),即應(yīng)用程序可直接在Flash閃存內(nèi)運行,不必把代碼讀到系統(tǒng)RAM中。NOR的傳輸效率很高,在14MB的小容量時具有很高的成本效益,但是很低的寫入和擦除速度大大影響了它的性能。NA

14、ND結(jié)構(gòu)能提供極高的單元密度,可以達到高存儲密度,并且寫入和擦除的速度也很快。應(yīng)用NAND的困難在于Flash的管理和需要特殊的系統(tǒng)接口,S3C2410A內(nèi)嵌了NAND FLASH控制器。S3C2410A支持從GCS0上的NOR FLASH啟動(16位或32位)或從NAND FLASH啟動,需要通過OM0和OM1上電時的上下拉來設(shè)置:在系統(tǒng)中分別采用了一片NOR FLASH(28F640)和NAND FLASH(K9S1208),電路如下圖:3.4串口S3C2410內(nèi)部集成了UART控制器,實現(xiàn)了并串轉(zhuǎn)換。外部還需提供CMOS/TTL電平與RS232之間的轉(zhuǎn)換:3.5以太網(wǎng) 以太網(wǎng)控制芯片采用

15、CIRRUS LOGIC公司生產(chǎn)的CS8900A,其突出特點是使用靈活,其物理層接口、數(shù)據(jù)傳輸模式和工作模式等都能根據(jù)需要而動態(tài)調(diào)整,通過內(nèi)部寄存器的設(shè)置來適 應(yīng)不同的應(yīng)用環(huán)境。它符合IEEE803.3以太網(wǎng)標準,帶有傳送、接收低通濾波的10Base-T連接端口,支持10Base2,10Base5和 10Base-F的AUI接口,并能自動生成報頭,自動進行CRC檢驗,在沖突后自動重發(fā)。CS8900A支持的傳輸模式有I/O和 Memory模式。當(dāng)CS8900A有硬件復(fù)位或軟件復(fù)位時,它將默認成為8位工作模式。因此,要使CS8900A工作于16位模式,系統(tǒng)必須在訪問之前 提供給總線高位使能管腳(/

16、SBHE)一個由高到低、再由低到高變化的電平。3.6 USB接口 USB 系統(tǒng)由USB 主機(USB Host)、USB集線器(USB Hub)和USB設(shè)備(USB Device)組成。USB 和主機系統(tǒng)的接口稱作主機控制器(Host Controller),它是由硬件和軟件結(jié)合實現(xiàn)的。根集線器是綜合于主機系統(tǒng)內(nèi)部的,用以提供USB的連接點。USB的設(shè)備包括集線器(Hub)和功 能器件(Function)。S3C2410A集成了USB host和USB device,外部連接電路如下圖: 3.7電源LDO(Low Dropout)屬于DC/DC變換器中的降壓變換器,它具有低成本、低噪聲、低功耗

17、等突出優(yōu)點,另外它所需要的外圍器件也很少,通常只有 12 個旁路電容。在電路板上我們分別用兩個LDO來實現(xiàn)5V向3.3V(存儲接口電平)和1.8V(ARM內(nèi)核電平)的轉(zhuǎn)換。up監(jiān)控電路采用MAX708芯片,提供上電、掉電以及降壓情況下的復(fù)位輸出及低電平有效的人工復(fù)位輸出:3.8其它SN74LVTH62245A提供總線驅(qū)動和緩沖能力:S3C2410A集成LCD液晶顯示器控制電路,外部引出接口: 觸摸屏有電阻式、電容式等,其本質(zhì)是一種將手指在屏幕上的觸點位置轉(zhuǎn)化為電信號的傳感器。手指觸到屏幕,引起觸點位置電阻或電容的變化,再通過檢測這一 電性變化,從而獲得手指的坐標位置。通過S3C2410A集成的

18、AD功能,完成電信號向屏幕坐標的轉(zhuǎn)化,觸摸屏接口如下:鍵盤則直接利用CPU的可編程I/O口,若連接 mxn鍵盤,則需要m+n個可編程I/O口,由軟件實現(xiàn)鍵盤掃描,識別按鍵:3.9整體架構(gòu)下圖呈現(xiàn)了ARM處理器及外圍電路的整體設(shè)計框架:4.小結(jié)本章講解了基于S3C2410A ARM處理器電路板硬件設(shè)計的基本組成,為后續(xù)各章提供了總體性的準備工作。BootLoader指系統(tǒng)啟動后,在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過BootLoader,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映 射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。通常,BootLoa

19、der是嚴重地依賴于硬件而實現(xiàn) 的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的 BootLoader 幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫ootLoader歸納出一些通用的概念來,以指導(dǎo)用戶特定的BootLoader設(shè)計與實現(xiàn)。 BootLoader 的實現(xiàn)依賴于CPU的體系結(jié)構(gòu),因此大多數(shù) BootLoader 都分為stage1 和stage2 兩大部分。依賴于CPU體系結(jié)構(gòu)的代碼,比如設(shè)備初始化代碼等,通常都放在 stage1中,而且通常都用匯編語言來實現(xiàn),以達到短小精悍的目的。而stage2 則通常用C 語言來實現(xiàn),這樣可以實現(xiàn)更復(fù)雜的功能,而且代碼會具有更好的可讀性

20、和可移植性。BootLoader 的 stage1 通常包括以下步驟:·硬件設(shè)備初始化;·為加載Boot Loader的stage2準備 RAM 空間;·拷貝Boot Loader的stage2 到RAM空間中;·設(shè)置好堆棧;·跳轉(zhuǎn)到 stage2 的 C 入口點。Boot Loader的stage2通常包括以下步驟: ·初始化本階段要使用到的硬件設(shè)備;·檢測系統(tǒng)內(nèi)存映射(memory map);·將kernel 映像和根文件系統(tǒng)映像從flash上讀到 RAM 空間中;·為內(nèi)核設(shè)置啟動參數(shù);·調(diào)

21、用內(nèi)核。本系統(tǒng)中的BootLoader參照韓國mizi公司的vivi進行修改。1.開發(fā)環(huán)境 我們購買了武漢創(chuàng)維特信息技術(shù)有限公司開發(fā)的具有自主知識產(chǎn)權(quán)的應(yīng)用于嵌入式軟件開發(fā)的集成軟、硬件開發(fā)平臺ADT(ARM Development Tools)它為基于ARM 核的嵌入式應(yīng)用提供了一整套完備的開發(fā)方案,包括程序編輯、工程管理和設(shè)置、程序編譯、程序調(diào)試等。 ADT嵌入式開發(fā)環(huán)境由ADT Emulator for ARM 和ADT IDE for ARM組成。ADT Emulator for ARM 通過JTAG 實現(xiàn)主機和目標機之間的調(diào)試支持功能。它無需目標存儲器,不占用目標系統(tǒng)的任何端口資源。

22、目標程序直接在目標板上運行,通過ARM 芯片的JTAG 邊界掃描口進行調(diào)試,屬于完全非插入式調(diào)試,其仿真效果接近真實系統(tǒng)。ADT IDE for ARM 為用戶提供高效明晰的圖形化嵌入式應(yīng)用軟件開發(fā)環(huán)境,包括一整套完備的面向嵌入式系統(tǒng)的開發(fā)和調(diào)試工具:源碼編輯器、工程管理器、工程編譯器(編譯器、匯 編器和連接器)、集成調(diào)試環(huán)境、ADT Emulator for ARM 調(diào)試接口等。其界面同Microsoft Visual Studio 環(huán)境相似,用戶可以在ADT IDE for ARM 集成開發(fā)環(huán)境中創(chuàng)建工程、打開工程,建立、打開和編輯文件,編譯、連接、設(shè)置、運行、調(diào)試嵌入式應(yīng)用程序。ADT嵌

23、入式軟件開發(fā)環(huán)境 采用主機目標機交叉開發(fā)模型。ADT IDE for ARM 運行于主機端,而ADT Emulator for ARM 實現(xiàn)ADT IDE for ARM 與目標機之間的連接。開發(fā)時,首先由ADT IDE for ARM 編譯連接生成目標代碼,然后建立與ADT Emulator for ARM 之間的調(diào)試通道,調(diào)試通道建立成功后,就可以在ADT IDE for ARM 中通過ADT Emulator for ARM 控制目標板實現(xiàn)目標程序的調(diào)試,包括將目標代碼下載到目標機中,控制程序運行,調(diào)試信息觀察等等。2.ARM匯編ARM本身屬于RISC指令系統(tǒng),指令條數(shù)就很少,而其編程又

24、以C等高級語言為主,我們僅需要在Bootloader的第一階段用到少量匯編指令:(1)+-運算ADD r0, r1, r2 r0 := r1 + r2SUB r0, r1, r2 r0 := r1 - r2其中的第二個操作數(shù)可以是一個立即數(shù):ADD r3, r3, #1 r3 := r3 + 1第二個操作數(shù)還可以是位移操作后的結(jié)果:ADD r3, r2, r1, LSL #3 r3 := r2 + 8.r1(2)位運算AND r0, r1, r2 r0 := r1 and r2ORR r0, r1, r2 r0 := r1 or r2EOR r0, r1, r2 r0 := r1 xor r2

25、BIC r0, r1, r2 r0 := r1 and not r2(3)寄存器搬移MOV r0, r2 r0 := r2MVN r0, r2 r0 := not r2(4)比較CMP r1, r2 set cc on r1 - r2CMN r1, r2 set cc on r1 + r2TST r1, r2 set cc on r1 and r2TEQ r1, r2 set cc on r1 or r2這些指令影響CPSR寄存器中的 (N, Z, C, V) 位(5)內(nèi)存操作LDR r0, r1 r0 := mem r1STR r0, r1 mem r1 := r0LDR r0, r1, #

26、4 r0 := mem r1+4LDR r0, r1, #4 ! r0 := mem r1+4 r1 := r1 + 4LDR r0, r1, #4 r0 := mem r1 r1 := r1 +4LDRB r0 , r1 r0 := mem8 r1LDMIA r1, r0, r2, r5 r0 := mem r1 r2 := mem r1+4 r5 := mem r1+8. 可以包括r0r15中的所有寄存器,若包括r15 (PC)將導(dǎo)致程序的跳轉(zhuǎn)。(6)控制流例1:MOV r0, #0 ; initialize counterLOOP:ADD r0, r0, #1 ; increment c

27、ounterCMP r0, #10 ; compare with limitBNE LOOP ; repeat if not equal例2:CMP r0, #5 ADDNE r1, r1, r0 SUBNE r1, r1, r2 if (r0 != 5) r1 := r1 + r0 - r23.BootLoader第一階段3.1硬件設(shè)備初始化基本的硬件初始化工作包括:·屏蔽所有的中斷;·設(shè)置CPU的速度和時鐘頻率;·RAM初始化;·初始化LEDARM的中斷向量表設(shè)置在0地址開始的8個字空間中,如下表:每當(dāng)其中的某個異常發(fā)生后即將PC值置到相應(yīng)的中斷向量

28、處,每個中斷向量處放置一個跳轉(zhuǎn)指令到相應(yīng)的中斷服務(wù)程序去進行處理,中斷向量表的程序如下: 0x00: Resetb Reset 0x04: Undefined instruction exceptionUndefEntryPoint:b HandleUndef 0x08: Software interrupt exceptionSWIEntryPoint:b HandleSWI 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)PrefetchAbortEnteryPoint:b HandlePrefetchAbort 0x10: Dat

29、a Access Memory AbortDataAbortEntryPoint:b HandleDataAbort 0x14: Not usedNotUsedEntryPoint:b HandleNotUsed 0x18: IRQ(Interrupt Request) exceptionIRQEntryPoint:b HandleIRQ 0x1c: FIQ(Fast Interrupt Request) exceptionFIQEntryPoint:b HandleFIQ復(fù)位時關(guān)閉看門狗定時器、屏蔽所有中斷:Reset: disable watch dog timermov r1, #0x5

30、3000000mov r2, #0x0str r2, r1 disable all interruptsmov r1, #INT_CTL_BASEmov r2, #0xffffffffstr r2, r1, #oINTMSKldr r2, =0x7ffstr r2, r1, #oINTSUBMSK設(shè)置系統(tǒng)時鐘:init clk 1:2:4mov r1, #CLK_CTL_BASEmov r2, #0x3 str r2, r1, #oCLKDIVNmrc p15, 0, r1, c1, c0, 0 read ctrl register orr r1, r1, #0xc0000000 Asynch

31、ronous mcr p15, 0, r1, c1, c0, 0 write ctrl register now, CPU clock is 200 Mhzmov r1, #CLK_CTL_BASEldr r2, mpll_200mhzstr r2, r1, #oMPLLCON點亮所有的用戶LED: All LED onmov r1, #GPIO_CTL_BASEadd r1, r1, #oGPIO_Fldr r2,=0x55aastr r2, r1, #oGPIO_CONmov r2, #0xffstr r2, r1, #oGPIO_UPmov r2, #0x00str r2, r1, #o

32、GPIO_DAT設(shè)置(初始化)內(nèi)存映射:ENTRY(memsetup) initialise the static memory set memory control registersmov r1, #MEM_CTL_BASEadrl r2, mem_cfg_valadd r3, r1, #521: ldr r4, r2, #4str r4, r1, #4cmp r1, r3bne 1bmov pc, lr設(shè)置(初始化)UART: set GPIO for UARTmov r1, #GPIO_CTL_BASEadd r1, r1, #oGPIO_Hldr r2, gpio_con_uart

33、str r2, r1, #oGPIO_CONldr r2, gpio_up_uartstr r2, r1, #oGPIO_UP bl InitUART Initialize UART r0 = number of UART portInitUART:ldr r1, SerBasemov r2, #0x0str r2, r1, #oUFCONstr r2, r1, #oUMCONmov r2, #0x3str r2, r1, #oULCONldr r2, =0x245str r2, r1, #oUCON#define UART_BRD (50000000 / (UART_BAUD_RATE *

34、16) - 1)mov r2, #UART_BRDstr r2, r1, #oUBRDIVmov r3, #100mov r2, #0x01: sub r3, r3, #0x1tst r2, r3bne 1b#if 0mov r2, #'U'str r2, r1, #oUTXHL1: ldr r3, r1, #oUTRSTATand r3, r3, #UTRSTAT_TX_EMPTYtst r3, #UTRSTAT_TX_EMPTYbne 1b mov r2, #'0'str r2, r1, #oUTXHL1: ldr r3, r1, #oUTRSTATand

35、r3, r3, #UTRSTAT_TX_EMPTYtst r3, #UTRSTAT_TX_EMPTYbne 1b #endifmov pc, lr此外,vivi還提供了幾個匯編情況下通過串口打印字符的函數(shù)PrintChar、PrintWord和PrintHexWord: PrintChar : prints the character in R0 r0 contains the character r1 contains base of serial port writes ro with XXX, modifies r0,r1,r2 TODO : write ro with XXX reg

36、to error handlingPrintChar:TXBusy:ldr r2, r1, #oUTRSTATand r2, r2, #UTRSTAT_TX_EMPTYtst r2, #UTRSTAT_TX_EMPTYbeq TXBusy str r0, r1, #oUTXHLmov pc, lr PrintWord : prints the 4 characters in R0 r0 contains the binary word r1 contains the base of the serial port writes ro with XXX, modifies r0,r1,r2 TO

37、DO : write ro with XXX reg to error handlingPrintWord:mov r3, r0mov r4, lrbl PrintCharmov r0, r3, LSR #8 /* shift word right 8 bits */bl PrintCharmov r0, r3, LSR #16 /* shift word right 16 bits */bl PrintCharmov r0, r3, LSR #24 /* shift word right 24 bits */bl PrintCharmov r0, #'r'bl PrintCh

38、armov r0, #'n'bl PrintCharmov pc, r4 PrintHexWord : prints the 4 bytes in R0 as 8 hex ascii characters followed by a newline r0 contains the binary word r1 contains the base of the serial port writes ro with XXX, modifies r0,r1,r2 TODO : write ro with XXX reg to error handlingPrintHexWord:mo

39、v r4, lrmov r3, r0mov r0, r3, LSR #28bl PrintHexNibblemov r0, r3, LSR #24bl PrintHexNibblemov r0, r3, LSR #20bl PrintHexNibblemov r0, r3, LSR #16bl PrintHexNibblemov r0, r3, LSR #12bl PrintHexNibblemov r0, r3, LSR #8bl PrintHexNibblemov r0, r3, LSR #4bl PrintHexNibblemov r0, r3bl PrintHexNibblemov r

40、0, #'r'bl PrintCharmov r0, #'n'bl PrintCharmov pc, r4本節(jié)簡介: BootLoader指系統(tǒng)啟動后,在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過BootLoader,我們可 以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準備好正確的環(huán)境。通常, BootLoader 是嚴重地依賴于硬件而實現(xiàn)的,特別是在嵌入式世界。因此,在嵌入式世界里建立一個通用的 BootLoader 幾乎是不可能的。盡管如此,我們?nèi)匀豢梢詫ootLoader歸納出一些通用的概念

41、來,以指導(dǎo)用戶特定的BootLoader設(shè)計與實現(xiàn)。=3.2Bootloader拷貝配置為從NAND FLASH啟動,需要將NAND FLASH中的vivi代碼copy到RAM中:#ifdef CONFIG_S3C2410_NAND_BOOTbl copy_myself jump to ramldr r1, =on_the_ramadd pc, r1, #0nopnop1: b 1b infinite loop#ifdef CONFIG_S3C2410_NAND_BOOT copy_myself: copy vivi to ramcopy_myself:mov r10, lr reset NA

42、NDmov r1, #NAND_CTL_BASEldr r2, =0xf830 initial valuestr r2, r1, #oNFCONFldr r2, r1, #oNFCONFbic r2, r2, #0x800 enable chipstr r2, r1, #oNFCONFmov r2, #0xff RESET commandstrb r2, r1, #oNFCMDmov r3, #0 wait 1: add r3, r3, #0x1cmp r3, #0xablt 1b2: ldr r2, r1, #oNFSTAT wait readytst r2, #0x1beq 2bldr r

43、2, r1, #oNFCONForr r2, r2, #0x800 disable chipstr r2, r1, #oNFCONF get read to call C functions (for nand_read()ldr sp, DW_STACK_START setup stack pointermov fp, #0 no previous frame, so fp=0 copy vivi to RAMldr r0, =VIVI_RAM_BASEmov r1, #0x0mov r2, #0x20000bl nand_read_lltst r0, #0x0beq ok_nand_rea

44、d#ifdef CONFIG_DEBUG_LLbad_nand_read: ldr r0, STR_FAILldr r1, SerBasebl PrintWord1: b 1b infinite loop #endifok_nand_read:#ifdef CONFIG_DEBUG_LLldr r0, STR_OKldr r1, SerBasebl PrintWord#endif verifymov r0, #0ldr r1, =0x33f00000mov r2, #0x400 4 bytes * 1024 = 4K-bytesgo_next:ldr r3, r0, #4ldr r4, r1,

45、 #4teq r3, r4bne notmatchsubs r2, r2, #4beq done_nand_read bne go_nextnotmatch:#ifdef CONFIG_DEBUG_LLsub r0, r0, #4ldr r1, SerBasebl PrintHexWordldr r0, STR_FAILldr r1, SerBasebl PrintWord#endif1: b 1bdone_nand_read:#ifdef CONFIG_DEBUG_LLldr r0, STR_OKldr r1, SerBasebl PrintWord#endifmov pc, r10 cle

46、ar memory r0: start address r1: lengthmem_clear:mov r2, #0mov r3, r2mov r4, r2mov r5, r2mov r6, r2mov r7, r2mov r8, r2mov r9, r2clear_loop:stmia r0!, r2-r9subs r1, r1, #(8 * 4)bne clear_loopmov pc, lr#endif CONFIG_S3C2410_NAND_BOOT3.3進入C代碼首先要設(shè)置堆棧指針sp,堆棧指針的設(shè)置是為了執(zhí)行C語言代碼作好準備。設(shè)置好堆棧后,調(diào)用C語言的main函數(shù): get re

47、ad to call C functionsldr sp, DW_STACK_START setup stack pointermov fp, #0 no previous frame, so fp=0mov a2, #0 set argv to NULL bl main call main mov pc, #FLASH_BASE otherwise, reboot4. BootLoader第二階段vivi Bootloader的第二階段又分成了八個小階段,在main函數(shù)中分別調(diào)用這幾個小階段的相關(guān)函數(shù):int main(int argc, char *argv)int ret;/* Step

48、 1:*/putstr("rn");putstr(vivi_banner);reset_handler();/* Step 2:*/ret = board_init();if (ret) putstr("Failed a board_init() procedurern");error();/* Step 3:*/mem_map_init();mmu_init();putstr("Succeed memory mapping.rn");/* Now, vivi is running on the ram. MMU is enabled

49、.*/* * Step 4:*/* initialize the heap area*/ret = heap_init();if (ret) putstr("Failed initailizing heap regionrn");error();/* Step 5:*/ret = mtd_dev_init();/* Step 6:*/init_priv_data();/* Step 7:*/misc();init_builtin_cmds();/* Step 8:*/boot_or_vivi();return 0;STEP1的putstr(vivi_banner)語句在串口

50、輸出一段字符說明vivi的版本、作者等信息,vivi_banner定義為:const char *vivi_banner ="VIVI version " VIVI_RELEASE " (" VIVI_COMPILE_BY ""VIVI_COMPILE_HOST ") (" VIVI_COMPILER ") " UTS_VERSION "rn"reset_handler進行相應(yīng)的復(fù)位處理:voidreset_handler(void)int pressed;pressed =

51、 is_pressed_pw_btn();if (pressed = PWBT_PRESS_LEVEL) DPRINTK("HARD RESETrn");hard_reset_handle(); else DPRINTK("SOFT RESETrn");soft_reset_handle();hard_reset_handle會clear內(nèi)存,而軟件復(fù)位處理則什么都不做:static voidhard_reset_handle(void)clear_mem(unsigned long)USER_RAM_BASE, (unsigned long)USER_

52、RAM_SIZE); STEP2進行板初始化,設(shè)置時間和可編程I/O口:int board_init(void)init_time();set_gpios();return 0;STEP3進行內(nèi)存映射及MMU初始化:void mem_map_init(void)#ifdef CONFIG_S3C2410_NAND_BOOTmem_map_nand_boot();#elsemem_map_nor();#endifcache_clean_invalidate();tlb_invalidate(); S3C2410A的MMU初始化只需要調(diào)用通用的arm920 MMU初始化函數(shù):static inli

53、ne void arm920_setup(void)unsigned long ttb = MMU_TABLE_BASE;_asm_(/* Invalidate caches */"mov r0, #0n""mcr p15, 0, r0, c7, c7, 0n" /* invalidate I,D caches on v4 */"mcr p15, 0, r0, c7, c10, 4n" /* drain write buffer on v4 */"mcr p15, 0, r0, c8, c7, 0n" /* invalidate I,D TLBs on v4 */* Load page table pointer */"mov r4, %0n""mcr p15, 0, r4, c2, c0, 0n" /* load page table pointer */* Write domain id (cp15_r3) */"mvn r0, #0n" /* Domains 0, 1 = client */"mcr p15, 0, r0, c3, c0, 0n" /* load

溫馨提示

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

評論

0/150

提交評論