linux中断驱动

dengjingen 2013-02-05 01:23:49
使用以下函数注册一个中断,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分,麻烦大神指点。。。

...全文
137 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
dengjingen 2013-02-07
  • 打赏
  • 举报
回复
把电平触发改为边沿触发,改设备树文件interrupts = <0x11 0x2>;//硬件中断号0x11,下降沿触发;ret = request_irq(fpga_irq, mpc83xx_fpga_interrupt, 0, "fpga", NULL);//flag参数设为0,使用设备树中设置的参数;改完之后中断上来了。
dengjingen 2013-02-05
  • 打赏
  • 举报
回复
相应管脚(IRQ1)有中断信号的。
morris88 2013-02-05
  • 打赏
  • 举报
回复
貌似没有收到中断信号

742

社区成员

发帖
与我相关
我的任务
社区描述
该论坛主要探讨Linux系统在IBM Power平台的安装、部署、应用开发等话题,并为网友们提供自由交流的平台。
社区管理员
  • Power Linux社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧