linux输入设备种类繁杂,常见的包括触摸屏、键盘、鼠标、遥感等;linux将这些设备的共同特性抽象出来,linux input子系统就产生了。
对于驱动编写者而言,不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可。
一、特性、用途
用来解决输入问题,输入:驱动给应用层提供数据。
简介
input子系统也是字符设备
二、核心数据结构
三、API函数
四、操作模板
1、申请并初始化并注册input_dev:使用input_allocate_device申请;初始化input_dev的事件类型以及事件值;使用input_register_device注册
第一种设置事件值的方法:
__set_bit(EV_KEY,inputdev->evbit);//设置产生按键事件
__set_bit(EV_REP,inputdev->evbit);//重复事件
__set_bit(KEY_0,inputdev->evbit);
struct input_dev {
const char *name;
const char *phys;
const char *uniq;
struct input_id id;
unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
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)];
........
首先是name,其次看evbit
evbit表示输入事件类型,可选事件类型定义在include/uapi/linux/input.h文件中,事件类型如下:
#define EV_SYN 0x00//同步事件
#define EV_KEY 0x01//按键
#define EV_REL 0x02//鼠标
#define EV_ABS 0x03//触摸屏
#define EV_MSC 0x04
#define EV_SW 0x05//开关
#define EV_LED 0x11
#define EV_SND 0x12
#define EV_REP 0x14//重复,连按
#define EV_FF 0x15//压力
#define EV_PWR 0x16//电源
#define EV_FF_STATUS 0x17
#define EV_MAX 0x1f
比如按键对应的事件就是EC_KEY,如果要连按。还要加EV_REP。
上报输入事件,调用input_event。
五、软件架构
输入子系统是由设备驱动层(input driver)、输入核心层(input core)、输入事件处理层(input event handle)组成,具体架构如图。
(1)input设备驱动层:负责具体的硬件设备,将底层的硬件输入转化为统一的事件形式,向input核心层和汇报;
(2)input核心层:连接input设备驱动层与input事件处理层,向下提供驱动层的接口,向上提供事件处理层的接口;
(3)input事件处理层:为不同硬件类型提供了用户访问以及处理接口,将硬件驱动层传来的事件报告给用户程序。
所有的输入设备主设备号都是13,input-core通过次设备号来将输入设备进行分类。
linux输入子系统支持的数据类型:
2、数据结构
2.1、input_dev
是硬件驱动层,代表一个input设备。
2.2、input_handle
是事件处理层,代表一个事件处理器。
2.3、input_handler
属于核心层,代表一个配对的input设备与input事件处理器。
3、input_event
上报事件,实质上是调用input_handle_event进行事件处理。
dev是上报事件的设备,type是事件总类型,code是事件子类型,vlaue是事件值。