46.Linux-创建rc红外遥控平台设备,实现重复功能(2)


在上章分析了红外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上报事件:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

Java Web技术经验总结(十四)

这个语句如果只是查询前面几页,或者是表的数据量不大(小于10万),就没有问题,否则就会出现慢查询。参考文章:【MySQL】 性能优化之 延迟关联进行了优化。

721
来自专栏猿天地

mongodb java操作语法

之前都是通过spring-data框架来对mongodb操作,当然在很多老的项目中,由于jar包版本的问题,不太好升级到最新的版本,往往会采用mongodb-d...

30110
来自专栏恰童鞋骚年

.NET基础拾遗(6)ADO.NET与数据库开发基础

  SQL语句时操作关系型数据库的基础,在开发数据访问层、调试系统等工作中十分常用,掌握SQL对于每一个程序员(无论是.NET、Java还是C++等)都非常重要...

1363
来自专栏hbbliyong

ShellExecute 启动外部程序 参数详细介绍

ShellExecute的功能是运行一个外部程序(或者是打开一个已注册的文件、打开一个目录、打印一个文件等等),并对外部程序有一定的控制。 目录 1基本简介 2...

53110
来自专栏Oracle

Oracle Job创建及使用详解

Oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。 一、查询系统中的job,可以查询视图 --相关视图 select *...

2175
来自专栏性能与架构

Mysql 8.0 新增特性

1. 数据字典 新增了事务型的数据字典,用来存储数据库对象信息 之前,字典数据是存储在元数据文件和非事务型表中的 2. 账号权限管理 添加了对 “角色” 的支持...

37611
来自专栏铭毅天下

Elasticsearch 6.X 新类型Join深入详解

0、ES6.X 一对多、多对多的数据该如何存储和实现呢? 引出问题: “某头条新闻APP”新闻内容和新闻评论是1对多的关系? 在ES6.X该如何存储、如何进行高...

3.5K9
来自专栏沃趣科技

其他混杂存储过程 | 全方位认识 sys 系统库

在上一篇《用于查看配置的存储过程 | 全方位认识 sys 系统库》中,我们介绍了sys 系统库中用于查看performance_schema配置信息的快捷存储过...

1433
来自专栏玩转全栈

Flutter中利用MapCache加sqflite实现一个伪LRU三级缓存

在做flutter应用的时候,遇到了一个问题,纯粹属于自己给自己加戏,问题是什么呢?我的app首页是一个列表,目前每次进应用,都是通过网络拿到新的列表,所以,如...

7585
来自专栏蓝天

一个简单的支持MySQL和SQLite3的DB接口

simple_db.zip 相关联代码:https://github.com/eyjian/mooon/tree/master/common_library/...

1112

扫码关注云+社区

领取腾讯云代金券