- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写一个简单的内核模块,它可以注册一个中断并处理它。但是,当我尝试通过调用 request_irq 函数来注册中断时,它返回错误代码 -22 :
ERROR: Cannot request IRQ 30 - code -22 , EIO 5 , EINVAL 22
我相信,这个错误代码等于 EINVAL(无效参数)
请告诉我,我做错了什么。这是一个模块:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <linux/irqdomain.h>
#include <linux/interrupt.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <asm/exception.h>
#include <asm/mach/irq.h>
void int068_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
printk("Interrupt should be handled there\n");
}
static int __init
clcdint_init(void)
{
unsigned int irq;
unsigned int irqflags;
int ret;
irq=68;
irqflags=IRQF_SHARED | IRQF_NO_SUSPEND;
ret = request_irq(irq, int068_interrupt,
irqflags, "clcdint-int068", NULL);
if (ret!=0) {
printk("ERROR: Cannot request IRQ %d", irq);
printk(" - code %d , EIO %d , EINVAL %d\n", ret, EIO, EINVAL);
}
printk("CLCDINT_INIT\n");
return 0;
}
module_init(clcdint_init);
static void __exit
clcdint_exit(void)
{
unsigned int irq;
irq=68;
free_irq(irq, NULL);
printk("CLCDINT_EXIT\n");
}
module_exit(clcdint_exit);
最佳答案
在处理共享中断线(IRQF_SHARED 标志打开)时,您不能传递 NULL 上下文(request_irq() 调用的最后一个参数)。
要理解为什么考虑以下场景:您有两个相同的网卡共享相同的 IRQ。相同的驱动程序将传递相同的中断处理函数、相同的 irq 号和相同的描述。除非通过上下文参数,否则无法区分注册的两个实例。
因此,作为预防措施,如果您传递 IRQF_SHARED 标志,则不能传递 NULL 上下文参数。
关于c - 简单中断处理程序 : request_irq returns error code -22,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15245626/
我在 ARM 处理器上运行嵌入式 linux 3.2.6。我正在使用修改版的 atmel 串行驱动程序来控制我设备上的 4 个 USART 端口。当我使用内核编译的驱动程序时,一切正常。但我想改为将驱
据我所知,它“分配一条中断线”,但是 > what is happening after request_irq()? > How a particular handler is getting ca
我知道通过 request_irq 我们可以安排一个 work_queue,而通过 request_threaded_irq 我们可以产生一个 kthread 作为中断的下半部分。但是 workque
这是我的问题。我目前正在更新 arm 嵌入式 Linux 机器的内核,从 4.1 到 4.14.73。 我遇到了驱动程序方面的问题。对于内核 4.1,在使用 request_irq 注册 irq 之前
request_irq 和 setup_irq 有什么区别? 何时使用 request_irq()什么时候使用 setup_irq() 最佳答案 从内核源代码 kernel/irq/manage.c
据我所知,两者都用于注册中断处理程序。我在内核代码中看到了很多 request_irq 调用,但甚至没有看到一个 __interrupt 调用。 __interrupt 是从用户空间注册处理程序的某种
我正在尝试在由 gpio 中断触发的内核模块中设置中断处理程序,但我似乎没有使用 request_irq() 函数正确的...我正在通过 gpio_to_irq() 获取我的 irq-number,这
我正在学习 Linux 中的设备驱动程序编程。我想知道在哪里可以找到用作 request_irq 函数中“irq”参数的 IRQ 号? int request_irq (unsigned int ir
在浏览 2.6.35 时,在某些驱动程序中,观察到 request_irq 被传递给 irq 标志的值 0。当在 interrupt.h 中看到时 - 0 对应于 IRQ_TRIGGER_NONE;
我正在编写一个简单的内核模块,它可以注册一个中断并处理它。但是,当我尝试通过调用 request_irq 函数来注册中断时,它返回错误代码 -22 : ERROR: Cannot request IR
我正在为 IRQ 号 8 开发一个驱动程序,它对应于 RTC 时钟。我有以下问题。当我用 request_irq 请求那个 IRQ 时,我得到一个 EBUSY 错误。我认为首先使用 free_irq(
我是一名优秀的程序员,十分优秀!