中断 1》 初识

2350阅读 0评论2015-06-12 lsxuan驱动
分类:嵌入式

0> 实验目的:

        实现key1一个按键的中断。

思路:

        在裸板时【irq异常处理2》Key】我们需要:1》初始化按键2》注册中断3》实现中断处理函数。
        现在有了内核,已将提供了一套注册中断的函数。

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

1> 中断注册函数:

request_irq(unsigned int irq,            //中断号

                            irq_handler_t handler,              //中断处理函数

                            unsigned long flags,                    //中断类型标记

                            const char *name,                //cat /proc/interrupts

                            void *dev        //1》存私有数据, 传给中断处理函数的第2个参数,cookie点心

)

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2>中断处理函数的实现:

/Linux-3.5/include/linux/irqreturn.h


enum irqreturn {

        IRQ_NONE = (0 << 0),                     //中断信号不是来自此设备

        IRQ_HANDLED = (1 << 0),                     //成功处理

        IRQ_WAKE_THREAD = (1 << 1),                 //?????

};


typedef enum irqreturn  irqreturn_t;

typedef   irqreturn_t   (*irq_handler_t)   (int, void *);

irqreturn_t     irq_handler(int irq_num, void *dev);

@irq_num:  中断号,只是打印时用下。

@dev:  中断注册函数传过来的参数。

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

只需2个函数成功实现按键中断。

3>疑问:

1》与裸板相比:没了按键初始化,怎么可以产生中断呢?

答:这就是神奇中断号,三星已将内部中断和外部中断的中断号进行了统一编号,并且当你获得中断号时,已将代表把相关寄存器初始化好,不过触发方式没设定,所以就需要flags来标记。

中断号获取:

以key1为例子:

    硬件原理图得: XEINT26/GPX3_2

    1》GPIO编号= EXYNOS4_GPX3(2);//内核也将所有的GPIO也进行了统一编号

    2》中断号= gpio_to_irq(GPIO编号);//将GPIO转换为中断号。


2》中断类型标记:
        IRQ_TYPE_EDGE_BOTH     //双边沿
        IRQF_TRIGGER_RISING      //上升沿
        IRQF_TRIGGER_FALLING    //下降沿

NOTE:注意区分与裸板的中断号。

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
4>释放资源:
        void free_irq(unsigned int irq,  voie *dev_id);
中断号不共享:
                删除中断处理程序同时释放中断号。
中断共享:
            删除最后一个处理函数时才释放中断号。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

总结:

对比裸板时的中断注册,理解内核中断的注册,关于如何获得Exynos4412的硬件资源需单独写个笔记总结,这儿简单了解。

实例:irq1.txt





上一篇:编译错误
下一篇:中断 2》上下半部