往linux内核注册中断,request_irq返回值-22,不能注册成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了往linux内核注册中断,request_irq返回值-22,不能注册成功相关的知识,希望对你有一定的参考价值。

zynq上定义了一个gpio用作dipsw输入,并且带有中断。
运用到DTS,在systom-top.dts中是这样描述中断信息的。
interrupt-parent = <&intc>;
interrupts = <0 29 4>;

驱动中:
irqNumber = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
if (!irqNumber)
printk("no IRQ found\n");
return -1;

printk("irqNumber = %d\n",irqNumber->start);
ccddev->irq = irqNumber->start;
printk("ccddev->irq = %d\n",ccddev->irq);
//这边从DTS得到的中断号是 164=irqNumber->start
//init irq
result = request_irq(a,
(irq_handler_t) ebbgpio_irq_handler,
0,
DRIVER_NAME,
ccddev);
printk(KERN_INFO "GPIO_TEST: The interrupt request result is: %d\n", result);
//request_irq 的返回值一直为-22

参考技术A 回复 xidianunix 这个取决于你的内核版本。追问

我的内核版本是Linux version 4.6.0-xilinx。
你的意思是,有的内核可以执行成功?
我知道的是request_irq的第三个参数对于不同的内核是不一样的。

参考技术B 你好,我的内核是4.4.0-21,注册中断的时候程序里使用了#include<interrupt.h>,我在使用gcc编译的时候已经指定内核路径了,但是终端还是提示各种头文件找不到例如asm/xxx.h等,请问你是怎么注册中断的?求解答,向大佬致敬。

中断按键驱动

有很多Linux 的驱动都是通过中断的方式来进行内核和硬件的交互。

在 Linux 设备驱动中,使用中断的设备需要申请和释放对应的中断,分别使用内核提供的request_irq()
和free_irq()函数。

驱动程序申请中断和释放中断的调用在include/linux/sched.h里声明。

request_irq()调用的定义:

int request_irq(unsigned int irq,
void (*handler)(int irq, void *dev_id, struct pt_regs *regs),
unsigned long irqflags,const char * devname,oid *dev_id);

irq         是要申请的硬件中断号。在Intel 平台,范围是0~15。

handler   是向系统登记的中断处理函数。这是一个回调函数,中断发生时,系统调用这个函数,传入的参数包括硬件中断号,device id,寄存器值。
             dev_id就是下面的request_irq时传递给系统的参数dev_id。


irqflags   是中断处理的一些属性(下降沿/上升沿的触发)。比较重要的有SA_INTERRUPT,标明中断处理程序是快速处理程序(设置SA_INTERRUPT)还是慢速处理程序(不              设置SA_INTERRUPT)。  快速处理程序被调用时屏蔽所有中断。慢速处理程序不屏蔽。还有一个SA_SHIRQ 属性,设置了以后运行多个设备共享中断。

dev_id    在中断共享时会用到。一般设置为这个设备的device结构本身或者NULL。中断处理程序可以用dev_id找到相应的控制这个中断的设备,或者用irq2dev_map找到中断对              应的设备。void free_irq(unsigned int irq,void *dev_id);


以上是关于往linux内核注册中断,request_irq返回值-22,不能注册成功的主要内容,如果未能解决你的问题,请参考以下文章

linux中断管理

RK3399平台开发系列讲解(中断篇)13.8中断的注册:request_irq

linux中断

Linux驱动开发中断

Linux驱动开发中断

linux内核中控制器中断号和中断号的关系