文/林福德
數(shù)字高清電視系統(tǒng)中Linux驅(qū)動(dòng)的基本結(jié)構(gòu)及應(yīng)用
文/林福德
數(shù)字高清電視保留了對(duì)傳統(tǒng)的模擬信號(hào)進(jìn)行抽樣、量化和編碼后轉(zhuǎn)換成的二進(jìn)制數(shù)字式信號(hào),也支持對(duì)目前主流數(shù)字媒體設(shè)備的數(shù)字信號(hào)處理,同時(shí)也向互聯(lián)網(wǎng)應(yīng)用、人機(jī)交互、智能家居和客戶定制等方向發(fā)展,基于Linux系統(tǒng)的電視方案中Linux驅(qū)動(dòng)發(fā)揮著重要的作用。文章首先對(duì)Linux驅(qū)動(dòng)進(jìn)行了介紹,然后對(duì)Linux驅(qū)動(dòng)的基本結(jié)構(gòu)進(jìn)行了分析,最后對(duì)Linux驅(qū)動(dòng)的使用方法進(jìn)行了探討,為相關(guān)人員提供借鑒。
數(shù)字高清電視系統(tǒng) Linux驅(qū)動(dòng) 驅(qū)動(dòng)設(shè)備加載
在Linux系統(tǒng)中設(shè)備驅(qū)動(dòng)程序是硬件設(shè)備的控制代碼,基于Linux的數(shù)字高清電視系統(tǒng)中如果沒有Linux驅(qū)動(dòng),那么就無(wú)法保證運(yùn)行系統(tǒng)的功能。文章重點(diǎn)對(duì)數(shù)字高清電視系統(tǒng)中Linux驅(qū)動(dòng)的基本結(jié)構(gòu)和使用方法進(jìn)行分析和探討。
Linux是一種利用POSIX操作的系統(tǒng),有著BSD和SYSV兩種特征。相比其它系統(tǒng),Linux具有連接用戶多、擁有多種平臺(tái)及有虛擬內(nèi)存等優(yōu)勢(shì),再加上其源代碼經(jīng)常不關(guān)閉,用戶在使用時(shí)可以根據(jù)不同的需求選擇操作系統(tǒng),進(jìn)而能夠很好地滿足用戶各種需求。另外,由于Linux是一款免費(fèi)軟件,系統(tǒng)所花費(fèi)成本相對(duì)較低,而且可以根據(jù)用戶需求進(jìn)行剪裁,所以相比于其他系統(tǒng)有著很好的實(shí)用性及穩(wěn)定性,在軟件開發(fā)時(shí)越來越多的人通過Linux平臺(tái)進(jìn)行開發(fā)研究。
Linux系統(tǒng)主要分為下面幾種:字符設(shè)備以及網(wǎng)絡(luò)設(shè)備等。不同的模塊與不同的設(shè)備相互對(duì)應(yīng),同時(shí)也可以將模塊分為不同的模塊。但是這種分類不是十分嚴(yán)格。
(1)字符設(shè)備是一種可以同字節(jié)流一樣進(jìn)行訪問的設(shè)備,利用相應(yīng)的程序來完成。字符設(shè)備驅(qū)動(dòng)程序可以在不同設(shè)備中隨意使用打開、關(guān)閉、讀取和編輯等系統(tǒng)調(diào)用。字符終端(/dev/console)和串口(/dev/ttys0以及類似設(shè)備)就可以較好的顯示成流抽象索。在進(jìn)行訪問時(shí)可以利用文件系統(tǒng)節(jié)點(diǎn)(比如/dev/tty1和/dev/mtd0等),以 fl ash的mtd設(shè)備為例操作單元小到字節(jié),分區(qū)只須擦除一次就可以順序?qū)憯?shù)據(jù)直至所有空間都寫滿才需要重新擦除后再寫,所以小數(shù)據(jù)操作時(shí)只要管理算法得當(dāng)就能很大程度上提高設(shè)備的使用壽命;常用的文件在進(jìn)行訪問時(shí),指針可以隨意移動(dòng),字符設(shè)備進(jìn)行訪問時(shí)遵守一定的次序,指針不能進(jìn)行移動(dòng);有的設(shè)備性能與其具有一定的相似性,在進(jìn)行訪問時(shí)指針也能夠隨意移動(dòng),就像幀抓取器在訪問時(shí)指針可以隨意移動(dòng)。
圖1:將模塊存入內(nèi)核
(2)模塊設(shè)備與字符設(shè)備相同,模塊設(shè)備在進(jìn)行訪問時(shí)是利用/dev目錄來進(jìn)行訪問。模塊設(shè)備(就像磁盤)可以承載一些系統(tǒng)。在許多Unix系統(tǒng)運(yùn)行過程中,模塊設(shè)備都是以整數(shù)形式存在的,但是每個(gè)設(shè)備之間也有著差異性。
Linux可以使程序進(jìn)行讀寫時(shí)像字符設(shè)備一樣,可以一次性傳送多種字符,所以模塊設(shè)備與字符設(shè)備的不同之處就是數(shù)據(jù)管理的方式,即設(shè)備所連接的接口不同。與字符設(shè)備相同,模塊設(shè)備在進(jìn)行訪問時(shí)也需要通過節(jié)點(diǎn),用戶使用時(shí)會(huì)明顯發(fā)現(xiàn)它們間的不同之處,以flash的mtdblock設(shè)備為例操作的最小單元是block,寫每個(gè)block之前都必須先擦除原有數(shù)據(jù),較大數(shù)據(jù)量的操作時(shí)在速度上比字符設(shè)備會(huì)有很大的優(yōu)勢(shì)。模塊設(shè)備不僅能給內(nèi)核提供接口,還能夠向模塊設(shè)備提供接口,但是在dev目錄中打開是不能發(fā)現(xiàn)這些接口的。除此之外模塊設(shè)備如果不支持掛裝文件系統(tǒng),就不能進(jìn)行相應(yīng)操作。
(3)在進(jìn)行網(wǎng)絡(luò)訪問時(shí)都需要通過一個(gè)接口,即能夠與其它主機(jī)進(jìn)行數(shù)據(jù)共享的設(shè)備。一般將硬件來作為接口,也可以是一個(gè)軟件設(shè)備,就像回環(huán)接口一樣。網(wǎng)絡(luò)接口的運(yùn)行需要通過系統(tǒng)驅(qū)動(dòng)來完成,以此來保證數(shù)據(jù)間的傳遞,完全不用了解數(shù)據(jù)傳遞的運(yùn)行原理。最后Telnet以FTP連接都由一個(gè)設(shè)備來進(jìn)行,但是只能看到數(shù)據(jù)包,由于使用的設(shè)備都不是面向流的設(shè)備,所以把運(yùn)行接口應(yīng)用到不同的設(shè)備(比如/dev/tty1)不容易。
Linux是通過模塊的形式進(jìn)行連接的設(shè)備,即每個(gè)模塊都有著自己的程序,設(shè)備驅(qū)動(dòng)程序應(yīng)當(dāng)給Linux的中心或者所屬系統(tǒng)提供一個(gè)程序。
設(shè)備驅(qū)動(dòng)在運(yùn)行的過程中經(jīng)常需要用到函數(shù)init_module(),這個(gè)函數(shù)負(fù)責(zé)設(shè)備的初始化運(yùn)行。其有著很重要的作用就是在系統(tǒng)中進(jìn)行注冊(cè),在注冊(cè)的過程中經(jīng)常會(huì)用到register_ chrdev()以及register_blkdev()。注冊(cè)完成后,這個(gè)設(shè)備就會(huì)得到自己的設(shè)備號(hào),而且還與文件產(chǎn)生了聯(lián)系。這跟PCI、USB設(shè)備進(jìn)行注冊(cè)的時(shí)候有些差異。設(shè)備驅(qū)動(dòng)在進(jìn)行刪除時(shí)會(huì)將數(shù)據(jù)回收,然后會(huì)在系統(tǒng)中注銷相應(yīng)的賬號(hào),字符設(shè)備調(diào)用unregister_chrdev()、模塊設(shè)備調(diào)用unregister_blkdev()。調(diào)用insmod進(jìn)行模塊的使用過程中設(shè)備會(huì)自動(dòng)通過初始化函數(shù)保存數(shù)據(jù),調(diào)用rmmod刪除這個(gè)模塊時(shí)會(huì)自動(dòng)通過注銷函數(shù)來進(jìn)行設(shè)備的卸載,除此之外用戶還可以通過lsmod命令來獲取已經(jīng)加載過的模塊數(shù)據(jù)。系統(tǒng)對(duì)數(shù)據(jù)的獲取就是設(shè)備具體的操作過程,就像open、read、write、ioctl等設(shè)備的使用過程。圖1是設(shè)備模塊的掛接、刪除和數(shù)據(jù)保存的具體流程。
(1)設(shè)備驅(qū)動(dòng)就是利用函數(shù):open()、close()、read()、write()、ioctl()的過程來進(jìn)行的。在進(jìn)行操作的時(shí)候,open會(huì)啟動(dòng)模塊,模塊開始運(yùn)行,close是關(guān)閉這個(gè)模塊,這整個(gè)操作都是在read、write之中進(jìn)行的,而且ioctl會(huì)對(duì)整個(gè)模塊進(jìn)行一定的調(diào)整。所以在設(shè)備系統(tǒng)的操作過程中起到了很大的作用,fops進(jìn)行注冊(cè)的方式如下:
以上表明, fi le_ fops對(duì)設(shè)備的運(yùn)行有著一定的影響。由這些數(shù)據(jù)可以得出,基本完成了設(shè)備的開、關(guān)、讀、寫和控制功能。通過程序?qū)ξ募M(jìn)行讀取的時(shí)候,最重要的操作就是通過系統(tǒng)來調(diào)用函數(shù),將這個(gè)過程作為數(shù)據(jù)進(jìn)行傳遞,通過這種方式來連接驅(qū)動(dòng)與核心。
Linux驅(qū)動(dòng)程序利用函數(shù)運(yùn)行,自動(dòng)配置和初始化子程序能夠檢測(cè)設(shè)備是否能夠正常運(yùn)行。要是設(shè)備沒有異常,就會(huì)對(duì)整個(gè)系統(tǒng)進(jìn)行初始化運(yùn)行。而這個(gè)程序只會(huì)在初始化操作時(shí)才會(huì)運(yùn)行。
(2)根據(jù)I/O發(fā)出的指令而運(yùn)行的子程序,又叫做程序的上半部分。這些程序在執(zhí)行命令的過程中,系統(tǒng)依然會(huì)認(rèn)定其與系統(tǒng)調(diào)用處于同一個(gè)進(jìn)程。只是用戶進(jìn)行了不同的操作,創(chuàng)造了用戶操作的環(huán)境,所以對(duì)在進(jìn)行此項(xiàng)操作時(shí)通常會(huì)運(yùn)行相應(yīng)的函數(shù)。
(3)結(jié)束子程序運(yùn)行狀態(tài),通常又稱為驅(qū)動(dòng)的下半部分。在進(jìn)行系統(tǒng)調(diào)用時(shí)無(wú)法直接調(diào)用設(shè)備驅(qū)動(dòng)程序的子程序,只能利用Linux系統(tǒng)來結(jié)束子程序的運(yùn)行,然后通過系統(tǒng)來對(duì)中斷服務(wù)子程序進(jìn)行調(diào)用。中斷的情況會(huì)出現(xiàn)在所有運(yùn)行的程序中,所以當(dāng)中斷服務(wù)程序被調(diào)用時(shí),不要通過任意一個(gè)程序來調(diào)用,也就是不能對(duì)正在運(yùn)行程序的函數(shù)進(jìn)行調(diào)用。由于設(shè)備驅(qū)動(dòng)程序一般只能通過同一種設(shè)備的驅(qū)動(dòng)程序進(jìn)行調(diào)用,因此在進(jìn)行此操作的時(shí)候,經(jīng)常會(huì)使用同一個(gè)參數(shù)。
綜上所述,數(shù)字高清電視系統(tǒng)是數(shù)字進(jìn)程的一個(gè)主要產(chǎn)物,集中體現(xiàn)了計(jì)算機(jī)、多媒體、加解擾算法、熟悉壓縮編碼、通信技術(shù)、加解密算法的發(fā)展水平。在數(shù)字高清電視系統(tǒng)中Linux驅(qū)動(dòng)作為數(shù)字高清電視廣播的主流接收端,在數(shù)字電視普及和發(fā)展過程中發(fā)揮著重要作用。本文通過對(duì)數(shù)字高清電視系統(tǒng)中Linux驅(qū)動(dòng)的基本結(jié)構(gòu)和使用方法進(jìn)行研究,可以使程序的開發(fā)更加簡(jiǎn)單,提高產(chǎn)品的可移植性和開放性,保證了數(shù)字高清電視系統(tǒng)的擴(kuò)展性。
[1]范質(zhì)堅(jiān).Linux在嵌入式系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2000(06):22-25.
[2]夏一民,羅軍,鄧勝蘭.實(shí)時(shí)Linux操作系統(tǒng)初探[J].計(jì)算機(jī)應(yīng)用研究,2001(01):45-48.
[3]劉云新,張堯?qū)W.一個(gè)基于Linux的嵌入式實(shí)時(shí)操作系統(tǒng)[J].計(jì)算機(jī)工程與應(yīng)用,2001(07):64-66+85.
作者單位 廣東九聯(lián)科技股份有限公司 廣東省惠州市516025
林福德(1985-),男,廣東省梅州市人。大學(xué)本科學(xué)歷。工程師,從事軟件開發(fā)工作。