前言
在linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候,驱动和核心工作时向系统报告按键,触摸屏,键盘,鼠标等输入,不再需要关心文件操作接口,因为input子系统已经完成了文件操作接口,驱动报告的事经过inputCore和Eventhandler最终到达用户空间,也就是说以前需要自已构造“open,read,write”等函数,而现在是输入子系统框架中定义好的,参看 “evdev.c”,输入子系统右边的纯软件部分“处理方式”层由内核提供好了,我们只需要做左边“硬 件相关的操作”这部分,所以我们这次我们只需要创建一个Input_dev结构体变量,初始化这个变量的值,然后注册,在需要时上报按键调用input_event()函数就可以了,input driver编写要点如下
1.分配,注册,注销input设备
struct input_dev *input_allocate_device(void)
int input_register_device(struct input_dev *dev);
void input_unregister_device(struct input_dev *dev);
==2.==设置input设备支持的事件类型,事件码,事件值的范围,input_id等信息一个设备可以支持一个或多个事件类型,每个事件类型下面还需要设置具体的触发事件码,比如:EV_KEY事件,需要定义其支持哪些按键事件码,evbit[]表示能产生哪类事件,keybit[]表示能产生哪些按键
evbit 事件类型
#define EV_SYN 0x00 /*表示设备支持所有的事件*/
#define EV_KEY 0x01 /*键盘或者按键,表示一个键码*/
#define EV_REL 0x02 /*鼠标设备,表示一个相对的光标位置结果*/
#define EV_ABS 0x03 /*手写板产生的值,其是一个绝对整数值*/
#define EV_MSC 0x04 /*其他类型*/
#define EV_LED 0x11 /*LED灯设备*/
#define EV_SND 0x12 /*蜂鸣器,输入声音*/
#define EV_REP 0x14 /*允许重复按键类型*/
#define EV_PWR 0x16 /*电源管理事件*/
code
事件的代码.如果事件的类型是EV_KEY,该代码code为设备键盘代码.代码值0-127为键盘上的按键代码,0x110~0x116 为鼠标上按键代码,其中0x110(BTN_LEFT)为鼠标左键,0x111(BTN_RIGHT)为鼠标右键,0x112(BTN_ MIDDLE)为鼠标中键.其它代码含义看include/linux/input.h文件
value:
事件的值.如果事件的类型是EV_KEY,当按键按下时值为1,松开时值为0。
==3.==如果需要,设置input设备的打开,关闭,写入数据时的处理方法
==4.==在发生输入事件时,向子系统报告事件
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); //同步
查看键盘evdev支持哪一些dev
static const struct input_device_id evdev_ids[] = {
{
.driver_info = 1 }, /* Matches all devices */
{
}, /* Terminating zero entry */
};
....
static struct input_handler evdev_handler = {
.event = evdev_event,
.connect = evdev_connect,
.disconnect = evdev_disconnect,
.fops = &evdev_fops,
.minor = EVDEV_MINOR_BASE,
.name = "evdev",
.id_table = evdev_ids,
};
“Matches all devices”注释说明这个“evdev_ids[]”支持所有的设备.那么也就会支持我们要写按键设备.这时,evdev_ids[]支持这个“buttons_dev”后,就会调用"evdev_handler"这个“input_handler”结构中“.connect =evdev_connect”.
如何创建设备节点
static int __init input_init(void)
{
int err;
err = class_regi