嵌入式Linux / 工程师面试高频题 /
传感器的INT引脚已经连接到SoC的GPIO,但驱动一直收不到中断。面试官问你设备树怎么写、驱动怎么申请IRQ,实际考查的是设备树中断描述、GPIO控制器中断能力和Linux内核GPIO descriptor接口。
面试先说结论
设备树通常通过interrupt-parent和interrupts描述设备的中断控制器及中断号/触发类型;如果驱动先通过*-gpios属性获取GPIO描述符,也可以在GPIO配置为输入后使用gpiod_to_irq()转换为IRQ,再通过devm_request_threaded_irq()等接口注册中断处理。具体写法必须匹配SoC的GPIO控制器binding和芯片数据手册,不能把GPIO序号直接当成Linux全局IRQ号。
一、核心原理与工程判断

设备树中interrupts和*-gpios不是一回事
*-gpios属性用于描述设备使用的GPIO线路,例如复位脚、使能脚或状态输入脚;interrupts属性用于描述设备的中断资源,包括中断控制器、硬件中断号和触发类型。某些GPIO控制器本身也提供中断功能,因此GPIO引脚可以作为中断源,但设备树写法必须符合对应控制器的binding。
interrupt-parent和interrupts如何配合
interrupt-parent用于指定该设备的中断父控制器,interrupts则按照该控制器的#interrupt-cells格式填写中断信息。不同SoC的GPIO控制器可能需要填写GPIO线号、触发类型等字段,也可能使用interrupts-extended显式指定父控制器。不能把示例中的数字直接照搬到其他芯片。
驱动如何获取IRQ
如果平台设备的设备树已经将中断资源映射为platform IRQ,可以通过platform_get_irq()获取;如果驱动是通过GPIO descriptor获取中断脚,则需要确认该GPIO配置为输入,再调用gpiod_to_irq()转换为IRQ号。新驱动优先使用descriptor接口,避免继续依赖已不推荐的全局GPIO整数编号。
中断服务函数要不要使用线程化中断
硬中断上半部应尽量短,不要执行可能睡眠的I2C/SPI访问、长时间延时或复杂处理。若传感器中断后需要通过I2C读取状态寄存器,可使用devm_request_threaded_irq()注册线程化处理函数,在合适的上下文中完成耗时操作,并根据芯片要求清除中断源。
二、实际排查与设计步骤
先查SoC设备树binding和原理图,确认INT引脚对应哪个GPIO控制器、哪个引脚号,以及中断触发方式是上升沿、下降沿还是电平触发。
在设备树中按芯片binding填写interrupt-parent、interrupts或interrupts-extended;如果还需要普通GPIO控制属性,再单独配置对应的*-gpios。
驱动中通过platform_get_irq()或gpiod_to_irq()获取IRQ,检查返回值是否为负错误码,并确认GPIO已设置为输入。
使用devm_request_threaded_irq()或适合的IRQ接口注册中断,测试中断触发、屏蔽/清除、重复进入和系统休眠唤醒行为。
三、面试中的常见失分点
误区1:把设备树中的GPIO编号直接当成Linux IRQ编号使用,忽略GPIO控制器的IRQ domain映射。
误区2:在硬中断上半部直接调用可能睡眠的I2C/SPI接口,导致内核告警、死锁或系统异常。
四、面试官可能继续追问
面试追问:设备树里配置了下降沿中断,但驱动始终收不到中断,你会从哪些方向排查?
先用示波器确认INT引脚确实产生下降沿,再检查引脚复用、上下拉、电平有效方式、interrupt-parent和触发类型是否与硬件一致;随后检查GPIO控制器是否启用IRQ功能、驱动是否成功获取IRQ、申请中断是否返回错误,以及中断源是否需要先清状态才能再次触发。
相关业务与课程
围绕电子工程师岗位能力,了解对应方向的系统课程。

扫码关注






























