input子系统开发:


可以看出 input 子系统用到了驱动分层模型,我们编写驱动程序的时候只需要关注中间的驱动层、核心层和事件层,这三个层的分工如下: 硬件驱动层,子系统核心层,事件处理层。
1、
(1)其中硬件驱动层负责操作具体的硬件设备,这层的代码是针对具体的驱动程序的,需要驱动程序的作者来编写。输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。
(2)子系统核心层是链接其他两个层之间的纽带与桥梁,向下提供驱动层的接口,向上提供事件处理层的接口。承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。
(3)事件处理层负责与用户程序打交道,将硬件驱动层传来的事件报告给用户程序。

2.Input子系统的三个重要结构体:

input_dev 是硬件驱动层,代表一个input设备

input_handler 是事件处理层,代表一个事件处理器

input_handle 个人认为属于核心层,代表一个配对的input设备与input事件处理器

linux中input系统主设备号是13
次设备号:

0-31 joystick(游戏杆)

32-62 mouse(鼠标)

63 mice(鼠标)

64-95 事件(Event)设备

struct input_event {

struct timeval time; //按键时间

__u16 type; //类型,在下面有定义

__u16 code; //要模拟成什么按键

__s32 value;//是按下还是释放

};

code:

事件的代码.如果事件的类型代码是EV_KEY,该代码code为设备键盘代码.代码植0127为键盘上的按键代码,0x1100x116 为鼠标上按键代码,其中0x110(BTN_ LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义请参看include/linux/input.h文件. 如果事件的类型代码是EV_REL,code值表示轨迹的类型.如指示鼠标的X轴方向REL_X(代码为0x00),指示鼠标的Y轴方向REL_Y(代码 为0x01),指示鼠标中轮子方向REL_WHEEL(代码为0x08).

value:

事件的值.如果事件的类型代码是EV_KEY,当按键按下时值为1,松开时值为0;如果事件的类型代码是EV_ REL,value的正数值和负数值分别代表两个不同方向的值.

adxl362振动传感器的官网上提供的linux-spi驱动程序中

1、第687行: __set_bit(EV_ABS, input_dev->evbit);
evbit代表设备产生的事件类型和上报的按键值。事件类型和键值得定义在input.h文件中:

#define EV_SYN           0x00   //同步事件
#define EV_KEY          0x01   //按键事件
#define EV_REL          0x02   //相对坐标(鼠标)
#define EV_ABS          0x03   //绝对坐标(TP)
#define EV_MSC          0x04   //其它
#define EV_SW           0x05   //开关
#define EV_LED          0x11   //设备灯
#define EV_SND          0x12   //声音、警报
#define EV_REP          0x14   //重复
#define EV_FF               0x15   //力反馈
#define EV_PWR          0x16   //电源
#define EV_FF_STATUS        0x17   //力反馈状态
#define EV_MAX          0x1f   //最大事件个数
#define EV_CNT          (EV_MAX+1)

2、adxl362输入振动信号时,当产生动作时通常是采用中断的方式上报动作的。输入设备的驱动程序也是在中断处理函数中上报输入事件的,所以我们还需为我们的输入设备注册一个中断:

int request_threaded_irq(unsigned int irq, irq_handler_t handler, irq_handler_t thread_fn, unsigned long irqflags, const char *devname, void *dev_id) ;

参数:
irq:表示申请的中断号。
handler:表示中断服务例程。
thread_fn:中断线程化,若此处传递的是NULL,表示没有中断线程化。
irqflags:表示中断标志位。
devname:表示请求中断的设备的名称。
dev_id: 对应于request_irq()函数中所传递的第五个参数,可取任意值,但必须唯一能够代表发出中断请求的设备,通常取描述该设备的结构体。 共享中断时所用。

ret = request_threaded_irq(spi->irq, NULL, adxl362_irq,irqflags |IRQF_ONESHOT,dev_name(dev), ac);

3、输入设备子系统所提供的上报事件的主要接口函数有:

/上报绝对坐标事件/
void input_report_abs(struct input_dev *dev, unsigned int code, int value);
/报告同步事件/
void input_sync(struct input_dev *dev);
/*通过输入设备获取adxl设备 */
struct adxl362_state *ac = input_get_drvdata(input);

4、注册输入设备:
ret = input_register_device(input_dev);
通过调用input_register_device将我们的输入设备添加到系统的输入设备链表中
5、资源回收
input_unregister_device(ac->input);
free_irq(spi->irq, ac);//释放工作可以放在模块的清除函数中进行

arm-linux驱动开发学习7相关推荐

  1. ARM Linux驱动开发简介

    一.Linux驱动分类 Linux的驱动主要分为三种,分别为字符设备驱动.块设备驱动.网络设备驱动.其中字符设备驱动是最多的一类驱动,因为字符设备最多,从最简单的点灯到I2C.SPI.音频等都属于字符 ...

  2. Linux驱动开发学习笔记-电容触摸屏驱动

    <电容触摸屏驱动框架> 电容触摸屏驱动其实是以下几种 linux 驱动框架的组合: ① IIC 设备驱动,因为电容触摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 设备驱动. ...

  3. Linux驱动开发学习笔记【12】:Linux自带LED灯驱动

    目录 一.内核自带LED驱动使能 二.内核自带LED驱动分析 三.内核自带LED驱动使用 一.内核自带LED驱动使能 在Linux内核中,已经自带了LED灯的驱动程序,使用的就是platform平台驱 ...

  4. linux驱动开发学习2 设备树

    设备树 dtb板级信息文件,大势所趋,一定要学  如何确定要编译哪个DTS文件:查看linux下的arch/arm/boot/dts/Makefile  DTS语言有属于自己的语法:以树形来描述设备信 ...

  5. Linux驱动开发学习笔记【8】:Linux中断系统

    目录 一.Linux内核中断处理过程 1.1.裸机中断 1.2.linux中断 二.linux中断的上半部和下半部 2.1 软中断 2.2 tasklet 2.3 工作队列 2.4 中断线程化 三.设 ...

  6. 正点原子 Linux驱动开发学习笔记-06 chrdevbase虚拟设备驱动的完善

    要求:应用程序可以对驱动进行读写操作. 读:从驱动读一个字符串 写:应用程序向驱动写一个字符串 驱动的缓冲,与应用程序的读写buffer都是100. 1. read驱动函数编写,需要用到copy_to ...

  7. linux驱动开发学习笔记二十一:异步通知

    一.异步通知简介 我们首先来回顾一下"中断",中断是处理器提供的一种异步机制,我们配置好中断以后就可以让处理器去处理其他的事情了,当中断发生以后会触发我们事先设置好的中断服务函数, ...

  8. LINUX驱动开发学习笔记--DDR3内存

    在学习DDR之前,我们首先要知道什么是RAM和ROM RAM:随机存储器,可以随时进行读写操作,速度很快,掉电以后数据会丢失.比如内存条. SRAM. SDRAM. DDR等都是 RAM. RAM一般 ...

  9. 如何学习Linux驱动开发?

    原文链接:https://blog.csdn.net/hwunion/article/details/41621655 Linux驱动开发,看起来是一份很高大上的职业,毕竟从事上层应用开发人员太多,而 ...

  10. 嵌入式Linux驱动开发【学习小结】

    文章目录 前言 一.嵌入式Linux驱动程序和单片机裸奔有啥区别? 二.为什么需要嵌入式Linux驱动开发 三.驱动程序框架大致演变过程 总结 前言 随着去嵌入式设备资源不断丰富,主频不断升高,搭载操 ...

最新文章

  1. pyqt5 视频播放器
  2. java虚拟机-JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
  3. DAY4-打卡第四天-2018-1-12
  4. JDK9的新特性:String压缩和字符编码
  5. 【机器学习】传统目标检测算法之HOG
  6. 远程声控系统(MATLAB代码见CSDN资源)
  7. 虚拟机机操作系统已禁用 cpu。请关闭或重置虚拟机。_黑科技教学丨Win10竟然内置了一台虚拟机?教你如何玩转它...
  8. java printf与println_浅析Java中print、printf、println的区别
  9. 背景图片固定(背景图片附着)(HTML、CSS)
  10. 引用数据类型Scanner,Random
  11. (转)Spring实现IoC的多种方式
  12. Word2010邮件合并(附带照片)
  13. Python 复数属性和方法操作实例
  14. UE学习笔记01(3月)
  15. IntelliJ IDEA之内存不够提示os::commit_memory failed
  16. 腾讯云服务器公网6M带宽实际下载/上传速度详细解释
  17. 【淘宝】商品列表页数据采集+商品销量数据采集代码
  18. 51分布式电商项目 - Linux下安装ActiveMQ
  19. STM32-HAL-SPI-W25Q128FV简单读写测试(2)
  20. 京东物流组织架构分析,要有具体数据

热门文章

  1. VS2015社区版安装教程
  2. 自动驾驶应用加速 模拟仿真技术是关键之一
  3. 通过JavaScript实现分页及搜索查询
  4. vs2017社区版在离线的电脑上注册方法
  5. javaee之用户信息增删改查案例
  6. ⑤初识java:打印日历
  7. 微信小程序实现每日签到功能
  8. sql创建和添加时间字段
  9. 理解Andriod 硬件加速
  10. 微信小程序框架--weui