今天在rockchip的rk3066平台上的声卡驱动中想加一个中断用来进行耳机插拔检测,在使用request_irq()时,在flags中设置为上下边沿触发,结果竟然返回失败,大体检查了一下代码,发现问题出在平台相关代码的GPIO IRQ中,主要是代码不支持同时设置上下边沿触发,只能设置为上边沿或者下边沿触发模式。由于我们freescale iMX6平台没有这个问题,而且也能正确的触发,所以我回来后想看看关于gpio irq这块的内容;
几个重要的结构:
struct irq_chip hardware interrupt chip descriptor;可以理解为管理某类中断集合,比如,我们所有的gpio irq;
它的功能函数比较全面比如 ack/set type/mask等,也就是说,当你需要对某个中断进行操作时,要用到这里的函数;
struct irq_desc interrupt descriptor;中断描述符,用来全面描述一个具体的中断;
struct gpio_chip abstract a GPIO controller;顾名思义,gpio控制器呗,类似struct irq_chip;但是抽象出来的,一般用来表示一个gpio集合;比如GPIOA;
它的功能也是比较全面的,比如设置一个gpio的方向,请求gpio,get/set gpio,gpio_to_irq等;除了方法,还有关于这个GPIO集合的信息,比如有多少各GPIO,这个gpio集合的起始编号等;
看到这,也许能猜到,应该还有一个描述某个gpio的结构,对,下个就是:
struct gpio_desc 用来描述一个gpio,结构很简单,感觉也没啥用,最重要的就是chip指针指向的struct gpio_chip;它的全部幸福,都在gpio_chip身上;
接下来,怎么把他们链接在一起呢?
看一下代码,这也太简单了吧。。。gpio_to_irq(pin),轻轻松松的搞定。。下面分析:
在kernel启动过程中,有一个init_irq函数被调用,它直接初始化所有的irq,当然包含gpio对应的那些个irq,所以,当我们调用gpio_to_irq函数时,就取得了已经初始化好的irq的索引了,接下来就很轻松,调用request_irq,将中断处理函数,触发模式等全部写进了struct irq_desc中,接下来完事ok了,只等中断到来;
今天就到这,我再分析分析,打通向前到arm处理中断异常部分;