1、中断处理流程

中断专题:11. 基于ARM Cortex-A9中断详解 (qq.com)

 

 

2、中断注册函数

 

 

 

3、tq2440写的一个按键中断程序

有一个编译报错:

make -C /home/aston/040-linux-tq2440/linux-tq2440/ M=/home/aston/040-linux-tq2440/key_driver modules CROSS_COMPILE=arm-linux- ARCH=arm
make[1]: Entering directory `/home/aston/040-linux-tq2440/linux-tq2440'
  CC [M]  /home/aston/040-linux-tq2440/key_driver/key.o
/home/aston/040-linux-tq2440/key_driver/key.c:58: error: expected identifier or '(' before 'do'
/home/aston/040-linux-tq2440/key_driver/key.c:58: error: expected identifier or '(' before 'while'
/home/aston/040-linux-tq2440/key_driver/key.c:65: warning: function declaration isn't a prototype
/home/aston/040-linux-tq2440/key_driver/key.c: In function '__inittest':
/home/aston/040-linux-tq2440/key_driver/key.c:70: error: 'key_init' undeclared (first use in this function)
/home/aston/040-linux-tq2440/key_driver/key.c:70: error: (Each undeclared identifier is reported only once
/home/aston/040-linux-tq2440/key_driver/key.c:70: error: for each function it appears in.)
make[2]: *** [/home/aston/040-linux-tq2440/key_driver/key.o] Error 1
make[1]: *** [_module_/home/aston/040-linux-tq2440/key_driver] Error 2
make[1]: Leaving directory `/home/aston/040-linux-tq2440/linux-tq2440'
make: *** [all] Error 2
root@ubuntu:/home/aston/040-linux-tq2440/key_driver# 

对应的key.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <linux/io.h>
#include <linux/interrupt.h>
#include <linux/miscdevice.h>

/**************引入中断框架**************/
#define GPFCON 0X56000050
irqreturn_t key_int(int irq, void *dev_id)
{
    /*1、检查是否发生了中断
    **2、清除中断
    **3、打印按键值
    */
    printk("key down\n");
    return 0;
}
void key_hw_init(void)
{
    unsigned int *gpio_config;
    unsigned short data;
    gpio_config=ioremap(GPFCON,4);
    data=readw(gpio_config);//读了4节,读出来再写进去
    data &= ~0b11;
    data |=0x10;
    writew(data,gpio_config);//将引脚配置成中断
}
/************************************/
int key_open(struct inode *node, struct file *filp)
{
    return 0;
}
struct file_operations key_fops={
    .open=key_open,
};

struct miscdevice key_miscdev = {
    .minor = 200,
    .name  = "key",
    .fops = &key_fops,
};

static int button_init()
{
    misc_register(&key_miscdev);//按键下降沿触发中断
    key_hw_init();
    request_irq(IRQ_EINT0,key_int, IRQF_TRIGGER_FALLING,"key",0);
}
static void button_exit()
{
    misc_deregister(&key_miscdev);
    //free_irq(IRQ_EINT0, 0);
}
MODULE_LICENSE("GPL");
module_init(button_init);//为甚改成key_init就报错
module_exit(button_exit);

只要把button_init button_exit都改成key_init编译就立马报错。为什么???

Makefile

obj-m:=key.o
KDIR:= /home/aston/040-linux-tq2440/linux-tq2440/
all:
    make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=arm-linux- ARCH=arm
clean:
    rm -rf *.ko *.o *.mod.o *.mod.c *.symvers *.bak *.order