返回信息流arm9 2440,内核用的是2.6.22
我在驱动开发中需要用到外部中断0,我是这样来申请中断的:
s3c2410_gpio_cfgpin(S3C2410_GPF0,S3C2410_GPF0_EINT0);
s3c2410_gpio_pullup(S3C2410_GPF0,0);
set_irq_type(IRQ_EINT0,IRQT_LOW); //低电平触发
request_irq(IRQ_EINT0,my_ISR,SA_INTERRUPT,DEVICE_NAME,0);
其中request_irq返回值为0,应该能说明中断申请成功了吧
调试中发现,无论我在哪用disable_irq禁止这个中断,在申请成功之后总会自动进入中断服务程序一次,我把中断触发方式改成其他的方式也是如此。在申请前先对INTMSK寄存器(已经ioremap了)相应位写1禁止中断也会自动进入ISR一次。
为什么会是这样?
还有就是,我应该怎么来禁止某个中断,是用disable_irq还是置位INTMSK?
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #5271同步于 2009/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖
问个arm linux驱动开发申请外部中断的问题
jennymasar
2009/7/5镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
你说的申请成功是指request_irq成功还是disable_irq成功?(调试中发现那段话里面)
关于禁止中断,推荐的做法好像是disable_irq,因为它做的事情好像是把request_irq时候挂上的函数换掉(CPU的中断管脚依然生效,只不过无法执行以前的中断处理函数了);而置位掩码的方法相比disable_irq更“粗暴”(LDD上好像这么说的)一些,这样中断管脚就不再关心是否有效电平了,不管怎样都到不了中断处理函数了。
request_irq返回值为0,应该是申请成功了吧。disable_irq(EINT0)之后去读INKMSK观察到EINT0位为0,禁止中断应该是成功了吧.
我需要用到低电平触发的外部中断0。外部中断一申请成功就自动计入相应的服务程序中了,不清楚为什么,申请时所以的中断触发方式、中断的类型都试过了,都如此,自动进入服务程序。
所以我想着是不是需要在申请之前把这个外部中断禁止掉?
disable_irq能用在中断服务程序的外边吗?看网上都说是“禁止给定的中断, 并等待当前的中断处理例程结束”?
【 在 hobby 的大作中提到: 】
: 你说的申请成功是指request_irq成功还是disable_irq成功?(调试中发现那段话里面)
: 关于禁止中断,推荐的做法好像是disable_irq,因为它做的事情好像是把request_irq时候挂上的函数换掉(CPU的中断管脚依然生效,只不过无法执行以前的中断处理函数了);而置位掩码的方法相比disable_irq更“粗暴”(LDD上好像这么说的)一些,这样中断管脚就不再关心是否有效电平了,不管怎样都到不了中断处理函数了。
没有解决。
我需要用到两个中断,一个是IRQ类型,一个是FIQ类型(是个外部中断),想让FIQ随时可以打断IRQ。
发现只要request_irq一成功就会将所申请的中断使能了,就进入服务程序了,但是这个时候我还不想让这个申请好的外部中断起作用,想把它禁掉。
后来想着对cspr的直接操作,把fiq类型的中断禁掉,发现只能禁掉IRQ类型的中断,禁不掉FIQ类型的中断。
对cpsr操作的代码如下:
asm volatile("msr r12,cpsr\n\t"
"orr r12,r12,#0xc0\n\t"
"mrs cpsr_c,r12" ::: "r12","cc","memory");
不知道怎么来禁掉这个FIQ了,不知道哪做错了
【 在 hobby 的大作中提到: 】
: 解决了是吗?
: 是request_irq参数有变化?