红外知识介绍的网站(https://www.sbprojects.net/knowledge/ir/index.php),包含各种红外协议,其中常见是是nec协议。
图1是红外的发射电路,图2是红外的接收电路,图3和图4是nec协议
9毫秒脉冲+4.5毫秒低电平+8位地址码+8位地址反码+8位命令码+8位命令反码
比如地址码是0xff,相当于8个逻辑1,按图4进行发送即可。
所谓的码库就是时间信息(单位是us),由于对称性,nec发一次码的时间为(9+4.5+(2.15+1.12)×32),大约118ms
脉冲经过图2的电路处理后,就变成了一个简单的波形,如图5橙色部分(或反相),只要判断脉冲的长度(ktime_sub&&ktime_get),便可将需要的红外码解析出来了,内核已集成相关的代码gpio-ir-recv.c,编译相应的协议文件即可。
1.io/pwm/spi-do控制红外灯发射红外线(成本低,不支持学习功能,小米手机采用这种方案)
2.芯片方案
下面三种芯片都是支持学习型的芯片
abov(MC96FR116C 硬件i2c) http://www.abov.co.kr/en/
ETEK(et4007 模拟i2c) http://www.etek.com.cn/
宏芯达(hxd019d 模拟i2c) http://www.hxdkj88.com/
3.红外码库(这部分一般需要购买)
酷控 遥控精灵 宏芯达等
拿小米的开源代码来分析下,使用过gpio,pwm,spi-do来控制红外的发射。
如Redmi 4X(gpio方式),电路类似下图
https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/santoni-n-oss/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi
gpio-leds {compatible = "gpio-leds";status = "okay";pinctrl-names = "default";pinctrl-0 = <&gpio_led_off>;infred {gpios = <&tlmm 45 0>;label = "infrared";linux,default-trigger = "infra-red";default-state = "off";retain-state-suspended;};};
驱动https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/santoni-n-oss/drivers/leds/leds-gpio.c
Redmi Note 4X Standard(pwm方式)
https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/mido-n-oss/arch/arm/boot/dts/qcom/msm8953-qrd.dtsi
pwm_ir {compatible = "pwm-ir";pwms = <&pmi8950_pwm 0 0>;reg-id = "vdd";vdd-supply = <&pm8953_l8>;};
驱动https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/mido-n-oss/drivers/media/rc/pwm-ir.c
Xiaomi5X, Redmi 5Plus(spi-do方式,即使用spi的一个口来发射,因为spi有参考时钟,能用来做延时,同时spi要开启dma模式,保证传输过程中不受os调度影响,保证时序稳定)
https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/tiffany-n-oss/arch/arm/boot/dts/qcom/msm8953-qrd.dtsi
&spi_6 {status = "ok";peel_ir@0 {compatible = "peel_ir";reg = <0x0>;spi-max-frequency = <19200000>;vdd-supply = <&pm8953_l8>;peel_ir,reg-id = "vdd";peel_ir,lr-gpio = <73>;peel_ir,lr-gpio-valid = <0>;peel_ir,spi-bpw = <32>;peel_ir,spi-clk-speed = <960000>;peel_ir,spi-mode = <0>;peel_ir,peel-field = <2345>;status = "ok";};
};
驱动https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/tiffany-n-oss/drivers/media/rc/peelir.c
最新的内核https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/media/rc?h=v4.14.194
已集成这三种方式ir-spi.c,pwm-ir-tx.c,gpio-ir-tx.c