一、概述
1. input子系统是什么?
input子系统是linux用来管理不同类型、不同原理、不同的输入信息的众多输入设备的系统
这边要注意,input子系统只支持字符流的输入设备,并不支持如lcm、camera等非字符流的设备
input子系统支持的常见设备有:键盘、鼠标、触摸屏、游戏手柄、sensor、按键
linux中有很多个子系统:平台总线,input子系统,i2c子系统等。为了使代码复用,且简洁统一,均分成三层
input子系统分层:
input handler层
input 核心层
input driver层
2. input子系统有什么作用?
假设没有input子系统,输入设备要传递数据到应用层,驱动工程师必须实现以下操作步骤:
采用input子系统后,步骤大大化简,驱动工程师仅需要实现上面的第7步,其他步骤都由input子系统完成
1. input子系统是什么?
input子系统是linux用来管理不同类型、不同原理、不同的输入信息的众多输入设备的系统
这边要注意,input子系统只支持字符流的输入设备,并不支持如lcm、camera等非字符流的设备
input子系统支持的常见设备有:键盘、鼠标、触摸屏、游戏手柄、sensor、按键
linux中有很多个子系统:平台总线,input子系统,i2c子系统等。为了使代码复用,且简洁统一,均分成三层
input子系统分层:
input handler层
input 核心层
input driver层
2. input子系统有什么作用?
假设没有input子系统,输入设备要传递数据到应用层,驱动工程师必须实现以下操作步骤:
1. register_chrdev_region() // 申请设备号
2. cdev_init() // malloc一个字符设备cdev,初始化,并实现fops
3. cdev_add(); // 注册一个cdev
4. class_create(); // 创建类
5. device_create(); // 创建设备节点
6. request_irq(); // 硬件初始化,并注册中断(并非所有设备都需要中断)
7. init_waitqueue_head(&mywq_head); // 实现阻塞
8. copy_to_user() // 在中断处理函数中,将数据
以上有一些步骤是通用的,input子系统将通用步骤提取出来,并统一实现
采用input子系统后,步骤大大化简,驱动工程师仅需要实现上面的第7步,其他步骤都由input子系统完成
二、input子系统中主要数据结构
struct input_event {
struct timeval time; // 时间戳
__u16 type; // 数据类型 如EV_ABS
__u16 code; // 具体数据 如ABS_MT_POSITION_X
__s32 value; // 值 如tp的横坐标
};
struct input_dev {
const char *name; // sysfs中给用户看的信息
const char *phys;
const char *uniq;
struct input_id id;
//evbit实际是一个位表,描述输入设备能够产生什么类型数据
unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; // EV_KEY,EV_ABS, EV_REL
//表示能够产生哪种按键
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];//KEY_POWER.. 能够表示768bit,直接用24个long来表示
// KEY_CNT == 768 BITS_TO_LONGS== nr/32 = 768/32==24
//表示能够产生哪种相对坐标数据
unsigned long relbit[BITS_TO_LONGS(REL_CNT)];// REL_X
//表示能够产生哪种绝对坐标数据
unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; //ABS_X
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)];
struct device dev; // 继承device对象
struct list_head h_list;
struct list_head node; //表示节点
}