android平台应用GPIO模拟IR控制车载DTV
? ? 數(shù)字電視—DTV對我們來說早已不是一個新東西,在車載電子上DTV大多是以模塊的形式獨立存在的,是可配的。在車載的市場上,客戶的需求是多種多樣的,如果把DTV也做到車載導(dǎo)航主PCB上去,還是不靈活,不要DTV的就得是不同的PCB板,這對于售后維護(hù)、開發(fā)都不是一個好辦法。
??????? DTV在家里,大家一般都是通過遙控器來操作,當(dāng)然現(xiàn)在有些android的電視盒子可以通過手機來控制,有個泰捷遙控器的apk,通過同一個wifi熱點的電視盒,可以用手機來操作也挺方便。但是在車上,怎么去操作DTV呢?在小車上,一般空間都是比較狹窄的,使用遙控器是很不方便的,因此我們需要把控制做到導(dǎo)航主控上去。在遙控器的協(xié)議中,NEC協(xié)議是使用得最普遍的,下面就以NEC協(xié)議為例學(xué)習(xí)一下使用GPIO模擬IR按鍵消息的方法。
??????? NEC的一條按鍵信息由數(shù)據(jù)頭、客戶碼、客戶碼反碼、鍵值、鍵值反碼、停止位組成,在此不介紹重復(fù)碼。數(shù)據(jù)頭是一個9ms + 4.5ms的高低組合,后面就是緊跟4個字節(jié)的數(shù)值,也就是32bit的0、1組合。IR口的gpio口一般是默認(rèn)是高電平的,解碼驅(qū)動大多都是采用下降沿觸發(fā)中斷。在此我們主要是要編出一串IR脈沖。組合這一串脈沖的代碼如下:
[plain]?view plaincopy
??????? 在此有一個問題,就是編這一段脈沖需要50ms以上,標(biāo)準(zhǔn)的一個完整的消息大概是108ms-110ms。這就要求我們在發(fā)送4字節(jié)數(shù)據(jù)以及停止碼中間不能被任務(wù)調(diào)度,因為任務(wù)一調(diào)度的話編的碼的寬度就會有很大出入,接收端解析就會認(rèn)為是一個錯誤的遙控值。那我們怎么去盡力保證呢?在linux中有一個spinlock,也就是自旋鎖,一旦獲得這個鎖就可以保證當(dāng)然執(zhí)行的進(jìn)程不被調(diào)度搶占。因此在上面的這段代碼前后加上鎖以及取消鎖操作,筆者在實際操作中,在近百次的操作中,發(fā)送IR鍵值的成功率是百分之百。加鎖的相關(guān)代碼如下:
[plain]?view plaincopy
?????? 在android上層,可以通過ioctl來控制,向上層可以封裝在service里面供上層應(yīng)用使用。
?????? 以上僅供參考。
總結(jié)
以上是生活随笔為你收集整理的android平台应用GPIO模拟IR控制车载DTV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt环境报错-Project ERROR
- 下一篇: STM32CUBE+自平衡车-前言