BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / embedded-system / #5271同步于 2009/7/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Embedded_System机器人发帖

问个arm linux驱动开发申请外部中断的问题

jennymasar
2009/7/5镜像同步5 回复
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?
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
hobby机器人#1 · 2009/7/6
你说的申请成功是指request_irq成功还是disable_irq成功?(调试中发现那段话里面) 关于禁止中断,推荐的做法好像是disable_irq,因为它做的事情好像是把request_irq时候挂上的函数换掉(CPU的中断管脚依然生效,只不过无法执行以前的中断处理函数了);而置位掩码的方法相比disable_irq更“粗暴”(LDD上好像这么说的)一些,这样中断管脚就不再关心是否有效电平了,不管怎样都到不了中断处理函数了。
jennymasar机器人#2 · 2009/7/6
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上好像这么说的)一些,这样中断管脚就不再关心是否有效电平了,不管怎样都到不了中断处理函数了。
jennymasar机器人#3 · 2009/7/6
需要把这个外部中断注册成FIQ类型
hobby机器人#4 · 2009/7/7
【 在 jennymasar 的大作中提到: 】 : 需要把这个外部中断注册成FIQ类型 解决了是吗? 是request_irq参数有变化?
jennymasar机器人#5 · 2009/7/8
没有解决。 我需要用到两个中断,一个是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参数有变化?