RK3399教程:PWM之IR调试

首先先查看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 调试

驱动路径:kernel\drivers\input\remotectl\rockchip_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 = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH 0>;
	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
在这里插入图片描述

硬件连接

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_27809619/article/details/116982741