2013年12月23日 星期一

使用萬用遙控器(學習型) 替換新小米盒子的遙控器

小米盒子是小米公司出的 android 多媒體機上盒,  大概想要走 AppleTV 的路線, 
所以外觀小巧, 前陣子入手了首發的二代小米盒子, 官方稱為 新小米盒子, 


整體來說, 摒除中華電信非固定型光世代連大陸頻寬十分糟糕的問題之外, 
使用上感覺還不錯.

不過, 使用這一陣子以來, 讓我覺得最不方便的地方是它的遙控器, 

倒不是這支遙控器不好用(其實我也不喜歡它的按鍵聲)
而是因為家裡多媒體設備眾多, 為了方便, 早就用一支8合一的學習型遙控器來整合,
新小米盒子入手的第一天, 就想把它的遙控器也整進原本那支萬用遙控器裡,
但試了下, 卻發現總是學習失敗, 猜想應該是像DM500S 一樣, 使用了非一般常用的NEC
遙控碼協定, 因為新小米盒子剛上市, 網路上也少有它的資訊, 這件事就暫時打住了...

最近在逛樂視論壇時, 發現了有人在談論一代小米盒子的遙控器,  他們是想拿小米盒子的
遙控器去樂視盒子上使用, 雖然跟我的需求沒有直接關係, 但揭露的一些資訊卻讓我有了
個方向,  經過一番努力(反覆開機數十次以上)加上一些好運氣, 總算成功解決這個問題.


把詳細方法寫在下面, 有興趣的人看看:

在往下看之前, 有幾個先決條件, 一定都要OK才行.
1.  新小米盒子要已經 ROOT, 因為遙控器設定檔放在 /system/etc 下, 沒有  root 權限是無法替換修改的 (可以使用 root 大師 來幫忙)
2.  欲替換遙控器的鍵碼, 需事先取得欲替換遙控器按鍵的鍵碼, 這樣才有辨法製作新設定檔以取代原設定檔( 這個就需要一些外部工具了, 如果欲替換的遙控器蠻普遍的, 也許可以google 看看, 若沒有的話, 就只好自已實作一些電路來取得遙控器的鍵碼了, 這點有需要的話, 可以回覆留言再討論, 也許再另文分享)
3. 已經有安裝且會使用 Android  adb 工具.

首先是官方原始遙控器設定檔: /system/etc/remote.conf ( 我已經加上一些註解, 以方便觀看)
#*********************************************************************************************************
#this file is configuration for each factory remote device
# work_mode  0 :software mode  1 :hardware mode
# repeat_enable  0 :disable repeat 1 :enable repeat
#
# factory_code      each device has it's unique factory code.
#  pattern:custom_code(16bit)+index_code(16bit)
#  examble: 0xff000001 = 0xff00(custom cod)  0001 (index)
#
# release_delay  unit:ms.release will report from kernel to user layer after this period of time
#  from press or repeat triggered.
#
# debug_enable      0 :debug disable  1 :debug disable
#
# SW MODE:
# bit_count  how many bits in each frame  
# tw_leader_act  time window for leader active
# tw_bit0  time window for bit0 time.
# tw_bit1  time window for bit1 time
# tw_repeat_leader  time window for repeat leader1
# REG
# reg_base_gen  set value for PREG_IR_DEC_BASE_GEN
# reg_control  set value for PREG_IR_DEC_CONTROL
# reg_leader_act  set value for PREG_IR_DEC_LEADER_ACTIVE
# reg_leader_idle  set value for PREG_IR_DEC_LEADER_IDLE
# reg_repeat_leader set value for PREG_IR_DEC_REPEAT_IDLE
# reg_bit0_time  set value for PREG_IR_DEC_BIT0_TIME
#*************************************************************************************************************
#amlogic NEC remote
factory_code    = 0x00860001
work_mode               = 2
repeat_enable = 0
release_delay   =       90
debug_enable    = 1
bit_count = 20


key_begin
0x05 103  #up
0x06 108  #down
0x0b 105  #left
0x0c 106  #right
0x0d 28    #ok
0x08 102  #home
0x07 158  #back
0x04 139  #menu
0x0a 116  #power
0x11 236  #low battery (按下後顯示低電量符號, 無任何作用)
0x03 235  #switch resolution (切換解析度, 每按一次切換一次)
0x0e 115  #volume up
0x0f 114   #volume down
key_end



按鍵定義:  遙控碼 鍵盤值 #說明


 以up 鍵(103)為例  ->  0x4e 103  #up


實際取得使用NEC協定的遙控器其中一鍵遙控碼鍵為
FF00728D  共32 bit, 4byte ( 工廠碼 + 反相工廠碼 + 命令碼 + 反相命令碼)


命令碼= 0x72  -> 0111 0010
反轉(reverse)命令碼 ->  0100 1110 => 0x4e


工廠碼(factory_code)
實際取得使用NEC協定的遙控器其中一鍵遙控碼鍵為CE94D02F
工廠碼+反相工廠碼 = 0xCE94  -> 1100 1110 1001 0100
反轉(reverse) 工廠碼 -> 0010 1001 0111 0011 => 0x2973
factory_code    = 0x29730001


實際以網樂通機上盒遙控器替換原新小米盒子遙控器之設定檔


factory_code   = 0x29730001                                                                                  
work_mode    = 1                                                                                   
repeat_enable  = 0  
release_delay  =  150  #90無法連發, 150可以連發,                                                                                  
debug_enable  = 1                                                                                           
#reg_control     = 0xfbe40    #此行似乎不用加, 加不加都可以正常使用.
                                                                                                             
key_begin                                                                                                     
               0x61 103 #up                                                                                  
               0x62 108 #down                                                                                
               0x63 105 #left                                                                                
               0x64 106 #right                                                                               
               0x0b 28  #ok                                                                                  
               0x1e 102 #home                                                                                
               0x03 158 #back                                                                                
               0x00 139 #menu                                                                                
               0x1d 116 #power                                                                               
               0x58 236 #low power                                                                           
               0x40 235 #swite resolution                                                                    
               0x09 115 #volume up                                                                           
               0x01 114 #volume down                                                                         
               0x02 113 #mute                                                                                
               0x08 120 #media_forward                                                                       
               0xa0 121 #media_rewind                                                                        
               0x0e 2   #key 1                                                                               
               0x0f 3   #key 2                                                                               
               0x0c 4   #key 3           
               0x1a 5   #key 4           
               0x13 6   #key 5           
               0x10 7   #key 6           
               0x16 8   #key 7           
               0x71 9   #key 8           
               0x14 10  #key 9           
               0x1b 11  #key 0           
               0x15 15  #backspace       
key_end                                   


當產生新的設定檔後,  以新的設定檔覆蓋或修改舊的設定檔 (建議將原始的檔案先改名處理)

  • adb shell
  • su
  • mount -o remount,rw /dev/block/system /system
  • vi /system/etc/remote.conf
  • 修改完後, reboot 重新開機
如果設定值正確的話, 重新開機後就可以生效, 每按一個有效鍵, 則盒子的指示燈會閃爍一次.
如果不是有效值的話, 指示燈完全不會變化( 就是這樣, 所以 debug 才很困難, 要不是一些好運氣, 否則這次恐怕要花上更多的時間了)

有任何問題, 歡迎提出.

最後是從盒子裡截取出來的按鍵碼 Vendor_0001_Product_0001.kl



key 399   GRAVE
key 1     BACK
key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 15    BACK
key 158   BACK
key 58    SOFT_RIGHT
key 107   ENDCALL
key 62    ENDCALL
key 139    MENU
key 125    MENU
key 60    NOTIFICATION
key 127   SEARCH
key 217   SEARCH
key 228   POUND
key 227   STAR
key 231   CALL
key 61    CALL
key 97    DPAD_CENTER
key 232   DPAD_CENTER
key 108   DPAD_DOWN
key 103   DPAD_UP
key 102   HOME
key 105   DPAD_LEFT
key 106   DPAD_RIGHT
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 104   VOLUME_UP
key 109   VOLUME_DOWN
key 212   CAMERA
key 236   POWERLOW
key 235   SWITCHRESOLUTION


key 16    Q
key 17    W
key 18    E
key 19    R
key 20    T
key 21    Y
key 22    U
key 23    I
key 24    O
key 25    P
key 26    LEFT_BRACKET
key 27    RIGHT_BRACKET
key 43    BACKSLASH


key 30    A
key 31    S
key 32    D
key 33    F
key 34    G
key 35    H
key 36    J
key 37    K
key 38    L
key 39    SEMICOLON
key 40    APOSTROPHE
key 14    DEL


key 44    Z
key 45    X
key 46    C
key 47    V
key 48    B
key 49    N
key 50    M
key 51    COMMA
key 52    PERIOD
key 53    SLASH
key 28    ENTER


key 56    ALT_LEFT
key 100   ALT_RIGHT
key 42    SHIFT_LEFT
key 54    SHIFT_RIGHT
#key 15    TAB
key 57    SPACE
key 70    EXPLORER
key 155   ENVELOPE


key 12    MINUS
key 13    EQUALS
key 215   AT
key 119   MEDIA_PLAY_PAUSE
key 122   MEDIA_PREVIOUS
key 123   MEDIA_NEXT
key 120   MEDIA_FAST_FORWARD
key 121   MEDIA_REWIND
key 116   POWER WAKE
key 113   MUTE
key 128   MEDIA_STOP
key 130   ZOOM_IN
key 131   ZOOM_OUT
key 133   TAB


key 132   TV_REPEAT
key 134   TV_SHORTCUTKEY_DISPAYMODE
key 135   TV_SUBTITLE
key 136   TV_SHORTCUTKEY_VOICEMODE
key 137   TV_SWITCH