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(),
.active_low = ,
.map_name = RC_MAP_MY_TEXT, //.map_name ="rc-my-text",用来匹配键映射表
.allowed_protos = , //允许支持所有编码协议
}; static struct platform_device ir_recv_device = {
.name = "gpio-rc-recv",
.id = -,
.num_resources = ,
.dev = {
.platform_data = &ir_recv_data,
},
};
static int __init ir_recv_test_init(void)
{
platform_device_register(&ir_recv_device);
return ;
} 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上报事件:
46.Linux-创建rc红外遥控平台设备,实现重复功能(2)的更多相关文章
- 46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)
内核版本 : Linux 3.10.14 rc红外接收类型: GPIO 类型的NEC红外编码 本章内容 1) rc体系结构分析 2) 分析红外platform_driver平台驱 ...
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...
- [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联
转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...
- Linux中总线设备驱动模型及平台设备驱动实例
本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...
- Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)
Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...
- 【Linux高级驱动】linux设备驱动模型之平台设备驱动机制
[1:引言: linux字符设备驱动的基本编程流程] 1.实现模块加载函数 a.申请主设备号 register_chrdev(major,name,file_operations); b.创 ...
- Linux Platform devices 平台设备驱动
设备总线驱动模型:http://blog.csdn.net/lizuobin2/article/details/51570196 本文主要参考:http://www.wowotech.net/devi ...
- 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验
1. 打开 https://www.aliyun.com/ 注册账号 2.注册账号登录后点击控制台 3. 在下图1处输入物联网平台,会弹出2处所示物联网平台的入口,点击红色箭头所示处,进入物联网平 ...
- 嵌入式Linux驱动学习之路(十七)驱动程序分层分离概念-平台设备驱动
平台设备驱动: 包含BUS(总线).DEVICE.DRIVER. DEVICE:硬件相关的代码 DRIVER:比较稳定的代码 BUS有一个driver链表和device链表. ①把device放入bu ...
随机推荐
- 常用类:Object
2017-08-08 Object :作为所有类的根类,(超类,父类) 常用的方法: public int hasCode(){//返回该对象的哈希码值(地址)}:判断对象是否在同一内存地址上 pub ...
- iOS TouchID & FaceID
import UIKit import LocalAuthentication //指纹识别必须用真机测试,并且在iOS8以上系统,如果是FaceID至少IOS11以上. class Authenti ...
- Python基础理论 - Python简介
1. Python介绍 -程序员减少开发成本 创业性公司 - Python使用较多,开发效率高 老牌大公司 - 有部门使用 -应用领域 •自动化运维 -- 安装Linux 自带 Python -- 现 ...
- Android开发之如何避免ANR(Keeping Your App Responsive)
一:什么是ANR 如果应用程序不能响应用户的输入了,那么就可以说应用ANR了. 如果需要运行一个耗时较长的操作的时候,不要把这个任务放在UI线程上运行,而是单独创建一个线程运行那些操作. 以下情况会出 ...
- 每天学点SpringCloud(十二):Zipkin全链路监控
Zipkin是SpringCloud官方推荐的一款分布式链路监控的组件,使用它我们可以得知每一个请求所经过的节点以及耗时等信息,并且它对代码无任何侵入,我们先来看一下Zipkin给我们提供的UI界面都 ...
- 一些能体现个人水平的SQL语句[总结篇]
作为一名小小的开发人员,刚入门的时候觉得很难,过了一段时间之后,发现很简单,很快就可以搞定很bug了.然而这并不能说明你就已经很牛掰了,只能说,你不了解其他太多的东西.应该说,数据库有几个共同的命令, ...
- 【PHP篇】输出方法
php开始处加:error_reporting(E_ALL & ~E_NOTICE); //不打印注意 echo: echo “字符串”; //也可为单引号 echo $变量名; ech ...
- JS继承的从入门到理解
开场白 大三下学期结束时候,一个人跑到帝都来参加各厂的面试,免不了的面试过程中经常被问到的问题就是JS中如何实现继承,当时的自己也是背熟了实现继承的各种方法,回过头来想想却不知道__proto__是什 ...
- JSON库的使用研究(一)
最近用到JSON,收集了一些资料,整理如下: 选择一个合适的JSON库要从多个方面进行考虑: 字符串解析成JSON性能 字符串解析成Java Object性能 Java Object转JSON性能 集 ...
- <数据结构> 队列[转]
队列(queue)是一个简单而常见的数据结构.队列也是有序的元素集合.队列最大的特征是First In, First Out (FIFO,先进先出),即先进入队列的元素,先被取出.这一点与栈(stac ...