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正在输出有效的视频信号:如果显示器没有正常显示画面,VOP可能不会进入正常的时序周期,自然不会产生vblank信号。可以读取显示模式寄存器(比如
RK3328_TIMING_H_ACTIVE、RK3328_TIMING_V_ACTIVE),确认分辨率配置正确。 - 检查VOP是否绑定到了正确的显示接口(比如HDMI、LVDS),并且该接口已经完成初始化。Rockchip的VOP需要和显示控制器联动,接口未初始化的话,VOP可能处于 idle 状态。
- 确认VOP正在输出有效的视频信号:如果显示器没有正常显示画面,VOP可能不会进入正常的时序周期,自然不会产生vblank信号。可以读取显示模式寄存器(比如
调整寄存器读取的时机
- Vblank是脉冲式的信号,持续时间很短,如果在非vblank周期读取状态寄存器,大概率会读到0。可以尝试:
- 在注册的中断处理函数中读取
RK3328_INTR_STATUS0,看是否能捕获到置位的值。 - 用轮询的方式持续读取该寄存器,同时观察显示器的画面刷新,看是否能偶然读到非0值。
- 在注册的中断处理函数中读取
- 注意部分Rockchip VOP的状态寄存器是写1清除的,不过你这里始终读0,这条优先级稍低,但可以尝试先写1清除状态位,再等待读取。
- Vblank是脉冲式的信号,持续时间很短,如果在非vblank周期读取状态寄存器,大概率会读到0。可以尝试:
核查内核配置选项
- 确认内核编译时开启了Rockchip VOP相关的配置,比如
CONFIG_ROCKCHIP_VOP以及对应的子选项(如果有的话)。部分内核配置未开启的话,会导致VOP的中断框架无法正常工作。
- 确认内核编译时开启了Rockchip VOP相关的配置,比如
内容的提问来源于stack exchange,提问作者Lino




