移植 tiny210 的按键驱动
2014-06-27 15:00
375 查看
按键驱动比较简单,这里利用了tiny210的8个按键,上报A,B,C,D,L,S,shift ,enter 8个事件。
代码如下:
测试:
在终端上执行 exec 0</dev/tty1
按下开发板上按键就可以看到相应按键的值。
代码如下:
#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
按下开发板上按键就可以看到相应按键的值。
相关文章推荐
- 一步一步学习 Linux 驱动之 platform 机制(tiny210 按键驱动)
- tiny210触摸屏驱动移植问题
- 基于tiny210v2的linux-3.9.6内核驱动移植2:按键驱动
- 向Tiny210移植Debian Linux
- tiny210——uboot移植Makefile文章分析
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——配置过程(二)
- tiny6410按键platform(平台)驱动的实现
- 友善之臂210矩阵键盘驱动分析与移植
- S3C2440 Linux驱动移植——按键
- 基于fl2440内核linux-3.0移植----添加按键驱动
- android系统移植之按键驱动篇
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植网卡
- 【TINY4412】LINUX移植笔记:(22)设备树LCD按键驱动
- tiny6410按键platform(平台)驱动的实现
- 【原创】zstack - 协议栈程序精简日志-按键驱动移植
- Qtopia4.2.5移植及按键驱动的调试总结
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——前言
- Linux-2.6.32.2内核在mini2440上的移植(十六)---基于中断的按键驱动移植
- 第三十三天:Tiny4412驱动开发之LED驱动和u-boot移植
- tiny6410按键驱动(一)---驱动框架