Linux 外设驱动 应用 2 KEY 按键实验

发布于:2024-10-17 ⋅ 阅读:(7) ⋅ 点赞:(0)

2 按键

2.1 按键介绍

按键是指轻触式按键开关,也称之为轻触开关。按键开关是一种电子开关,属于电子元器件类,最早出现在日本,称之为:敏感型开关,使用时以满足操作力的条件向开关操作方向施压开关功能闭合接通,当撤销压力时开关即断开,其内部结构是靠金属弹片受力变化来实现通断的。

2.2 硬件接口

平台有 4 个按键,每个按键接一个 IO 引脚,通过外部 IO 的高低来获取按键。

在这里插入图片描述

2.3 应用代码

int main(int argc,char *argv[])
{
	int keys_fd;
	char ret[2];
	struct input_event t;
	keys_fd = open(argv[1], O_RDONLY);//打开按键设备,由终端输入
	if(keys_fd<=0)//打开失败处理
	{
		printf("open %s device error!\n",argv[1]);
		return 0;
	}
	while(1)
	{
		if(read(keys_fd,&t,sizeof(t))==sizeof(t))
		 {//读取输入设备
			if(t.type==EV_KEY) //其中为按键
			if(t.value==0 || t.value==1) //按下或者抬起
			printf("key %d %s\n",t.code,(t.value)?"Pressed":"Released");//打印
		}
	}
close(keys_fd);
return 0;
}

2.4 运行代码

在Linux系统中,input_event结构体用于描述输入事件,其中包括时间、事件类型、事件码和事件值。‌ input_event结构体的定义如下:

struct input_event {
    struct timeval time;
    __u16 type;
    __u16 code;
    __s32 value;
};

time:记录事件发生的时间。
type:事件的类型,如EV_KEY表示键盘事件。
code:事件的代码,对于键盘事件,这代表按键的键值。
value:事件的数值,对于按键事件,通常0表示键释放,1表示键按下,2表示自动重复。

‌键盘键值与input_event结构体中的code字段对应。‌ 例如,ESC键、F1-F12键、方向键等都有对应的键值。这些键值在内核源码的input.h文件中定义。以下是一些常见的键盘键值:

ESC键:0x01
F1键:0x70
F2键:0x71
F3键:0x72
F4键:0x73
方向上键:0x26
方向下键:0x28
方向左键:0x25
方向右键:0x27

全部键值的值:

键名 值(十进制)
ESC 1
F1 59
F2 60
F3 61
F4 62
F5 63
F6 64
F7 65
F8 66
F9 67
F10 68
F11 87
F12 88
` ~ 41
1 ! 2
2 @ 3
3 # 4
4 $ 5
5 % 6
6 ^ 7
7 & 8
8 * 9
9 ( 10
0 ) 11

  • _ 12
  • = 13
    Backspace(退格键) 14
    Tab 15
    q Q 16
    w W 17
    e E 18
    r R 19
    t T 20
    Y y 21
    u U 22
    i I 23
    o O 24
    p P 25
    [ { 26
    ] } 27
    Enter(回车键) 28
    CapsLock 58
    a A 30
    s S 31
    d D 32
    f F 33
    g G 34
    h H 35
    j J 36
    k K 37
    l L 38
    ; : 39
    ’ " 40
    \ | 43
    Left_shift(左上档键) 42
    z Z 44
    x X 45
    c C 46
    v V 47
    b B 48
    n N 49
    m M 50
    , < 51
    . > 52
    / ? 53
    Right_shift(右上档键) 54
    Left_ctrl(左Ctrl键) 29
    左Super键(windows键) 125
    Left_alt(左alt键) 56
    space(空格键) 57
    Right_alt(右alt键) 100
    右Super键(windows键) 126
    菜单键 127
    Right_ctrl(右Ctrl键) 97
    Print Screen键 99
    ScrollLock键 70
    PauseBreak键 119
    Insert 110
    Home 102
    PageUp 104
    Delete 111
    End 107
    PageDown 109
    方向键上 103
    方向键下 108
    方向键左 105
    方向键右 106
    NumLock 69
    / (小键盘) 98
    * (小键盘) 55
    - (小键盘) 74
    + (小键盘) 78
    Enter(小键盘) 96
    . (小键盘) 83
    0 (小键盘) 82
    1 (小键盘) 79
    2 (小键盘) 80
    3 (小键盘) 81
    4 (小键盘) 75
    5 (小键盘)

76
6 (小键盘) 77
7 (小键盘) 71
8(小键盘) 72
9(小键盘) 73

2.4.1 查看 key 为第几个输入设备,找到 Name="gpio-keys"这一栏,可以看到 Handlers 为 event4

root@imx8mmevk:/mnt/SRC/exp/04_module/02_keys# cat /proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio-keys"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio-keys/input/input6
U: Uniq=
H: Handlers=kbd event4
B: PROP=0
B: EV=3
B: KEY=108000000000 10000002

2,4,2 运行程序./key /dev/input/event4

root@imx8mmevk:/mnt/SRC/exp/04_module/02_keys# ./key /dev/input/event4
key 103 Pressed
key 103 Released
key 108 Pressed
key 108 Released
key 1 Pressed
key 1 Released
key 28 Pressed
key 28 Released