46.Linux-创建rc红外遥控平台设备,实现重复功能(…
2018-10-14 10:49:17来源:博客园 阅读 ()
- 上章链接:46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)
在上章分析了红外platform_driver后,已经修改bug后,接下来我们自己创建一个红外platform_device平台设备,其实写一个平台设备很简单.
创建红外platform_device平台设备步骤为:
- 1) 创建一个platform_device设备,其中.name= "gpio-rc-recv",并注册设备
- 2) 在drivers\media\rc\keymaps\里创建一个名字为rc-my-text.c键值映射文件
1.首先在include/media/rc-map.h添加rc-my-text.c键值映射文件的名字
2.由于我们板子上的红外接收编码是NEC格式,并且是GPIO类型,所以配置Make menuconfig:
->Device Drivers -> Multimedia support (MEDIA_SUPPORT [=y]) -> Remote controller decoders (RC_DECODERS [=y]) [*] Enable IR raw decoder for the NEC protocol //选择NEC协议, ,使CONFIG_IR_NEC_DECODER=y ->Device Drivers -> Multimedia support (MEDIA_SUPPORT [=y]) -> Remote Controller devices (RC_DEVICES [=y]) [*] GPIO IR remote control //选择GPIO接收类型,使CONFIG_IR_GPIO_CIR=y
3.写ir_recv_test.c文件,来注册platform_device
#include <linux/platform_device.h> #include <media/gpio-ir-recv.h> #include <media/rc-map.h> #include <linux/gpio.h> #include <linux/of_gpio.h>
static struct gpio_ir_recv_platform_data ir_recv_data = { .gpio_nr = GPIO_PD(5), .active_low = 1, .map_name = RC_MAP_MY_TEXT, //.map_name ="rc-my-text",用来匹配键映射表 .allowed_protos = 0, //允许支持所有编码协议 }; static struct platform_device ir_recv_device = { .name = "gpio-rc-recv", .id = -1, .num_resources = 0, .dev = { .platform_data = &ir_recv_data, }, }; static int __init ir_recv_test_init(void) { platform_device_register(&ir_recv_device); return 0; } arch_initcall(ir_recv_test_init);
4.然后将ir_recv_test.c文件添加到Makefile中
obj-y += ir_recv_test.o
编译内核后,便实现一个红外驱动设备.
由于我们不知道遥控器具体键值对应的编码,所以先测试,获取编码值后,再创建键值映射文件
5.编译测试
如下图所示,我们以上下左右确定5个按键为例:
注意:上图显示的仅仅是打印信息,并没有上传input按键值,所以需要创建键值映射文件
6.创建drivers\media\rc\keymaps\rc-my-text.c键值映射文件
一般上下左右按键都要实现重复功能(比如:按下一直调音量)
而确定按键一般不实现重复功能.
所以代码如下:
#include <media/rc-map.h> #include <linux/module.h> static struct rc_map_table latte_key[] = { //所有支持的映射表 { 0x48ac40bf, KEY_UP}, { 0x48ac609f, KEY_DOWN}, { 0x48acc03f, KEY_LEFT}, { 0x48aca05f, KEY_RIGHT}, { 0x48ac20df, KEY_ENTER}, }; static struct rc_map_table repeat_key[] = { //支持重复按下的映射表 { 0x48ac40bf, KEY_UP}, { 0x48ac609f, KEY_DOWN}, { 0x48acc03f, KEY_LEFT}, { 0x48aca05f, KEY_RIGHT}, }; static struct rc_map_list latte_map = { .map = { .scan = latte_key, .size = ARRAY_SIZE(latte_key), .rc_type = RC_TYPE_NEC, //编码类型为NEC .name = RC_MAP_MY_TEXT, //用来匹配platform_device .repeat_key = repeat_key, .repeat_size = ARRAY_SIZE(repeat_key), } }; static int __init init_rc_map_latte(void) { return rc_map_register(&latte_map); } static void __exit exit_rc_map_latte(void) { rc_map_unregister(&latte_map); } module_init(init_rc_map_latte) module_exit(exit_rc_map_latte) MODULE_LICENSE("GPL"); MODULE_AUTHOR("Mauro Carvalho Chehab <mchehab@redhat.com>");
然后修改drivers\media\rc\keymaps\Makefile,将该文件添加进去
7.编译试验
当一直按下上下左右任意键时,可以看到能实现重复功能:
通过getevent查看一直按下时,是否一直input上报事件:
当一直按下确定键时:
通过getevent查看一直按下确定键时,是否只上传一次input上报事件:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- CentOS创建管理LVM分区(挂载新分区) 2020-05-17
- 如何VMware创建Linux虚拟机并设置虚拟机网络 2020-05-15
- KVM-virsh 创建虚拟网络 2020-01-17
- 如何在Linux上创建,列出和删除Docker容器 2020-01-02
- linux 文件系统管理三部曲之二:创建文件系统 2020-01-02
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash