移植 tiny210 的按键驱动

        按键驱动比较简单,这里利用了tiny210的8个按键,上报A,B,C,D,L,S,shift ,enter 8个事件。

代码如下:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/poll.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/input.h>
#include <plat/gpio-cfg.h> 

#include <mach/map.h>
#include <mach/gpio.h>
#include <mach/regs-clock.h>
#include <mach/regs-gpio.h>
#include <asm/gpio.h>


static struct input_dev *s5p_buttons_dev;
static struct timer_list s5p_buttons_timer;

struct s5p_buttons_desc
{
	int gpio;
	int value;
	char* name;
};
static struct s5p_buttons_desc s5p_buttons_desc[] = 
{
	{ S5PV210_GPH2(0), KEY_L, "KEY0" },
	{ S5PV210_GPH2(1), KEY_S, "KEY1" },
	{ S5PV210_GPH2(2), KEY_ENTER, "KEY2" },
	{ S5PV210_GPH2(3), KEY_LEFTSHIFT, "KEY3" },
	{ S5PV210_GPH3(0), KEY_A, "KEY4" },
	{ S5PV210_GPH3(1), KEY_B, "KEY5" },
	{ S5PV210_GPH3(2), KEY_C, "KEY6" },
	{ S5PV210_GPH3(3), KEY_D, "KEY7" },
};

static struct s5p_buttons_desc *tmp_button_desc;



static void s5p_210_buttons_timer(unsigned long _data)
{
	int value;
	
//	tmp_button_desc = (struct s5p_buttons_desc *)_data;  
	value = gpio_get_value(tmp_button_desc->gpio);

	/* active low */
	printk("KEY %s: %08x\n", tmp_button_desc->name,value);

	if(value)
	{
		input_event(s5p_buttons_dev , EV_KEY , tmp_button_desc->value ,0); // 0表示按下  ,1 表示松开
		input_sync(s5p_buttons_dev);
	}
	else
	{
		input_event(s5p_buttons_dev , EV_KEY , tmp_button_desc->value ,1);
		input_sync(s5p_buttons_dev);
	}
}


static irqreturn_t s5p_button_interrupt(int irq, void *dev_id)
{
	tmp_button_desc = (struct s5p_buttons_desc *)dev_id;  
	mod_timer(&s5p_buttons_timer, jiffies + msecs_to_jiffies(40));

	return IRQ_HANDLED;
}

static int __init s5p_button_dev_init(void)
{
	int i;
	/*1. 分配input_dev 结构体*/
	s5p_buttons_dev	 = input_allocate_device();

	/*2. 设置 input_dev 结构体 */
	set_bit(EV_KEY, s5p_buttons_dev->evbit);  // 设置产生按键类事件
	set_bit(EV_REL, s5p_buttons_dev->evbit);  // 设置产生相对位移类事件

	
	set_bit(KEY_L, s5p_buttons_dev->keybit);  
	set_bit(KEY_S, s5p_buttons_dev->keybit);  
	set_bit(KEY_ENTER, s5p_buttons_dev->keybit); 
	set_bit(KEY_LEFTSHIFT, s5p_buttons_dev->keybit);  
	set_bit(KEY_A, s5p_buttons_dev->keybit);  
	set_bit(KEY_B, s5p_buttons_dev->keybit);  
	set_bit(KEY_C, s5p_buttons_dev->keybit);  
	set_bit(KEY_D, s5p_buttons_dev->keybit);  

	/*3. 硬件操作 */
	// 加一个定时器

	init_timer(&s5p_buttons_timer);
	s5p_buttons_timer.function = s5p_210_buttons_timer;
	add_timer(&s5p_buttons_timer);

	for (i = 0; i < ARRAY_SIZE(s5p_buttons_desc); i++) 
	{
		request_irq(gpio_to_irq(s5p_buttons_desc[i].gpio), s5p_button_interrupt,  
			IRQ_TYPE_EDGE_BOTH, s5p_buttons_desc[i].name, (void *)&s5p_buttons_desc[i]); // 注册中断
	}
	
	
	/*4. 注册 input_dev */
	input_register_device(s5p_buttons_dev);
	return 0;
}

static void __exit s5p_button_dev_exit(void)
{
		int i;
	for (i = 0; i <  ARRAY_SIZE(s5p_buttons_desc); i++)
	{
		free_irq(gpio_to_irq(s5p_buttons_desc[i].gpio), (void *)&s5p_buttons_desc[i]);
	}

	del_timer(&s5p_buttons_timer);
	input_unregister_device(s5p_buttons_dev);
	input_free_device(s5p_buttons_dev);	
}

module_init(s5p_button_dev_init);
module_exit(s5p_button_dev_exit);

MODULE_LICENSE("GPL");







测试:

在终端上执行 exec 0</dev/tty1
按下开发板上按键就可以看到相应按键的值。

 


 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值