中断驱动设计----mini2440 按键驱动设计之路

按键驱动设计设计的知识比较多,包括中断体系,定时器,GPIO配置,多路I/O选择。其源代码在我引用的另一篇博客里附有,这里主要讲在学习过程中遇到的一些问题。这里对中断体系进行一个总结。
1    中断处理体系结构,如下图所示。
中断驱动设计----mini2440 按键驱动设计之路_第1张图片

extern struct irq_desc irq_desc[NR_IRQS];
先简要说下上图中的一些数据结构体含义,irq_desc结构数组用来描述中断,每个数组项对于一个或一组中断号;irq_chip操作底层硬件,比如设置寄存器屏蔽中断、使能中断、清除中断;irqaction表示用户注册的中断处理。
中断处理流程:
【1】发生中断时,cpu执行异常向量vector_irq的代码
【2】在vector_irq里面,最终会调用中断处理的总入口函数asm_do_IRQ
【3】 asm_do_IRQ根据中断号调用irq_desc数组项中的handle_irq。
【4】handle_irq会使用chip成员中的函数来初始化硬件。
【5】handle_irq逐个调用用户在action链表中注册的处理函数。
中断初始化就是构造这些数据结构,比如irq_desc数组项里的成员handle_irq,chip等成员;
用户注册的中断是就是构造action链表;
用户卸载中断时就是从action链表中去除不需要的项。

2 中断注册函数最后一个参数的作用,即dev_id

for(i = 0; i < KEY_COUNT; i++)
    {
        //设置6个IO口为中断触发方式
        s3c2410_gpio_cfgpin(button_irqs[i].pin, button_irqs[i].pin_setting);

        //设置中断下降沿为有效触发
        set_irq_type(button_irqs[i].irq, IRQ_TYPE_EDGE_FALLING);
        
        //申请中断(类型为快速中断,中断服务时屏蔽所有外部中断?)
        ret = request_irq(button_irqs[i].irq, buttons_interrupt, IRQF_DISABLED,button_irqs[i].name,(void *)i);

        if(ret)
        {
            break;
        }

        //初始化6个按键的状态为抬起
        key_status[i]= KEY_UP;

        //初始化并设置6个去抖定时器
        setup_timer(&key_timers[i], buttons_timer, i);
    }
request_irq申请注册中断,其函数原型是
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char * devname, void *dev_id)
......文字在整理中....

你可能感兴趣的:(中断驱动设计----mini2440 按键驱动设计之路)