请选择 进入手机版 | 继续访问电脑版
    查看: 216|回复: 2

    Linux下的Keyboard子系统

    [复制链接]

    2

    主题

    2

    帖子

    6

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    6
    基情
    4
    发表于 2016-9-18 15:32:14 | 显示全部楼层 |阅读模式
    版权所有,转载请说明转自 http://my.csdn.net/weiqing1981127

    最简单的按键驱动就是一个中断处理函数,当用户有按键,通过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开发板上的key1key2编写按键驱动,根据资料知道,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设备格式判断键值区分不同的按键是否被按下。

    如果了解Gpio_keys.c或应用层测试代码,可以查阅我的博文,链接如下
    http://blog.csdn.net/weiqing1981127/article/details/8147368
    回复

    使用道具 举报

    0

    主题

    7

    帖子

    7

    积分

    新手上路

    Rank: 1

    积分
    7
    基情
    0
    发表于 2017-6-27 16:59:02 | 显示全部楼层
    不知该说些什么。。。。。。就是谢谢












    钱宝自选商户mpos机器免费送   带键盘  带闪付功能的mpos,  钱宝自选商户mpos,定位本地,可根据消费时间段自选本地商户,想刷什么就刷什么   绝不跳码  绝不跳商户!!! 老司机都懂稳定不跳的重要性。养卡提额神器!    支持京东白条闪付,支持云闪付自选商户0.38费率,支持微信支付宝银联钱包扫码0.38费率,支持闪付挥卡支付。v信:qianbao5219  全国可以邮寄
    回复 支持 反对

    使用道具 举报

    0

    主题

    7

    帖子

    7

    积分

    新手上路

    Rank: 1

    积分
    7
    基情
    0
    发表于 2017-6-29 23:18:49 | 显示全部楼层
    萌帝国,幼幼王朝,拯救天使,我愛幼幼 最新幼幼论坛最新地址

    萌帝国 iuuvip.com (推荐)

    纯粹个人分享.欢迎转发
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|网站地图|DZ商业模板|VR福利资源|嵌入式Linux论坛 ( 粤ICP备15085165号-2

    GMT+8, 2017-8-23 18:00 , Processed in 0.312000 second(s), 12 queries , File On.

    Powered by 深嵌论坛 X3.3

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表