您的位置:首页 > 其它

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: