Linux GPIO 按键驱动
1. 前言
限于作者能力水平,本文可能存在的谬误,因此而给读者带来的损失,作者不做任何承诺。
2. 背景
在系统 S5P4418 + Linux 3.4.y 下,硬件有一个GPIO按键,客户要求按键上报按键码KEY_REWIND。
按键连接到GPIOB8,按下按键GPIO变高,放开按键GPIO为低。
我们需要一个驱动来驱动该按键,经过一番研究,可以利用内核自带的GPIO按键驱动来进行适配。
3. GPIO按键驱动适配
(1) 配置GPIOB8为GPIO功能。
修改文件arch/arm/plat-s5p4418/nanopi2/include/cfg_gpio.h
#define PAD_GPIOB8 (PAD_MODE_IN | PAD_FUNC_ALT0 |
PAD_LEVEL_LOW | PAD_PULL_OFF |
PAD_STRENGTH_0)
(2) 配置GPIOB8按键码为KEY_REWIND。
修改文件arch/arm/plat-s5p4418/nanopi2/include/cfg_main.h
/*------------------------------------------------------------------------------
* Keypad
*/
#define CFG_KEYPAD_KEY_BUTTON { PAD_GPIO_B + 8, PAD_GPIO_ALV + 0 }
#define CFG_KEYPAD_KEY_CODE { KEY_REWIND, KEY_POWER }
#define CFG_KEYPAD_REPEAT CFALSE /* 0: Repeat Off 1 : Repeat On */
(3) GPIO按键驱动设备对象定义。
修改文件arch/arm/mach-s5p4418/include/mach/devices.h
#define DEV_NAME_KEYPAD "nxp-keypad"
修改文件arch/arm/plat-s5p4418/nanopi2/device.c
/*------------------------------------------------------------------------------
* Keypad platform device
*/
#if defined(CONFIG_KEYBOARD_NXP_KEY) || defined(CONFIG_KEYBOARD_NXP_KEY_MODULE)
#include <linux/input.h>
static unsigned int button_gpio[] = CFG_KEYPAD_KEY_BUTTON;
static unsigned int button_code[] = CFG_KEYPAD_KEY_CODE;
struct nxp_key_plat_data key_plat_data = {
.bt_count = ARRAY_SIZE(button_gpio),
.bt_io = button_gpio, /* 按键GPIO */
.bt_code = button_code, /* 按键码 */
.bt_repeat = CFG_KEYPAD_REPEAT,
};
static struct platform_device key_plat_device = {
.name = DEV_NAME_KEYPAD,
.id = -1,
.dev = {
.platform_data = &key_plat_data
},
};
#endif /* CONFIG_KEYBOARD_NXP_KEY || CONFIG_KEYBOARD_NXP_KEY_MODULE */
(4) GPIO按键驱动对象定义。
修改文件drivers/input/keyboard/nxp_io_key.c
static struct platform_driver key_plat_driver = {
.driver = {
.owner = THIS_MODULE,
.name = DEV_NAME_KEYPAD,
},
.probe = nxp_key_probe,
.remove = nxp_key_remove,
.suspend = nxp_key_suspend,
.resume = nxp_key_resume,
};
正是宏DEV_NAME_KEYPAD 将GPIO按键设备key_plat_device和GPIO按键驱动key_plat_driver联系起来。
当然,内核配置项 CONFIG_KEYBOARD_NXP_KEY 要打开。

浙公网安备 33010602011771号