红外接收头内部包括红外监测二极管、放大器、限副器、带通滤波器、积分电路、比较器等。红外监测二极管检测到红外信号,然后把信号送到放大器和限幅器,限 幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器(带通滤波器可以通过30khz到60khz的负载波), 再通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。 示例:
模块接收到遥控器发送的信息并打印出来。
引脚说明:
测试说明:
采用driver/media/rc/下面的 gpio-ir-recv.c
并加入下面驱动添加键值
drivers/media/rc/keymaps/rc-nec.c
#include
#include
#include
static struct rc_map_table hceng_nec[] = {
{ 0x45, KEY_CHANNELDOWN},
{ 0x46, KEY_CHANNEL},
{ 0x47, KEY_CHANNELUP},
{ 0x44, KEY_PREVIOUS},
{ 0x40, KEY_NEXT},
{ 0x43, KEY_PLAYPAUSE}, //
{ 0x07, KEY_VOLUMEDOWN},
{ 0x15, KEY_VOLUMEUP},
{ 0x09, KEY_EQUAL},
{ 0x16, KEY_0},
{ 0x19, KEY_F1},
{ 0x0d, KEY_F2},
{ 0x0c, KEY_1},
{ 0x18, KEY_2},
{ 0x5e, KEY_3},
{ 0x08, KEY_4},
{ 0x1c, KEY_5},
{ 0x5a, KEY_6},
{ 0x42, KEY_7},
{ 0x52, KEY_8}, //
{ 0x4a, KEY_9},
};
static struct rc_map_list hceng_nec_map = {
.map = {
.scan = hceng_nec,
.size = ARRAY_SIZE(hceng_nec),
.rc_proto = RC_PROTO_NEC, //RC_TYPE_UNKNOWN //echo nec > /sys/class/rc/rc0/protocols
.name = "rc-nec",
}
};
static int __init init_rc_map_hceng_nec(void)
{
return rc_map_register(&hceng_nec_map);
}
static void __exit exit_rc_map_hceng_nec(void)
{
rc_map_unregister(&hceng_nec_map);
}
module_init(init_rc_map_hceng_nec)
module_exit(exit_rc_map_hceng_nec)
MODULE_LICENSE("GPL");
MODULE_AUTHOR("hceng");
添加内核配置:
CONFIG_RC_CORE=y
CONFIG_RC_MAP=y
CONFIG_LIRC=y
CONFIG_RC_DECODERS=y
CONFIG_IR_NEC_DECODER=y
在arch/arm64/boot/dts/rockchip/rk3399-orangepi-4.dts中加入如下代码:
ir: ir-receiver {
compatible = "gpio-ir-receiver";
gpios = <&gpio1 11>;
linux,rc-map-name = "rc-nec";
};
用evtest 来测试,安装evtest 用sudo apt-get install evtest 就可以
evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: Typec_Headphone
/dev/input/event1: gpio_ir_recv
/dev/input/event2: adc-keys
/dev/input/event3: realtek,rt5651-codec Headphones
/dev/input/event4: gpio-keys
Select the device event number [0-4]:
选择 gpio_ir_recv 驱动对应的 1 ,然后按遥控器 就会打印出相应键值
|