0
点赞
收藏
分享

微信扫一扫

linux input子系统

unadlib 2022-04-18 阅读 209

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是事件值。
在这里插入图片描述

举报

相关推荐

0 条评论