ARM40-A5应用程序——key

ARM40-A5应用程序——key

2019.3.8
版权声明:本文为博主原创文章,允许转载。

  Linux输入设备总类繁杂,常见的包括有按键、键盘、触摸屏、鼠标、摇杆等等,他们本身就是字符设备,而Linux内核将这些设备的共同性抽象出来,简化驱动开发建立了一个input子系统。
  本文结合ARM40-A5介绍其中的gpio key,即GPIO按键。

一、gpio key电路

  下图是ARM40-A5上典型的gpio key电路。J1断开,则PD8为高电平(LED1不亮);J1短接,则PD8为低电平(LED1亮)。
在这里插入图片描述

二、建立<键值, gpio>的联系

  首先要建立gpio与键值的联系,命令为:

echo 0x105 104 > /sys/devices/gpio_keys/new_device		#键值0x105, gpio为PD8

  看看结果:

root@ARM40:/# cat /proc/bus/input/devices
I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="TSC2007 Touchscreen"
P: Phys=2-0048/input0
S: Sysfs=/devices/ahb/ahb:apb/f801c000.i2c/i2c-2/2-0048/input/input0
U: Uniq=
H: Handlers=event0 
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio_keys"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/gpio_keys/input/input1
U: Uniq=
H: Handlers=event1 
B: PROP=0
B: EV=3
B: KEY=20 0 0 0 0 0 0 0 0
root@ARM40:/# cat /sys/devices/gpio_keys/keys
261

  在shell中测试:

root@ARM40:/# hexdump /dev/input/event1
0000000 8a69 4598 73dd 0008 0001 0105 0001 0000			#J1短接,PD8为低电平
0000010 8a69 4598 73dd 0008 0000 0000 0000 0000
0000020 8a69 4598 4901 000b 0001 0105 0000 0000			#J1断开,PD8为高电平
0000030 8a69 4598 4901 000b 0000 0000 0000 0000

三、上电自动建立<键值, gpio>

  若希望系统上电后,自动建立<键值, gpio>,需要文件:

/etc/init.d/S02keylike
    并且:
chmod 755 /etc/init.d/S02keylike

  系统启动后会运行/etc/init.d/S02keylike
  /etc/init.d/S02keylike的内容示例:

#!/bin/sh
set -e
# User program
#keycode = 0x105, gpio = PD8 = 104
echo 0x105 104 > /sys/devices/gpio_keys/new_device
#keycode = 0x101, gpio = PD16 = 112
echo 0x101 112 > /sys/devices/gpio_keys/new_device

四、C语言操作keylike

  参考本文末尾的“参考文章”。

五、常见问题

  ① 重复echo 0x105 104 > /sys/devices/gpio_keys/new_device会报错:

root@ARM40:/# echo 0x105 104 > /sys/devices/gpio_keys/new_device
gpio-keys gpio_keys: Failed to request GPIO 104, error -16
sh: write error: Device or resource busy。

  ② 若要撤销<键值, gpio>,重启系统即可。
  ③ gpio与gpionum的对应关系为:

· PA0-PA31  对应的gpio_num为  (0-31)
· PB0-PB31  对应的gpio_num为  (0-31) + 32
· PC0-PC31  对应的gpio_num为  (0-31) + 64
· PD0-PD31  对应的gpio_num为  (0-31) + 96
· PE0-PE31  对应的gpio_num为  (0-31) + 128

  ④ 内核固件不正确:

root@ARM40:/# echo 0x105 104 > /sys/devices/gpio_keys/new_device
-/bin/sh: can't create /sys/devices/gpio_keys/new_device: nonexistent directory

  ⑤ 与已经使用的gpio冲突:

root@ARM40:/# echo 0x101 17 > /sys/devices/gpio_keys/new_device
genirq: Flags mismatch irq 75. 00000083 (gpio_keys) vs. 00002000 (tsc2007)
gpio-keys gpio_keys: Unable to claim irq 75; error -16
sh: write error: Device or resource busy

  ⑥ 内核固件默认的硬件设计是“按下按键,gpio收到低电平”,示例:

root@ARM40:/# hexdump /dev/input/event1
0000000 8a69 4598 73dd 0008 0001 0105 0001 0000			#PD8为低电平
0000010 8a69 4598 73dd 0008 0000 0000 0000 0000
0000020 8a69 4598 4901 000b 0001 0105 0000 0000			#PD8为高电平
0000030 8a69 4598 4901 000b 0000 0000 0000 0000

  ⑦ 最多允许使用31个gpio key,超出了允许的按键数量会报错:

root@ARM40:/# echo 0x101 32 > /sys/devices/gpio_keys/new_device
vkey: exceed the maximum permitted keys
sh: write error: Invalid argument

  ⑧ 键值keycode列表见附录。
  

参考文章:

ARM40-A5应用程序——ledlike
https://blog.csdn.net/vonchn/article/details/88073894
linux下获取按键响应事件
https://www.cnblogs.com/yangwindsor/articles/3454955.html
Linux C中读取/dev/input/event设备来判断键盘按键是否按下
https://blog.csdn.net/zgrjkflmkyc/article/details/39499521
input子系统event数据解析
https://blog.csdn.net/luckywang1103/article/details/50458043
event-codes.txt
https://www.kernel.org/doc/Documentation/input/event-codes.txt
荟聚计划:共商 共建 共享 Grant

内核源码的 include/uapi/linux/input.h 文件中定义了keycode列表:

/*
 * Keys and buttons
 *
 * Most of the keys/buttons are modeled after USB HUT 1.12
 * (see http://www.usb.org/developers/hidpage).
 * Abbreviations in the comments:
 * AC - Application Control
 * AL - Application Launch Button
 * SC - System Control
 */

#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
#define KEY_MINUS		12
#define KEY_EQUAL		13
#define KEY_BACKSPACE		14
#define KEY_TAB			15
#define KEY_Q			16
#define KEY_W			17
#define KEY_E			18
#define KEY_R			19
#define KEY_T			20
#define KEY_Y			21
#define KEY_U			22
#define KEY_I			23
#define KEY_O			24
#define KEY_P			25
#define KEY_LEFTBRACE		26
#define KEY_RIGHTBRACE		27
#define KEY_ENTER			28
#define KEY_LEFTCTRL		29
#define KEY_A			30
#define KEY_S			31
#define KEY_D			32
#define KEY_F			33
#define KEY_G			34
#define KEY_H			35
#define KEY_J			36
#define KEY_K			37
#define KEY_L			38
#define KEY_SEMICOLON		39
#define KEY_APOSTROPHE		40
#define KEY_GRAVE			41
#define KEY_LEFTSHIFT		42
#define KEY_BACKSLASH		43
#define KEY_Z			44
#define KEY_X			45
#define KEY_C			46
#define KEY_V			47
#define KEY_B			48
#define KEY_N			49
#define KEY_M			50
#define KEY_COMMA		51
#define KEY_DOT			52
#define KEY_SLASH		53
#define KEY_RIGHTSHIFT		54
#define KEY_KPASTERISK		55
#define KEY_LEFTALT			56
#define KEY_SPACE			57
#define KEY_CAPSLOCK		58
#define KEY_F1			59
#define KEY_F2			60
#define KEY_F3			61
#define KEY_F4			62
#define KEY_F5			63
#define KEY_F6			64
#define KEY_F7			65
#define KEY_F8			66
#define KEY_F9			67
#define KEY_F10			68
#define KEY_NUMLOCK		69
#define KEY_SCROLLLOCK		70
#define KEY_KP7			71
#define KEY_KP8			72
#define KEY_KP9			73
#define KEY_KPMINUS		74
#define KEY_KP4			75
#define KEY_KP5			76
#define KEY_KP6			77
#define KEY_KPPLUS		78
#define KEY_KP1			79
#define KEY_KP2			80
#define KEY_KP3			81
#define KEY_KP0			82
#define KEY_KPDOT		83

#define KEY_ZENKAKUHANKAKU	85
#define KEY_102ND			86
#define KEY_F11				87
#define KEY_F12				88
#define KEY_RO				89
#define KEY_KATAKANA		90
#define KEY_HIRAGANA		91
#define KEY_HENKAN			92
#define KEY_KATAKANAHIRAGANA	93
#define KEY_MUHENKAN		94
#define KEY_KPJPCOMMA		95
#define KEY_KPENTER			96
#define KEY_RIGHTCTRL		97
#define KEY_KPSLASH			98
#define KEY_SYSRQ			99
#define KEY_RIGHTALT		100
#define KEY_LINEFEED		101
#define KEY_HOME		102
#define KEY_UP			103
#define KEY_PAGEUP		104
#define KEY_LEFT		105
#define KEY_RIGHT		106
#define KEY_END			107
#define KEY_DOWN		108
#define KEY_PAGEDOWN		109
#define KEY_INSERT			110
#define KEY_DELETE			111
#define KEY_MACRO			112
#define KEY_MUTE			113
#define KEY_VOLUMEDOWN		114
#define KEY_VOLUMEUP		115
#define KEY_POWER			116	/* SC System Power Down */
#define KEY_KPEQUAL			117
#define KEY_KPPLUSMINUS		118
#define KEY_PAUSE			119
#define KEY_SCALE			120	/* AL Compiz Scale (Expose) */

#define KEY_KPCOMMA		121
#define KEY_HANGEUL		122
#define KEY_HANGUEL		KEY_HANGEUL
#define KEY_HANJA		123
#define KEY_YEN			124
#define KEY_LEFTMETA		125
#define KEY_RIGHTMETA		126
#define KEY_COMPOSE			127

#define KEY_STOP		128	/* AC Stop */
#define KEY_AGAIN		129
#define KEY_PROPS		130	/* AC Properties */
#define KEY_UNDO		131	/* AC Undo */
#define KEY_FRONT		132
#define KEY_COPY		133	/* AC Copy */
#define KEY_OPEN		134	/* AC Open */
#define KEY_PASTE		135	/* AC Paste */
#define KEY_FIND		136	/* AC Search */
#define KEY_CUT			137	/* AC Cut */
#define KEY_HELP		138	/* AL Integrated Help Center */
#define KEY_MENU		139	/* Menu (show menu) */
#define KEY_CALC		140	/* AL Calculator */
#define KEY_SETUP		141
#define KEY_SLEEP		142	/* SC System Sleep */
#define KEY_WAKEUP		143	/* System Wake Up */
#define KEY_FILE		144	/* AL Local Machine Browser */
#define KEY_SENDFILE		145
#define KEY_DELETEFILE		146
#define KEY_XFER		147
#define KEY_PROG1		148
#define KEY_PROG2		149
#define KEY_WWW			150	/* AL Internet Browser */
#define KEY_MSDOS		151
#define KEY_COFFEE		152	/* AL Terminal Lock/Screensaver */
#define KEY_SCREENLOCK		KEY_COFFEE
#define KEY_DIRECTION		153
#define KEY_CYCLEWINDOWS	154
#define KEY_MAIL			155
#define KEY_BOOKMARKS		156	/* AC Bookmarks */
#define KEY_COMPUTER		157
#define KEY_BACK		158	/* AC Back */
#define KEY_FORWARD		159	/* AC Forward */
#define KEY_CLOSECD		160
#define KEY_EJECTCD		161
#define KEY_EJECTCLOSECD	162
#define KEY_NEXTSONG		163
#define KEY_PLAYPAUSE		164
#define KEY_PREVIOUSSONG	165
#define KEY_STOPCD		166
#define KEY_RECORD		167
#define KEY_REWIND		168
#define KEY_PHONE		169	/* Media Select Telephone */
#define KEY_ISO			170
#define KEY_CONFIG		171	/* AL Consumer Control Configuration */
#define KEY_HOMEPAGE		172	/* AC Home */
#define KEY_REFRESH			173	/* AC Refresh */
#define KEY_EXIT			174	/* AC Exit */
#define KEY_MOVE			175
#define KEY_EDIT			176
#define KEY_SCROLLUP		177
#define KEY_SCROLLDOWN		178
#define KEY_KPLEFTPAREN		179
#define KEY_KPRIGHTPAREN	180
#define KEY_NEW				181	/* AC New */
#define KEY_REDO			182	/* AC Redo/Repeat */

#define KEY_F13			183
#define KEY_F14			184
#define KEY_F15			185
#define KEY_F16			186
#define KEY_F17			187
#define KEY_F18			188
#define KEY_F19			189
#define KEY_F20			190
#define KEY_F21			191
#define KEY_F22			192
#define KEY_F23			193
#define KEY_F24			194

#define KEY_PLAYCD		200
#define KEY_PAUSECD		201
#define KEY_PROG3		202
#define KEY_PROG4		203
#define KEY_DASHBOARD		204	/* AL Dashboard */
#define KEY_SUSPEND			205
#define KEY_CLOSE			206	/* AC Close */
#define KEY_PLAY			207
#define KEY_FASTFORWARD		208
#define KEY_BASSBOOST		209
#define KEY_PRINT			210	/* AC Print */
#define KEY_HP				211
#define KEY_CAMERA			212
#define KEY_SOUND			213
#define KEY_QUESTION		214
#define KEY_EMAIL			215
#define KEY_CHAT			216
#define KEY_SEARCH			217
#define KEY_CONNECT			218
#define KEY_FINANCE			219	/* AL Checkbook/Finance */
#define KEY_SPORT			220
#define KEY_SHOP			221
#define KEY_ALTERASE		222
#define KEY_CANCEL			223	/* AC Cancel */
#define KEY_BRIGHTNESSDOWN	224
#define KEY_BRIGHTNESSUP	225
#define KEY_MEDIA			226

#define KEY_SWITCHVIDEOMODE	227	/* Cycle between available video
					   				outputs (Monitor/LCD/TV-out/etc) */
#define KEY_KBDILLUMTOGGLE	228
#define KEY_KBDILLUMDOWN	229
#define KEY_KBDILLUMUP		230

#define KEY_SEND			231	/* AC Send */
#define KEY_REPLY			232	/* AC Reply */
#define KEY_FORWARDMAIL		233	/* AC Forward Msg */
#define KEY_SAVE			234	/* AC Save */
#define KEY_DOCUMENTS		235

#define KEY_BATTERY			236

#define KEY_BLUETOOTH		237
#define KEY_WLAN			238
#define KEY_UWB				239

#define KEY_UNKNOWN			240

#define KEY_VIDEO_NEXT		241	/* drive next video source */
#define KEY_VIDEO_PREV		242	/* drive previous video source */
#define KEY_BRIGHTNESS_CYCLE	243		/* brightness up, after max is min */
#define KEY_BRIGHTNESS_AUTO		244		/* Set Auto Brightness: manual
					  				brightness control is off,
					  				rely on ambient */
#define KEY_BRIGHTNESS_ZERO	KEY_BRIGHTNESS_AUTO
#define KEY_DISPLAY_OFF		245	/* display device to off state */

#define KEY_WWAN		246	/* Wireless WAN (LTE, UMTS, GSM, etc.) */
#define KEY_WIMAX		KEY_WWAN
#define KEY_RFKILL		247	/* Key that controls all radios */

#define KEY_MICMUTE		248	/* Mute / unmute the microphone */

/* Code 255 is reserved for special needs of AT keyboard driver */
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值