您的位置:首页 > 其它

移植 tiny210 的按键驱动

2014-06-27 15:00 375 查看
        按键驱动比较简单,这里利用了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

按下开发板上按键就可以看到相应按键的值。

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息