當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]Redboot修改實(shí)例

在通常情況下,嵌入式開發(fā)中都需要對(duì)bootload部分的代碼進(jìn)行修改,以適應(yīng)實(shí)際的需求。本文以redboot為例,說(shuō)明了如何修改redboot源碼以使其具備

1. 啟動(dòng)時(shí)提供LOGO圖片顯示

2. 為實(shí)現(xiàn)量產(chǎn),在命令行下提供自動(dòng)配置網(wǎng)絡(luò)的命令autocONfig

3. 為實(shí)現(xiàn)量產(chǎn),在命令行下提供自動(dòng)更新文件的命令update

4. 為實(shí)現(xiàn)量產(chǎn),在命令行下提供自動(dòng)配置腳本的命令autoexec

Redboot適用的運(yùn)行環(huán)境為基于ARM架構(gòu)的硬件環(huán)境,包括

運(yùn)行環(huán)境如下表所示。

 

 

Redboot是Red Hat公司開發(fā)的一個(gè)獨(dú)立運(yùn)行在嵌入式系統(tǒng)上的BootLoad程序,是目前比較流行的一個(gè)功能強(qiáng)大、可移植性好的BootLoad。

Redboot是一個(gè)采用eCos開發(fā)環(huán)境開發(fā)的應(yīng)用程序,并采用了eCos的硬件抽象層作為基礎(chǔ),但它完全可以脫離eCos環(huán)境運(yùn)行,并用來(lái)引導(dǎo)人和其他的嵌入式操作系統(tǒng),如Linux、WinCE等。

eCos實(shí)現(xiàn)系統(tǒng)可配置機(jī)制的核心就在于它是由許多個(gè)組件構(gòu)成,包括調(diào)度內(nèi)核組件、硬件抽象層、文件系統(tǒng)組件、網(wǎng)絡(luò)協(xié)議棧等,用戶可以根據(jù)不同的需求選擇組件,并對(duì)一些特定的配置選項(xiàng)進(jìn)行設(shè)置,就可以構(gòu)造出滿足特定應(yīng)用需求的系統(tǒng)。

所有的組件都在組件庫(kù)中,組件庫(kù)其實(shí)是一個(gè)包含了eCos所有系統(tǒng)組件的文件夾,其路徑對(duì)應(yīng)于“/eCos-2.0/packages”,該目錄的內(nèi)容如下所示

☆ compat

包含支持與POSIX和uITRON3.0標(biāo)準(zhǔn)兼容的組件文件包

☆ cygmon

生成Cygmon調(diào)試監(jiān)視器的配置文件包

☆ devs

eCos支持的所有外部設(shè)備驅(qū)動(dòng),如串口、以太網(wǎng)等

☆ error

包含各種常見的錯(cuò)誤和狀態(tài)描述代碼,便于系統(tǒng)調(diào)試時(shí)報(bào)告錯(cuò)誤和狀態(tài)

☆ fs

包含ROM和RAM文件系統(tǒng)包

☆ hal

包含所有硬件抽象層的目標(biāo)硬件配置文件包

☆ infra

包含系統(tǒng)定義的基本結(jié)構(gòu),如數(shù)據(jù)類型、宏定義、系統(tǒng)啟動(dòng)方式選擇

☆ io

I/O子系統(tǒng)文件包,建立在外部設(shè)備驅(qū)動(dòng)上層從而與特定硬件無(wú)關(guān)

☆ isoinfra

包含的文件包提供支持ISO標(biāo)準(zhǔn)C庫(kù)和兼容POSIX標(biāo)準(zhǔn)的接口

☆ kernel

提供eCos內(nèi)核功能的配置文件包

☆ language

包含ISO的C庫(kù)和math庫(kù)

☆ net

提供TCP/IP協(xié)議棧支持的文件包

☆ redboot

包含生成Redboot調(diào)試監(jiān)視器的配置文件包

☆ services

包含提供動(dòng)態(tài)內(nèi)存分配和文件壓縮與解壓功能的庫(kù)文件

與硬件相關(guān)的文件按照如上所述,分別對(duì)應(yīng)以下的子目錄:

“/eCos-2.0/packages/hal/arm”:Architectur HAL

“/eCos-2.0/packages/hal/arm/arm9”:Variant HAL

“/eCos-2.0/packages/hal/arm/arm9/ep93xx”:Platform. HAL

為了實(shí)現(xiàn)本文開頭的四項(xiàng)特殊功能,需要修改eCos中的部分代碼。修改的文件為:

“/eCos-2.0/packages/hal/arm/arm9/ep93xx/v2_0/src/ep93xx_misc.c”

“/eCos-2.0/packages/redboot/v2_0/src/Flash.c”

“/eCos-2.0/packages/redboot/v2_0/src/io.c”

“/eCos-2.0/packages/redboot/v2_0/src/main.c”

ep93xx_misc的修改

在本例中,開發(fā)平臺(tái)上添加了一塊FPGA芯片,通過該FPGA實(shí)現(xiàn)了對(duì)LCD的控制,因此對(duì)于raSTer的初始化過程有所不同。

該部分的修改,主要目的是提供“啟動(dòng)時(shí)提供logo圖片顯示”的功能。

增加__FPGA_LCD__宏定義

增加_RASTER_宏定義

_RASTER_ 完成Raster設(shè)置并且顯示開機(jī)界面。

_ FPGA_LCD _ 完成FPGA設(shè)置并且顯示開機(jī)界面。

Raster:

initRaster用來(lái)初始化LCD controller

LCD 界面定制在Nor Flash AddrESS 0x60DC0000

Copy Kernel 到指定Address, Copy zImage 到0x800000(SDRAM Address)

FPGA:

1. check chip 分區(qū)是否存在

2. 如果存在則Copy logo and chip 到指定地址。

3. 初始化FGPA。

4. 顯示開機(jī)界面。

5. Copy Kernel 到指定地址。

初始化FPGA流程:

1. Config相關(guān)GPIO

a) GPIO 0-7===D0~D7為輸出

b) GPIO 9,11,12===PROG_B,CSI_B,CCLK為輸出 8,10===DONE,INIT_B為輸入

2. Clear相關(guān)SDRAM

a) set prog_b low to clear the config data

b) start the config process

c) ready to read the init_b status

3. 寫Chip.bin

4. 顯示logo

SDRAM write流程如下圖所示:

 

 

1. 根據(jù)CPU_buffer的使用情況,將準(zhǔn)備寫入SDRAM的數(shù)據(jù),先存入CPU_buffer中。

2. 然后需要依次配置ADDR1、ADDR0、CONTROL_REG。

3. cpu_sdram_cmdgen會(huì)根據(jù)以上寄存器的設(shè)置,將cpu_buffer中的數(shù)據(jù)發(fā)送至arbiter,后存入SDRAM.

4. 數(shù)據(jù)請(qǐng)求完成后,cpu_sdram_cmdgen會(huì)將CONTROL_REG.ACT自動(dòng)清除。

5. CPU可以通過查詢CONTROL_REG.ACT位,得知當(dāng)前寫入SDRAM數(shù)據(jù)的操作是否完成。

6. 寫SDRAM步驟實(shí)例如下

a) write (16‘h00F0, 16‘haaaa);

b) write (16‘h00F1, 16‘hbbbb);

c) write (16‘h00F2, 16‘hcccc);

d) write (16‘h00F3, 16‘hdddd);

e) write (16‘h00F4, 16‘heeee);

f) write (16‘h00F5, 16‘hffff);

g) write (16‘h00F6, 16‘h5555);

h) write (16‘h00F7, 16‘h6666);

i) write (16‘h00F8, 16‘h9999);

j) write (16‘h00F9, 16‘h7777);

k) write (16‘h00Fa, 16‘h8888);[!--empirenews.page--]

l) write (16‘h00Fb, 16‘h4444);

m) write (16‘h00Fc, 16‘h3333);

n) write (16‘h00Fd, 16‘h2222);

o) write (16‘h00Fe, 16‘h1111);

p) write (16‘h00Ff, 16‘h0000);

以上16條命令將16個(gè)16bit的數(shù)據(jù)分別存入cpu_buffer的地址0xF0~0xFF。

q) write (16‘hf002, 16‘h3c3f);

r) write (16‘hf001, 16‘hffff);

以上兩條命令將CPU_BUFFER_OFFSET設(shè)為0xF0,將SDRAM_ADDR (SDRAM_ADDR_H, SDRAM_ADDR_L)設(shè)置為0x3FFFFF。

s) write (16‘hf000, 16‘h0073);

將CPU_BURST_LENGTH設(shè)置為7(實(shí)際寫入為8),CPU_RW為“1”表示當(dāng)前操作為寫SDRAM,ACT為“1”表示立即啟動(dòng)當(dāng)前操作。

t) read (16‘hf000);

讀取CONTROL_REG的數(shù)值,當(dāng)ACT為“0”時(shí),表示之前存入cpu_buffer 0xF0~0xFF的16個(gè)16bit的數(shù)據(jù),已經(jīng)被寫入SDRAM中起始地址為“0x3FFFFF”的連續(xù)的8個(gè)地址中(SDRAM的數(shù)據(jù)寬度為32bit)。

main.c的修改

這一部分的修改主要目的是為了提供三條控制臺(tái)命令“autoconfig”“update”“autoexec”。

增加命令

RedBoot_cmd("autoconfig",

"autoconfig"

"",

do_autoconfig);

RedBoot_cmd("update"

"update",

"",

do_update);

RedBoot_cmd("autoexec",

"autoExec",

"",

do_autoexec);

增加函數(shù):

void do_autoconfig(int argc, char *argv[])

void do_update(int argc, char *argv[])

void do_autoexec(int argc, char *argv[])

增加全局變量

configFlag

updateFlag

execFlag

函數(shù)do_autoconfig()的主要內(nèi)容

1. 設(shè)置configFlag為True

2. 調(diào)用fconfig –i

3. set Run script. at boot is false

4. set Use BOOTP for network configuration: false

5. set Gateway IP address

6. set Local IP address

7. set Local IP address mask

8. Default server IP address

9. set DNS server IP address

10. eth0 network hardware address

11. set GDB connection port

12. 設(shè)置configFlag為Flash

函數(shù)do_update()的主要內(nèi)容

1. 設(shè)置updateFlag為True

2. 調(diào)用fconfig -i

3. 初始化Flash

4. 更新zimage 到 /dev/mtdblock2

5. 更新root 到 /dev/mtdblock2

6. 更新usr 到 /dev/mtdblock2

7. 更新config 到 /dev/mtdblock2

8. 更新chip 到 /dev/mtdblock2

9. 更新logo 到 /dev/mtdblock2

10. 設(shè)置updateFlag為Flash

函數(shù)do_autoexec()的主要內(nèi)容

1. 設(shè)置execFlag為True

2. 調(diào)用fconfig -i

3. set Run script. at boot is true

4. set Use BOOTP for network configuration: false

5. set Gateway IP address

6. set Local IP address

7. set Local IP address mask

8. Default server IP address

9. set DNS server IP address

10. eth0 network hardware address

11. set GDB connection port

12. 設(shè)置execFlag為Flash

完成以上工作后,再對(duì)flash.c,io.c進(jìn)行相關(guān)修改便可生成redboot可執(zhí)行文件。注意,編譯Redboot代碼時(shí)最好使用arm-elf-gcc。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉