linux驱动之input子系统

本文深入探讨了Linux系统的input输入子系统,包括设备驱动层、input core层和input handler事件处理层的功能。设备驱动层通过input_register_device注册,input handler负责与用户空间交互,input core作为桥梁协调两者。文章详细分析了input_dev结构,解释了设备驱动的注册流程,如设置设备属性、事件支持等,并介绍了input_handler的注册过程,以evdev为例展示了如何连接设备和处理程序。
摘要由CSDN通过智能技术生成

linux系统中,input输入子系统驱动主要可以分为:设备驱动层、input core层和input handler事件处理层。

设备驱动层提供具体用户设备驱动,由struct input-dev 结构表示,input_register_device来注册。

input handler事件处理层 主要和用户空间交互

input core 层负责管理系统中的input dev设备和inputhander事件处理,并起到承上启下作用,负责输入设备驱动和input handler之间信息传输

input子系统结构如图:

 

主要分为两部分:设备驱动层的注册、handler的注册,在注册的过程中会有handle的创建以及它的作用,会说明设备驱动与handler是如何匹配的

                                                    设备驱动层的注册

注册一个input设备主要是对input_register_device的分析

1、  input_dev结构

struct input_dev {

const char *name;                     /*设备名*/

struct input_id id;                       /*id号,用于匹配事件处理层handler*/

 

unsigned longevbit[BITS_TO_LONGS(EV_CNT)]; /*用于记录支持的事件类型的位图*/

unsigned longkeybit[BITS_TO_LONGS(KEY_CNT)]; /*记录支持的按键值的位图*/

unsigned longrelbit[BITS_TO_LONGS(REL_CNT)]; /*记录支持的相对坐标的位图  */

unsigned longabsbit[BITS_TO_LONGS(ABS_CNT)]; /*记录支持的绝对坐标的位图  */

unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];

unsigned longledbit[BITS_TO_LONGS(LED_CNT)];  /*led */

unsigned longsndbit[BITS_TO_LONGS(SND_CNT)]; /*beep*/

unsigned int keycodemax;  /*支持的按键值的个数*/

unsigned int keycodesize;  /*每个键值的字节数  */

void *keycode;                    /*存储按键值的数组首地址*/

int (*setkeycode)(structinput_dev *dev, const struct input_keymap_entry *ke,

                      unsigned int *old_keycode);                  /* 修改键值的函数,可选 */

int (*getkeycode)(structinput_dev *dev,

                      struct input_keymap_entry *ke);        /* 获取扫描码的键值,可选  */

unsigned int repeat_key;             

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值