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