实现键盘驱动,让开发板的4个按键代表键盘中的L、S、空格键、回车键
1.先来介绍以下几个结构体使用和函数,下面代码中会用到
struct input_dev { void *private; const char *name; //设备名字 const char *phys; //文件路径,比如 input/buttons const char *uniq; struct input_id id; unsigned long evbit[NBITS(EV_MAX)]; //表示支持哪类事件,常用有以下几种事件(可以多选) //EV_SYN 同步事件,当使用input_event()函数后,就要使用这个上报个同步事件 //EV_KEY 键盘事件 //EV_REL (relative)相对坐标事件,比如鼠标 //EV_ABS (absolute)绝对坐标事件,比如摇杆、触摸屏感应 //EV_MSC 其他事件,功能 //EV_LED LED灯事件 //EV_SND (sound)声音事件 //EV_REP 重复键盘按键事件 //(内部会定义一个定时器,若有键盘按键事件一直按下/松开,就重复定时,时间一到就上报事件) //EV_FF 受力事件 //EV_PWR 电源事件 //EV_FF_STATUS 受力状态事件 unsigned long keybit[NBITS(KEY_MAX)]; //存放支持的键盘按键值 //键盘变量定义在:include/linux/input.h, 比如: KEY_L(按键L) unsigned long relbit[NBITS(REL_MAX)]; //存放支持的相对坐标值 unsigned long absbit[NBITS(ABS_MAX)]; //存放支持的绝对坐标值 unsigned long mscbit[NBITS(MSC_MAX)]; //存放支持的其它事件,也就是功能 unsigned long ledbit[NBITS(LED_MAX)]; //存放支持的各种状态LED unsigned long sndbit[NBITS(SND_MAX)]; //存放支持的各种声音 unsigned long ffbit[NBITS(FF_MAX)]; //存放支持的受力设备 unsigned long swbit[NBITS(SW_MAX)]; //存放支持的开关功能 ... ...
struct input_dev *input_allocate_device(void); //向内核中申请一个input_dev设备,然后返回这个设备 input_unregister_device(struct input_dev *dev); //卸载/sys/class/input目录下的input_dev这个类设备, 一般在驱动出口函数写 input_free_device(struct input_dev *dev); //释放input_dev这个结构体, 一般在驱动出口函数写 set_bit(nr,p); //设置某个结构体成员p里面的某位等于nr,支持这个功能 /* 比如: set_bit(EV_KEY,buttons_dev->evbit); //设置input_dev结构体buttons_dev->evbit支持EV_KEY set_bit(KEY_S,buttons_dev->keybit); //设置input_dev结构体buttons_dev->keybit支持按键”S” */ void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); //上报事件 // input_dev *dev :要上报哪个input_dev驱动设备的事件 // type : 要上报哪类事件, 比如按键事件,则填入: EV_KEY // code: 对应的事件里支持的哪个变量,比如按下按键L则填入: KEY_L //value:对应的变量里的数值,比如松开按键则填入1,松开按键则填入0
input_sync(struct input_dev *dev); //同步事件通知
为什么使用了input_event()上报事件函数,就要使用这个函数?
因为input_event()函数只是个事件函数,所以需要这个input_sync()同步事件函数来通知系统,然后系统才会知道
input_sync()代码如下:
static inline void input_sync(struct input_dev *dev) { input_event(dev, EV_SYN, SYN_REPORT, 0); //就是上报同步事件,告诉内核:input_event()事件执行完毕 }