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