嵌入式Linux中使硬件中断(如DMA)显示在/proc/interrupts的必要步骤
嵌入式Linux下让硬件中断(如DMA)显示在
/proc/interrupts的具体步骤 1. 硬件层面确认中断配置
- 确保目标硬件(如DMA控制器)的中断输出引脚正确连接到CPU的中断控制器(如GIC、NVIC等)。
- 配置硬件寄存器开启中断触发:以DMA为例,需设置对应通道的中断使能位(如
DMA_CHx_INT_EN寄存器),确保DMA完成/出错时能触发中断信号。
2. 内核驱动中注册中断
在驱动代码中完成中断注册,这是中断能被/proc/interrupts识别的核心步骤:
- 使用
devm_request_irq()(推荐,自动管理资源释放)或request_irq()函数注册中断处理逻辑,关键参数说明:- 中断号:可通过设备树解析(
platform_get_irq())或平台数据获取; - 中断处理函数:自定义的中断响应逻辑(如DMA完成后的收尾操作);
- 触发类型:根据硬件特性设置,如
IRQF_TRIGGER_RISING(上升沿触发)、IRQF_TRIGGER_LEVEL_HIGH(高电平触发); - 中断名称:此名称会直接显示在
/proc/interrupts中,需清晰标识(如"dma-channel-0"); - 私有数据:传递给中断处理函数的设备上下文。
- 中断号:可通过设备树解析(
- 示例代码片段:
int irq = platform_get_irq(pdev, 0); if (irq < 0) { return irq; } ret = devm_request_irq(&pdev->dev, irq, dma_interrupt_handler, IRQF_TRIGGER_LEVEL_HIGH, "dma-channel-0", dma_dev); if (ret) { dev_err(&pdev->dev, "Failed to request IRQ %d\n", irq); return ret; }
3. 设备树(若使用)配置中断信息
如果系统采用设备树管理硬件资源,需在对应节点中添加interrupts属性:
- 示例DMA控制器节点配置:
dma-controller@12340000 { compatible = "vendor,dma-controller"; reg = <0x12340000 0x1000>; interrupts = <GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>; // 中断号、触发类型 #dma-cells = <1>; }; - 内核会自动解析设备树中的中断信息,驱动通过
platform_get_irq()即可获取正确的中断号。
4. 确保内核配置项开启
检查内核配置,确保相关子系统和驱动已启用:
- 基础中断子系统配置:
CONFIG_IRQ_SUPPORT、CONFIG_GENERIC_IRQ_CHIP(一般默认开启); - 目标硬件驱动配置:如DMA控制器对应的内核选项(如
CONFIG_AM335X_DMA、CONFIG_STM32_DMA等,根据SOC厂商选择); - 可通过
cat .config | grep CONFIG_XXX查看配置状态,或用make menuconfig调整。
5. 加载驱动并验证
- 编译驱动(若为模块)并加载:
insmod dma_driver.ko; - 执行
cat /proc/interrupts,查看是否存在之前设置的中断名称(如dma-channel-0); - 触发一次DMA操作,确认中断计数是否递增,验证中断功能正常。
常见排查点
- 若中断未显示,先通过
dmesg查看驱动注册日志,确认request_irq()是否成功; - 检查CPU中断控制器寄存器,确认对应中断未被屏蔽;
- 回查硬件连接和寄存器配置,确保中断信号能正常触发。
内容的提问来源于stack exchange,提问作者Creator
相关产品推荐
相关产品推荐

