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