999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Cortex-A8的Bootloader設計與實現※

2015-07-03 03:33:42葉茂李智任和
單片機與嵌入式系統應用 2015年2期

葉茂,李智,任和

(四川大學 電子信息學院,成都610064)

引 言

隨著電子行業日新月異的發展,ARM處理器憑借自身高性能、低成本、低功耗等特點,廣泛應用于消費電子、數字家電、工業生產等領域中[1]。Cortex-A8為Cortex系列中的“A”系列,采用ARM v7架構,主要面向搭載操作系統、高性能的應用領域。Bootloader是系統上電后執行的第一段代碼,其功能類似于電腦的BIOS[2]。簡單來說,Bootloader的工作主要有兩點:其一是初始化底層硬件資源,為操作系統啟動提供必要的環境;其二是從存儲設備中讀取操作系統鏡像并啟動[3-4]。但為了方便后期開發,往往要為Bootloader添加其他的功能,如支持串口打印調試信息、NFS網絡下載、根文件系統燒寫等[5]。本文以u-boot-2013.01為源碼包,設計了一個基于S5PV210平臺,功能齊全且高效穩定的Bootloader。

1 硬件平臺

1.1 S5PV210簡介

S5PV210是三星公司推出的一款基于Cortex-A8架構的高性能應用處理器。該處理器支持ARM v7指令集,具有32位內部總線結構,主頻最高可達1 GHz,另外還支持掛接LPDDR1、LPDDR2和DDR2類型的RAM,Flash方面可選擇NAND Flash或NOR Flash等。不僅如此,該處理器還提供了包括串口、LCD、I2C、SPI、USB、HDMI等豐富的外部接口資源。目前S5PV210已經廣泛應用于智能手機和平板電腦之中。

1.2 S5PV210的啟動方式

S5PV210支持多種啟動方式,啟動流程如圖1所示。

圖1 S5PV210的啟動流程

S5PV210的啟動過程由BL0、BL1和BL2(BL為Bootloader的簡稱)3部分代碼實現,其中BL0在出廠時已經被固化到64 KB的iROM中。S5PV210上電后首先執行BL0,該段代碼主要負責一些簡單的初始化工作,如關看門狗、初始化ICache等;然后BL0會根據硬件設置判斷使用何種方式啟動,并將BL1從啟動設備(OneNand、Nand Flash、USB、UART、SD card等)拷貝到Internal SRAM的BL1區中;最后BL0會比較一個校驗值,如果相等則跳轉到BL1中繼續執行,否則轉入其他啟動方式。該校驗值存在于BL1的頭部,大小為16字節。

開發人員一般會單獨編寫一個工具為BL1編譯出的二進制文件添加頭部。其校驗值(checksum)的計算方法如下:

由于BL1的大小被限制為16 KB,所以一般情況下BL1負責的工作也不多。BL1被執行后首先初始化系統時鐘、內存、串口等,然后將BL2代碼拷貝到Internal SRAM的BL2區中并跳轉執行。實際上SRAM的BL2區的大小只有80 KB,但很多情況下BL2代碼的大小遠遠超過80 KB,所以將BL2代碼拷貝到SRAM中意義不大。更好的做法是直接將BL2拷貝到容量更大的內存中,不過在拷貝之前一定要先初始化好系統時鐘和內存。BL2是整個Bootloader的主體部分,因此它需要完成更多的初始化工作,例如初始化網卡、Flash等,之后BL2讀取操作系統鏡像到內存中運行。一般把操作系統鏡像放到Flash上,也可以放到SD卡上,根據具體的開發平臺而定。

2 軟件平臺

2.1 U-Boot介紹

U-Boot(全稱 Universal Bootloader)是Bootloader的一種,其他常見的Bootloader還有RedBoot、vivi等。與它們相比,U-Boot具有代碼開源、可靠性和擴展性較高等優點。另外,對于類似于Nand Flash、Nor Flash、網卡、LCD等硬件資源,U-Boot已經抽象出與硬件平臺無關的代碼作為設備驅動源碼提供給開發者。對于與硬件平臺相關的代碼,U-Boot將其定義成宏并保留在配置文件中,開發者往往只需要修改這些宏的值就能成功使用這些硬件資源,讓移植工作變得十分簡單。

2.2 U-Boot中幾個比較重要的源文件

U-Boot的源碼包含有上千個源文件,但經過分析之后,可以找出如下幾個比較重要的源文件(括號中為該源文件所在源碼包的位置):

(1)start.S(arch\arm\cpu\armv7\start.S)

通過分析U-Boot的鏈接文件可以發現,start.S是UBoot上電后執行的第一個源文件。該源文件包括定義了異常向量入口、相關的全局變量、禁用L2緩存、關閉MMU等,之后跳轉到lowlevel_init()函數中繼續執行。

(2)lowlevel_init.S(board\samsung\smdkv210\lowlevel_init.S)

該源文件用匯編代碼編寫,其中只定義了一個函數lowlevel_init()。該函數實現對平臺硬件資源的一系列初始化過程,包括關看門狗、初始化系統時鐘、內存和串口。

(3)mem_setup.S(board\samsung\smdkv210)

該源文件包含對內存進行初始化的匯編源碼。

(4)board.c(arch\arm\lib\board.c)

該源文件是用C語言編寫的,主要實現了U-Boot第二階段啟動過程,包括初始化環境變量、串口控制臺、Flash和打印調試信息等,最后調用main_loop()函數。

(5)smdkv210.h(include\configs\Smdkv210.h)

S5PV210平臺的配置文件,該源文件定義了一些與CPU或者外設相關的參數,這些參數都是用宏來定義的。

2.3 U-Boot啟動的一般流程

2.3.1 第一階段初始化

U-Boot的啟動過程分為兩個階段:第一階段主要由匯編代碼實現,負責對CPU及底層硬件資源的初始化;第二階段用C語言實現,負責使能Flash、網卡和引導操作系統等。第一階段啟動流程如圖2所示。

圖2 U-Boot第一階段啟動流程

上電后,U-Boot首先會設置CPU為管理模式、禁用L1緩存、關閉MMU和清除Caches,之后調用底層初始化函數lowlevel_init()。該函數實現略——編者注。

初始化完成之后,U-Boot首先調用一個拷貝函數將BL2拷貝到內存地址為0x 3FF0 0000處,然后跳轉到該位置執行BL2。在U-Boot中,BL1和BL2是基于相同的一些源文件編譯生成的。開發者在編寫代碼時需要使用預編譯宏CONFIG_SPL_BUILD來實現BL1和BL2不同的功能。其拷貝函數實現略——編者注。

2.3.2 第二階段初始化

進入第二階段后,U-Boot首先聲明一個gd_t結構體類型的指針指向內存地址(0x 4000 0000~GD_SIZE)處。0x 4000 0000為內存結束地址,GD_SIZE為結構體gd_t的大小,這樣相當于在內存最頂端分配了一段空間用于存放一個臨時結構體gd_t。該結構體在global_data.h中被定義,U-Boot用它來存儲所有的全局變量。之后U-Boot會調用board_init_f()和board_init_r()兩個函數進一步對底板進行初始化。

(1)board_init_f()

進入board_init_f()之后,U-Boot首先設置之前分配的臨時結構體,然后開始劃分內存空間,其內存分配狀態如圖3所示。

圖3 U-Boot內存分配狀態

從圖3中可以看到,gd指針指向的臨時結構體存放在內存的最頂部。BL2代碼存放在內存地址0x 3ff0 0000處,即距離內存頂部1 MB空間的位置,接下來依次分配malloc空間、bd_t結構體空間和gd_t結構體空間,并且重新設置棧,最后將臨時結構體拷貝到ID指針所指向的位置。board_init_f()實現過程略——編者注。

(2)board_init_r()

board_init_r()負責對其他硬件資源進行初始化,如網卡、Flash、MMC、中斷等,最后調用 main_loop(),等待用戶輸入命令。

3 設計實現

3.1 支持Nand Flash讀寫

Nand Flash是嵌入式系統中重要的存儲設備,存儲對象包括Bootloader、操作系統內核、環境變量、根文件系統等,所以使能Nand Flash讀寫是U-Boot移植過程中必須完成的一個步驟。U-Boot中Nand Flash初始化函數調用關系為:board_init_r()->nand_init()->nand_init_chip()->board_nand_init()。

board_nand_init()完成兩件事:①對S5PV210關于Nand Flash控制器的相關寄存器進行設置。②對nand_chip結構體進行設置。需要設置的成員項有IO_ADDR_R和IO_ADDR_W,這兩個成員都指向地址0x B0E0 0010,即Nand Flash控制器的數據寄存器的地址。此外還需要實現以下3個成員函數:

①void(*select_chip)(struct mtd_info*mtd,int chip);

該函數實現Nand Flash設備選中或取消選中。

②void(*cmd_ctrl)(struct mtd_info *mtd,int dat,unsigned int ctrl);

該函數實現對Nand Flash發送命令或者地址。

③int(*dev_ready)(struct mtd_info*mtd);

該函數實現檢測Nand Flash設備狀態。最后將成員ecc.mode設置為NAND_ECC_SOFT,即ECC軟件校驗。

配置文件中相應的宏定義略——編者注。

3.2 支持網卡

支持NFS或TFTP網絡下載會極大地方便從Linux服務器上下載文件或鏡像到硬件平臺上,所以使能網卡在U-Boot移植過程中就顯得非常重要。以網卡DM9000為例,U-Boot已經抽象出一套完整的關于DM9000的驅動代碼(其源碼路徑為drivers\net\dm9000x.c),用戶只需要根據具體的硬件電路配置相應的宏即可。U-Boot中DM9000網卡初始化函數的調用關系為:board_init_r()->eth_initialize()->board_eth_init()->dm9000_initialize()。

配置文件中相應的宏定義略——編者注。

3.3 支持環境變量的保存和修改

為了方便用戶配置,U-Boot將一部分變量,如串口波特率、IP地址、內核參數、啟動命令等存在Flash或SD卡上,這部分數據稱為環境變量。每次上電啟動時,U-Boot會檢查Flash或SD卡上是否存放有環境變量。如果有則將其讀取出來并使用,如果沒有就使用默認的環境變量。默認的環境變量定義在env_default.h中,用戶也可以隨時修改或保存環境變量到Flash或SD卡中。

環境變量的移植非常簡單。以Nand Flash為例,開發人員在smdkv210.h源文件中只需要添加如下的宏定義:

4 測試結果

4.1 測試U-Boot啟動

測試平臺的軟硬件環境:硬件平臺為友善之臂的smart210開發板;Linux服務器版本為ubuntu9.0;U-Boot版本為2013-01;GCC交叉編譯工具鏈版本為4.3.2。

首先將修改后的源碼包放到裝有交叉編譯工具鏈的Linux服務器上,輸入命令make即可以編譯生成兩個二進制文件。一個是smdkv210-spl.bin,即BL1代碼,存放在spl目錄下;另一個是u-boot.bin,即BL2代碼,存放在頂層目錄下。然后插入SD卡,執行write2sd.sh腳本就可以把BL1和BL2分別燒寫到SD卡的第1扇區和第49扇區。write2sd.sh腳本實現如下:

燒寫完成之后將SD卡插入到smart210開發板的SD卡槽中,連接好串口和網線,上電啟動。通過串口工具(本次測試使用的是SecureCRT)看到輸出信息,即表示該UBoot已經成功運行在開發板上,測試U-Boot啟動圖略——編者注。

4.2 測試Nand Flash和網卡

在等待命令狀態下輸入“nfs 20000000 192.168.1.123:/work/nfs_root/uImage”,該命令表示從IP為192.168.1.123的Linux服務器上,通過NFS下載該服務器上“/work/nfs_root”目錄下的uImage,并存放在內存地址為0x 2000 0000處,uImage為適配于S5PV210開發板的Linux內核鏡像。等待一段時間后看到“Bytes transferred=2127008(2074a0 hex)”字樣,表示下載成功。

下載成功之后輸入命令“nand erase.part kernel”,該命令表示擦除Nand Flash上的kernel分區。接著輸入命令“nand write 2000 0000 kernel”,該命令表示拷貝內存地址為0x 2000 0000的內容,燒寫到Nand Flash的kernel分區中。內存地址0x 2000 0000存放的內容正是之前從Linux服務器上下載下來的uImage。kernel保存在環境變量mtdparts中,kernel規定了該分區的起始地址和大小。執行完這兩條命令后看到“4194304 bytes written:OK”字樣,表示系統內核已經成功燒寫到Nand Flash中,證明了Nand Flash和網卡均可以正常使用。其實驗結果略——編者注。

4.3 測試引導內核啟動

燒寫完內核之后執行boot命令就可以啟動該內核。boot命令實際上是執行環境變量bootcmd中的一條語句,其內容為“nand read 2000 0000 kernel;bootm 20000000”,該語句表示從Nand Flash的kernel分區中讀出內核并存放在內存地址為0x 2000 0000處,然后跳轉在該地址執行內核鏡像。啟動過程中可以看到串口打印出的信息,證明了該U-Boot已經成功支持引導Linux操作系統。測試引導內核啟動圖略——編者注。

結 語

本文首先從硬件和軟件兩個方面分析了S5PV210的特性及啟動方式,然后通過u-boot-2013.01源碼包詳細闡述了U-Boot啟動過程中的兩個階段,最后結合smart210開發板成功設計了一個基于SD卡啟動、多功能的Bootloader。測試結果表明,該Bootloader支持Nand Flash讀寫、NFS網絡下載、環境變量保存和修改等功能,為后期開發帶來了極大的便利。

編者注:本文為期刊縮略版,全文見本刊網站www.mesnet.com.cn。

[1]馮林琳,耿恒山.基于S3C6410的Uboot分析與移植[J].計算機與現代化,2013(1):119-121.

[2]王茜.基于ARM的平板電腦硬件平臺設計[J].微型機與應用,2012(22):29-31.

[3]梁超,楊峰,雷鵬,等.U-Boot SD卡啟動方式的移植分析與功能擴展[J].現代電子技術,2013(20):84-86,90.

[4]張健,周書林,朱文靜.基于硬件抽象層的Bootloader研究與實現[J].現代電子技術,2010(8):38-40.

[5]郭鋒,袁國良,王麗芳.嵌入式Linux引導加載程序分析與設計[J].信息技術,2011(11):123-125.

主站蜘蛛池模板: 国产在线高清一级毛片| 最新日本中文字幕| 国产美女91视频| 国产中文一区二区苍井空| 91精品综合| 亚洲综合激情另类专区| 久久中文无码精品| 中文无码精品A∨在线观看不卡 | 伊伊人成亚洲综合人网7777| 一级香蕉人体视频| 国产乱人乱偷精品视频a人人澡| 97综合久久| 国产精品不卡永久免费| a亚洲视频| 日韩第一页在线| 久久国产高清视频| 亚洲AⅤ无码国产精品| 女同国产精品一区二区| 国产亚洲欧美在线中文bt天堂| 国产二级毛片| 亚洲啪啪网| 欧美日韩亚洲综合在线观看| 精品国产毛片| 丰满人妻一区二区三区视频| 青青青视频91在线 | 日本人妻一区二区三区不卡影院| 国产综合色在线视频播放线视| 国产成人福利在线视老湿机| 国产无码性爱一区二区三区| 国产乱人视频免费观看| 亚洲va视频| 国内精品一区二区在线观看| 国内精品视频| 无码又爽又刺激的高潮视频| 中文字幕永久在线观看| 永久成人无码激情视频免费| 亚洲成人福利网站| 永久免费无码日韩视频| 青青国产成人免费精品视频| 97国产精品视频自在拍| 欧美激情视频一区二区三区免费| 欧美三级视频在线播放| 中文字幕乱码二三区免费| 男女性午夜福利网站| 国产精品刺激对白在线| 少妇高潮惨叫久久久久久| 久久综合干| 亚洲一区免费看| 美美女高清毛片视频免费观看| 免费又爽又刺激高潮网址 | 自慰高潮喷白浆在线观看| 国产人免费人成免费视频| 九色免费视频| 国产真实乱子伦视频播放| 国产极品粉嫩小泬免费看| 好久久免费视频高清| 国产不卡网| 亚洲国产一成久久精品国产成人综合| 国产精品无码在线看| 久久a级片| 国产亚洲精久久久久久久91| 老司机午夜精品视频你懂的| 国产成人亚洲无码淙合青草| 久久精品午夜视频| 在线中文字幕日韩| 婷婷在线网站| 国产黄色视频综合| 91久久夜色精品国产网站| 亚洲一欧洲中文字幕在线| 欧美精品v欧洲精品| 2018日日摸夜夜添狠狠躁| 欧美综合成人| 99精品免费在线| 久久综合伊人 六十路| 欧美精品不卡| 美女一级免费毛片| 亚洲色成人www在线观看| 黄色福利在线| 高清视频一区| 国产凹凸视频在线观看| 国产欧美精品专区一区二区| 欧美日韩午夜|