linux 按键驱动

在许多开发板教程中一说到按键驱动内容时,大多都是按照之前单片机的思想来写的。但是如果深入学习linux设备驱动的话,会发现这样是很复杂而且不符合linux的编程思想。在此给大家介绍一下利用内核已有的驱动修改自己的按键驱动。
其实驱动已经写好了,就是内核的输入设备驱动。我们现在用到的是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值