linux input子系统详解
首先,什么是linux的子系统:
输入子系统由驱动层、输入子系统核心、事件处理层三部分组成。一个输入事件,如鼠标移动通过Driver->Input core->Event handler->user space的顺序到达用户控件的应用程序。
驱动层:将底层的硬件输入转化为统一事件形式,向输入核心(Input Core)汇报。
Input Core:承上启下, 为驱动层 提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息。
事件处理层:主要是和用户空间交互。(Linux中在用户空间将所有的设备都当初文件来处理,由于在一般的驱动程序中都有提供fops接口,以及在/dev下会生成相应的设备文件nod,这些操作在输入子系统中由事件处理层完成)。
////////////////////////////////////////////////////////////////////////////////////////////
实现设备驱动核心工作是:向系统报告按键等输入事件(event,通过input_event结构描述),不再需要关心文件操作接口(如何理解)。驱动报告事件经过inputCore和Eventhandler到达用户空间。
一些驱动相关的函数:
设备注册------------属于在驱动程序中使用?不在用户代码中用?
注册输入设备函数:int input_register_device(struct input_dev *dev)
注销输入设备函数:void input_unregister_device(struct input_dev *dev)
初始化(事件支持):
set_bit()告诉input输入子系统支持哪些事件,哪些按键。例如:
set_bit(EV_KEY,button_dev.evbit) (其中button_dev是 struct input_dev类型)
struct input_dev中有两个成员:evbit,keybit----------怎么与input.h中定义的input_event不一样呢,难道这里说的是内核空间的同名结构体??
evbit: 事件类型(包括 EV_RST,EV_REL,EV_MSC,EV_KEY,EV_ABS,EV_REP等)
keybit:与某种事件类型对应的按键类型(eg. 当事件类型为EV_KEY时, 包括KEY_F11,BTN_LEFT, BTN_0, BTN_1 ,BTN_MIDDLE等 )
报告事件:
用于报告EV_KEY,EV_REL,EV_ABS事件的函数分别为:
void input_report_key (struct input_dev *dev, unsigned int code, int value)
void input_report_rel (struct input_dev *dev, unsigned int code, int value)
void input_report_abs (struct input_dev *dev, unsigned int code, int value)
报告结束:
input_sync()同步用于告诉input core子系统报告结束。
实例:触摸屏设备驱动中,一次点击的整个报告过程如下:
input_reprot_abs(input_dev,ABS_X,x); //x坐标
input_reprot_abs(input_dev,ABS_Y,y); // y坐标
input_reprot_abs(input_dev,ABS_PRESSURE,1);
input_sync(input_dev);//同步结束
实例分析(按键中断程序):
//按键初始化
static int __init button_init(void)//申请中断
{
if(request_irq(BUTTON_IRQ, button_interrupt,0,”button”,NUll))
return –EBUSY;
set_bit(EV_KEY,button_dev.evbit); //支持EV_KEY事件
set_bit(BTN_0,button_dev.keybit); //支持设备两个键
set_bit(BTN_1,button_dev.keybit); //
input_register_device(&button_dev);//注册input设备
}
/*在按键中断中报告事件*/
Static void button_interrupt(int irq,void *dummy,struct pt_regs *fp)
{
input_report_key(&button_dev,BTN_0,inb(BUTTON_PORT0));//读取寄存器BUTTON_PORT0的值
input_report_key(&button_dev,BTN_1,inb(BUTTON_PORT1));
input_sync(&button_dev);
}
总结:input子系统仍然是字符设备驱动程序,但是代码量减少很多,input子系统只需要完成两个工作:初始化和事件报告(这里在linux中是通过中断来实现的)。读者不妨用sourceinsignt 输入input_init去搜关于输入子系统的实现.
例子:https://www.cnblogs.com/myblesh/articles/2367648.html
////////////////////////////////////////////////////////////////////////////////////////////
输入子系统内核代码分析:
https://www.cnblogs.com/lifexy/p/7542989.html
ref:
https://www.cnblogs.com/myblesh/articles/2367648.html
https://www.cnblogs.com/lifexy/p/7542989.html
linux input子系统详解的更多相关文章
- driver: Linux设备模型之input子系统详解
本节从整体上讲解了输入子系统的框架结构.有助于读者从整体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识能够找准方向,明白原理. 本节重点: 输入子系统的框架结构 各层对应内核中的 ...
- Linux内核驱动学习(十)Input子系统详解
文章目录 前言 框架 如何实现`input device` 设备驱动? 头文件 注册input_dev设备 上报按键值 dev->open()和dev->close() 其他事件类型,处理 ...
- input子系统详解
一.初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(Inpu ...
- Linux输入子系统详解
input输入子系统框架 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(Input ...
- input子系统详解2
上一节大概了解了输入子系统的流程 这一节认真追踪一下代码 input.c: input_init(void)函数 static int __init input_init(void) { int er ...
- Linux /dev目录详解和Linux系统各个目录的作用
Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...
- Linux netstat命令详解
Linux netstat命令详解 一 简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多 ...
- linux grep命令详解
linux grep命令详解 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来 ...
- 【转发】linux yum命令详解
linux yum命令详解 yum(全 称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理, ...
随机推荐
- 主要排序算法(Python实现)
1. 冒泡排序 算法描述:1. 比较相邻的两个数,对升序(/降序)而言,若当前数小于(大于)后一个数则交换两者的位置. 2.那么循环长度为L的列表,从第一个元素到倒数第(L-1)元素进行第1步操作,其 ...
- Oracle的存储的三大物理文件
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 一. ...
- STM32 软件按键消抖
引言 通常按键所用的开关都是机械弹性开关,当机械触点断开.闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖 ...
- 使用HttpClient访问WebHook
代码: import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.c ...
- MiniUI增删改查操作及确认按钮
原文:https://blog.csdn.net/codezdx/article/details/81565043 1.动态创建列:尽量不要直接在html文件里创建列,动态设置在js文件里方面添加.修 ...
- restful swagger api java go
rest框架使用swagger api,接口越来越多后性能会很差,如何优化? - 知乎https://www.zhihu.com/question/59349319 golang restful 框架 ...
- Centos 安装 nginx 特定版本
CentOS 6.9/7通过yum安装指定版本的Nginx - EasonJim - 博客园https://www.cnblogs.com/EasonJim/p/9020896.html [root@ ...
- layui表格工具条,如何动态控制按钮的展示?
<script type="text/html" id="toolTpl"> {{# if(d.agrgrtsts == 'A'){ }} < ...
- GPRS以TCP上传数据到服务器OK,但收不到服务器下发的数据
GPRS以TCP上传数据到服务器OK,但收不到服务器下发的数据 基站漂移是DTU很常见的连接故障,一个DTU所处的地方可能会有多个基站信号,时间久了,可能会在不同的基站之间切换,它会更新自己的连接,发 ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#endregion(C# 参考)
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#endregion(C# 参考) 1.返回顶部 1. #endregion(C# 参考) 2015/07/20 #endreg ...