摄像头硬件中断基础:传感器中断类型与中断控制器连接

摄像头传感器在图像采集过程中会产生多种硬件中断信号,这些信号通过中断控制器路由至CPU,是驱动实现帧同步、错误恢复和流控的基础。理解传感器中断类型及其与中断控制器的连接方式,是优化V4L2驱动中断处理路径的前提。

2.1 摄像头传感器核心中断类型

图像传感器(Sensor)在逐行扫描和逐帧输出数据时,会通过专用引脚或MIPI CSI-2嵌入式数据包向主机控制器发送三类主要中断:

中断类型 缩写 触发条件 典型频率 驱动用途
帧同步中断 VSYNC 一帧图像传输开始/结束 30~120 Hz 帧起始/结束标记、DMA描述符切换、帧计数
行同步中断 HSYNC 一行像素传输开始/结束 数十~数百 kHz 行级时间戳、部分ISP逐行处理
FIFO溢出中断 FIFO_OVF 传感器内部FIFO或接收端FIFO满 偶发 错误恢复、流控降帧、DMA重配置
优化要点: VSYNC是驱动中最关键的中断,通常绑定到高优先级IRQ线;HSYNC频率过高,在嵌入式场景中通常不直接作为中断使用,而是通过DMA完成中断或硬件行计数器间接获取;FIFO溢出中断虽然频率低,但处理延迟直接影响丢帧率,必须纳入中断嵌套或工作队列机制。

2.2 中断信号在传感器与主机之间的物理连接

传感器中断信号从Sensor芯片到CPU中断控制器,通常经过以下路径:

  1. Sensor引脚输出: VSYNC/HSYNC通过专用GPIO引脚或MIPI CSI-2虚拟通道内的嵌入式数据包(Embedded Data)传输。
  2. 桥接/ISP芯片: 部分平台使用FPGA或独立ISP桥接Sensor,桥接芯片将Sensor中断信号转换为SoC可识别的电平或边沿触发信号。
  3. 中断控制器(GIC/INTC): SoC内部通用中断控制器(如ARM GIC、RISC-V PLIC)对多路中断进行优先级仲裁和分发。
  4. CPU核: 中断信号最终送达指定CPU核的IRQ线,触发异常处理。
硬件连接示例(MIPI CSI-2 + I2C控制):
Sensor VSYNC → SoC GPIO_IRQ_17 → GIC SPI #89 → CPU Core 0 IRQ
Sensor HSYNC → SoC GPIO_IRQ_18 → GIC SPI #90 → CPU Core 1 IRQ(可选)
FIFO_OVF → SoC GPIO_IRQ_19 → GIC SPI #91 → CPU Core 0 IRQ

2.3 中断控制器与CPU的连接架构

下图展示了典型嵌入式SoC中摄像头中断从Sensor到CPU核的完整路由架构:

摄像头中断信号路由架构 图像传感器 VSYNC (GPIO_17) HSYNC (GPIO_18) FIFO_OVF (GPIO_19) 桥接/ISP芯片 电平转换 边沿检测 中断合并 中断控制器 GIC / PLIC / INTC 优先级仲裁 SPI #89~91 CPU Core 0/1 IRQ异常处理 中断嵌套/线程化 说明: • VSYNC通常映射到高优先级SPI,确保帧同步低延迟。 • HSYNC频率过高时,可通过DMA完成中断替代,避免中断风暴。 • FIFO溢出中断需配合工作队列处理,不可在硬中断上下文中执行复杂恢复逻辑。

2.4 中断触发方式与驱动配置

Sensor中断信号在中断控制器侧可配置为不同的触发方式,直接影响中断响应延迟和误触发概率:

触发方式 适用中断 优点 缺点
上升沿触发 VSYNC(帧起始) 精确捕获帧边界 易受毛刺干扰
下降沿触发 VSYNC(帧结束) 配合DMA传输完成 需确认Sensor极性
电平触发(高/低) FIFO溢出 持续通知直到清除 需配合硬件清除机制
双边沿触发 HSYNC(调试用) 同时捕获起止 中断频率翻倍
常见陷阱: 部分Sensor的VSYNC极性在初始化阶段可通过I2C寄存器配置,但默认极性因厂商而异。驱动在probe阶段必须读取Sensor ID并调用v4l2_subdev_call(sd, video, g_std, &std)或直接读取寄存器确认极性,否则可能导致中断丢失或帧偏移。

2.5 中断共享与中断线复用

在资源受限的嵌入式平台中,多个Sensor或外设可能共享同一根中断线。中断共享对驱动设计提出以下要求:

  • 中断处理函数必须检查设备状态寄存器: 确认中断是否由本设备触发,避免误处理。
  • 使用IRQF_SHARED标志: 在request_irq()中显式声明共享中断。
  • 避免在共享中断中执行耗时操作: 共享中断的延迟会叠加影响所有共享设备。
  • 优先使用专用中断线: 对于VSYNC等实时性要求高的中断,应在设备树中分配独立中断线。
设备树中断配置示例(双Sensor共享中断线):
sensor0: camera@10 {
    compatible = "vendor,sensor";
    reg = <0x10>;
    interrupt-parent = <&gic>;
    interrupts = <GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
    /* 共享中断需在驱动中设置 IRQF_SHARED */
};

sensor1: camera@20 {
    compatible = "vendor,sensor";
    reg = <0x20>;
    interrupt-parent = <&gic>;
    interrupts = <GIC_SPI 89 IRQ_TYPE_EDGE_RISING>;
};

2.6 中断延迟对摄像头性能的影响

中断延迟(Interrupt Latency)是驱动优化的重要指标。对于摄像头中断,延迟主要来自以下环节:

延迟环节 典型耗时 对摄像头的影响
中断控制器仲裁 几十~几百 ns 可忽略
CPU中断屏蔽(local_irq_disable) 取决于临界区长度 可能导致VSYNC丢失
中断处理函数执行 几~几十 μs 影响帧间隔稳定性
中断下半部(tasklet/workqueue)调度 几十~几百 μs 增加帧处理延迟
优化方向: VSYNC中断处理函数应仅做最轻量操作(如设置标志位、唤醒等待队列),将DMA描述符更新和帧处理移至下半部或内核线程。对于FIFO溢出中断,建议使用irq_wake_thread()机制将恢复逻辑完全线程化,避免阻塞高优先级VSYNC中断。

2.7 本章小结