龍 芬
(咸寧職業(yè)技術(shù)學(xué)院 工學(xué)院,湖北 咸寧 437100)
適用于嵌入式系統(tǒng)的DTV Linux設(shè)備框架構(gòu)建
龍 芬
(咸寧職業(yè)技術(shù)學(xué)院 工學(xué)院,湖北 咸寧 437100)
構(gòu)建了一種用于支持和控制DTV硬件的Linux設(shè)備驅(qū)動架構(gòu)。之前LinuxTV由于用于PC TV卡而被廣泛認(rèn)可,但在發(fā)布Linux DVB API V3時,卻沒有面向嵌入式系統(tǒng)應(yīng)用的計劃。通過改善和代替Linux DVB,開發(fā)出具有簡化內(nèi)核驅(qū)動定義良好的APIs層次化軟件體系。
DVB;LinuxTV;Linux DVB API;嵌入式Linux
在數(shù)字視頻廣播早期,STBs和iDTV的主要功能是接收、選擇和顯示數(shù)字視頻,這些基本功能那時就出現(xiàn)了互動服務(wù),如局部互動(請求視頻)、連接其它消費服務(wù)及訪問Internet[1]。軟件必須靈活適應(yīng)TV服務(wù),并能支持各種新的多媒體格式。為了適應(yīng)硬件平臺較短的生命周期,軟件體系必須確保新的硬件平臺推出時最少能適應(yīng)現(xiàn)有軟件。然而,即使已經(jīng)被確立為TV市場中領(lǐng)先的嵌入式操作系統(tǒng),Linux內(nèi)核仍然不能對一個數(shù)字TV系統(tǒng)功能完全支持。數(shù)字TV設(shè)備的內(nèi)核支持僅限于LinuxTV工程,但它主要側(cè)重于基于PC的系統(tǒng),而不是嵌入式TV平臺。
本文對DTV linux設(shè)備框架進(jìn)行了改進(jìn),并命名為嵌入式LinuxTV(LTVe)。LTVe框架在LinuxTV工程基礎(chǔ)上進(jìn)行了擴(kuò)展,使其更適用于嵌入式Linux平臺,支持PC DVB擴(kuò)展卡,專用于機頂盒(STB)芯片組和集成數(shù)字電視(IDTV)。
1.1 設(shè)備類型
Linux設(shè)備依據(jù)其功能可劃分為幾類,這些分類關(guān)系到設(shè)備如何與上層Linux文件系統(tǒng)和其它內(nèi)核模塊集成。像大多數(shù)UNIX系統(tǒng)一樣,字符設(shè)備有許多功能調(diào)用,執(zhí)行像read()、write()、ioctl()等操作[2]。根據(jù)這一機制,LTVe讓單個硬件塊以字符設(shè)備的形式訪問,圖1為典型SOC電視系統(tǒng)設(shè)備映射圖。
圖1 典型SOC電視系統(tǒng)的設(shè)備映射
LTVe設(shè)備類型如表1所示。在大多數(shù)TV系統(tǒng)中,一般通過硬件塊來定義。硬件支持的數(shù)據(jù)流方式都可以選擇合適的硬件功能塊。
表1 LTVe 設(shè)備類型
通常情況下,poll()和select()的系統(tǒng)調(diào)用一般發(fā)生在字符設(shè)備標(biāo)志信息有效時,且將觸發(fā)應(yīng)用程序[3-4]。實際上,由于沒有生成事件序列,這種方法效率非常低。為了實現(xiàn)DTV系統(tǒng)事件隊列,允許源和類型事件過濾,引入了特殊設(shè)備。同理,為克服用戶驅(qū)動程序太復(fù)雜,引入了驅(qū)動橋。該設(shè)備作為一種內(nèi)核接口類型,是導(dǎo)出用戶空間DTV設(shè)備驅(qū)動框架的主要部分。
1.2 設(shè)備控件
對每一功能都定義了一套控件組。一般有兩個主要控件組:一個用于通用設(shè)備,另一個指定給補充設(shè)備。
1.2.1 連接
連接指通過傳遞源設(shè)備進(jìn)行定義的源同步類型文件描述符。這些控件用來定義一個設(shè)備如何互相連接,以及如何同步數(shù)據(jù)流。每個連接遵循 “單輸入-多輸出”規(guī)則。因此,每次只能有一個輸入設(shè)備。
1.2.2 數(shù)據(jù)訪問
數(shù)據(jù)訪問是指訪問用戶應(yīng)用程序的數(shù)據(jù)處理接口。為了獲得流設(shè)備數(shù)據(jù),應(yīng)用程序必須使用read()調(diào)用,或內(nèi)存設(shè)備的mmap()調(diào)用以及直接訪問數(shù)據(jù)。后一種方法優(yōu)化了數(shù)據(jù)的訪問,因為沒有將數(shù)據(jù)額外復(fù)制到應(yīng)用程序緩沖區(qū)。為了從之前的mmap()區(qū)域訪問數(shù)據(jù),應(yīng)用程序需要執(zhí)行3個步驟:①從定位數(shù)據(jù)的設(shè)備獲得信息;②讀數(shù)據(jù);③釋放讀出的數(shù)據(jù)。
1.2.3 內(nèi)存輸入
由于類型輸入可讓應(yīng)用程序?qū)憯?shù)據(jù)流到設(shè)備,因此在重放多媒體內(nèi)容時可以對硬件進(jìn)行加速。一般應(yīng)用中,運行時可配置雙緩沖區(qū)作為解碼器輸入,因為只有部分緩沖區(qū)能用來發(fā)送數(shù)據(jù)給給定設(shè)備。為了考慮這些硬件上的局限,嵌入式內(nèi)存接口主要依賴于底層硬件模塊,由作為設(shè)備源的內(nèi)存輸入激活。由于用戶內(nèi)存和任意硬件緩沖區(qū)的自由配置需要一個解碼設(shè)備輸入的硬件平臺,為了支持這種系統(tǒng),內(nèi)存設(shè)備類型定義為直接的連接源,分配到其它設(shè)備中。
1.2.4 實時控制
控制接口主要用于配置和安裝硬件設(shè)備正常運行,一般能控制所有設(shè)備活動。實時控制能啟動、停止或暫停設(shè)備,同時控制運行狀態(tài),且DTV設(shè)備框架能獲得當(dāng)前設(shè)備狀態(tài)或狀態(tài)變化情況。
LTVe設(shè)備框架由硬件接口和內(nèi)核編程接口兩部分組成。DTV軟件體系框架如圖2所示。
2.1 LTVe核
該組件使用Linux設(shè)備驅(qū)動模型和字符設(shè)備給用戶空間。它執(zhí)行系統(tǒng)初始化,對每個框架內(nèi)的設(shè)備進(jìn)行注冊,以及將一部分用戶空間轉(zhuǎn)換成LTVe驅(qū)動接口[5]。LTV設(shè)備作為字符設(shè)備應(yīng)用于 /dev/dvb/adapterN/tree中。
圖2 DTV軟件體系框架
基于Linux的DTV系統(tǒng)中,大部分軟件棧和模塊是從PC系統(tǒng)繼承和吸收過來的。因此,應(yīng)用程序同時運行不太多,這和之前有較大不同。RTOS被編譯成單一的TV應(yīng)用程序系統(tǒng)[6]。LTVe利用SysFS接口從系統(tǒng)shell配置框架,在運行應(yīng)用程序上獨立控制設(shè)備活動。對每一個LTVe,都會創(chuàng)建注冊屬性列表的SysFS節(jié)點。使用這個接口,可以監(jiān)視特定設(shè)備的運行狀態(tài)。
2.2 LTVe管理器
這個組件的創(chuàng)建和控制行為包含在框架里。為了統(tǒng)一LTVe設(shè)備行為,定義了一些基本原則:每個設(shè)備在寫使用權(quán)限時可以同時有限次打開,但對每個設(shè)備來說,只能設(shè)置一個輸入數(shù)據(jù)源,且輸入源只能是其它LTVe設(shè)備。
LTVe管理模塊實現(xiàn)了對通用邏輯數(shù)據(jù)流的定義。數(shù)據(jù)通路通過源設(shè)備至目標(biāo)設(shè)備的源文件描述符來創(chuàng)建。LTVe管理將通過文件描述符進(jìn)行檢查,僅在被識別為LTVe框架時對數(shù)據(jù)通路進(jìn)行定義。在初始化連接前,為了確保正確的初始狀態(tài),LTVe幫助設(shè)備釋放之前的數(shù)據(jù)源,此過程中設(shè)備處于非激活狀態(tài)。
每當(dāng)要建立數(shù)據(jù)通路時,LTVe管理會先調(diào)用生產(chǎn)設(shè)備的set_feed,如果連通可行則執(zhí)行查詢請求。set_input調(diào)用被執(zhí)行,設(shè)備驅(qū)動會為輸入接口選擇一個合適的配置。
2.3 LTVe驅(qū)動器
該模塊為LTVe驅(qū)動開發(fā)定義了內(nèi)核編程接口。圖3描述了LTVe內(nèi)部結(jié)構(gòu)之間的相互連接,并描述了不同設(shè)備類型如何與LTVe通訊。
圖3 LTVe驅(qū)動系統(tǒng)
2.4 LTVe橋
LTVe橋是為現(xiàn)有LTVe驅(qū)動編程接口的插件[7]。它是一個通用設(shè)備節(jié)點,模擬被LTVe驅(qū)動鉤子轉(zhuǎn)換的注冊設(shè)備類型,ioctl調(diào)用被定義為 /bridge設(shè)備,每個LTVe驅(qū)動鉤子匹配ioctl調(diào)用。數(shù)據(jù)流通過申請mmap()調(diào)用內(nèi)部硬件緩沖區(qū)。橋設(shè)備的注冊處理將產(chǎn)生兩個設(shè)備節(jié)點:①dev/dvb/adapterN/bridge 作為用戶通訊接口的通用節(jié)點; ②dev/dvb/adapterN/xxxM LTVe設(shè)備節(jié)點,這里xxx以合適的設(shè)備類型代替(如video2)。
當(dāng)需要在用戶空間運行監(jiān)聽時,LTVe監(jiān)聽/bridge設(shè)備通過橋接口重構(gòu)內(nèi)核調(diào)用,且以共享庫形式實現(xiàn)。這種機制確保了系統(tǒng)能夠成功通訊,實現(xiàn)LTVe橋驅(qū)動的數(shù)據(jù)流動。
本文提出的DTV驅(qū)動框架(LTVe)已成功移植到基于300MHz MIPS32內(nèi)核的商業(yè)SoC數(shù)字電視產(chǎn)品線的ICs中,目前LTVe框架電視應(yīng)用程序可通過第三方商業(yè)DVB和MHEG支持的DVB軟件庫來開發(fā),這表明LTVe框架是可行的。
為開發(fā)數(shù)字電視驅(qū)動和應(yīng)用程序接口,本文提出了Linux DVB設(shè)備框架軟件架構(gòu)。本架構(gòu)優(yōu)點在于在驅(qū)動開發(fā)中完全脫離Linux內(nèi)核,并且對不同硬件平臺有統(tǒng)一的DVB功能表現(xiàn)形式。采用Linux TV能極大縮短設(shè)計和開發(fā)時間,減少開發(fā)成本。
[1] 徐儉.數(shù)字電視接收機頂盒淺析[J].有線電視技術(shù),2003(3):152-156.
[2] 李叢.基于Linux的嵌入式操作系統(tǒng)的研究與實現(xiàn)[D].北京:北京化工大學(xué),2008.
[3] 田棣.嵌入式Linux下機頂盒驅(qū)動程序的開發(fā)[D].天津:天津大學(xué),2004.
[4] 王拯.數(shù)字電視機頂盒關(guān)鍵模塊設(shè)計與實現(xiàn)[D].武漢:華中科技大學(xué),2009.
[5] 劉洪濤.基于嵌入式Linux的IPTV機頂盒設(shè)計實現(xiàn)與關(guān)鍵技術(shù)研究[D].西安:西安電子科技大學(xué),2007.
[6] 胡煒.數(shù)字機頂盒Linux平臺軟件的設(shè)計與實現(xiàn)[D].上海:上海交通大學(xué),2006.
[7] SAN PIL MOON,JOO WOON KIM,KUK-HO BAE,et al.Embeded Linux implementation on a commercial digital TV system[J].Consumer Electronics,2003,49(4):155-159.
(責(zé)任編輯:杜能鋼)
龍芬(1984-),女,湖南祁東人,咸寧職業(yè)技術(shù)學(xué)院工學(xué)院講師,研究方向為自動測試系統(tǒng)。
10.11907/rjdk.162622
TP319
A
1672-7800(2017)003-0091-03