移植 tiny210 的按键驱动

来源:互联网 发布:宜宾零距离网络 编辑:程序博客网 时间:2024/06/04 20:02

        按键驱动比较简单,这里利用了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 0
原创粉丝点击