利用linux 内核所提供的input子系统编写字符设备驱动的步骤

时间:2023-01-29 17:56:07



利用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();