Android底層開發之紅外遙控驅動移植
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
1.紅外遙控驅動移植
每個脈衝都是一箇中斷,逐個脈衝計數判斷就成了紅外資訊接收驅動程式。
就是一個普通的GPIO
關於休眠後通過紅外遙控器喚醒系統
系統休眠
Android的開發者網站中以應用開發者的角度說明了系統電源狀態,以CPU,Screen,Keyboard的工作狀態來區分。
這裡呈現給應用開發者的狀態,但對於作業系統和Linux核心來說是有嚴格的等級制度的。
* Early suspend 相當於PC中的睡眠狀態
* suspend 相當於
*
對於電源直接供電裝置,可以讓系統級應用開啟一個PARTIAL_WAKE_LOCK鎖。這樣系統預設進入的就是淺休眠,喚醒問題得以解決。
以下四個方法:
1. if resume handler of rk remote driver can run at very first place in whole resume process;
2. if handler wait proper key signal (drop partial signal) then you can get key code and decide "continue to wake or sleep again";
3. if remote controller send key code repeatedly while "drop partial signal and wait proper/complete key signal";
4. if the system is only _early suspend_ don't _suspend_. likes a PC we used.
深度休眠後遙控器不能喚醒系統分析和方案選擇
Android休眠狀態主要有淺休眠/深度休眠,前者相當於PC機上的待機狀態 後者相當於睡眠狀態。Android系統深度休眠後,所有的驅動(包括紅外驅動)是不工作的。紅外訊號是一串連續的波形。測試在深度休眠時紅外訊號到CPU之前都是正常完好的。當按下遙控器上的按鍵時,CPU收到紅外訊號後會立即開始喚醒所有驅動,但是在這個時間段中紅外訊號是在不斷地輸入,等到紅外遙控驅動喚醒完成後它所能接收到的訊號並不是一個完整的訊號,所以也無法解析出一個正確的按鍵,沒有辦法向上層系統上報一個喚醒的鍵值。接著核心會再次進入休眠狀態。導致系統不能正常喚醒。
1. 喚醒系統時首先喚醒IR驅動;
個人評價:無論再怎麼首先喚醒IR驅動,也會導致丟失部分紅外訊號;
2. 接收到訊號時將訊號儲存,等IR驅動喚醒成功後再傳至其處理函式;
個人評價:這個需要在PM中實現,複雜度有點高;
3. 遙控器連續傳送相同訊號,直到系統完全喚醒停止;
個人評價:這個要修改遙控器的實現,且紅外傳輸一般是單向的,不切合實際。
4. 系統只進入淺休眠狀態(相當於PC上的「待機」狀態),不進入深度休眠狀態。
個人評價:對於電源供電裝置,完全可以照此方法實現,這也是普通PC機的實現方法。不用過度按照電池供電裝置(手機/平板)的而喪失一些易用性。同時照此實現方法後之前一直擱置的滑鼠/鍵盤喚醒系統的問題也同時得以解決。
關於「確定真正問題之前疑點」的解答
1. 連線USB OTG線到PC機時為什麼可以正常使用
因為這裡系統進入的是 淺休眠 不是深度休眠,所有驅動工作正常。
2. 為什麼產線版本系統可以正常喚醒
當時測試時,由於產線版本系統中有一個 硬體測試 APP在執行,
該軟體限制了系統進入「深度休眠」,關閉或者刪除後問題就可以重現。
3. 多次按鍵能偶爾能喚醒
在紅外驅動被喚醒後,再按的鍵後遙控器發出的紅外訊號是可以被完整接收到的。
但這有相當大的偶然性。
關於第4種方法的程式碼實現
一段程式碼就可以實現,將其新增至SystemUI中:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
畫的兩個原理手圖: