LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 676|回复: 1

求助中断加载问题

[复制链接]
发表于 2004-12-2 11:08:58 | 显示全部楼层 |阅读模式
我写了一个小程序,用来测试中断的加载和调用,程序及问题如下,请路过高手指点迷津
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/module.h>
#define pad_irq 33
static void pad_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
        printk("key pressed\n");
        printk("interrupte num is %i\n", irq);
}


int pad_init(void)
{
   free_irq(pad_irq, NULL);

   if ( request_irq(pad_irq, pad_interrupt,SA_INTERRUPT, "pad", NULL) )
        printk("can't get assigned irq %i\n ",pad_irq);
}

void pad_cleanup(void)
{ }

init_module(void) {
        printk("pad driver installed!\n");
        pad_init();
        printk("requested irq\n");
}

cleanup_module(void) {
        free_irq(pad_irq, NULL);
        printk("pad driver removed!\n");
}


编译通过以后我加载如下
# insmod pad_irq1.o
出现如下信息
Using pad_irq1.o
Insmod: init_module: pad_irq1: Device or resource  busy

不知道问题出在什么地方,中断号肯定是唯一的,也查了一下中断是没有被占用的,我看到有个
函数返回的是-EBUSY
具体函数如下

int setup_irq(unsigned int irq, struct irqaction * new)
{
        int shared = 0;
        unsigned long flags;
        struct irqaction *old, **p;
        irq_desc_t *desc = irq_desc + irq;

        /*
         * Some drivers like serial.c use request_irq() heavily,
         * so we have to be careful not to interfere with a
         * running system.
         */
        if (new->flags & SA_SAMPLE_RANDOM) {
                /*
                 * This function might sleep, we want to call it first,
                 * outside of the atomic block.
                 * Yes, this might clear the entropy pool if the wrong
                 * driver is attempted to be loaded, without actually
                 * installing a new handler, but is this really a problem,
                 * only the sysadmin is able to do this.
                 */
                rand_initialize_irq(irq);
        }

        /*
         * The following block of code has to be executed atomically
         */
[1]     spin_lock_irqsave(&desc->lock,flags);
        p = &desc->action;
        if ((old = *p) != NULL) {
                /* Can't share interrupts unless both agree to */
                if (!(old->flags & new->flags & SA_SHIRQ)) {
[2]                     spin_unlock_irqrestore(&desc->lock,flags);
                        return -EBUSY;
                }

                /* add new interrupt at end of irq queue */
                do {
                        p = &old->next;
                        old = *p;
                } while (old);
                shared = 1;
        }

        *p = new;

        if (!shared) {
                desc->depth = 0;
                desc->status &= ~(IRQ_DISABLED | IRQ_AUTODETECT |IRQ_WAITING);
                desc->handler->startup(irq);
        }
[3]     spin_unlock_irqrestore(&desc->lock,flags);

        register_irq_proc(irq);
        return 0;
}
 楼主| 发表于 2004-12-2 20:15:50 | 显示全部楼层

回复 中断加载问题

我又做了一些测试,在我屏蔽了int setup_irq(unsigned int irq, struct irqaction * new)
函数中的
if ((old = *p) != NULL) {
/* Can't share interrupts unless both agree to */
//if (!(old->flags & new->flags & SA_SHIRQ)) {
//[2] spin_unlock_irqrestore(&desc->lock,flags);
//return -EBUSY;
}
后中断仍然出现
Insmod: init_module: pad_irq1: Device or resource busy
后我输入dmesg
出现奇怪的现象,居然调用了我的中断处理函数
static void pad_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
printk("key pressed\n");
printk("interrupte num is %i\n", irq);
}
出现了打印,输出为key pressed
interrupte num is 33

奇怪之处是我没有点击小键盘而触发中断,怎么会出现中断处理函数的调用呢?

当我按下小键盘后,开发板输入失灵了,说明我的按下键是起作用的,我是用小键盘来触发中断的

我的开发板是omap1510 ,看看我的问题出现在什么地方,我认为是我的request_irq()函数用的不对

不知道如何去用它



我的开发板可以加载模块是没有问题的,我触发后能是机子死机可以说明的小键盘是其作用了,那又怎么会输出Insmod: init_module: pad_irq1: Device or resource busy 呢

现在搞不明白了是怎么回事了

请路过的高手指点一下啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表