面向嵌入式視頻處理平臺(tái)的Linux移植
5設(shè)備驅(qū)動(dòng)程序開發(fā)
5.1 Linux設(shè)備驅(qū)動(dòng)程序開發(fā)步驟
Linux系統(tǒng)設(shè)備分為字符設(shè)備、塊設(shè)備和網(wǎng)絡(luò)設(shè)備3種。其設(shè)備驅(qū)動(dòng)的開發(fā)主要包括:
a)在驅(qū)動(dòng)程序源文件中定義file_opera-tions結(jié)構(gòu),并編寫出設(shè)備需要的各個(gè)操作函數(shù),對(duì)于設(shè)備不需要的操作函數(shù)用NULL初始化,這些操作函數(shù)將被注冊(cè)到內(nèi)核中。
b)定義一個(gè)初始化函數(shù),在Linux初始化時(shí)會(huì)調(diào)用此函數(shù)。此函數(shù)包含:初始化驅(qū)動(dòng)程序要用到的硬件寄存器;初始化與設(shè)備相關(guān)的參數(shù);注冊(cè)設(shè)備;注冊(cè)設(shè)備使用的中斷和函數(shù);其他一些初始化工作。
c)對(duì)于驅(qū)動(dòng)程序的使用,可以進(jìn)行靜態(tài)編譯,也可以進(jìn)行動(dòng)態(tài)編譯。靜態(tài)編譯是指將設(shè)備驅(qū)動(dòng)程序添加到內(nèi)核中,動(dòng)態(tài)編譯是指將設(shè)備驅(qū)動(dòng)程序編譯成驅(qū)動(dòng)模塊。
本嵌入式系統(tǒng)主要用于視頻處理,涉及到的外設(shè)主要是顯示設(shè)備和輸入設(shè)備。這里采用的顯示設(shè)備是LCD,而輸入設(shè)備是通過USB接口與系統(tǒng)相連的。
5.2 LCD顯示驅(qū)動(dòng)程序開發(fā)
LCD的設(shè)備驅(qū)動(dòng)程序?qū)儆谧址O(shè)備的驅(qū)動(dòng),應(yīng)按照字符設(shè)備的規(guī)則編寫。在Linux下進(jìn)行LCD顯示用Framebuffer技術(shù),這是提取圖形的設(shè)備,是用戶進(jìn)入圖形界面很好的接口。Linux內(nèi)核根據(jù)硬件描述抽象出Framebuffer設(shè)備,供用戶態(tài)的進(jìn)程直接進(jìn)行寫屏??梢詫?Framebuffer看成是顯示內(nèi)存的一個(gè)映像,將其映射到進(jìn)程地址空間之后,就可以直接進(jìn)行讀寫操作,寫操作立即反應(yīng)在屏幕上。 Framebuffer的設(shè)備文件一般存放在/dev這個(gè)目錄下,對(duì)此設(shè)備文件進(jìn)行操作即可實(shí)現(xiàn)圖像的顯示。
LCD顯示驅(qū)動(dòng)程序主要包括:
a)LCD驅(qū)動(dòng)的文件結(jié)構(gòu):包括打開設(shè)備文件、設(shè)備文件其它操作、關(guān)閉設(shè)備文件等;
b)LCD的打開:LCD設(shè)備以讀寫的方式打開;
c)LCD設(shè)備的硬件初始化:包括注冊(cè)LCD設(shè)備、卸載LCD設(shè)備等;
d)LCD相關(guān)結(jié)構(gòu)的設(shè)置:以獲取顯存起始地址、分別率、色深等;
e)映射內(nèi)存區(qū)的操作:包括初始化顯存清零等,將攝像頭采集到的圖像數(shù)據(jù)讀至顯存處,以顯示圖像;
f)LCD控制輸出:包括得到命令、畫水平線、畫垂直線、畫圓等;
g)LCD的關(guān)閉。
將上面的內(nèi)容用程序?qū)崿F(xiàn),進(jìn)行動(dòng)態(tài)編譯。通過后,將LCD驅(qū)動(dòng)模塊進(jìn)行移植加載,一個(gè)完整的LCD驅(qū)動(dòng)就開發(fā)完畢了。
5.3 USB驅(qū)動(dòng)程序開發(fā)
與LCD設(shè)備不同,USB既不屬于字符設(shè)備,也不屬于塊設(shè)備,而是一個(gè)新的設(shè)備類別,設(shè)計(jì)框架和流程如下:首先,提供一個(gè)“.o”的驅(qū)動(dòng)模塊文件,且在一開始就加載運(yùn)行。USB驅(qū)動(dòng)就會(huì)根據(jù)其類型向系統(tǒng)注冊(cè)。注冊(cè)成功后,系統(tǒng)會(huì)反饋一個(gè)主設(shè)備號(hào),這個(gè)主設(shè)備號(hào)就是其唯一標(biāo)識(shí)。USB驅(qū)動(dòng)就是根據(jù)主設(shè)備號(hào)創(chuàng)建一個(gè)放置在/dev目錄下的設(shè)備文件。要訪問此硬件,可用open、read和write等命令訪問相應(yīng)的設(shè)備文件,驅(qū)動(dòng)就會(huì)接收到相應(yīng)的 read或write函數(shù),根據(jù)模塊中相對(duì)應(yīng)的函數(shù)進(jìn)行操作。驅(qū)動(dòng)流程見圖6。
USB驅(qū)動(dòng)的具體設(shè)計(jì)過程如下:
a)USB驅(qū)動(dòng)的注冊(cè)。USB驅(qū)動(dòng)程序在注冊(cè)時(shí)會(huì)發(fā)送一個(gè)命令給函數(shù)register_chrdev,通常在驅(qū)動(dòng)程序的初始化函數(shù)中。當(dāng)USB 設(shè)備插入時(shí),為了使linux-hotplug(Linux中USB等設(shè)備熱插拔支持)系統(tǒng)自動(dòng)裝載驅(qū)動(dòng)程序,需創(chuàng)建 MODULE_DEVICE_TABLE,在此過程中需將USB的主設(shè)備號(hào)傳遞給相應(yīng)的函數(shù)。
b)USB設(shè)備的打開。打開設(shè)備是通過調(diào)用file_operations結(jié)構(gòu)中的函數(shù)open()來完成的。其主要完成的任務(wù)是:檢查設(shè)備相關(guān)錯(cuò)誤,如果是第一次打開,則初始化硬件設(shè)備;識(shí)別次設(shè)備號(hào);使用計(jì)數(shù)增1。
c)USB設(shè)備的釋放。釋放設(shè)備是通過調(diào)用file_operations結(jié)構(gòu)中的函數(shù)release()來完成的。它的作用正好與open()相反,通常要完成這樣的工作:使用計(jì)數(shù)減1,如果使用計(jì)算為0,則關(guān)閉設(shè)備。
d)USB設(shè)備的控制信息與數(shù)據(jù)讀寫。USB設(shè)備驅(qū)動(dòng)程序可以通過文件操作結(jié)構(gòu)中的函數(shù)向應(yīng)用程序提供對(duì)硬件進(jìn)行控制的接口,同時(shí)讀寫操作也要通過此函數(shù)來完成。
e)USB驅(qū)動(dòng)的注銷。當(dāng)從系統(tǒng)卸載驅(qū)動(dòng)程序時(shí),需要注銷USB設(shè)備,這樣必須編寫一個(gè)注銷函數(shù)unregister_chrdev。
6結(jié)束語(yǔ)
本文基于TMS320DM*6平臺(tái)實(shí)現(xiàn)了Linux移植,包括創(chuàng)建交叉編譯環(huán)境、BootLoader的設(shè)計(jì)、Linux內(nèi)核移植以及LCD、 USB設(shè)備驅(qū)動(dòng)程序開發(fā),為實(shí)時(shí)視頻處理應(yīng)用開發(fā)創(chuàng)建了一個(gè)良好的嵌入式平臺(tái),在此平臺(tái)上可進(jìn)一步進(jìn)行應(yīng)用程序、GUI及視頻處理算法開發(fā)與測(cè)試。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論