1.简介
我们有一个项目是双屏异显的(双 MIPI 屏),副屏是通过 rk618 的转换芯片,把 rgb 信号转成 mipi信号输出,但是转换出来的画面会有抖动的现象,log 打印的错误显示带宽不足
[ 127.410618] rockchip-vop ff470000.vop: [drm:vop_isr] ERROR WIN1_EMPTY irq err
[ 127.568685] rockchip-vop ff470000.vop: [drm:vop_isr] ERROR WIN1_EMPTY irq err
[ 130.254854] rockchip-vop ff470000.vop: [drm:vop_isr] ERROR WIN1_EMPTY irq err
2.调试过程
2.1 先关闭 dmc 定频,来查看现象
&dmc {
center-supply = <&vdd_logic>;
status = "disabled";
};
如果问题解决,说明当前的ddr频率没有问题,则把 dmc 打开
修改vop-dclk-mode值:0,1,2
vop-dclk-mode = <0>;
注: 常是改为 vop-dclk-mode = <1>;
2.2 如果上述修改不行,则需要修改 ddr 频率
改成 rk 支持的最大频率,查看现象,逐步调试成合适的频率,即可
&dmc {
status = "okay";
system-status-freq = <
/*system status freq(KHz)*/
SYS_STATUS_NORMAL 856000 //只保留这个改成这个列表里最高频率看看能不能行。
/* SYS_STATUS_REBOOT 666000
SYS_STATUS_SUSPEND 328000
SYS_STATUS_VIDEO_1080P 666000
SYS_STATUS_VIDEO_4K 856000
SYS_STATUS_VIDEO_4K_10B 856000
SYS_STATUS_PERFORMANCE 856000
SYS_STATUS_BOOST 856000
SYS_STATUS_DUALVIEW 856000
SYS_STATUS_ISP 856000 */
>;
auto-min-freq = <666000>;
auto-freq-en = <1>;
}
3.dts 参考说明
dmc: dmc {
compatible = "rockchip,rk3399-dmc";
devfreq-events = <&dfi>;
interrupts = <GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH 0>;
clocks = <&cru SCLK_DDRCLK>;
clock-names = "dmc_clk";
ddr_timing = <&ddr_timing>;
/* DDR 利用率超过 40%,开始升频;auto-freq-en=1 时才有效 */
upthreshold = <40>;
/* DDR 利用率低于 20%,开始降频;auto-freq-en=1 时才有效 */
downdifferential = <20>;
system-status-freq = <
/*system status freq(KHz)*/
/* 只有 auto-freq-en=0 时有效。表示除了下列场景以外的,都用这个场景 */
SYS_STATUS_NORMAL 800000
/* reboot 前的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_REBOOT 528000
/* 一级待机时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_SUSPEND 200000
/* 1080P 视频时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_VIDEO_1080P 300000
/* 4K 视频时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_VIDEO_4K 600000
/* 4K 10bit 视频时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_VIDEO_4K_10B 800000
/* 性能模式时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_PERFORMANCE 800000
/* 触屏时的 DDR 频率,用于从低频提高上来,改善触屏响应。当 auto-freq-en=1 时,会以此频率作为 min值,根据负载状况往上升频 */
SYS_STATUS_BOOST 400000
/* 双屏显示时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_DUALVIEW 600000
/* ISP 时的 DDR 频率。当 auto-freq-en=1 时,会以此频率作为 min 值,根据负载状况往上升频 */
SYS_STATUS_ISP 600000
>;
/* auto-freq-en=1 时有效,表示 normal 场景的最低频率 */
auto-min-freq = <400000>;
/* 等于 1,表示开启负载变频功能;等于 0,表示关闭负载变频功能。开启负载变频功能后,SYS_STATUS_NORMAL 场景将完全被负载负载变频接替,且最低频率以 auto-min-freq 为准,而不是以SYS_STATUS_NORMAL 定义的为准。而且开启负载变频后,其他场景定义的频率将作为最低频率,系统根据 DDR带宽的利用率状况,依据 upthreshold、downdifferential 来提高、降低 DDR 频率 */
auto-freq-en = <1>;
status = "disabled";
};