红外遥控的发射威廉希尔官方网站
是采用红外发光二极管来发出经过调制的红外光波;红外接收威廉希尔官方网站
由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。鉴于家用电器的品种多样化和用户的使用特点,生产厂家对红外遥控编码进行了严格的规范编码,这些编码各不相同,从而形成不同的编码方式,统一称为红外遥控器编码传输协议。到目前为止,红外遥控协议已多达十种, 如: RC5、 SIRCS、 Sy、 RECS80、Denon、NEC、Motorola、Japanese、SAMSWNG 和 Daewoo 等。我国家用电器的红外遥控器的生产厂家,其编码方式多数是按上述的各种协议进行编码的,而用得较多的有 NEC 协议。目前 RK 平台也只支持 NEC 编码的红外协议。
RK 平台上红外实现原理简介
PWM 有三种工作模式, reference mode, one-shot mode 和 continuousmode. 红外遥控器就采用 reference mode,这种模式下 PWM 可以捕获输入高低电平的宽度,并产生中断,CPU接收到中断后去相应的寄存器读取。
按下遥控的时候,红外接收头会产生一系列的高低电平,PWM 就会产生相应的中断,CPU 读取相应的寄存器就知道这些高低电平的时间,根据协议就可以解码出红外的用户码和键值码出来。
1、查看遥控器的用户码和键值,供应商给的可能是反码,也有可能不正确,最好是自己打印出来看看是啥。
打开红外打印功能有以下两种方式,内核打印可以用串口,也可以在adb中使用指令 # cat proc/kmsg
(1)通过指令打开红外接收的打印功能,然后按遥控器按键,就可以在内核打印中看到用户码和键值。
root@rk3288:/ # cat sys/module/rockchip_pwm_remotectl/parameters/code_print
0
root@rk3288:/ # echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
(2)在红外接收的源码中,给下面变量赋值,也可以打印用户码和键值,但需要重新编译烧录内核
path:kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
static int rk_remote_print_code = 1;
Kernel修改:
--- a/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
+++ b/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
@@ -43,6 +43,7 @@
/dts-v1/;
#include "rk3288-evb.dtsi"
#include "rk3288-android.dtsi"
+#include //czd: support IR-Remote.
/ {
compatible = "rockchip,rk3288-evb-android-rk808-hdmi", "rockchip,rk3288";
@@ -397,3 +398,71 @@
pinctrl-0 = <&pwm1_pin_pull_down>;
};
+//add by czd for support IR-Remote on start
+&pwm2 {
+ status = "okay";
+ compatible = "rockchip,remotectl-pwm";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm2_pin>;
+ remote_pwm_id = <2>;
+ handle_cpu_id = <1>;
+ interrupts = ;
+ remote_support_psci = <1>;
+
+ ir_key1{
+ rockchip,usercode = <0xbd02>;
+ rockchip,key_table =
+ <0x2f KEY_BACK>,
+ <0x35 KEY_UP>,
......
}
Android层修改:
zwei@ubt144c:/work/zwei/czd/rk3288_7.1_mid/device/rockchip/common$ git diff
diff --git a/device.mk b/device.mk
index 37e73d5..fc82c24 100755
--- a/device.mk
+++ b/device.mk
@@ -101,7 +101,7 @@ PRODUCT_COPY_FILES +=
device/rockchip/common/ueventd.rockchip.rc:root/ueventd.$(TARGET_BOARD_HARDWARE).rc
device/rockchip/common/media_profiles_default.xml:system/etc/media_profiles_default.xml
device/rockchip/common/rk29-keypad.kl:system/usr/keylayout/rk29-keypad.kl
- device/rockchip/common/ff680030_pwm.kl:system/usr/keylayout/ff680030_pwm.kl
+ device/rockchip/common/ff680030_pwm.kl:system/usr/keylayout/ff680020_pwm.kl
device/rockchip/common/alarm_filter.xml:system/etc/alarm_filter.xml
并且需要添加对应按键的linux code和android code到ff680020_pwm.kl文件。
a)打开打印键值的调试开关:
echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
b) 按遥控器的按键,记录下对应的键值
[19634.735833] GET USERCODE=0xbd02
[19634.762463] RMC_GETDATA=e9
说明:该遥控器的 usercode 是 0xbd02,向下键的键值就是 0xe9
有时候无法确定是内核按键判断出错,还是 android 层没有响应某个按键,可以在串口下输入getevent 调试命令,该命令会打印出驱动上报的所有 input 事件,如果按遥控器有打印,并且键值正确,那说明是 android 响应的问题。
rk3288:/ # getevent
add device 1: /dev/input/event1
name: "rk29-keypad"
add device 2: /dev/input/event0
name: "ff680020.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
/dev/input/event0: 0001 009e 00000001
cmd输入 getevent,最前面会列出所有的 input 设备,按的时候会上报
事件,其中 0x6c 是上报的 linux 键值,后面的 1 代表按下,如果是 0 则代表弹起。
如果没有getevent到事件,无键值上报,adb执行cat proc/interrupts可以查看中断interrupt的注册使用情况:(第一列的数字对应注册的中断号,第二第三第四第五列数字分别表示中断在哪一个cpu上处理,有中断过来的话,对应的cpu下的数字相应自加1)
rk3288:/ # cat proc/interrupts
CPU0 CPU1 CPU2 CPU3
16: 0 0 0 0 GIC 29 Edge arch_timer
17: 118303 97092 81417 115531 GIC 30 Edge arch_timer
20: 0 0 0 0 GIC 98 Level rk_timer
25: 0 0 0 0 GIC 34 Level ff250000.dma-controller
26: 0 0 0 0 GIC 35 Level ff250000.dma-controller
27: 367 0 0 0 GIC 32 Level ff600000.dma-controller
28: 0 0 0 0 GIC 33 Level ff600000.dma-controller
29: 0 0 0 0 GIC 64 Level dw-mci
30: 14838 0 0 0 GIC 65 Level dw-mci
31: 34851 0 0 0 GIC 67 Level dw-mci
32: 4565 0 0 0 GIC 68 Level ff100000.saradc
33: 747 0 0 0 GIC 92 Level ff650000.i2c
34: 0 0 0 0 GIC 94 Level ff140000.i2c
35: 153 0 0 0 GIC 95 Level ff150000.i2c
37: 0 0 0 0 GIC 69 Level rockchip_thermal
38: 4352 0 0 0 GIC 59 Level eth0
39: 0 0 0 0 GIC 60 Level eth0
40: 0 0 0 0 GIC 56 Level ehci_hcd:u***2
41: 0 0 0 0 GIC 73 Level ohci_hcd:u***3
42: 151 0 0 0 GIC 57 Level ff540000.u***, dwc2_hsotg:u***1
43: 489 0 0 0 GIC 55 Level dwc_otg, dwc_otg_pcd, dwc_otg_hcd:u***4
44: 24 0 0 0 GIC 93 Level ff660000.i2c
45: 0 1 0 0 GIC 110 Level rk_pwm_irq
关于键值转换说明:键值经过两次转换到达安卓上层:
在Dts配置:(16进制寄存器值转换成linux code的宏,
0x35 KEY_UP
其中0x35为遥控键值码;
KEY_UP宏定义在include/dt-bindings/input/linux-event-codes.h文件)
这样遥控器红外层到linux层的键值映射就完成了。
input输入子系统上报键值(adb shell && getevent查看):
/dev/input/event0: 0001 0067 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0067 00000000
/dev/input/event0: 0000 0000 00000000
其中 0x67 是上报的 linux 键值(include/dt-bindings/input/linux-event-codes.h文件的10进制转成的16进制数,如0067是由103转换而来),后面的 1 代表按下,如果是 0 则代表弹起。
.kl文件键值转换:android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件。adb使用dumpsys input命令可以查看当前设备对应使用的是哪个kl文件,(RK平台的 kl 文件一般是放在devicerockchipcommon(如rk3288) 目录下,与getevent获取的name属性名字一样的文件(只不过name中的“.”要换成 kl 中的“_”)。每个芯片的 kl 文件名字不一样,需要注意,一般在devicerockchipcommondevice.mk文件配置。),如果没有配置对应设备的.kl文件,则会默认使用Generic.kl这个kl
==>
rk3288:/ # getevent
add device 1: /dev/input/event1
name: "rk29-keypad"
add device 2: /dev/input/event0
name: "ff680020.pwm"
则对应需要kl文件为:ff680020_pwm.kl,目录在/system/usr/keylayout/,可以push进去验证
130|rk3288:/ $ dumpsys input
2: ff680020.pwm
Classes: 0x00000401
Path: /dev/input/event0
Descriptor: d2c52ff0f656fac4cd7b7a118d575e0109a9fe1c
Location: gpio-keys/remotectl
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100
KeyLayoutFile: /system/usr/keylayout/ff680020_pwm.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false
kl文件内容:
key 28 ENTER
key 116 POWER
key 158 BACK、
说明:
key是固定的
28是linux code值
ENTER是Android code值
这样kernel层到Android层的键值映射就完成了。
红外遥控的发射威廉希尔官方网站
是采用红外发光二极管来发出经过调制的红外光波;红外接收威廉希尔官方网站
由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。鉴于家用电器的品种多样化和用户的使用特点,生产厂家对红外遥控编码进行了严格的规范编码,这些编码各不相同,从而形成不同的编码方式,统一称为红外遥控器编码传输协议。到目前为止,红外遥控协议已多达十种, 如: RC5、 SIRCS、 Sy、 RECS80、Denon、NEC、Motorola、Japanese、SAMSWNG 和 Daewoo 等。我国家用电器的红外遥控器的生产厂家,其编码方式多数是按上述的各种协议进行编码的,而用得较多的有 NEC 协议。目前 RK 平台也只支持 NEC 编码的红外协议。
RK 平台上红外实现原理简介
PWM 有三种工作模式, reference mode, one-shot mode 和 continuousmode. 红外遥控器就采用 reference mode,这种模式下 PWM 可以捕获输入高低电平的宽度,并产生中断,CPU接收到中断后去相应的寄存器读取。
按下遥控的时候,红外接收头会产生一系列的高低电平,PWM 就会产生相应的中断,CPU 读取相应的寄存器就知道这些高低电平的时间,根据协议就可以解码出红外的用户码和键值码出来。
1、查看遥控器的用户码和键值,供应商给的可能是反码,也有可能不正确,最好是自己打印出来看看是啥。
打开红外打印功能有以下两种方式,内核打印可以用串口,也可以在adb中使用指令 # cat proc/kmsg
(1)通过指令打开红外接收的打印功能,然后按遥控器按键,就可以在内核打印中看到用户码和键值。
root@rk3288:/ # cat sys/module/rockchip_pwm_remotectl/parameters/code_print
0
root@rk3288:/ # echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
(2)在红外接收的源码中,给下面变量赋值,也可以打印用户码和键值,但需要重新编译烧录内核
path:kernel/drivers/input/remotectl/rockchip_pwm_remotectl.c
static int rk_remote_print_code = 1;
Kernel修改:
--- a/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
+++ b/arch/arm/boot/dts/rk3288-evb-android-rk808-hdmi.dts
@@ -43,6 +43,7 @@
/dts-v1/;
#include "rk3288-evb.dtsi"
#include "rk3288-android.dtsi"
+#include //czd: support IR-Remote.
/ {
compatible = "rockchip,rk3288-evb-android-rk808-hdmi", "rockchip,rk3288";
@@ -397,3 +398,71 @@
pinctrl-0 = <&pwm1_pin_pull_down>;
};
+//add by czd for support IR-Remote on start
+&pwm2 {
+ status = "okay";
+ compatible = "rockchip,remotectl-pwm";
+ pinctrl-names = "default";
+ pinctrl-0 = <&pwm2_pin>;
+ remote_pwm_id = <2>;
+ handle_cpu_id = <1>;
+ interrupts = ;
+ remote_support_psci = <1>;
+
+ ir_key1{
+ rockchip,usercode = <0xbd02>;
+ rockchip,key_table =
+ <0x2f KEY_BACK>,
+ <0x35 KEY_UP>,
......
}
Android层修改:
zwei@ubt144c:/work/zwei/czd/rk3288_7.1_mid/device/rockchip/common$ git diff
diff --git a/device.mk b/device.mk
index 37e73d5..fc82c24 100755
--- a/device.mk
+++ b/device.mk
@@ -101,7 +101,7 @@ PRODUCT_COPY_FILES +=
device/rockchip/common/ueventd.rockchip.rc:root/ueventd.$(TARGET_BOARD_HARDWARE).rc
device/rockchip/common/media_profiles_default.xml:system/etc/media_profiles_default.xml
device/rockchip/common/rk29-keypad.kl:system/usr/keylayout/rk29-keypad.kl
- device/rockchip/common/ff680030_pwm.kl:system/usr/keylayout/ff680030_pwm.kl
+ device/rockchip/common/ff680030_pwm.kl:system/usr/keylayout/ff680020_pwm.kl
device/rockchip/common/alarm_filter.xml:system/etc/alarm_filter.xml
并且需要添加对应按键的linux code和android code到ff680020_pwm.kl文件。
a)打开打印键值的调试开关:
echo 1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
b) 按遥控器的按键,记录下对应的键值
[19634.735833] GET USERCODE=0xbd02
[19634.762463] RMC_GETDATA=e9
说明:该遥控器的 usercode 是 0xbd02,向下键的键值就是 0xe9
有时候无法确定是内核按键判断出错,还是 android 层没有响应某个按键,可以在串口下输入getevent 调试命令,该命令会打印出驱动上报的所有 input 事件,如果按遥控器有打印,并且键值正确,那说明是 android 响应的问题。
rk3288:/ # getevent
add device 1: /dev/input/event1
name: "rk29-keypad"
add device 2: /dev/input/event0
name: "ff680020.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
/dev/input/event0: 0001 009e 00000001
cmd输入 getevent,最前面会列出所有的 input 设备,按的时候会上报
事件,其中 0x6c 是上报的 linux 键值,后面的 1 代表按下,如果是 0 则代表弹起。
如果没有getevent到事件,无键值上报,adb执行cat proc/interrupts可以查看中断interrupt的注册使用情况:(第一列的数字对应注册的中断号,第二第三第四第五列数字分别表示中断在哪一个cpu上处理,有中断过来的话,对应的cpu下的数字相应自加1)
rk3288:/ # cat proc/interrupts
CPU0 CPU1 CPU2 CPU3
16: 0 0 0 0 GIC 29 Edge arch_timer
17: 118303 97092 81417 115531 GIC 30 Edge arch_timer
20: 0 0 0 0 GIC 98 Level rk_timer
25: 0 0 0 0 GIC 34 Level ff250000.dma-controller
26: 0 0 0 0 GIC 35 Level ff250000.dma-controller
27: 367 0 0 0 GIC 32 Level ff600000.dma-controller
28: 0 0 0 0 GIC 33 Level ff600000.dma-controller
29: 0 0 0 0 GIC 64 Level dw-mci
30: 14838 0 0 0 GIC 65 Level dw-mci
31: 34851 0 0 0 GIC 67 Level dw-mci
32: 4565 0 0 0 GIC 68 Level ff100000.saradc
33: 747 0 0 0 GIC 92 Level ff650000.i2c
34: 0 0 0 0 GIC 94 Level ff140000.i2c
35: 153 0 0 0 GIC 95 Level ff150000.i2c
37: 0 0 0 0 GIC 69 Level rockchip_thermal
38: 4352 0 0 0 GIC 59 Level eth0
39: 0 0 0 0 GIC 60 Level eth0
40: 0 0 0 0 GIC 56 Level ehci_hcd:u***2
41: 0 0 0 0 GIC 73 Level ohci_hcd:u***3
42: 151 0 0 0 GIC 57 Level ff540000.u***, dwc2_hsotg:u***1
43: 489 0 0 0 GIC 55 Level dwc_otg, dwc_otg_pcd, dwc_otg_hcd:u***4
44: 24 0 0 0 GIC 93 Level ff660000.i2c
45: 0 1 0 0 GIC 110 Level rk_pwm_irq
关于键值转换说明:键值经过两次转换到达安卓上层:
在Dts配置:(16进制寄存器值转换成linux code的宏,
0x35 KEY_UP
其中0x35为遥控键值码;
KEY_UP宏定义在include/dt-bindings/input/linux-event-codes.h文件)
这样遥控器红外层到linux层的键值映射就完成了。
input输入子系统上报键值(adb shell && getevent查看):
/dev/input/event0: 0001 0067 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0067 00000000
/dev/input/event0: 0000 0000 00000000
其中 0x67 是上报的 linux 键值(include/dt-bindings/input/linux-event-codes.h文件的10进制转成的16进制数,如0067是由103转换而来),后面的 1 代表按下,如果是 0 则代表弹起。
.kl文件键值转换:android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件。adb使用dumpsys input命令可以查看当前设备对应使用的是哪个kl文件,(RK平台的 kl 文件一般是放在devicerockchipcommon(如rk3288) 目录下,与getevent获取的name属性名字一样的文件(只不过name中的“.”要换成 kl 中的“_”)。每个芯片的 kl 文件名字不一样,需要注意,一般在devicerockchipcommondevice.mk文件配置。),如果没有配置对应设备的.kl文件,则会默认使用Generic.kl这个kl
==>
rk3288:/ # getevent
add device 1: /dev/input/event1
name: "rk29-keypad"
add device 2: /dev/input/event0
name: "ff680020.pwm"
则对应需要kl文件为:ff680020_pwm.kl,目录在/system/usr/keylayout/,可以push进去验证
130|rk3288:/ $ dumpsys input
2: ff680020.pwm
Classes: 0x00000401
Path: /dev/input/event0
Descriptor: d2c52ff0f656fac4cd7b7a118d575e0109a9fe1c
Location: gpio-keys/remotectl
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100
KeyLayoutFile: /system/usr/keylayout/ff680020_pwm.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false
kl文件内容:
key 28 ENTER
key 116 POWER
key 158 BACK、
说明:
key是固定的
28是linux code值
ENTER是Android code值
这样kernel层到Android层的键值映射就完成了。
举报