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 要打开。

posted @ 2025-04-08 09:06  JiMoKuangXiangQu  阅读(35)  评论(0)    收藏  举报