Chinaunix首页 | 论坛 | 博客
  • 博客访问: 276590
  • 博文数量: 74
  • 博客积分: 1336
  • 博客等级: 中尉
  • 技术积分: 1057
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-02 09:33
文章分类

全部博文(74)

文章存档

2016年(6)

2015年(4)

2014年(20)

2013年(8)

2012年(16)

2010年(9)

2009年(11)

我的朋友

分类: LINUX

2014-08-15 15:24:19

14.4

Linux内核下的drivers/input/keyboard/gpio_keys.c实现了一个体系结构无关的GPIO按键驱动,使用此按键驱动,只需在arch/arm/mach-s5pv210/mach-smdkc110.c中定义相关的数据即可。驱动的实现非常简单,但是适合于实现独立式按键驱动,且按键所接端口为中断引脚,如本书硬件平台矩阵按键对应的EINT0,EINT2,EINT11,EINT19中断对应的引脚。如果是矩阵按键,相应代码的改动较大,不提倡使用。

在S5PV210开发平台上,使用GPG3,GPG11,GPF0,GPF2实现了DOWN、ENTER、HOME、POWER四个按键,该法实现驱动程序首先在mach-smdkc110.c头文件位置键入以下头文件:

#include

#include

#include //S5PV210各个端口定义

然后在mach-smdkc110.c中键入按键的定义信息:

static struct gpio_keys_button S5PV210_buttons [ ] = {

{

.gpio = S5PV210_GPH2(0),

.code = KEY_DOWN,

.desc = "Down" ,

.active_low = 1,

},

{

.gpio = S5PV210_GPH2(1),

.code = KEY_ENTER,

.desc = "Enter " ,

.active_low = 1,

},

{

.gpio = S5PV210_GPH2(2),

.code = KEY_HOME,

.desc = "Home" ,

.active_low = 1,

},

{

.gpio = S5PV210_GPH2(3),

.code = KEY_POWER,

.desc = "Power " ,

.active_low = 1,

},

};

static struct gpio_keys_platform_data S5PV210_button_data = {

.buttons = S5PV210_buttons,

.nbuttons = ARRAY_SIZE(S5PV210_buttons) ,

};

static struct platform_device S5PV210_device_button = {

.name = "gpio-keys",

.id =-1,

.dev = {

.platform_data = &S5PV210_button_data,

}

};

其中

n gpio是连接按键的IO管脚。

n code是这个按键上报的键值, 在input.h中定义。

n desc是按键的name。

n active_low为1是表示低电平触发。

将“&S5PV210_device_button,”语句填入 struct platform_device *S5PV210_devices[]数组,作为该数组的一个成员。

static struct platform_device *smdk2410_devices[] __initdata = {

&s3c_device_usb,

&s3c_device_lcd,

&s3c_device_wdt,

&s3c_device_i2c,

&s3c_device_iis,

&s3c_device_rtc,

&s3c_device_ts,

&S5PV210_device_button,};

编译内核时选择:

Device Drivers >

Input device support >

[*] Keyboards

<*> GPIO Buttons

如果要修改按键对应的GPIO和键值,只需要简单的修改S5PV210_buttons[]数组中的内容。

这样在内核的启动过程中,会发现如下的提示:

input: gpio-keys as /class/input/input0

同时在文件系统dev目录下有event0设备节点,event1是触摸屏节点,对gpio-keys按键的访问可以通过event0来完成。

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char **argv)

{

int key_state;

int fd;

int ret;

int code;

struct input_event buf;

fd = open("/dev/event0", O_RDONLY);

if (fd < 0)

{

printf("Open gpio-keys failed.\n");

return -1;

}

else

{

printf("Open gpio-keys success.\n");

}

while(1)

{

ret = read(fd,&buf,sizeof(struct input_event));

if(ret <= 0)

{

printf("read fail!\n");

return -1;

}

code = buf.code;

key_state = buf.value;

switch(code)

{

case KEY_DOWN:

code = '1';

break;

case KEY_ENTER:

code = '2';

break;

case KEY_HOME:

code = '3';

break;

case KEY_POWER:

code = '4';

break;

default:

code = 0;

break;

}

if(code!=0)

{

printf("Key_%c state= %d.\n",code,key_state);

}

}

close(fd);

printf("Key test finished.\n");

return 0;

}

阅读(890) | 评论(0) | 转发(0) |
0

上一篇:引言

下一篇:启动参数备份

给主人留下些什么吧!~~