當(dāng)前位置:首頁(yè) > 消費(fèi)電子 > 消費(fèi)電子
[導(dǎo)讀]本文介紹了在PowerPC405上利用嵌入式Linux來(lái)構(gòu)建數(shù)字視頻播放系統(tǒng)軟件平臺(tái)的過(guò)程,探討了嵌入式Linux系統(tǒng)里交叉編譯器、bootloader、Linux內(nèi)核、根文件系統(tǒng)等幾個(gè)主要部分的構(gòu)建過(guò)程。

摘要:本文介紹了在PowerPC405上利用嵌入式Linux來(lái)構(gòu)建數(shù)字視頻播放系統(tǒng)軟件平臺(tái)的過(guò)程,探討了嵌入式Linux系統(tǒng)里交叉編譯器、bootloader、Linux內(nèi)核、根文件系統(tǒng)等幾個(gè)主要部分的構(gòu)建過(guò)程。
關(guān)鍵詞:PowerPC405;嵌入式Linux;數(shù)字視頻播放機(jī);U-BOOT

引言

數(shù)字視頻播放設(shè)備在近幾年的發(fā)展十分迅速,種類繁多。傳統(tǒng)的視頻播放設(shè)備(如DVD播放機(jī))的軟件系統(tǒng)一般都是一簡(jiǎn)單的控制環(huán)系統(tǒng),沒(méi)有操作系統(tǒng),功能擴(kuò)展和升級(jí)受到限制。本課題研究的便攜式數(shù)字視頻播放設(shè)備構(gòu)建于嵌入式32位PowerPC405 CPU之上,運(yùn)行Linux操作系統(tǒng),以大容量的硬盤(pán)作為存儲(chǔ)介質(zhì),具有網(wǎng)絡(luò)功能。PowerPC405是IBM公司推出的一款專門(mén)針對(duì)嵌入式應(yīng)用的RISC處理器,應(yīng)用十分廣泛。嵌入式Linux[1]作為一種開(kāi)源的操作系統(tǒng)軟件,具有免費(fèi)、支持眾多CPU、可裁減、支持網(wǎng)絡(luò)、豐富的軟件資源等特點(diǎn)。利用嵌入式Linux來(lái)構(gòu)建數(shù)字視頻播放系統(tǒng)的軟件平臺(tái)使得該播放機(jī)成本低,易于升級(jí)和管理,支持多種接口如USB,從而使得視頻節(jié)目交換方便等優(yōu)勢(shì),代表了該種設(shè)備未來(lái)發(fā)展的一個(gè)方向。本文主要探討了構(gòu)建應(yīng)用于數(shù)字視頻播放機(jī)的嵌入式Linux系統(tǒng)的bootloader、Linux內(nèi)核移植的主要過(guò)程和可能碰到的問(wèn)題,給出了相應(yīng)的解決方案。

1 數(shù)字視頻播放系統(tǒng)框圖


(圖1-1 碼流播放系統(tǒng)硬件框圖)

圖1-1為本播放機(jī)的系統(tǒng)框圖,其核心控制系統(tǒng)為基于PowerPC405的嵌入式Linux,通過(guò)其上的應(yīng)用程序來(lái)把數(shù)據(jù)存儲(chǔ)系統(tǒng)里的節(jié)目經(jīng)過(guò)一定處理后搬移到碼流控制系統(tǒng)里的FPGA里,由FPGA完成解密后送給解碼系統(tǒng),經(jīng)過(guò)解碼系統(tǒng)解壓縮后輸出RGB信號(hào)給顯示設(shè)備來(lái)顯示。其中我們要關(guān)注的就是核心控制系統(tǒng)里嵌入式Linux系統(tǒng)的搭建。

播放機(jī)的嵌入式Linux系統(tǒng)的層次結(jié)構(gòu)如圖1-2,硬件上電后,CPU的程序指針首先指向一個(gè)特定的存儲(chǔ)器地址,該地址處一般存放著bootloader,bootloader在初始化完CPU以及內(nèi)存等設(shè)備后,把Linux內(nèi)核從一般ROM設(shè)備里搬移解壓到內(nèi)存里,然后程序指針跳轉(zhuǎn)到內(nèi)核在內(nèi)存里的開(kāi)始位置處,由Linux內(nèi)核來(lái)繼續(xù)完成剩下的系統(tǒng)引導(dǎo)工作。內(nèi)核在重新初始化完系統(tǒng)后,就加載根文件系統(tǒng),運(yùn)行用戶應(yīng)用程序。整個(gè)嵌入式Linux系統(tǒng)平臺(tái)的構(gòu)建過(guò)程可以參照系統(tǒng)的啟動(dòng)過(guò)程,主要要做的工作有構(gòu)建bootloader、Linux內(nèi)核、根文件系統(tǒng)這幾個(gè)部分。

(圖1-2 軟件系統(tǒng)層次結(jié)構(gòu)圖)

2 嵌入式Linux系統(tǒng)平臺(tái)搭建的準(zhǔn)備

要搭建嵌入式Linux系統(tǒng)平臺(tái),首先要準(zhǔn)備好跨平臺(tái)開(kāi)發(fā)工具鏈。它運(yùn)行于本地主機(jī)上,編譯鏈接生成的二進(jìn)制可執(zhí)行程序能夠運(yùn)行于開(kāi)發(fā)板的CPU及操作系統(tǒng)上。構(gòu)建這樣一個(gè)主要包括編譯器gcc,鏈接器ld,C庫(kù)glibc等的工具鏈的方法有很多種,可以去相關(guān)網(wǎng)站下載源代碼手工編譯,而最便捷的方法則為利用完善的已編譯好開(kāi)發(fā)包,如德國(guó)denx公司的ELDK開(kāi)發(fā)包,使用方法參見(jiàn)[2]。

3 bootloader與Kernel的選擇

準(zhǔn)備好了開(kāi)發(fā)工具鏈之后,就可以開(kāi)始嵌入式Linux系統(tǒng)的開(kāi)發(fā),首先是bootloader的選擇。

3.1 bootloader的選擇

一般的PC機(jī)啟動(dòng)后先是進(jìn)入BIOS,通過(guò)BIOS進(jìn)行一定的系統(tǒng)初始化后,再引導(dǎo)操作系統(tǒng)如Windows或Linux等,而一般嵌入式系統(tǒng)里沒(méi)有BIOS,但也需要實(shí)現(xiàn)類似功能的模塊,這就是bootloader(引導(dǎo)裝載器),其主要的功能是初始化CPU、內(nèi)存等硬件設(shè)備,以及導(dǎo)入操作系統(tǒng)。Bootloader種類很多,如blob、lilo、grub、U-BOOT等。目前在嵌入式領(lǐng)域用得最廣泛的是denx公司的免費(fèi)開(kāi)源軟件U-BOOT,它支持PowerPC、ARM、MIPS、x86等多種CPU,超過(guò)100種開(kāi)發(fā)板,源碼結(jié)構(gòu)清晰,移植容易,開(kāi)發(fā)文檔豐富,用戶在使用中可能碰到的問(wèn)題一般都能夠很快被解決。因此,我們選用U-BOOT做為開(kāi)發(fā)板的bootloader。

根據(jù)不同的開(kāi)發(fā)板,flash的大小以及型號(hào)不同,內(nèi)存的大小不一樣,啟動(dòng)方式的不同等使得利用U-BOOT時(shí)需要做一些相應(yīng)的修改,以適應(yīng)用戶自己的開(kāi)發(fā)板,具體移植方法及常見(jiàn)問(wèn)題可參見(jiàn)[3]。

3.2 Linux內(nèi)核的移植               

bootloader初始化完系統(tǒng)硬件后,把Linux內(nèi)核從外部存儲(chǔ)介質(zhì)中導(dǎo)入內(nèi)存里,然后,就將控制權(quán)交給Linux內(nèi)核,由內(nèi)核來(lái)繼續(xù)完成系統(tǒng)的引導(dǎo)工作。

如果內(nèi)核里沒(méi)有支持用戶所使用的開(kāi)發(fā)板,那么用戶就需要自己手工修改Linux的內(nèi)核,做一些相關(guān)的移植工作,要關(guān)注的是對(duì)開(kāi)發(fā)板的硬件外設(shè)部分的處理,包括內(nèi)核對(duì)板子硬件基本信息的處理,板上硬件設(shè)備的初始化、中斷的分配等。

開(kāi)發(fā)板級(jí)別的Linux內(nèi)核移植最方便的方法是利用內(nèi)核里已有的且與用戶使用的硬件平臺(tái)最接近的開(kāi)發(fā)板為模板,在此基礎(chǔ)上再做修改。我們使用的開(kāi)發(fā)板與IBM walnut開(kāi)發(fā)板類似,主要的外設(shè)包括硬盤(pán)、USB設(shè)備等都是利用PCI總線接口轉(zhuǎn)接(PCI轉(zhuǎn)IDE,PCI轉(zhuǎn)USB),所以內(nèi)核的移植工作主要有兩部分, 一為bootloader和內(nèi)核之間板子硬件信息的傳遞,二為PCI外設(shè)的初始化。

3.2.1 U-BOOT與Linux內(nèi)核的配合

U-BOOT在初始化完硬件設(shè)備后,把內(nèi)核裝入內(nèi)存,然后程序指針跳轉(zhuǎn)到內(nèi)核所在位置處的同時(shí),會(huì)傳遞一些參數(shù)給內(nèi)核來(lái)使用,其中就包括有board_info數(shù)據(jù)結(jié)構(gòu),內(nèi)容包括板子的CPU主頻、SDRAM和flash大小、ip地址、MAC地址等,Linux會(huì)利用這些參數(shù)來(lái)初始化系統(tǒng)。但Linux內(nèi)核與U-BOOT的開(kāi)發(fā)并不是同一個(gè)組織,要修改Linux內(nèi)核的相關(guān)部分來(lái)匹配U-BOOT傳遞過(guò)來(lái)的數(shù)據(jù),對(duì)于我們所使用的PowerPC,U-BOOT是利用五個(gè)通用寄存器(r3,r4,r5,r6,r7)來(lái)傳遞參數(shù),我們需要修改通過(guò)r3寄存器傳遞過(guò)來(lái)的board_info數(shù)據(jù)結(jié)構(gòu)(定義在Linux內(nèi)核里arch/ppc/platforms/cs2000.h),使之與U-BOOT源代碼里u-boot-1.1.1/include/asm-ppc/u-boot.h里定義的bd_info數(shù)據(jù)結(jié)構(gòu)內(nèi)容一致,這樣內(nèi)核才不會(huì)對(duì)U-BOOT傳遞過(guò)來(lái)的board_info數(shù)據(jù)結(jié)構(gòu)進(jìn)行錯(cuò)誤解讀。

3.2.2 PCI外設(shè)初始化部分的修改

Linux內(nèi)核初始化PCI部分的主要過(guò)程為:掃描整個(gè)PCI總線,找到連接在總線上的所有設(shè)備,根據(jù)各PCI設(shè)備配置空間寄存器的信息,給各PCI設(shè)備統(tǒng)籌分配I/O空間,memory空間,以及IRQ中斷號(hào)。對(duì)于x86平臺(tái),這部分工作其實(shí)已經(jīng)在BIOS部分做過(guò),Linux內(nèi)核只需調(diào)用BIOS生成的配置即可,但對(duì)于我們嵌入式Linux系統(tǒng),沒(méi)有BIOS,這部分工作Linux內(nèi)核要自己做。而對(duì)于各個(gè)不同的開(kāi)發(fā)板,需要補(bǔ)充到標(biāo)準(zhǔn)的PCI初始化代碼里的內(nèi)容有兩部分,一為PCI設(shè)備配置空間寄存器的訪問(wèn)方式,另一為PCI中斷的配置。

根據(jù)PCI的協(xié)議規(guī)范,訪問(wèn)某PCI設(shè)備配置空間的方法為先使能該設(shè)備的IDSEL管腳,才可以讀寫(xiě)該設(shè)備的配置寄存器組。但PCI規(guī)范并沒(méi)有定義IDSEL管腳的連接方法,所以根據(jù)各開(kāi)發(fā)板PCI從設(shè)備的IDSEL管腳硬件連線方法的不同,訪問(wèn)PCI設(shè)備配置空間的方法也不同。

(圖3-1)PCI設(shè)備IDSEL管腳的兩種接法

 

如圖3-1所示,對(duì)于一般接法的(a)圖,PCI從設(shè)備的IDSEL管腳是通過(guò)一電阻串聯(lián)到PCI總線的地址線AD[11-31]中某一根,這樣可通過(guò)在訪問(wèn)PCI總線的地址期內(nèi)往AD[11-31]這些地址線一個(gè)個(gè)的置高電平,如果讀回來(lái)的配置寄存器數(shù)據(jù)有效,說(shuō)明該地址線連了某設(shè)備的IDSEL,若無(wú)效,說(shuō)明未連接。而我們開(kāi)發(fā)板則采用了圖3-1里面的(b)接法,把PCI從設(shè)備的IDSEL管腳與CPU的一個(gè)GPIO端口相連,這樣就可以通過(guò)控制GPIO來(lái)靈活的控制PCI總線上某設(shè)備的使能或者失效。在我們這種硬件連接下,訪問(wèn)PCI從設(shè)備配置空間時(shí),需要先置該設(shè)備IDSEL管腳所連接的GPIO為高,再讀寫(xiě)配置寄存器組。所以,對(duì)于我們這種開(kāi)發(fā)板,需要在一般的讀取配置寄存器空間的源碼里(arch/ppc/kernel/indirect_pci.c),讀寫(xiě)配置寄存器之前,插入下列代碼:

switch  (dev_function)

{

       case PCI_DEV1: set_gpio1_high(); //置相應(yīng)的GPIO為高

       case PCI_DEV2: set_gpio2_high();

       default:break;

}

另外一項(xiàng)需要修改的PCI初始化代碼是有關(guān)PCI設(shè)備的中斷號(hào)分配。對(duì)于沒(méi)有BIOS的嵌入式Linux,PCI設(shè)備中斷號(hào)分配是由內(nèi)核根據(jù)板子的硬件連線來(lái)決定的。一般嵌入式設(shè)備不需要中斷路徑互連器,直接把插槽的/INT管腳與CPU的IRQ線相連。連接方法有很多種,如把一個(gè)插槽的四個(gè)中斷腳都連到一個(gè)IRQ上,由操作系統(tǒng)來(lái)控制中斷的復(fù)用關(guān)系,也可以一個(gè)PCI中斷管腳只連一個(gè)IRQ線。所以PCI IRQ的分配這部分Linux代碼要根據(jù)各開(kāi)發(fā)板實(shí)際的中斷連接方法來(lái)修改。

在我們的開(kāi)發(fā)板里,每個(gè)PCI的/INT管腳都連接到一單獨(dú)的IRQ線上,根據(jù)這種連接關(guān)系,我們從軟件上可以構(gòu)造出下面這樣一張表:

/* arch/ppc/platforms/our_board_name.c:ppc405_map_irq ()*/

static char pci_irq_table[][4] =

/*      PCI  /INT PIN->INTLINE

 *      A       B      C           D    */

{

              {28,       29,         30,         30}, /* IDSEL 1 - PCI 插槽 1 */

              {31,       31,         31,         31}, /* IDSEL 2 - PCI 插槽2 */

};

上表描述的PCI插槽1的/INT A中斷的號(hào)是28,而這個(gè)28號(hào)中斷的由來(lái)是該槽的/INT A與CPU的28號(hào)中斷的IRQ線相連了。把所有PCI插槽的中斷線與CPU IRQ線的連接關(guān)系填入表中,就可以通過(guò)內(nèi)核里標(biāo)準(zhǔn)的PCI初始化代碼正確分配各PCI設(shè)備的中斷號(hào)了。當(dāng)然,在板子的IRQ初始化部分(arch/ppc/platforms/our_board_name.c:board_setup_irq())還要正確設(shè)置這些分配了的中斷線的觸發(fā)方式,極性等。

Linux內(nèi)核的移植牽涉到很多硬件的知識(shí),對(duì)開(kāi)發(fā)板的硬件原理圖有比較清楚的認(rèn)識(shí)可以對(duì)移植工作有事半功倍的效果。

結(jié)束語(yǔ)

有了bootloader,內(nèi)核,再利用Busybox[4][5]來(lái)構(gòu)建一個(gè)簡(jiǎn)單的根文件系統(tǒng)后,這個(gè)嵌入式Linux系統(tǒng)平臺(tái)就已經(jīng)搭建完畢,用前述過(guò)程所搭建的嵌入式Linux系統(tǒng)平臺(tái)體積小,功能強(qiáng),運(yùn)行穩(wěn)定,對(duì)于像數(shù)字視頻播放機(jī)這種需要長(zhǎng)期工作運(yùn)行的設(shè)備而言非常適合,而且升級(jí)性強(qiáng),對(duì)于未來(lái)的一些應(yīng)用需求,可以通過(guò)開(kāi)發(fā)板上的PCI、USB、Ethernet等接口進(jìn)行擴(kuò)展,可以說(shuō)是為以后設(shè)備的進(jìn)一步功能增強(qiáng)奠定了堅(jiān)實(shí)的基礎(chǔ)。本論文的創(chuàng)新點(diǎn)在于將傳統(tǒng)的視頻播放設(shè)備的簡(jiǎn)單控制系統(tǒng)升級(jí)為嵌入式Linux系統(tǒng),并對(duì)嵌入式Linux系統(tǒng)的構(gòu)建和移植作了詳細(xì)探討,特別是根據(jù)PCI設(shè)備的新連接方法提出了一種新的初始化算法,具有很強(qiáng)的應(yīng)用價(jià)值。

參考文獻(xiàn)

1陳 福等,基于嵌入式系統(tǒng)的視頻圖像捕獲研究與實(shí)現(xiàn),《微計(jì)算機(jī)信息》,2005年第                12-2期,P12-13、P70
2 http://www.denx.de
3 http://www.denx.de/twiki/bin/view/DULG/Manual
4 http://www.busybox.net
5 Karim Yaghmour,Building Embedded Linux System.,O’Reilly, 2004

本站聲明: 本文章由作者或相關(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工具的開(kāi)發(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ì)開(kāi)幕式在貴陽(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)閉