主题 : 关于mini2440按键中断驱动的疑惑 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 28500
精华: 0
发帖: 39
金钱: 195 两
威望: 39 点
综合积分: 78 分
注册时间: 2010-09-12
最后登录: 2014-06-25
楼主  发表于: 2011-03-10 16:53

 关于mini2440按键中断驱动的疑惑

      官方给出的mini2440按键驱动程序中,用到了外部中断。可是在整个程序中,并没有设置相应pin的控制寄存器GPXCON的相应位为中断功能,它所涉及到的GPIO操作,仅仅是在中断处理程序中读了相应GPXDAT的相应位的值。
   这让我很疑惑:难道在外部中断中可以不设置相应的pin控制寄存器,直接读GPXDAT相应位就行,或者在内核启动过程中,已经将该中断对应的pin设置成中断功能了。对于后一种想法,我查了下内核代码,恕我鲁钝,并没有发现相应的初始化过程。
    请大伙释疑,谢谢
级别: 新手上路
UID: 28500
精华: 0
发帖: 39
金钱: 195 两
威望: 39 点
综合积分: 78 分
注册时间: 2010-09-12
最后登录: 2014-06-25
1楼  发表于: 2011-03-20 00:10
哎,等了这么久,没一个人给回复,失望,对这个社区感到很失望。

还是自己找了出来,贴出来,给其他不知道的人看看。

在s3c24xx_init_irq()中,有这么一段代码:
    for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {
        irqdbf("registering irq %d (extended s3c irq)\n", irqno);
        set_irq_chip(irqno, &s3c_irqext_chip);
        set_irq_handler(irqno, handle_edge_irq);
        set_irq_flags(irqno, IRQF_VALID);
    }
其中在调用set_irq_chip(irqno, &s3c_irqext_chip)中,
static struct irq_chip s3c_irqext_chip = {
    .name        = "s3c-ext",
    .mask        = s3c_irqext_mask,
    .unmask        = s3c_irqext_unmask,
    .ack        = s3c_irqext_ack,
    .set_type    = s3c_irqext_type,
    .set_wake    = s3c_irqext_wake
};
请仔细看看s3c_irqext_type(当初没深入,哎,浪费了我很多时间)
/* Set the GPIO to external interrupt mode */
    value = __raw_readl(gpcon_reg);
    value = (value & ~(3 << gpcon_offset)) | (0x02 << gpcon_offset);
    __raw_writel(value, gpcon_reg);
可以看得很明白。