linux 按键驱动

来源:互联网 发布:iphone通话录音软件 编辑:程序博客网 时间:2024/04/29 19:24
在许多开发板教程中一说到按键驱动内容时,大多都是按照之前单片机的思想来写的。但是如果深入学习linux设备驱动的话,会发现这样是很复杂而且不符合linux的编程思想。在此给大家介绍一下利用内核已有的驱动修改自己的按键驱动。
其实驱动已经写好了,就是内核的输入设备驱动。我们现在用到的是gpio-keys驱动。输入设备驱动的机制在这里先不讲解,后续再详细分析。现在尽管我们队gpio-keys驱动原理不懂,但我们也可以正常使用。我们只需要注册我们的设备就可以使用了。废话少说,开始修改。
1、找到对应平台的板级文件,你编译的内核的所有设备,管脚配置等工作都在这个文件中实现。一般为board-xxx。
2、找到一个合适的地方加入你的代码,其实随便找,不会影响系统运行。
代码样板如下:
#define  BTN_DEBOUNCE_TIMEOUT     20static struct gpio_keys_button my_buttons[] = {{  .code= BTN_1,//编码,在/linux/input.h中定义  .gpio= AT91_PIN_PB24,//gpio管脚,各个处理器平台不一样,最好是查看相近的板级文件修改。  .active_low   = 1,//低电平有效  .wakeup= 1,//支持唤醒机制  .desc= "SW1",//按键描述,随便定义  .debounce_interval= BTN_DEBOUNCE_TIMEOUT,//防抖动,延迟时间},{  .code= BTN_2,  .gpio= AT91_PIN_PB25,  .active_low   = 1,  .wakeup= 1,   .desc= "SW2",  .debounce_interval= BTN_DEBOUNCE_TIMEOUT,//防抖动,延迟时间},{  .code= BTN_3,  .gpio= AT91_PIN_PB26,  .active_low   = 1,  .desc= "SW3",  .wakeup= 1,  .debounce_interval= BTN_DEBOUNCE_TIMEOUT,//防抖动},};static struct gpio_keys_platform_data my_button_data = {.buttons   = my_buttons,.nbuttons  = ARRAY_SIZE(my_buttons),};static struct platform_device my_button_device = {.name= "gpio-keys",//必须是这个,要不然名字不一样驱动无法调用.id= -1 ,.num_resources= 0,.dev = {.platform_data= &my_button_data,}};static void __init at91_add_device_my_buttons(void){     //配置管脚at91_set_gpio_input(AT91_PIN_PB24, 1);/* SW1 */at91_set_deglitch(AT91_PIN_PB24, 1);at91_set_gpio_input(AT91_PIN_PB25, 1);/* SW2 */at91_set_deglitch(AT91_PIN_PB25, 1);at91_set_gpio_input(AT91_PIN_PB26, 1);/* SW3 */at91_set_deglitch(AT91_PIN_PB26, 1);platform_device_register(&my_button_device);}

最后还要把at91_add_devive_my_buttons()添加到初始化函数中,要不要没法调用。
注意:添加防抖很有必要,之前按照别的评估版的板级文件修改发现没有加入这个我不在意,结果按下去就出现多次的情况。知道这个没有防抖动,查看驱动代码修改添加了debounce_interval属性就解决了,debounce_interval的值可以按照实际情况修改。

参考文章:
读取linux input 的event 事件的 应用程序:http://duanyu010.iteye.com/blog/1938492
如何读取Linux键值,输入子系统,key,dev/input/event,dev/event,C语言键盘:http://blog.csdn.net/lanmanck/article/details/8423669
Linux设备驱动剖析之Input(一):http://www.cnblogs.com/lknlfy/p/3275781.html

原创粉丝点击