请选择 进入手机版 | 继续访问电脑版

您好,欢迎来到高清播放机爱好者!登录注册

  • 4172查看
  • 43回复

[问题] 固件跨厂移植实践:解决遥控器问题(一)端口法和管道法   [复制链接]

Rank: 8Rank: 8

RP值
38
金钱
5366
贡献
5055
在线时间
827 小时
最后登录
2011-10-7
精华
8
注册时间
2011-3-10
帖子
1800
发表于 2011-4-10 15:49:47 |显示全部楼层
本帖最后由 hdpdiy 于 2011-6-7 10:39 编辑

固件跨厂移植实践:解决遥控器问题(一)


官方固件的播放机操作控制过程

        用遥控器操作控制播放机可以看成是这样一个过程。遥控器发出指令编码,播放机接收后转换成输入装置/dev/venus_irrp中的遥控码。DvdPlayer从输入端口/dev/venus_irrp中读入遥控码,再用内部的转换表把遥控码转换成命令码,最后根据命令码执行相应的程序。


        这里要专门解释一下/dev/venus_irrp,上面的图中涉及到2个/dev/venus_irrp。一个是播放机接收遥控指令编码的输入装置/dev/venus_irrp,这个输入装置是不能重新命名设置的。另一个是DvdPlayer内部的/dev/venus_irrp,可以看成是DvdPlayer读入遥控码的输入端口。这个输入端口是可以重新命名设置的,如改成/tmp/venus_irrp,这时DvdPlayer读入遥控码的输入端口就是这个重新命名设置的/tmp/venus_irrp。

        另外还要解释一下命令码和遥控码,下面要反复用到这2个名词。命令码是一个字符串,通常就是一个单字符。在文本中不显示的空格也是一个字符,而且一般用来作遥控器上、下、左、右四个键中间的OK确定键的命令码。DvdPlayer从遥控码输入端口读入遥控码,经过转换表转换为命令码,再根据命令码执行相应的程序。

        遥控码是一组4字节的16进制编码。遥控器发出的指令编码由播放机接收后,转换为存放在输入装置/dev/venus_irrp中的遥控码,这就是遥控器的遥控码。这里还要更进一步的解释,DvdPlayer的遥控码是DvdPlayer从遥控码输入端口读入的遥控码。因为DvdPlayer的遥控码输入端口是可以重新命名设置的,不一定就是存放遥控器的遥控码的输入装置/dev/venus_irrp,所以遥控器的遥控码和DvdPlayer的遥控码是有所区分的。

        下面是M8的命令码:

命令码   按键名称
0            0
1            1
2            2
3            3
4            4
5            5
6            6
7            7
8            8
9            9
-            跳转
!            退仓
#            最好不用
]            浏览
&           拷贝
,             返回
/            设置
[            录制源
\            不能用,会造成程序出错
\\           最好不用
{            首页
}            信息
+            重复
=        
a             音轨
A            向左
b        
B            
c             确认
D            向右
f             快退
F            快进
G        
H            制式
i
I                    
j        
k        
K             编辑
l        
L              慢放
m             静音
M            节目指南
n        
N            下一曲
o        
O            启动/待机
p            前一曲
P        
q              
Q              停止
r               录制
s               字幕
S              播放
t               时移
T             图文信息
u              选择
v              音量-
V             音量+
W            向上
X             向下
z              放大
Z            暂停/步进
空格       确认

        下面是IBT-1283的遥控码

按键名称      遥控码
静音                ef10ff00
启动/停机      f50aff00

停止                bb44ff00
播放                ba45ff00
暂停/步进      b946ff00

前一个影片    bf40f00
快转后退        be41ff00
快转前进       bd42ff00
下一个影片   bc43ff00

资讯               b04fff00
慢动作          b847ff00
录影              b54aff00

返回               e916ff00
时光平移      f00fff00

上                   e718ff00
下                   e31cff00
左                   e619ff00
右                   e41bff00
确定OK鍵    e51aff00

红/磁片选单 a857ff00
绿/声音多重 a758ff00
黄/字幕          a659ff00
蓝/视角          a55aff00

音量增加       ed12ff00
音量减少       ea15ff00
菜单               ec13ff00
DTV/AV         f40bff00
频道+            eb14ff00
频道-             e817ff00

数字1            fe01ff00
数字2            fd02ff00
数字3            fc03ff00
数字4            fb04ff00
数字5            fa05ff00
数字6            f906ff00
数字7            f807ff00
数字8            f708ff00
数字9            f609ff00
数字0            ff00ff00

预设录影      f30cff00
浏览              f10eff00

节目表          a956ff00
缩放+            b14eff00
缩放-             b24dff00

频道表          ad52ff00
1/all重复      b44bff00
A-B重复       b34cff00

录影清单     f20dff00
解析度         ac53ff00
左右声道     a45bff00

TTX图文      aa55ff00
删除             ee11ff00
编辑             ab54ff00

        播放机正常使用时,遥控器的遥控码和DvdPlayer中的转换表是匹配的。固件跨厂移植或其他原因,使遥控器的遥控码和DvdPlayer中的转换表不匹配时,遥控器就不能正常使用了,也就是通常所说的遥控器失灵了。其实问题的实质是,从输入装置/dev/venus_irrp读入的按键遥控码,和DvdPlayer内部转换表中的内置遥控码对不上号了,或者说转换表不能用了。这时最容易想到的解决遥控器问题方法就是修改DvdPlayer中的转换表,但这是说起来容易做起来难。如果把DvdPlayer看成是一个透明的箱子,里面看到的几乎都是不透明的黑盒子,转换表就是这样的黑盒子。对于一般的业余爱好者来说,几乎不可能修改DvdPlayer中的转换表。好在DvdPlayer内部的遥控码输入端口的名字是透明的,而且可以重新修改命名,要不然遥控器的问题还真难解决。

        除了用遥控器外,还可以用播放机面板按钮操作控制播放机。这个过程和用遥控器操作控制过程不一样。可以看成是按动面板按钮后,经过面板按钮指令编码处理程序,直接转换成命令码。DvdPlayer从命令码输入管道读入命令码,然后根据命令码执行相应的程序。由此可以看出,播放机运行工作时,DvdPlayer有2种输入命令码的方式。一种是通过遥控码输入端口读入遥控码,再由内部的转换表转换成命令码。另一种是通过命令码输入管道直接读入命令码。根据DvdPlayer的这2种输入命令码方式,相应的有2种方法解决遥控器和DvdPlayer不匹配问题。


端口法的播放机操作控制过程


        首先来看第一种方法。这种方法要用到DvdPlayer的遥控码输入端口,就简称为端口法。如果知道DvdPlayer的内置遥控码,就可以采用这种方法。在输入装置/dev/venus_irrp和DvdPlayer遥控码输入端口之间,增加一个把一种遥控码转换为另一种遥控码的脚本remote_irrp。这个脚本remote_irrp从输入装置/dev/venus_irrp读入遥控器的按键遥控码,转换成和DvdPlayer中的转换表能匹配的遥控码后,再输出到一个新增加的装置/tmp/venus_irrp中。在DvdPlayer中,读入遥控码的输入端口也相应的重新设置命名为/tmp/venus_irrp。这样修改后,DvdPlayer就不是直接从输入装置/dev/venus_irrp读入遥控器的按键遥控码,而是从/tmp/venus_irrp读入经过remote_irrp转换的遥控码了。下面是remote_irrp脚本的基本形式:

#!/opt/bin/bash
while :
do
key=`dd if=/dev/venus_irrp bs=4 count=1  2> /dev/null | hexdump -e '"%02x"'`

#数字1 fe01ff00
        if [ "$key" = "ee11bf00" ] ; then
        printf "\x00\xff\x01\xfe\n" >> /tmp/venus_irrp
         
#数字2 fd02ff00
        elif [ "$key" = "ed21bf00" ] ; then
       printf "\x00\xff\x02\xfd\n" >> /tmp/venus_irrp
         
#数字3 fc03ff00
        elif [ "$key" = "ec31bf00" ] ; then
        printf "\x00\xff\x03\xfc\n" >> /tmp/venus_irrp

......

fi
done

# remote_irrp M8 to IBT1283
# updated 20110401 hdpdiy
# www.hdpfans.com

        注意,省略号“......”不是程序的一部分,下同。如果把remote_irrp存放在可写目录/usr/local/etc,在/usr/local/etc/rcS中还要增加下面2行命令:
mknod /tmp/venus_irrp p          # 新增加一个输入输出装置
/usr/local/etc/remote_irrp &    # 在后台执行remote_irrp脚本,&表示在后台执行


管道法的播放机操作控制过程


        现在来看第二种方法,这种方法要用到DvdPlayer的命令码输入管道,就简称为管道法。如果知道DvdPlayer的命令码,就可以采用这种方法。在输入装置/dev/venus_irrp和DvdPlayer的命令码输入管道之间,增加一个把遥控码转换为命令码的脚本remote_key。这个脚本remote_key从输入装置/dev/venus_irrp读入遥控器的按键遥控码,转换成DvdPlayer的命令码后,DvdPlayer通过命令码输入管道读入命令码。由于采用这种方法后DvdPlayer不再从遥控码输入端口读入遥控码,为了避免误动作,也要在DvdPlayer中把接收遥控码的输入端口重新设置命名为/tmp/venus_irrp。但是和上面的方法不同,不能把/tmp/venus_irrp设置成输入输出装置,也不能写入数据,是聋子耳朵,只是一个摆设。下面是remote_key脚本的基本形式:

#!/opt/bin/bash
while :
do
key=`dd if=/dev/venus_irrp bs=4 count=1  2> /dev/null | hexdump -e '"%02x"'`
QUERY_STRING=

#数字1
        if [ "$key" = "ee11bf00" ] ; then
        QUERY_STRING="1"
   
#数字2
        elif  [ "$key" = "ed21bf00" ] ; then
        QUERY_STRING="2"
   
#数字3
        elif  [ "$key" = "ec31bf00" ] ; then
        QUERY_STRING="3"

......

fi
echo "$QUERY_STRING"
done

# remote_key_M8
# updated 2010401 by hdpdiy
# www.hdpfans.com

        如果把remote_key存放在可写目录/usr/local/etc,在/usr/local/etc/rcS中还要修改其中的2个命令:

......

if [ -f $DEFAULT_AP_DIR/RootApp ] && [ -x $DEFAULT_AP_DIR/RootApp ]; then
        echo Running dvdplayer with RootApp
        /usr/local/etc/remote_key | ./RootApp DvdPlayer&
else
        echo Running dvdplayer
        /usr/local/etc/remote_key | ./DvdPlayer&
fi

......

        红色部分就是修改增加的命令,其中符号“|”表示把remote_key的输出结果通过管道输入到DvdPlayer中。由于红色部分的remote_key占用了DvdPlayer的命令码输入管道,如果其他用途想再这样利用命令码输入管道就有点困难了,如蓝钜T10S固件中就有这样利用命令码输入管道的功能。如果跨厂移植时采用这种管道法,这些功能就只有放弃了,所以最好采用上面第一种方法端口法。当然,如果不知道DvdPlayer的内置遥控码,就只能采用第二种方法管道法。


通用命令法的播放机操作控制过程

        一种播放机可以刷几个不同的固件,所用的遥控器要匹配几个不同的DvdPlayer。同样的,一个固件可以用于几种不同的播放机,这个固件的DvdPlayer也要匹配几种不同的遥控器。如果遥控器和DvdPlayer都要一一对应的手工编写remote_irrp或remote_key工作量就更大。手工编写remote_irrp或remote_key是一个细致繁琐的工作,很容易出错。特别是手工编写remote_irrp时要涉及到遥控器的按键遥控码和DvdPlayer的内置遥控码两套不同的编码,更容易出错。这里说一个小插曲,在把IBT-1283固件跨厂移植到M8播放机时,编写remote_key出了一个小错误,没太注意把制式键的命令码写成了单个倒斜杠“\”。这下好了,固件解包后修改再封包,刷机后遥控器就是不能用,反复检查也找不出这个错误,折腾了几天还真以为IBT-1283固件跨厂移植到M8是不行的。最后在M8上用M8的遥控器试M8的DvdPlayer,总不能自家人不认自家人吧。嘿,还真是自家人不认自家人,M8的播放机安装M8的固件,用了remote_key后遥控器居然不能用了。看来确实是remote_key出了问题。静下心来,慢慢试吧,慢慢查找吧 ......


        现在来看第三种方法。这种方法中要用到一种不针对具体DvdPlayer的通用命令码作为中转接口,就简称为通用命令法。其实这种方法的实质和上面的第一种方法是相同的,也是端口法。首先把第一种方法端口法中的remote_irrp分解为remote_key和key_irrp两部分。一种遥控器的remote_key从输入装置/dev/venus_irrp读入遥控器的按键遥控码,转换成一种不针对具体遥控器和DvdPlayer的通用命令码,key_irrp再把通用命令码转换成一种具体DvdPlayer的内置遥控码后输出到/tmp/venus_irrp。DvdPlayer通过遥控码输入端口/tmp/venus_irrp读入key_irrp转换后的遥控码。这种方法中的remote_key和上面第二种方法管道法中的remote_key基本相同,只是把echo "$QUERY_STRING"改成了执行key_irrp脚本。这样可以利用现在已经编写好的remote_key资源,不用重新编写。下面是通用命令法remote_key脚本的基本形式:

#!/opt/bin/bash
while :
do
key=`dd if=/dev/venus_irrp bs=4 count=1  2> /dev/null | hexdump -e '"%02x"'`
QUERY_STRING=

#数字1
        if [ "$key" = "ee11bf00" ] ; then
        QUERY_STRING="1"
   
#数字2
        elif  [ "$key" = "ed21bf00" ] ; then
        QUERY_STRING="2"
   
#数字3
        elif  [ "$key" = "ec31bf00" ] ; then
        QUERY_STRING="3"
   
......

fi

#echo "$QUERY_STRING"
/usr/local/etc/key_irrp "$QUERY_STRING"
done

# remote_key_M8 to key_irrp
# updated 2010401 by hdpdiy
# www.hdpfans.com

        红色部分就是通用命令法的remote_key和管道法的remote_key不同之处,其他部分在形式上是相同的。通过位置参数$1把remote_key转换得到的通用命令码输入到下面的key_irrp脚本中:

#!/opt/bin/bash

case $1 in

#数字1 fe01ff00
        "1" )
   printf "\x00\xff\x01\xfe\n" >> /tmp/venus_irrp
         ;;
#数字2 fd02ff00
        "2" )
   printf "\x00\xff\x02\xfd\n" >> /tmp/venus_irrp
         ;;
#数字3 fc03ff00
        "3" )
   printf "\x00\xff\x03\xfc\n" >> /tmp/venus_irrp
         ;;
......
                 
esac

# key_irrp_IBT1283
# updated 20110401 hdpdiy
# www.hdpfans.com

        和前面的2种方法一样,如果把remote_key和key_irrp都存放在可写目录/usr/local/etc,在/usr/local/etc/rcS中还要加入下面2个命令:
mknod /tmp/venus_irrp p         # 新增加一个输入输出装置
/usr/local/etc/remote_key &     # 在后台执行remote_key脚本

        采用第三种方法通用命令法后,在固件跨厂移植时的遥控器和DvdPlayer匹配问题就好解决了。有了不针对具体遥控器和DvdPlayer的通用命令码作中转接口,一种遥控器只需要编写一个通用命令码的remote_key就可以了,不用针对每个要刷的固件都编写一个remote_key。同样的,一个固件的DvdPlayer也只需要编写一个通用命令码的key_irrp就可以了,不用针对每个遥控器都编写一个key_irrp。当然还要统一好大家都能遵守的通用命令码标准

        本来所谓的通用命令码,是和DvdPlayer内部的实际命令码无关的,就是一个索引,可以是数字1、2、3、...、100、101、102、...或其他任何字母符号。为什么本来和DvdPlayer内部的实际命令码无关的这个索引,不但名字扯在了一起,取名通用命令码,而且还尽量直接采用了DvdPlayer内部的实际命令码?这主要是因为remote_key是原来管道法用的,其中的命令码必须是DvdPlayer内部的实际命令码,而且又留下了大量的remote_key资源。后来的通用命令法和irfake转换法想继承这些remote_key的资源,就沿用了原来管道法的remote_key中的实际命令码,当然副作用就是容易混淆通用命令码和实际命令码。


附件: 你需要登录才可以下载或查看附件。没有帐号?注册
已有 1 人评分RP值 金钱 收起 理由
ccc0120 + 1 + 5

总评分: RP值 + 1  金钱 + 5   查看全部评分

使用道具 举报

金牌会员

爱机一族

Rank: 6Rank: 6

RP值
22
金钱
629
贡献
402
在线时间
223 小时
最后登录
2012-2-23
精华
0
注册时间
2010-3-7
帖子
389
发表于 2011-4-10 16:53:34 |显示全部楼层
楼主好贴,不过普遍用的是第二种方法,端口法实现主要是不知道Dvdplayer的遥控码。

使用道具 举报

Rank: 8Rank: 8

RP值
42
金钱
5859
贡献
4226
在线时间
852 小时
最后登录
2012-2-20
精华
4
注册时间
2010-4-5
帖子
1225
发表于 2011-4-10 17:30:24 |显示全部楼层
确实是好技术帖子,但是不知道这两种方法会不会引起遥控反应缓慢。如果有能力找出dvdplayer里遥控部分相应键值就好了。

使用道具 举报

超级版主

最后的牛仔

Rank: 8Rank: 8

RP值
132
金钱
15815
贡献
15061
在线时间
2382 小时
最后登录
2012-2-23
精华
17
注册时间
2010-11-10
帖子
13711

热心会员徽章 资深元老徽章 优秀版主徽章

发表于 2011-4-10 18:29:02 |显示全部楼层
回复 mintcandy 的帖子

我也这样想,估计有难度吧。

使用道具 举报

Rank: 8Rank: 8

RP值
72
金钱
839
贡献
504
在线时间
342 小时
最后登录
2012-2-22
精华
2
注册时间
2010-11-15
帖子
228
发表于 2011-4-10 18:30:05 |显示全部楼层
能解决遥控的输入延迟才是关键啊

使用道具 举报

Rank: 8Rank: 8

RP值
56
金钱
1250
贡献
794
在线时间
399 小时
最后登录
2012-2-22
精华
2
注册时间
2010-2-15
帖子
683
发表于 2011-4-10 20:34:01 |显示全部楼层
这个问题在下面的帖子中已解决了:
1、[研究] 跨厂移植 遥控器脚本 深入解析
http://www.hdpfans.com/forum.php?mod=viewthread&tid=847
2、[研究] 视频异常退出后遥控器再也不会失灵了
http://www.hdpfans.com/thread-3549-1-1.html

使用道具 举报

Rank: 8Rank: 8

RP值
38
金钱
5366
贡献
5055
在线时间
827 小时
最后登录
2011-10-7
精华
8
注册时间
2011-3-10
帖子
1800
发表于 2011-4-10 21:27:41 |显示全部楼层
wuxipla 发表于 2011-4-10 20:34
这个问题在下面的帖子中已解决了:
1、[研究] 跨厂移植 遥控器脚本 深入解析
http://www.hdpfans.com/forum ...

别急,1楼现在还只是一个开场白。

使用道具 举报

Rank: 8Rank: 8

RP值
38
金钱
5366
贡献
5055
在线时间
827 小时
最后登录
2011-10-7
精华
8
注册时间
2011-3-10
帖子
1800
发表于 2011-4-10 23:47:47 |显示全部楼层
回复 wuxipla 的帖子

“2、[研究] 视频异常退出后遥控器再也不会失灵了
http://www.hdpfans.com/thread-3549-1-1.html

海美迪300B这类现在还在用yaffs格式固件的播放机可以这样修改crontab。对于squash格式固件,如果不用解包后修改再封包,可能就要绕弯子了。

使用道具 举报

Rank: 6Rank: 6

RP值
20
金钱
666
贡献
531
在线时间
247 小时
最后登录
2012-2-22
精华
0
注册时间
2010-9-19
帖子
205
发表于 2011-4-11 01:04:08 |显示全部楼层
加貼....加貼....加貼....勁勁勁

使用道具 举报

Rank: 6Rank: 6

RP值
25
金钱
641
贡献
480
在线时间
199 小时
最后登录
2012-2-23
精华
0
注册时间
2011-2-16
帖子
228
发表于 2011-4-11 06:26:53 |显示全部楼层
已按第一种方法解决了移植问题。

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|高清播放机爱好者 ( 蜀ICP备10206001号 )

GMT+8, 2012-2-23 14:57 , Processed in 0.030319 second(s), 21 queries , Gzip On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部