3、显示中断类型:VSYNC中断、HSYNC中断、FIFO上溢/下溢中断、EDID中断

在龙芯HDMI调试过程中,显示中断是驱动与硬件交互的核心信号。中断丢失会导致画面撕裂、黑屏、分辨率识别失败等严重问题。本节详细梳理HDMI控制器涉及的四种关键中断类型,帮助开发者建立中断分类排查的思维框架。

3.1 中断类型总览

龙芯HDMI控制器(以LS2K/LS7A系列为例)内部集成了多个中断源,通过中断状态寄存器(INT_STATUS)统一上报。下表列出四种主要中断及其典型触发条件:

中断类型 英文缩写 触发条件 典型丢失后果
垂直同步中断 VSYNC 每帧扫描结束,VBLANK起始 帧同步失败,画面撕裂或卡顿
水平同步中断 HSYNC 每行扫描结束,HBLANK起始 行同步偏移,图像错位
FIFO上溢/下溢中断 FIFO_OVER/UNDER 像素FIFO缓冲区满或空 像素数据丢失,花屏或黑屏
EDID中断 EDID_READY 显示器EDID数据读取完成 分辨率/刷新率识别失败
排查提示: 在龙芯平台调试时,建议先通过 /proc/interrupts 查看中断计数是否递增。若VSYNC计数停滞,优先检查中断控制器(INTC)的使能位和触发方式(边沿/电平)。

3.2 VSYNC中断——帧同步的基石

VSYNC(垂直同步)中断是显示驱动中最关键的中断。它标志着显示器从可视区域切换到垂直消隐区(VBLANK),驱动在此中断中完成帧缓冲区切换(Flip)、光标更新、统计帧率等操作。

VSYNC中断丢失的典型场景:

  • 中断线共享冲突: 龙芯平台多个外设共享同一中断线,若未正确设置IRQ类型(如边沿触发被误配为电平触发),可能导致中断丢失。
  • 中断嵌套未处理: 在VSYNC中断服务程序中执行了耗时操作(如DMA等待),导致后续VSYNC中断被CPU屏蔽。
  • 时钟门控关闭: HDMI控制器时钟被意外关闭,中断信号无法传递到中断控制器。
调试命令: 使用 cat /sys/kernel/debug/irq/irqs/<IRQ_NUM> 查看中断触发次数和CPU亲和性,确认VSYNC中断是否均匀分发到各CPU核心。
VSYNC中断处理流程 HDMI VSYNC 硬件触发 INTC 中断控制器转发 CPU 执行 ISR 服务函数 帧缓冲切换 / 统计更新 丢失排查点 ① 检查INTC使能位 ② 确认IRQ触发类型 ③ 查看/proc/interrupts计数

3.3 HSYNC中断——行同步的精度

HSYNC(水平同步)中断在每行扫描结束时触发,用于精确控制行消隐期间的像素填充和同步信号生成。在龙芯HDMI驱动中,HSYNC中断通常用于调试模式下的行计数器校准。

HSYNC中断与VSYNC中断的对比:

对比项 VSYNC中断 HSYNC中断
触发频率 60Hz(典型) 数十KHz(取决于分辨率)
中断负载 低 高(需谨慎处理)
主要用途 帧切换、VBLANK操作 行计数器、调试校准
丢失影响 画面撕裂、帧率异常 行同步偏移、图像错位
性能警告: 在龙芯平台中,HSYNC中断频率远高于VSYNC。若在HSYNC ISR中执行复杂操作(如打印日志),会严重拖慢系统响应,甚至导致中断丢失。建议仅在调试阶段开启HSYNC中断,并配合 printk_ratelimit 限制输出。

3.4 FIFO上溢/下溢中断——像素缓冲区的健康信号

HDMI控制器内部使用FIFO(先进先出)缓冲区来平滑像素数据的传输。当FIFO发生上溢(Overflow)或下溢(Underflow)时,表示数据流出现异常,驱动必须立即响应。

FIFO中断的触发原因:

  • 上溢(Overflow): 写入速度超过读取速度,FIFO满后继续写入。常见于DMA传输过快或显示器消隐期过短。
  • 下溢(Underflow): 读取速度超过写入速度,FIFO空后继续读取。常见于内存带宽不足或DMA延迟过高。
调试方法: 在龙芯平台中,通过读取HDMI控制器的 FIFO_STATUS 寄存器(偏移地址0x1C)可以获取当前FIFO水位。若频繁触发上溢/下溢中断,应调整DMA传输粒度或增加FIFO深度(如果硬件支持)。
FIFO中断状态机 正常传输 FIFO上溢 FIFO下溢 驱动恢复处理 恢复策略:驱动读取FIFO_STATUS寄存器 → 清空中断标志 → 重置DMA指针 → 重新使能传输

3.5 EDID中断——显示器的身份识别

EDID(Extended Display Identification Data)中断在HDMI控制器完成显示器EDID数据读取后触发。EDID数据包含显示器的分辨率、刷新率、色彩空间等关键参数,是驱动初始化时序的必备信息。

EDID中断丢失的典型原因:

  • I2C总线故障: EDID通过DDC通道(I2C)读取,若I2C时钟线(SCL)或数据线(SDA)电平异常,中断不会产生。
  • 中断标志未清除: 驱动在读取EDID后未正确清除中断状态寄存器中的EDID_READY位,导致后续中断被阻塞。
  • 热插拔检测(HPD)未联动: 部分龙芯平台需要先检测到HPD信号变化,才能触发EDID读取。若HPD中断丢失,EDID中断也不会产生。
快速验证: 在驱动加载后,执行 cat /sys/class/drm/card0-HDMI-A-1/edid | hexdump -C 查看EDID原始数据。若输出为空或显示“No such device”,说明EDID中断未触发或读取失败。
EDID中断与HPD联动流程 显示器插入/唤醒 HPD中断触发 启动DDC读取EDID EDID中断 驱动解析EDID并配置时序 丢失排查:检查HPD中断是否触发 → 确认DDC I2C地址(0x50)是否可访问 → 查看EDID_READY标志位

3.6 中断丢失的通用排查步骤

针对上述四种中断类型,总结以下通用排查步骤,适用于龙芯HDMI调试场景:

  1. 确认中断使能: 读取HDMI控制器的 INT_ENABLE 寄存器,确保对应中断位已置1。
  2. 检查中断状态: 读取 INT_STATUS 寄存器,确认中断标志是否被硬件置位。若置位但CPU未响应,问题出在中断控制器或CPU侧。
  3. 验证中断线连接: 使用 cat /proc/interrupts | grep hdmi 查看中断号及触发次数。若计数不增加,检查设备树中中断描述是否正确。
  4. 排查中断服务程序: 在ISR入口处添加 printk 或使用tracepoint,确认函数是否被调用。若被调用但功能异常,检查ISR中是否遗漏了中断标志清除操作。
  5. 硬件信号测量: 使用示波器测量HDMI控制器的中断输出引脚(如IRQ_OUT),确认硬件是否产生脉冲信号。
龙芯平台特殊注意: 龙芯LS2K/LS7A系列的中断控制器支持“边沿触发”和“电平触发”两种模式。对于VSYNC和HSYNC这类周期性脉冲信号,必须配置为边沿触发;若误配为电平触发,可能导致中断被重复触发或丢失。请在设备树中显式指定 interrupts = <0 IRQ_TYPE_EDGE_RISING>。