请教9200的gpio中断驱动

发布于 2022-09-23 12:25:15 字数 887 浏览 12 评论 0

在2.6.13内核中想用9200的PB18用作中断源,
代码如下:

AT91_SYS->PMC_PCER = 1 << AT91C_ID_PIOB;
sys->AIC_SMR[AT91C_ID_PIOB] = AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE;
sys->AIC_IECR = 1 << AT91C_ID_PIOB;
sys->PIOB_ODR |= AT91C_PIO_PB18;
sys->PIOB_IER |= AT91C_PIO_PB18;

retv = request_irq(AT91C_ID_PIOB, int_rtc_interrupt, SA_SHIRQ, "INT_RTC", NULL);
if( request_irq(AT91C_ID_PIOB, int_rtc_interrupt, 0, "INT_RTC", NULL))
{
printk(KERN_ERR "request INT RTC ERROR!");
return -1;
}
编译后装载驱动模块,一直申请不了中断,是不是内核配置的问题,困惑中,请教各位。
insmod ../ds1390drv/ds1390drv.ko
Using ../ds1390drv/ds1390drv.ko
request INT RTC ERROR!insmod: cannot insert `../ds1390drv/ds1390drv.ko': Operation not permitted (-1): Operation not permitted

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

拥有 2022-09-30 12:25:15

retv = request_irq(AT91C_ID_PIOB, int_rtc_interrupt, SA_SHIRQ, "INT_RTC", NULL);
if( request_irq(AT91C_ID_PIOB, int_rtc_interrupt, 0, "INT_RTC", NULL))
1、请问有了上面那句,这个是干嘛的?
2、请问if( request_irq(AT91C_ID_PIOB, int_rtc_interrupt, 0,,中“0”是干嘛的,
request_irq部分代码如下
…………

        if (irq >= NR_IRQS || !irq_desc[irq].valid || !handler ||
            (irq_flags & SA_SHIRQ && !dev_id))
                return -EINVAL;
…………

是不是这样比较好
if(!retv) {

.......
}

[ 本帖最后由 .kaka 于 2008-12-1 21:53 编辑 ]

落日海湾 2022-09-30 12:25:15

楼上的,上面的那一句代码是多余的,应该是注释掉的,
改成下面的
retv = request_irq(AT91C_ID_PIOB, int_rtc_interrupt, SA_INTERRUPT, "INT_RTC", NULL);
        if (!retv) {
                printk(KERN_ERR "request PIOB_IRQ ERROR!\n");
                return retv;
        }

[root@(none) ds1390app]$cat /proc/interrupts
           CPU0
  1:     144104   AT91RM9200 Timer Tick, at91_serial
10:       1132   at91rm9200_mci
11:          0   at91_udc
18:          1   tc1
24:      14648   eth0
58:          0   at91rm9200_mci
93:          1   eth0
Err:          0

cat /proc/interrupt 还是看不到IO中断

苄①跕圉湢 2022-09-30 12:25:15

if (request_irq(No, &_isr, SA_SHIRQ, "RTC", NULL) < 0) {
            printk(" request_irq error!\r\n");
            return -EAGAIN;
        }
确认一下你的No对不对吧,贴一下函数运行后的反馈~
就是这个样子~

杀手六號 2022-09-30 12:25:15

对,确认一下注册的中断号是否正确。

送君千里 2022-09-30 12:25:15

按照楼上的,我把中断号定位AT91C_ID_TC1(18)或者AT91_ID_UHP(23)都可以,设为AT91C_ID_PIOB(3)就不行,装载模块报错:
Using ds1390drv.ko
request PIOB_IRQ ERROR!
insmod: cannot insert `ds1390drv.ko': Resource temporarily unavailable (-1): Resource temporarily unavailable
是不是用9200的io作为中断还有什么讲究?

[ 本帖最后由 dreamice 于 2008-12-3 20:07 编辑 ]

梦里梦着梦中梦 2022-09-30 12:25:15

这个讲究,我估计你得分析一下芯片手册了

2022-09-30 12:25:15

费了半天劲,找到规律了,PB29的irq号是93,我要的PB18就是82了,后来发现,IO的中断号由32开始,PA PB PC PD 类推应该是这样的吧,多谢楼上2位!

冰雪梦之恋 2022-09-30 12:25:15

原帖由 chenkaick 于 2008-12-4 10:26 发表
费了半天劲,找到规律了,PB29的irq号是93,我要的PB18就是82了,后来发现,IO的中断号由32开始,PA PB PC PD 类推应该是这样的吧,多谢楼上2位!

呵呵,恭喜。
这个东西,你真得看芯片手册,单纯的去看其它代码来改动的话,很可能就不能跑

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文