linux中断驱动
使用以下函数注册一个中断,ret = request_irq(fpga_irq, mpc83xx_fpga_interrupt, IRQF_TRIGGER_LOW, "fpga", NULL);其中的软件中断号和硬件中断号对应,fpga设备注册正常,中断信号为每250us一个的持续400ns的低电平。环境为Linux+powerPC,设备树的相关部分为:
fpga@2,0 {
#address-cells = <0x1>;
#size-cells = <0x1>;
compatible = "zds900-fpga";
reg = <0x2 0x0 0x800>;
interrupts = <0x11 0x8>;//硬件中断号0x11,低电平触发
interrupt-parent = <0x1>;
};
(1)我现在的问题是注册、执行都没有问题,但是mpc83xx_fpga_interrupt中断函数没有执行,也就是内核没有检测到中断。
(2)我觉得可能出问题的地方,中断驱动每次在使用的时候需要mask(disable)该中断,中断处理完成后再unmask(enable),我现在的程序没有实现这一块。request_irq里面有没有自动实现这一块,使用request_irq注册的时候默认状态是不是enable的?如果需要mask,该怎么实现,内核里面好像声明为static了,不供外部调用。
(3)还有就是低电平触发是不是也有关系,CPU的datasheet里面有说到低电平方式在处理中断的时候需要mask,而边沿出发方式在处理的时候则通过清除中断状态位清除中断。
先给30分,解决问题之后再加30分,麻烦大神指点。。。