You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Rockchip VOP自定义DRM图形驱动IRQs未触发及状态寄存器读取异常问题求助

排查Rockchip RK3328 VOP中断与Vblank检测问题

我之前在Rockchip平台做过VOP驱动的定制开发,碰到过和你几乎一模一样的问题,给你梳理几个排查方向,应该能帮你定位问题:

  • 确认寄存器地址与基地址映射正确性

    • 先核对RK3328_INTR_STATUS0的偏移量是否和RK3328芯片手册一致,有时候内核头文件里的定义可能存在笔误。可以尝试直接用手册上的十六进制偏移(比如0x0030,具体以官方手册为准)替换宏定义,写成status = *((unsigned int *)(vop + 0x0030))再测试。
    • 验证vop基地址的映射是否正确:读取几个你已经配置过的寄存器(比如分辨率设置寄存器RK3328_DISP_CTRL),看返回值是否和你配置的一致。如果不一致,说明ioremap的基地址有问题,中断相关寄存器自然也读不对。
  • 检查中断启用的完整链路

    • 除了VOP内部的中断使能寄存器(RK3328_INTR_EN0)要置位vblank对应的位,还要确认GIC(通用中断控制器)层面是否启用了该中断:
      • 确保你已经在驱动中调用request_irq()注册了VOP中断的处理函数,并且没有返回错误。
      • 检查GIC的中断掩码寄存器,确认VOP对应的中断号没有被屏蔽。
    • 仔细核对RK3328_INTR_EN0中要置位的位是否是垂直消隐中断对应的位,不要误开启了其他类型的中断(比如帧结束中断)。
  • 验证VOP的工作状态与显示链路

    • 确认VOP正在输出有效的视频信号:如果显示器没有正常显示画面,VOP可能不会进入正常的时序周期,自然不会产生vblank信号。可以读取显示模式寄存器(比如RK3328_TIMING_H_ACTIVERK3328_TIMING_V_ACTIVE),确认分辨率配置正确。
    • 检查VOP是否绑定到了正确的显示接口(比如HDMI、LVDS),并且该接口已经完成初始化。Rockchip的VOP需要和显示控制器联动,接口未初始化的话,VOP可能处于 idle 状态。
  • 调整寄存器读取的时机

    • Vblank是脉冲式的信号,持续时间很短,如果在非vblank周期读取状态寄存器,大概率会读到0。可以尝试:
      • 在注册的中断处理函数中读取RK3328_INTR_STATUS0,看是否能捕获到置位的值。
      • 用轮询的方式持续读取该寄存器,同时观察显示器的画面刷新,看是否能偶然读到非0值。
    • 注意部分Rockchip VOP的状态寄存器是写1清除的,不过你这里始终读0,这条优先级稍低,但可以尝试先写1清除状态位,再等待读取。
  • 核查内核配置选项

    • 确认内核编译时开启了Rockchip VOP相关的配置,比如CONFIG_ROCKCHIP_VOP以及对应的子选项(如果有的话)。部分内核配置未开启的话,会导致VOP的中断框架无法正常工作。

内容的提问来源于stack exchange,提问作者Lino

火山引擎 最新活动