您的位置:首页 > 运维架构 > Linux

linux输入子系统

2013-12-17 16:34 459 查看

1.1.input子系统概述

1.2. input子系统结构图

input子系统结构图如下图1所示:





图1 输入子系统结构图

1.3.linux中输入设备驱动的分层

linux中输入设备驱动的分层如下图2所示:





图2 linux中输入设备的分层

1.4. 输入子系统设备驱动层实现原理

在Linux中,Input设备用input_dev结构体描述,定义在input.h中。设备的驱动只需按照如下步骤就可实现了。

1).在驱动模块加载函数中设置Input设备支持input子系统的哪些事件;

2).将Input设备注册到input子系统中;

3).在Input设备发生输入操作时(如:键盘被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时等),提交所发生的事件及对应的键值/坐标等状态。

1.5.软件设计流程

软件设计流程如下图3所示





图 3 input子系统软件设计流程

1.6.与软件设计有关的API函数

1.6.1.分配一个输入设备

Struct input_dev *input_allocate_device*(void);

1.6.2.注册一个输入设备

Int input_register_device(struct input_dev *dev);

1.6.3.驱动实现-事件支持

Set_bit告诉inout子系统它支持哪些事件

Set_bit(EV_KEY,button_dev.evbit)

Struct input_dev中有两个成员,一个是evbit;一个是keybit.分别用来表示设备所支持的事件类型和按键类型。

1.6.3.1事件类型

Linux中输入设备的事件类型有(这里只列出了常用的一些,更多请看linux/input.h中):EV_SYN 0x00 同步事件

EV_KEY 0x01 按键事件

EV_REL 0x02 相对坐标

EV_ABS 0x03 绝对坐标

EV_MSC 0x04 其它

EV_LED 0x11 LED

EV_SND 0x12 声音

EV_REP 0x14 Repeat

EV_FF 0x15 力反馈

1.6.4.驱动实现-报告事件

Void input_event(struct input_dev *dev,unsigned int type,unsigned int code,int value);//报告指定type,code的输入事件

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);//报告绝对坐标

Void input_sync(struct input_dev *dev);//报告同步事件

在触摸屏驱动设计中,一次坐标及按下状态的整个报告过程如下:

Input_report_abs(input_dev,ABS_X,x);//X坐标

Input_report_abs(input_dev,ABS_Y,y);//Y坐标

Input_report_abs(input_dev,ABS_PRESSURE,pres);//压力

input_sync(struct input_dev *dev);//同步

1.6.5释放与注销设备

Void input_free_device(struct input_dev *dev);

Void input_unregister_device(struct input_dev *);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: