XC2440开发板上使用IRM3638做为红外遥控解码设备,使用NEC编码格式的遥控器操作。
我在华为终端做的高清网络播放器项目上就用到了红外遥控,由于当时的内核里没有IRM的驱动,只能自己写,那是我第一次独立编写驱动程序,调试了1个月才最终稳定。后来把这个驱动移植到了XC2440开发板上,驱动文件请参见XC2440的linux源码中的:
drivers/input/keyboard/xc2440_irm.c 和 include/linux/xc2440_irm.h这两个文件。
在驱动专题视频教程的第12讲,我会讲解如何编写这个驱动,主要涉及到platform,input子系统,中断处理,内核定时器
红外遥控解码的功能是将遥控器上的按键解码出键值并上报给操作系统,所以它属于input设备,工作原理类似于键盘,所以我把它归类到drivers/input/keyboard目录下。
将xc2440_irm.c文件放到这个目录下,xc2440_irm.h放到include/linux/目录下
修改 drivers/input/keyboard/Kconfig文件,加入IRM驱动选项:
config XC2440_IRM_KEYBOARD
tristate "XC2440 IRM Keyboard support"
depends on ARCH_S3C2410
help
Say Y here to enable the irm keypad on xc2440 board
To compile this driver as a module, choose M here: the
module will be called xc2440_irm.
endif
修改同目录下的 Makefile文件,加入编译选项:
obj-$(CONFIG_XC2440_IRM_KEYBOARD) += xc2440_irm.o
在mach-xc2440.c文件中添加对IRM设备的支持:
加入头文件:#include
xc2440_devices[ ]结构体中加入:
&xc2440_irm_device,
构建IRM设备的平台数据结构:
/* IRM3638 */
static struct platform_xc2440_irm_data xc2440_irm_pins = {
.ctrl_pin_irq = IRQ_EINT(11),
.irq_type = IRQF_TRIGGER_FALLING,
};
static struct platform_device xc2440_irm_device = {
.name = "xc2440-irm",
.id = -1,
.dev = {
.platform_data = &xc2440_irm_pins,
},
};
说明:设备名称是“xc2440-irm”,这个和xc2440_irm.c驱动中的驱动名称一致,才能注册这个设备驱动。
在XC2440开发板上,使用GPG3(EINT11)这个管脚连接红外接收管的中断管脚,所以在platform_xc2440_irm_data结构体中指定ctrl_pin_irq为IRQ_EINT(11)
配置内核,支持IRM驱动:
Device Drivers --->
Input device support --->
[*] Keyboards --->
<*> XC2440 IRM Keyboard support
系统启动时输出的调试信息:
xc2440 irm keyboard driver probe Version 1.0
input: xc2440-irm as /devices/virtual/input/input1
查看设备:
/dev/event1
获得键值:
可以在驱动中直接把解码的键值通过串口打印出来,方便测试。
也可以写个应用程序,使用input_event,读取键值。
使用我们配套的红外遥控器对着板上的红外接收管按键,终端上即显示出键值:
阅读(298) | 评论(0) | 转发(0) |