OK6410 按键中断驱动
2015-03-28 18:15
316 查看
1. 修改内核代码 ,编译内核(可以不做)
进入arch /arm/mach-s3c64xx/mach-smdk6410.c将下面的代码注释掉(提供的内核代码已经完成这一步)
static struct gpio_keys_button gpio_buttons[] = { { .gpio = S3C64XX_GPN(0), //.code = 25, .code = KEY_UP, .desc = "BUTTON1", .active_low = 1, .wakeup = 0, }, { .gpio = S3C64XX_GPN(1), //.code = 42, .code = KEY_DOWN, .desc = "BUTTON2", .active_low = 1, .wakeup = 0, }, { .gpio = S3C64XX_GPN(2), //.code = 50, .code = KEY_LEFT, .desc = "BUTTON3", .active_low = 1, .wakeup = 0, }, { .gpio = S3C64XX_GPN(3), //.code = 10, .code = KEY_RIGHT, .desc = "BUTTON4", .active_low = 1, .wakeup = 0, }, { .gpio = S3C64XX_GPN(4), //.code = 24, .code = KEY_ENTER, .desc = "BUTTON5", .active_low = 1, .wakeup = 0, }, { .gpio = S3C64XX_GPN(5), //.code = 38, .code = KEY_ESC, .desc = "BUTTON6", .active_low = 1, .wakeup = 0, } };
2. 按键驱动中断号确定
IRQ_EINT0_3不能使用需要用gpio_to_irq(S3C64XX_GPN(0))获得
完整代码:
#include <linux/init.h> #include <linux/module.h> #include <linux/miscdevice.h> #include <linux/fs.h> #include <linux/interrupt.h> #include <linux/io.h> #include <mach/gpio.h> #include <mach/regs-gpio.h> #include <linux/irq.h> #define GPNCON 0X7F008830 #define EXT_INT_0_CON 0x7f008900 // #define EXT_INT_0_MASK 0x7f008920// #define VIC0INTENABLE 0x71200010 irqreturn_t key_int(int irq, void *dev_id) { //1.检测是否发生中断 //2. 清除中断标志 //3. 打印按键信息 printk(KERN_ERR"key down!\n"); return 0; } void gpio_hw_init(void) { unsigned int *gpio_config; unsigned short data; gpio_config=ioremap(GPNCON,4); data = readw(gpio_config); data &= ~0b11; data |= 0b10; writew(data,gpio_config); } void irq_init(void) { unsigned int *extint_config; unsigned int *extint_mask; // unsigned int *vic0intenable; unsigned short data; extint_config=ioremap(EXT_INT_0_CON,2); extint_mask=ioremap(EXT_INT_0_MASK,2); // vic0intenable=ioremap(VIC0INTENABLE,2); data=readw(extint_config); data &= ~0b11; data |= 0b10; writew(data,extint_config); /* 配置为下降沿触发 */ writew(0x00,extint_mask); /* 取消屏蔽外部中断 */ // data=readw(vic0intenable); // data &= ~0b1; // data |= 0b1; // writew(data,vic0intenable); /* 使能外部中断*/ } int key_open (struct inode *node ,struct file *filep) { return 0; } struct file_operations key_fops = { .open = key_open, }; struct miscdevice key_miscdev= { .minor = MISC_DYNAMIC_MINOR, .name = "key", .fops = &key_fops, }; static int key_init(void) { misc_register(&key_miscdev); //注册中断 //request_irq(IRQ_EINT0_3, key_int, IRQF_TRIGGER_FALLING, "key", 0);//这种方法无法实现 request_irq(gpio_to_irq(S3C64XX_GPN(0)), key_int, IRQF_TRIGGER_FALLING, "key", 0);//ok //下面这两种方法也是OK的 //request_irq(IRQ_EINT(0), key_int, IRQF_TRIGGER_FALLING, "key", 0);//ok //request_irq(S3C_EINT(0), key_int, IRQF_TRIGGER_FALLING, "key", 0);//ok //硬件中断初始化设置 gpio_hw_init(); irq_init(); return 0; } static void key_exit(void) { misc_deregister(&key_miscdev); //注销中断 free_irq(gpio_to_irq(S3C64XX_GPN(0)), 0); } MODULE_LICENSE("GPL"); module_init(key_init); module_exit(key_exit);
相关文章推荐
- 基于platform的ok6410按键中断实验
- tiny6410按键驱动(三)---中断发
- 基于platform的ok6410按键中断实验
- 国嵌OK6410按键中断点灯点不亮
- ok6410 按键中断点LED灯
- OK6410利用矢量中断通过按键控制LED灯
- OK6410按键中断点亮lED
- Tiny 6410 按键中断驱动笔记
- ok6410按键中断编程,linux按键裸机
- OK6410按键驱动--Qt程序(改)亲测可以运行
- 基于platform的ok6410按键中断实验
- 飞凌嵌入式OK6410按键设备驱动的模型
- OK6410:按键驱动
- ok6410按键中断驱动程序
- 【OK6410裸机程序】按键中断
- 飞凌 ok6410 按键驱动源码及测试代码
- OK6410按键驱动--Qt程序(改)亲测可以运行
- 飞凌ok6410开发板的按键驱动改程序
- OK6410的按键驱动
- ok6410实现定时器中断驱动 pwm驱动