利用linux 内核所提供的input子系统编写字符设备驱动的步骤:
包含头文件:
#include <linux/input.h>
涉及核心接口体:
struct input_dev {
.........
unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; //用于描述设备所产生数据的事件分类
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; //根据事件分类设置具体编码
unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
};
//第一步:实例化输入设备对应的结构体指针
static struct input_dev *inputdev;
//第二步:为输入设备结构体指针指向的对象分配空间。
inputdev = input_allocate_device();
//第三步:设置事件分类对应的成员数组和根据事件分类设置编码数组。
可以使用如下两种方法设置:
宏:
BIT_WORD(), BIT_MASK();
利用函数来设置:
set_bit(nr, long *array);
button_dev->evbit[BIT_WORD(EV_KEY)] = BIT_MASK(EV_KEY);
button_dev->keybit[BIT_WORD(BTN_0)] = BIT_MASK(BTN_0);
//set_bit(EV_KEY, evbit); //告诉输入子系统支持哪些事件
//set_bit(BTN_0, keybit); //告诉输入子系统支持哪些按键
事件类型:EV_RST EV_ABS 等
按键类型(只有当事件类型为KEY时):BTN_0 BTN_LEFT BTN_1 等
//第四步:向内核注册输入设备
error = input_register_device( );
//反向注册: input_unregister_device();
如果注册失败,需要使用input_free_device(); 释放利用
input_allocate_device(); 分配的空间。
//第五步:在拿到数据的地方向用户态上报。
input_report_abs();
input_report_rel();
input_report_key();
input_sync(); //同步全部结束
input_mt_sync(); //一个循环的同步结束
他们都调用input_event();