在许多开发板教程中一说到按键驱动内容时,大多都是按照之前单片机的思想来写的。但是如果深入学习linux设备驱动的话,会发现这样是很复杂而且不符合linux的编程思想。在此给大家介绍一下利用内核已有的驱动修改自己的按键驱动。
其实驱动已经写好了,就是内核的输入设备驱动。我们现在用到的是gpio-keys驱动。输入设备驱动的机制在这里先不讲解,后续再详细分析。现在尽管我们队gpio-keys驱动原理不懂,但我们也可以正常使用。我们只需要注册我们的设备就可以使用了。废话少说,开始修改。
1、找到对应平台的板级文件,你编译的内核的所有设备,管脚配置等工作都在这个文件中实现。一般为board-xxx。
2、找到一个合适的地方加入你的代码,其实随便找,不会影响系统运行。
代码样板如下:
其实驱动已经写好了,就是内核的输入设备驱动。我们现在用到的是gpio-keys驱动。输入设备驱动的机制在这里先不讲解,后续再详细分析。现在尽管我们队gpio-keys驱动原理不懂,但我们也可以正常使用。我们只需要注册我们的设备就可以使用了。废话少说,开始修改。
1、找到对应平台的板级文件,你编译的内核的所有设备,管脚配置等工作都在这个文件中实现。一般为board-xxx。
2、找到一个合适的地方加入你的代码,其实随便找,不会影响系统运行。
代码样板如下:
#define BTN_DEBOUNCE_TIMEOUT 20
static 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