Linux 系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,因此,12.1~12.2节的按键和触摸屏设备驱动都可以作为input设备驱动而实现。
在Linux 内核中,input设备用input_dev 结构 体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构 体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
通过input子系统,具体的输入设备驱动只需要完成如下工作。
l 在模块加载函数中告知input子系统它可以报告的事件。
设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY, button_dev.evbit);
l 在模块加载函数中注册输入设备。
注册输入设备的函数为:
int input_register_device(struct input_dev
*dev);
l 在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。
主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。
用于报告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_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(input_dev
); //同步
在模块卸载函数中注销输入设备。注销输入设备的函数为:
void input_unregister_device(struct input_dev
*dev);
代码清单12.28给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。
代码清单12.28 最简单的input设备驱动
1 /*在按键中断中报告事件*/
2 static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)
3 {
4 input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) &1);
5 input_sync(&button_dev);
6 }
7
8 static int _ _init button_init(void)
9 {
10 /*申请中断*/
11 if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
12 {
13 printk(KERN_ERR "button.c: Can't allocate irq %d ", button_irq);
14 return - EBUSY;
15 }
16
17 button_dev.evbit[0] = BIT(EV_KEY); //支持EV_KEY事件
18 button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);
19
20 input_register_device(&button_dev); //注册input设备
21 }
22
23 static void _ _exit button_exit(void)
24 {
25 input_unregister_device(&button_dev); //注销input设备
26 free_irq(BUTTON_IRQ, button_interrupt); //释放中断
27 }
Linux 系统提供了input子系统,按键、触摸屏、键盘、鼠标等输入都可以利用input接口函数来实现设备驱动,因此,12.1~12.2节的按键和触摸屏设备驱动都可以作为input设备驱动而实现。
在Linux 内核中,input设备用input_dev 结构 体描述,使用input子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、键盘、鼠标等输入事件(event,通过input_event结构 体描述),不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口。驱动报告的事件经过InputCore和 Eventhandler最终到达用户空间。
通过input子系统,具体的输入设备驱动只需要完成如下工作。
l 在模块加载函数中告知input子系统它可以报告的事件。
设备驱动通过set_bit()告诉input子系统它支持哪些事件,如下所示:
set_bit(EV_KEY, button_dev.evbit);
l 在模块加载函数中注册输入设备。
注册输入设备的函数为:
int input_register_device(struct input_dev
*dev);
l 在键被按下/抬起、触摸屏被触摸/抬起/移动、鼠标被移动/单击/抬起时通过input_ report_xxx()报告发生的事件及对应的键值/坐标等状态。
主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如光标移动,报告的是相对最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏和操纵杆,它们工作在绝对坐标系统)。
用于报告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_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(input_dev
); //同步
在模块卸载函数中注销输入设备。注销输入设备的函数为:
void input_unregister_device(struct input_dev
*dev);
代码清单12.28给出了一个最简单的使用input接口实现按键设备驱动的范例,它在中断服务程序中向系统报告按键及同步事件。
代码清单12.28 最简单的input设备驱动
1 /*在按键中断中报告事件*/
2 static void button_interrupt(int irq, void *dummy, struct pt_regs *fp)
3 {
4 input_report_key(&button_dev, BTN_1, inb(BUTTON_PORT) &1);
5 input_sync(&button_dev);
6 }
7
8 static int _ _init button_init(void)
9 {
10 /*申请中断*/
11 if (request_irq(BUTTON_IRQ, button_interrupt, 0, "button", NULL))
12 {
13 printk(KERN_ERR "button.c: Can't allocate irq %d ", button_irq);
14 return - EBUSY;
15 }
16
17 button_dev.evbit[0] = BIT(EV_KEY); //支持EV_KEY事件
18 button_dev.keybit[LONG(BTN_0)] = BIT(BTN_0);
19
20 input_register_device(&button_dev); //注册input设备
21 }
22
23 static void _ _exit button_exit(void)
24 {
25 input_unregister_device(&button_dev); //注销input设备
26 free_irq(BUTTON_IRQ, button_interrupt); //释放中断
27 }
分享到:
相关推荐
摘要视图2014年12月23日 20:13:38event分类:目录(?Linux/Android——输入子系统input_event传递 (二)11931人阅
input_hande 没有一个全局的链表,它注册的时候将自己分别挂在了input_dev 和 input_handler 的h_list上了。通过input_dev 和input_handler就可以找到input_handle在设备注册和事件处理器,注册的时候都要进行配对...
mini2440 友善之臂开发板上用input_dev实现的button驱动程序和应用程序
这个是Linux 输入事件所有宏定义,从vscode追到的,可以通过EV_KEY这宏定义追,不会追就直接下载文件吧。
设备驱动 对应input_dev 负责实际的设备数据读取,通过input core 将数据传递到事件驱动程序,上报给用户层 事件驱动,对应input_handler,负责创建设备节点,负责和应用层进行数据交互以及上报
sacd decoder to PCM format(wave)
tensorflow 1.x版本中Input_data,在tensorflow 2.x中被清理,学习mnist入门必经之路
linux input子系统的运行方式及驱动的添加
Linux中Input输入子系统分析.pdf
电脑播放sacd镜像音乐foobar插件
编写input_data函数、测试input_data函数
可用于foobar2000几个版本0.9.4.3、1.0、1.18、的DTS解码器插件foo_input_dts.dll
详细介绍了linux input子系统的知识
MNIST数据集input_data.py
linux input 子系统详解,对于快速理解这种input 设备驱动有很大帮助,touch,keypad,G-sensor
tools 搜狗输入法 android SogouInput_android_3.1.1_sweb.apk
方法/步骤 首先需要大家下载foo_input_monkey.dll这个插件 下载完成后解压文件 找到X:\foobar2000\components这个目录,将foo_input_monkey.dll放入这个目录。
Python中的导入数据模块input_data.py
由于TensorFlow中文社区中的input_data.py无法现在,经过多方寻找,找到了该文件,存在一些小小的问题,被我修改了之后,可以在本地运行.