设为首页 加入收藏

TOP

嵌入式Linux—输入子系统(一)
2023-07-23 13:40:41 】 浏览:58
Tags:Linux

输入系统

常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等等,用户通过这些输入设备与Linux系统进行数据交换。

内核中怎样表示一个输入设备

// include/linux/input.h
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)];
	
	.......
	
	};

查看所有的输入设备:

ls /dev/input/* -l

查看输入设备的信息:

cat /proc/bus/input/devices

得到如下信息:

[root@imx6ull:~]# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0000 Product=0000 Version=0000
N: Name="20cc000.snvs:snvs-powerkey"
P: Phys=snvs-pwrkey/input0
S: Sysfs=/devices/soc0/soc/2000000.aips-bus/20cc000.snvs/20cc000.snvs:snvs-powerkey/input/input0
U: Uniq=
H: Handlers=kbd event0 evbug
B: PROP=0
B: EV=3
B: KEY=100000 0 0 0

I: Bus=0018 Vendor=dead Product=beef Version=28bb  //设备ID(定义在input.h的struct input_id结构体)
N: Name="goodix-ts"      //名称
P: Phys=input/ts         //物理地址
S: Sysfs=/devices/virtual/input/input1  //sys系统地址
U: Uniq=          //标识号(无)
H: Handlers=event1 evbug
B: PROP=2        //设备属性
B: EV=b          //支持何种输入事件 
B: KEY=1c00 0 0 0 0 0 0 0 0 0 0   //设备具有的键
B: ABS=6e18000 0

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio-keys"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/soc0/gpio-keys/input/input2
U: Uniq=
H: Handlers=kbd event2 evbug
B: PROP=0
B: EV=3
B: KEY=c

APP可以获得什么数据

// include/linux/input.h
struct input_value {
	__u16 type;   //当前数据的事件类型
	__u16 code;   //当前事件类型下的哪一个事件
	__s32 value;  //
};

Type的内容:

// include/uapi/linux/input-event-codes.h
/*
 * Event types
 */

#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
#define EV_CNT			(EV_MAX+1)

code的内容(以EV_KEY举例)

// include/uapi/linux/input-event-codes.h
#define KEY_RESERVED		0
#define KEY_ESC			1
#define KEY_1			2
#define KEY_2			3
#define KEY_3			4
#define KEY_4			5
#define KEY_5			6
#define KEY_6			7
#define KEY_7			8
#define KEY_8			9
#define KEY_9			10
#define KEY_0			11

获取输入设备信息实例

两个ioctl的request参数说明(input.h)
request 说明
EVIOCGID 返回输入设备ID
EVIOCGBIT(ev,len) 获取输入设备支持的事件类型列表

ev值的说明:ev参数表示要获取的事件类型,它是一个整数值

  • 当ev=0,表示要获取输入设备支持的所有事件类型列表,包括键盘事件、鼠标事件、相对事件、绝对事件、事件同步、杂项事件等。
  • 当ev=1,表示要获取输入设备支持的键盘事件类型列表。
  • 当ev=2,表示要获取输入设备支持的相对事件类型列表。

EVIOCGBIT的iotcl调用说明:必须使用

len = ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), evbit);    
//len是evbit的实际读取大小,如果单独使用sizeof(evbit)得到len,将发生段错误
源码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <linux/input.h>

/* 用法:
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇SRE:如何提高报警有效性? 下一篇Linux的文件系统分层结构(FSH)..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目