首先,什么是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子系统详解的更多相关文章

  1. driver: Linux设备模型之input子系统详解

    本节从整体上讲解了输入子系统的框架结构.有助于读者从整体上认识linux的输入子系统.在陷入代码分析的过程中,通过本节的知识能够找准方向,明白原理. 本节重点: 输入子系统的框架结构 各层对应内核中的 ...

  2. Linux内核驱动学习(十)Input子系统详解

    文章目录 前言 框架 如何实现`input device` 设备驱动? 头文件 注册input_dev设备 上报按键值 dev->open()和dev->close() 其他事件类型,处理 ...

  3. input子系统详解

    一.初识linux输入子系统 linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(Inpu ...

  4. Linux输入子系统详解

    input输入子系统框架  linux输入子系统(linux input subsystem)从上到下由三层实现,分别为:输入子系统事件处理层(EventHandler).输入子系统核心层(Input ...

  5. input子系统详解2

    上一节大概了解了输入子系统的流程 这一节认真追踪一下代码 input.c: input_init(void)函数 static int __init input_init(void) { int er ...

  6. Linux /dev目录详解和Linux系统各个目录的作用

    Linux /dev目录详解(转http://blog.csdn.net/maopig/article/details/7195048) 在linux下,/dev目录是很重要的,各种设备都在下面.下面 ...

  7. Linux netstat命令详解

    Linux netstat命令详解 一  简介 Netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多 ...

  8. linux grep命令详解

    linux grep命令详解 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来 ...

  9. 【转发】linux yum命令详解

    linux yum命令详解 yum(全 称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器.基於RPM包管理, ...

随机推荐

  1. SSM ehcache 配置 mapper 文件出错

    异常 十二月 26, 2017 1:44:49 下午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertie ...

  2. 浅谈bitset

    维护二进制的数据结构,常数可近似看作\(\frac{1}{32}\) 定义 bitset<4> bitset1; 长度为4,下标[0,3],默认为0 bitset<4> bit ...

  3. 【CSP模拟赛】凤凰院凶真(最长公共上升子序列)

    题目描述 α世界线.凤凰院凶真创立了反抗SERN统治的组织“瓦尔基里”.为了脱离α线,他需要制作一个世界线变动率测量仪. 测量一个世界线相对于另一个世界线的变动率,实质上就是要求出这两个世界线的最长公 ...

  4. win10 eclipse连接虚拟机ubuntu中的hdfs

    1.eclipse安装连接hadoop的插件hadoop-eclipse-plugin-2.6.0(注意自己hadoop的版本) 将该插件放在eclipse安装路径的plugins文件夹中. ps:我 ...

  5. 迁移mysql数据位置

    查看位置: show variables like '%datadir%'; /var/lib/mysql

  6. TextBox光标定位到文本末尾

    private void RichTextBox1_TextChanged(object sender, EventArgs e) { this.richTextBox1.Select(richTex ...

  7. CMU Database Systems - Embedded Database Logic

    正常应用和数据库交互的过程是这样的, 其实我们也可以把部分应用逻辑放到DB端去执行,来提升效率 User-defined Function Stored Procedures Triggers Cha ...

  8. 阿里云 商标 SAAS

    商标注册-注册商标查询-商标交易平台-阿里云商标https://tm.aliyun.com/#/ 阿里云商标查询入口-云栖社区-阿里云https://yq.aliyun.com/articles/69 ...

  9. linux下如何制作initrd镜像?

    1. 准备文件 加入已经准备好了所有文件在/home/initrd-base目录下 2. 制作initrd镜像 cd /home/initrd-base/ ;find . | cpio --quiet ...

  10. postgresql 查看用户名

    查看当前连接的用户名: foo=#select * from current_user; 或 foo=#select user; 查看所有用户名: foo=#\du 用户管理可以查看之前的博文: ht ...