科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Linux Keyboard子系统分装和优化

Linux Keyboard子系统分装和优化

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Linux下的Keyboard子系统,按键驱动属于input子系统,源码路径在/driver/input/keyboard下,配置内核make menuconfig时,需要选中这一项,最简单的按键驱动就是一个中断处理函数,当用户有按键,通过read函数向应用层上报按键信息。

来源:中国IT实验室 2013年2月20日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

ZDNet至顶网软件频道 最简单的按键驱动就是一个中断处理函数,当用户有按键,通过read函数向应用层上报按键信息。而我们这里讲的keyboard子系统,主要是对按键进行了分装和优化,这里我们主要讲的是可以实现跨平台的按键驱动。不管你是使用三星的平台,还是Atmel的平台,你只要知道如何在你的BSP中添加平台数据,并且知道如何在应用程序中使用这个驱动,那么你就不用因为新的平台而再次编写按键驱动了。

按键驱动属于input子系统,源码路径在/driver/input/keyboard下,我们的跨平台按键驱动文件是/driver/input/keyboard/Gpio_keys.c

查看/driver/input/keyboard/Makefile

obj-$(CONFIG_KEYBOARD_GPIO) += gpio_keys.o

查看/driver/input/keyboard//Konfig

config KEYBOARD_GPIO

tristate "GPIO Buttons"

depends on GENERIC_GPIO

所以配置内核make menuconfig时,需要选中这一项。

现在先来看如何移植,比如我们现在要给mini2440开发板上的key1和key2编写按键驱动,根据资料知道,key1用的是GPG0端口,key2用的是GPG3端口。下面就看移植代码了,在mach-mini2440.c这个mini2440开发板的BSP中添加如下代码

static struct gpio_keys_button s3c_buttons[] = {

{

.code = KEY_LEFT, //键值,驱动人员可自己设定,但用户必须知道

.gpio = S3C2410_GPG(0),

.active_low = 1, //下降沿触发方式

.desc = "key1",

},

{

.code = KEY_RIGHT,

.gpio = S3C2410_GPG(3),

.active_low = 1,

.desc = "key2",

},

};

static struct gpio_keys_platform_data s3c_button_data = {

.buttons = s3c_buttons,

.nbuttons = ARRAY_SIZE(s3c_buttons),

};

static struct platform_device s3c_button_device = {

.name = "gpio-keys",

.id = -1,

.num_resources = 0,

.dev = {

.platform_data = &s3c_button_data,

}

};

然后把这个s3c_button_device加入到mini2440_devices数组

static struct platform_device *mini2440_devices[] __initdata = {

……

&s3c_button_device, //添加

};

最后添加头文件

#include <linux/gpio.h>

#include <linux/gpio_keys.h>

这样配置完后,进行make zImage生成zImage内核镜像。

下面大致说说/driver/input/keyboard/Gpio_keys.c

static struct platform_driver gpio_keys_device_driver = {

.probe = gpio_keys_probe, //探测

.remove = __devexit_p(gpio_keys_remove),

.driver = {

.name = "gpio-keys", //驱动名

.owner = THIS_MODULE,

#ifdef CONFIG_PM

.pm = &gpio_keys_pm_ops, //电源管理

#endif

}

};

static int __init gpio_keys_init(void)

{

return platform_driver_register(&gpio_keys_device_driver); //平台驱动注册

}

关于这个Gpio_keys.c的其他代码在此就不看了,总结下,probe函数主要是申请端口,然后注册中断,并将其放在input子系统中。当用户有按键时,触发按键中断服务程序,进行一些简单数据处理后交给底半部,由工作队列完成向input子系统上报键值的操作,同时设计了定时器,目的是为了能更加精确报告按键事件。我在学习input子系统的时候,就是拿了一个按键写入了input子系统中,也用到了工作队列和定时器,跟Gpio_keys.c代码原理类似,如果需要可以参考。

Keyboard驱动测试

用户可以先通过cat /sys/class/input/input0/name判断input设备名

然后应用层通过访问/dev/input/event0来读取按键,接着利用访问input设备格式判断键值区分不同的按键是否被按下。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章