- 平台信息:
硬件:S5PV210
系统:Android4.0.3
kernel:Linux 3.0.8
- 目的:
简要介绍android中keys驱动,在V210平台上添加Button(Power,Reset,Home)等功能.
- kernel驱动中的keys驱动简介:
android的keys相关的驱动已经很完善,有两种:
1. 用于多按键的矩阵按键驱动(用的是三星的,不同的平台会有点不同)
samsung_android_kernel_3.0/drivers/input/keyboard/samsung-keypad.c
2. 用于少按键的按键驱动,这个比较通用,基本每个平台都差不多一样:
samsung_android_kernel_3.0/drivers/input/keyboard/gpio_keys.c
这两种按键驱动都是很成熟,kernel部分的驱动,android部分的HAL,jni,framework等部分都已经完成。开发人员可以根据自己的需求选用。
kernel和android都有一套成熟的键值,功能大部分已经实现,而且kernel和android的键值是在samsung_android_kernel_3.0/include/linux/input.h中。
- 在当前平台下实现Power,Reset,Home功能
因为使用的按键不是很多,所以采用的是第二种驱动(gpio_keys),各个不同的平台实现的具体细节会有所不同,但思路基本是一样的。步骤如下:
1. 先把gpio_keys注册进系统总线:
驱动已经做好,只需要在配置中添加:make menuconfig
Device Drivers --->Input device support ---> Keyboards --->GPIO Buttons
添加之后驱动通过module_init函数,在总线上注册名为gpio-keys的驱动,正常情况下这时候gpio-keys就在kernel驱动总线里面了。
2. 把按键信息注册进kernel,提交给gpio-keys驱动:
一般都是在各自的平台初始化函数中添加:arch/arm/mach-s5pv210/mach-smdkv210.c
/*Button Power,Reset,V+,V-*/
static struct gpio_keys_button mpad_gpio_keys_table[] = {
{
// nPBSTA -> GPH0[1]
.code = KEY_POWER,
.gpio = S5PV210_GPH0(1),
.desc = "gpio-keys: KEY_POWER",
.type = EV_KEY,
.active_low = 1,
.wakeup = 1,
.debounce_interval = 1,
},
{
// HOME_KEY -> GPH0[7]
.code = KEY_ESC,
.gpio = S5PV210_GPH0(7),
.desc = "gpio-keys: KEY_ESC",
.type = EV_KEY,
.active_low = 1,
.wakeup = 1,
.debounce_interval = 1,
},
{
// KEY+ -> GPH1[3]
.code = KEY_VOLUMEUP,
.gpio = S5PV210_GPH1(3),
.desc = "gpio-keys: KEY_VOLUMEUP",
.type = EV_KEY,
.active_low = 1,
.wakeup = 1,
.debounce_interval = 1,
},
{
// KEY- -> GPH1[4]
.code = KEY_VOLUMEDOWN,
.gpio = S5PV210_GPH1(4),
.desc = "gpio-keys: KEY_VOLUMEDOWN",
.type = EV_KEY,
.active_low = 1,
.wakeup = 1,
.debounce_interval = 1,
},
};
static struct gpio_keys_platform_data mpad_gpio_keys_data = {
.buttons = mpad_gpio_keys_table,
.nbuttons = ARRAY_SIZE(mpad_gpio_keys_table),
};
static struct platform_device mpad_device_gpiokeys = {
.name = "gpio-keys",/*注册给gpio-keys驱动,这必须和驱动名保持一致*/
.dev = {
.platform_data = &mpad_gpio_keys_data,
},
};
// Add End
三星建了一个信息表
static struct platform_device *smdkv210_devices[] __initdata = {
&s3c_device_adc,
&s3c_device_cfcon,
&s3c_device_fb,
&s3c_device_hsmmc0,
&s3c_device_hsmmc1,
&s3c_device_hsmmc2,
/*中间跳过很多*/
&mpad_device_gpiokeys,/*我们加入的按键信息*/
};
在smdkv210_machine_init函数中会把上面这个表内所有的信息注册进kernel
platform_add_devices(smdkv210_devices, ARRAY_SIZE(smdkv210_devices));
最后重新编译内核,对应的按键功能就添加进去了。