Android4.0.3 Button(Power,Home,Back) 驱动

  • 平台信息:

硬件: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));

最后重新编译内核,对应的按键功能就添加进去了。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值