基于I2C的OSD顯示驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)
T128設(shè)備的初始化,主要是首先映射GPIO和T128相關(guān)寄存器到虛擬地址空間,然后檢測(cè)I2C總線驅(qū)動(dòng)有沒(méi)有初始化,創(chuàng)建互斥體,并建立一個(gè)寫線程OsdWriteProc(),同時(shí)建立一個(gè)OSD寫命令非空事件g_hevOsdQueueEmpty這樣檢測(cè)到非空事件時(shí)就可以調(diào)用OSD寫進(jìn)程。初始化設(shè)備失敗或者設(shè)備卸載的時(shí)候調(diào)用設(shè)備卸載函數(shù),卸載時(shí)要釋放虛擬GPIO寄存器的空間,調(diào)用I2C的卸載函數(shù),并關(guān)閉互斥體。
2.3.3 OSD寫入流程
實(shí)踐中發(fā)現(xiàn)在寫OSD時(shí)需要停止T128 MCU,寫完后恢復(fù)其運(yùn)行,否則OSD會(huì)錯(cuò)亂。如果要停止T128MCU時(shí),它正在切換視頻、檢測(cè)視頻信號(hào),操作未完成時(shí)被停掉,則液晶屏顯示會(huì)錯(cuò)亂,圖像分成幾個(gè)部分。而上層應(yīng)用的寫OSD請(qǐng)求不能丟棄,否則上層的狀態(tài)又會(huì)錯(cuò)亂,該隱藏的未隱藏,該顯示的沒(méi)顯示。因此需要設(shè)計(jì)一種機(jī)制,既保證上層的寫OSD操作不丟棄,又不與T128 MCU沖突。
如圖5所示,設(shè)計(jì)一個(gè)緩沖隊(duì)列,接收到上傳人的OSD數(shù)據(jù)壓入隊(duì)列。OSD驅(qū)動(dòng)留給上層的Write接口,不負(fù)責(zé)實(shí)際的寫操作,將數(shù)據(jù)壓入隊(duì)列(此時(shí)會(huì)激活隊(duì)列非空事件)后立即返回。創(chuàng)建一個(gè)OSD寫線程,等待緩沖隊(duì)列非空事件激活后,查詢T128 MCU狀態(tài),待其空閑后,獲取關(guān)鍵代碼段,執(zhí)行寫操作,寫完后退出關(guān)鍵代碼段,進(jìn)入下一輪循環(huán)。
3 性能分析
T128通過(guò)3根主線跟CPU通信,由T128處理從DVD和PXA270來(lái)的視頻信號(hào),這樣OSD就可以在各個(gè)源的信號(hào)上疊加。由于T128處理了很大一部分視頻信號(hào),降低了CPU的負(fù)擔(dān),同時(shí)也圓滿解決了OSD在DVD信號(hào)上的疊加問(wèn)題。由于I2C的多主控特點(diǎn),不會(huì)影響掛在I2C上的其他外設(shè)的工作和性能。
4 結(jié)語(yǔ)
本文介紹了基于PXA270處理器和Windows CE5.0操作系統(tǒng)上的OSD驅(qū)動(dòng)的設(shè)計(jì)和實(shí)現(xiàn)。目前已經(jīng)在本平臺(tái)上穩(wěn)定運(yùn)行,具有很好的OSD處理能力。同時(shí),鑒于T128強(qiáng)大的處理功能,該驅(qū)動(dòng)還可以優(yōu)化和拓展,比如可以利用T128實(shí)現(xiàn)車載平臺(tái)機(jī)構(gòu)的翻轉(zhuǎn)。
評(píng)論