在上章分析了红外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)的更多相关文章

  1. 46.Linux-分析rc红外遥控平台驱动框架,修改内核的NEC解码函数BUG(1)

    内核版本          :  Linux 3.10.14 rc红外接收类型:  GPIO 类型的NEC红外编码 本章内容 1) rc体系结构分析 2) 分析红外platform_driver平台驱 ...

  2. 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联

    转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...

  3. [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联

    转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...

  4. Linux中总线设备驱动模型及平台设备驱动实例

    本文将简要地介绍Linux总线设备驱动模型及其实现方式,并不会过多地涉及其在内核中的具体实现,最后,本文将会以平台总线为例介绍设备和驱动程序的实现过程. 目录: 一.总线设备驱动模型总体介绍及其实现方 ...

  5. Linux驱动之平台设备驱动模型简析(驱动分离分层概念的建立)

    Linux设备模型的目的:为内核建立一个统一的设备模型,从而有一个对系统结构的一般性抽象描述.换句话说,Linux设备模型提取了设备操作的共同属性,进行抽象,并将这部分共同的属性在内核中实现,而为需要 ...

  6. 【Linux高级驱动】linux设备驱动模型之平台设备驱动机制

    [1:引言: linux字符设备驱动的基本编程流程] 1.实现模块加载函数  a.申请主设备号    register_chrdev(major,name,file_operations);  b.创 ...

  7. Linux Platform devices 平台设备驱动

    设备总线驱动模型:http://blog.csdn.net/lizuobin2/article/details/51570196 本文主要参考:http://www.wowotech.net/devi ...

  8. 图解连接阿里云(一)创建阿里云物联网平台产品和设备,使用MQTT.fx快速体验

    1.  打开 https://www.aliyun.com/  注册账号 2.注册账号登录后点击控制台 3. 在下图1处输入物联网平台,会弹出2处所示物联网平台的入口,点击红色箭头所示处,进入物联网平 ...

  9. 嵌入式Linux驱动学习之路(十七)驱动程序分层分离概念-平台设备驱动

    平台设备驱动: 包含BUS(总线).DEVICE.DRIVER. DEVICE:硬件相关的代码 DRIVER:比较稳定的代码 BUS有一个driver链表和device链表. ①把device放入bu ...

随机推荐

  1. [转] IPTables for KVM Host

    IPTables for KVM Host January 26, 2012 By Andrew Galdes Use the following IPTables rules “/etc/sysco ...

  2. metools,个人工具站点分享

    需要[加密/解密][编码/解码][生成二维码]的时候不用再进百度点广告~ 也不需要去收藏夹找网址~ 我的目的大概就是如此. 项目地址:https://github.com/yimogit/metool ...

  3. jvm的垃圾回收和内存

    垃圾回收: 对象的创建是我们程序员主导的,但是却没有与之相对应的delete方法来删除我们用完的对象,释放这些我们已经不需要再使用的对象的内存空间,gc:垃圾回收机制:指的就是JVM自带的一种释放无用 ...

  4. Android JNI 学习(十一):Invocation Api

    1. 简介 Invocation API允许软件提供商在原生程序中内嵌Java虚拟机.因此可以不需要链接任何Java虚拟机代码来提供Java-enabled的应用程序. 以下代码演示如何使用: #in ...

  5. Javascript高级编程学习笔记(71)—— 模拟事件(1)DOM事件模拟

    事件,指的是网页中某个特定的交互时刻 一般来说事件由浏览器厂商负责提供,一般由用户操作或者其它浏览器功能来触发 但是有一类特殊的事件,那就是由我们开发人员通过JS触发的事件 这些事件和浏览器创建的事件 ...

  6. 程序员工作 996 生病 ICU ?

    阅读本文大概需要 2 分钟. 说实话,一般平时这个点我已经睡着了,今天准备好的文章也会准时在凌晨推送给大家.睡前看篇关于强制 996 加班的消息,里面有句口号还挺溜,上班996,下班ICU,为此还特意 ...

  7. es5

    var arr1=["上海","北京","广州"]; var arr2=[12,22, 33,58,32,45,92]; // 数组.方法( ...

  8. Log4J从基础到应用

    1.API中核心的三个接口(org.apache.log4j) Class Logger This is the central class in the log4j package. Most lo ...

  9. 微信小程序我的界面

    前言 感谢! 承蒙关照~ 微信小程序我的界面 界面效果: 界面结构: 小程序代码: 我们先看me.json代码 { "navigationBarTitleText": " ...

  10. 315道python面试题(参考答案)

    第一部分 Python基础篇 1:为什么学习Python 家里有在这个IT圈子里面,也想让我接触这个圈子,然后给我建议学的Python, 然后自己通过百度和向有学过Python的同学了解了Python ...