修改DTSI文件
$ vi kernel/arch/arm64/boot/dts/rockchip/rk3399pro-toybrick-prod.dtsi
// add by renton
&pwm3 {
status = "okay";
pinctrl-names = "default";
interrupts = ;
compatible = "rockchip,remotectl-pwm";
remote_pwm_id = <3>;
handle_cpu_id = <1>;
ir_key1 {
rockchip,usercode = <0x1980>;
rockchip,key_table =
<0xef KEY_POWER>,
<0xe2 0xe2>,
<0xe0 KEY_MUTE>,
<0xe8 KEY_UP>,
<0xe9 KEY_DOWN>,
<0xb0 KEY_LEFT>,
<0xae KEY_RIGHT>,
<0xaf KEY_ENTER>,
<0xe6 KEY_HOME>,
<0xe7 KEY_MENU>,
<0xe5 KEY_BACK>,
<0xe3 KEY_VOLUMEUP>,
<0xb9 KEY_VOLUMEDOWN>,
<0xb6 0xb6>,
<0xa5 0xa5>;
};
};
根据遥控器修改相应的key_table。
字母和符号键都是 linux 的标准键值,在可以在 include/dt-bindings/input/input.h 中查找。
驱动位置
kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
Debug
1、打开打印键值的调试开关
# echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
按遥控器的按键,记录下对应的键值
例如按向下键,有如下打印
[19634.735833] GET USERCODE=0x4040
[19634.762463] RMC_GETDATA=e9
则,该遥控器的 usercode 是 0x4040,向下键的键值就是 0xe9,如此反复,直到打印完遥控器上的所有键值。
2、有时候需要配合
# echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
一起打印,然后看出错的时候,是哪一个或者几个 bit 引起的,有时候放宽一点判断的条件即可,一般是通过修改上下限来达到,具体可以参考代码里面 bit 值的判断地方。
3、getevent
有时候无法确定是内核按键判断出错,还是 android 层没有响应某个按键, 可以在串口下输入getevent 调试命令,该命令会打出驱动上报的所有 input 事件,如果按遥控器有打印,并且键值正确,那说明是 android 响应的问题。
# getevent
add device 1: /dev/input/event0
name: "ff680000.pwm"
/dev/input/event0: 0001 006c 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 006c 00000000
/dev/input/event0: 0000 0000 00000000
以上是在调试平台输入 getevent 的效果,最前面会列出所有的 input 设备,按的时候会上报事件,其中 0x6c 是上报的 linux 键值,后面的 1 代表按下,如果是 0 则代表弹起。
修改DTSI文件
$ vi kernel/arch/arm64/boot/dts/rockchip/rk3399pro-toybrick-prod.dtsi
// add by renton
&pwm3 {
status = "okay";
pinctrl-names = "default";
interrupts = ;
compatible = "rockchip,remotectl-pwm";
remote_pwm_id = <3>;
handle_cpu_id = <1>;
ir_key1 {
rockchip,usercode = <0x1980>;
rockchip,key_table =
<0xef KEY_POWER>,
<0xe2 0xe2>,
<0xe0 KEY_MUTE>,
<0xe8 KEY_UP>,
<0xe9 KEY_DOWN>,
<0xb0 KEY_LEFT>,
<0xae KEY_RIGHT>,
<0xaf KEY_ENTER>,
<0xe6 KEY_HOME>,
<0xe7 KEY_MENU>,
<0xe5 KEY_BACK>,
<0xe3 KEY_VOLUMEUP>,
<0xb9 KEY_VOLUMEDOWN>,
<0xb6 0xb6>,
<0xa5 0xa5>;
};
};
根据遥控器修改相应的key_table。
字母和符号键都是 linux 的标准键值,在可以在 include/dt-bindings/input/input.h 中查找。
驱动位置
kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
Debug
1、打开打印键值的调试开关
# echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
按遥控器的按键,记录下对应的键值
例如按向下键,有如下打印
[19634.735833] GET USERCODE=0x4040
[19634.762463] RMC_GETDATA=e9
则,该遥控器的 usercode 是 0x4040,向下键的键值就是 0xe9,如此反复,直到打印完遥控器上的所有键值。
2、有时候需要配合
# echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print
一起打印,然后看出错的时候,是哪一个或者几个 bit 引起的,有时候放宽一点判断的条件即可,一般是通过修改上下限来达到,具体可以参考代码里面 bit 值的判断地方。
3、getevent
有时候无法确定是内核按键判断出错,还是 android 层没有响应某个按键, 可以在串口下输入getevent 调试命令,该命令会打出驱动上报的所有 input 事件,如果按遥控器有打印,并且键值正确,那说明是 android 响应的问题。
# getevent
add device 1: /dev/input/event0
name: "ff680000.pwm"
/dev/input/event0: 0001 006c 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 006c 00000000
/dev/input/event0: 0000 0000 00000000
以上是在调试平台输入 getevent 的效果,最前面会列出所有的 input 设备,按的时候会上报事件,其中 0x6c 是上报的 linux 键值,后面的 1 代表按下,如果是 0 则代表弹起。
举报