单片机 嵌入式硬件 RK3399
回帖(1)
2022-3-7 09:41:51
首先先查看rockchip的IR调试文档。
先去查看rockchip的调试文档,对RK的ir的先有一些初步的认识
rk驱动只支持NEC
NEC,最基础的红外电平,逻辑1为0.56ms高电平+1.69ms的低电平。逻辑0为0.56ms高电平+0.56的低电平。
因为rk的驱动只支持NEC,所以按照NEC的编码协议(如上图)可以看到,NEC的IR编码是首先是一段9ms的高电平,然后就是一段4.9ms的低电平。然后就开始发送地址(address),然后是地址(address)的反码,然后发送控制码(Command),然后是控制码的反码,这样的一个过程完成一次按键的按下。
其他厂商的红外编码
其他的厂商的比如美的,格力的红外编码都是私有协议和NEC不一样,需要根据对应的协议,然后使用PWM的脉冲测量进行修改驱动。
RK3399 IR 调试
驱动路径:kerneldriversinputremotectlrockchip_pwm_remotectl.c
首先查看dts,其中rk的ir驱动中,使用PWM的脉冲测量去检测高低电平的长度,然后计算出是不是我们配置的红外值,如果是将这个红外值映射成linux 的标准按键值,所以需要注册一个input子系统。
pwm3: pwm@ff420030 {
compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
reg = <0x0 0xff420030 0x0 0x10>;
#pwm-cells = <3>;
pinctrl-names = "active";
pinctrl-0 = <&pwm3a_pin>;
clocks = <&pmucru PCLK_RKPWM_PMU>;
clock-names = "pwm";
status = "disabled";
};
&pwm3 {
status = "okay";
pinctrl-names = "default"; //这个很重要必须要设置为“default”,不然就会使用"active";,导致没有产生中断。
pinctrl-0 = <&pwm3a_pin>;
interrupts = ;
compatible = "rockchip,remotectl-pwm";
remote_pwm_id = <3>;
handle_cpu_id = <1>;
remote_support_psci = <1>;
ir_key1 {
rockchip,usercode = <0x4040>; //usercode就是NEC里面的address
rockchip,key_table =
<0xf2 KEY_REPLY>, //将红外编码值(command),映射成linux的标准键KEY_REPLY。
<0xba KEY_BACK>,
<0xf4 KEY_UP>,
<0xf1 KEY_DOWN>,
<0xef KEY_LEFT>,
<0xee KEY_RIGHT>,
<0xbd KEY_HOME>,
<0xea KEY_VOLUMEUP>,
<0xe3 KEY_VOLUMEDOWN>,
<0xe2 KEY_SEARCH>,
<0xb2 KEY_POWER>,
<0xbc KEY_MUTE>,
<0xec KEY_MENU>,
<0xbf 0x190>,
<0xe0 0x191>,
<0xe1 0x192>,
<0xe9 183>,
<0xe6 248>,
<0xe8 185>,
<0xe7 186>,
<0xf0 388>,
<0xbe 0x175>;
};
};
驱动注册成功
如果驱动注册成功使用getevent -l 会生成如下节点:
查看红外中断
红外注册成功后,使用红外遥控器往红外接收头按下按键,可以看到是否产生了红外中断,从而证明驱动是正常工作了。
cat proc/interrupts
硬件连接
首先先查看rockchip的IR调试文档。
先去查看rockchip的调试文档,对RK的ir的先有一些初步的认识
rk驱动只支持NEC
NEC,最基础的红外电平,逻辑1为0.56ms高电平+1.69ms的低电平。逻辑0为0.56ms高电平+0.56的低电平。
因为rk的驱动只支持NEC,所以按照NEC的编码协议(如上图)可以看到,NEC的IR编码是首先是一段9ms的高电平,然后就是一段4.9ms的低电平。然后就开始发送地址(address),然后是地址(address)的反码,然后发送控制码(Command),然后是控制码的反码,这样的一个过程完成一次按键的按下。
其他厂商的红外编码
其他的厂商的比如美的,格力的红外编码都是私有协议和NEC不一样,需要根据对应的协议,然后使用PWM的脉冲测量进行修改驱动。
RK3399 IR 调试
驱动路径:kerneldriversinputremotectlrockchip_pwm_remotectl.c
首先查看dts,其中rk的ir驱动中,使用PWM的脉冲测量去检测高低电平的长度,然后计算出是不是我们配置的红外值,如果是将这个红外值映射成linux 的标准按键值,所以需要注册一个input子系统。
pwm3: pwm@ff420030 {
compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
reg = <0x0 0xff420030 0x0 0x10>;
#pwm-cells = <3>;
pinctrl-names = "active";
pinctrl-0 = <&pwm3a_pin>;
clocks = <&pmucru PCLK_RKPWM_PMU>;
clock-names = "pwm";
status = "disabled";
};
&pwm3 {
status = "okay";
pinctrl-names = "default"; //这个很重要必须要设置为“default”,不然就会使用"active";,导致没有产生中断。
pinctrl-0 = <&pwm3a_pin>;
interrupts = ;
compatible = "rockchip,remotectl-pwm";
remote_pwm_id = <3>;
handle_cpu_id = <1>;
remote_support_psci = <1>;
ir_key1 {
rockchip,usercode = <0x4040>; //usercode就是NEC里面的address
rockchip,key_table =
<0xf2 KEY_REPLY>, //将红外编码值(command),映射成linux的标准键KEY_REPLY。
<0xba KEY_BACK>,
<0xf4 KEY_UP>,
<0xf1 KEY_DOWN>,
<0xef KEY_LEFT>,
<0xee KEY_RIGHT>,
<0xbd KEY_HOME>,
<0xea KEY_VOLUMEUP>,
<0xe3 KEY_VOLUMEDOWN>,
<0xe2 KEY_SEARCH>,
<0xb2 KEY_POWER>,
<0xbc KEY_MUTE>,
<0xec KEY_MENU>,
<0xbf 0x190>,
<0xe0 0x191>,
<0xe1 0x192>,
<0xe9 183>,
<0xe6 248>,
<0xe8 185>,
<0xe7 186>,
<0xf0 388>,
<0xbe 0x175>;
};
};
驱动注册成功
如果驱动注册成功使用getevent -l 会生成如下节点:
查看红外中断
红外注册成功后,使用红外遥控器往红外接收头按下按键,可以看到是否产生了红外中断,从而证明驱动是正常工作了。
cat proc/interrupts
硬件连接
举报
更多回帖