日期:2014-05-16  浏览次数:20524 次

linux中断处理 如何调用内核的中断操作
一般嵌入式,在内核的arch下有对硬件cpu如ARM的中断处理,针对寄存器的操作,然后封装到内核的irq上,如下:
C/C++ code

static struct irq_chip lpc32xx_irq_chip = {
    .ack = lpc32xx_mask_ack_irq,
    .mask = lpc32xx_mask_irq, //屏蔽中断源
    .unmask = lpc32xx_unmask_irq,//打开中断源
    .set_type = lpc32xx_set_irq_type,//设置中断类型
};
static void lpc32xx_mask_irq(unsigned int irq)
{
}
static void lpc32xx_unmask_irq(unsigned int irq)
{
}
static int lpc32xx_set_irq_type(unsigned int irq, unsigned int type)
{
}



我在驱动中应该如何调用内核的irq进行操作,所有的VIC寄存器操作都封装在lpc32xx_irq_chip中,其它驱动程序应该直接
调用内核提供的操作即可,
比如GPIO中断驱动中,设置中断类型可以用内核的set_irq_type(IRQ_GPIO02, IRQ_TYPE_EDGE_FALLING);
这个函数在irq.h,但是我没弄清是怎么mask的,在kernel/irq/chip.c中,关于mask的操作函数也没有EXPORT

驱动程序中应该如何调用封装在irq_chip 中的mask和umask等函数呢,应该不用再针对寄存器进行读写了吧??

------解决方案--------------------
lpc32xx_mask_irq 这样的操作是针对全部中断的
这些权利保留给中断控制器

作为设备驱动,不需要有这么大的权限,所以chip.c 里就没有EXPORT那些


------解决方案--------------------
设备驱动 有个 disable_irq enable_irq 就行了