DISPLAY(3)——RK3399 双路mipi拼接屏+HDMI 三屏显示

本文详细介绍了瑞芯微RK3399芯片中的VOP(Video Output Processor)功能,特别是其支持的双屏异显特性。通过配置VOPB和VOPL,可以实现不同分辨率的显示需求。同时,解释了MIPI-DSI接口的单通道和双通道工作模式,以及如何通过设备树配置实现双路MIPI屏的拼接显示。在时序控制、初始化序列和时钟参数设置方面提供了具体步骤,展示了如何点亮并拼接两个1080x1920分辨率的竖屏。最后提到了VOPLITTLE可用于额外的HDMI显示,从而实现三屏显示方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VOP

Rockchip 平台的LCD Controller 称为VOP(Video Output Processor),芯片中一般集成1~2 个VOP。只有支持两个VOP 的芯片,才能支持双屏异显。
RK3399 有两个VOP,分别为VOPB(4096x2160),VOPL(2560x1600),所以对于分辨率大于2560x1600 的应用,只能选择VOPB 作为输入。
在这里插入图片描述

MIPI-DSI

RK3399 VOP可以接单通道MIPI屏也可以接双通道MIPI屏。单通道一半对应的是4 lanes,双通道对应8 lanes。
1) Single-channel
在这里插入图片描述
2) Dual-channel (RK3288/RK3399)
① 标准的dual-channel 接口MIPI 屏;
在这里插入图片描述
② 分别接一样的屏,组合成dual-channel 接口MIPI 屏,panel0 显示左半屏,panel1 显示右
半屏。
在这里插入图片描述

双路mipi拼接屏

之所以可以做成双路mipi拼接显示,究其原因是RK3399的vop可以支持双通道mipi,借用这个特性,我们才能进行拼接。
我们选择了两个1080x1920分辨率的竖屏进行拼接,使用VOP BIG进行输出。

软件修改

reset引脚时序控制

在这里插入图片描述
根据手册提供的示意图可知,reset引脚需要先拉高,然后拉低保持tRESW时间,再拉高保持tREST时间,显示控制芯片就进入Initial Condition,这个时候我们就可以进行写初始化序列了。一般可以再找FAE确认一下reset的时序要求。

reset引脚控制时序

		fdtdec_set_gpio(&panel->reset_gpio, 1);
		msleep(panel->delay_init);

		fdtdec_set_gpio(&panel->reset_gpio, 0);
		msleep(panel->delay_reset);

		fdtdec_set_gpio(&panel->reset_gpio, 1);
		msleep(panel->delay_enable);

初始化序列

在设备树中配置mipi屏的初始化序列,在dsi节点中配置panel-init-sequence数组序列

&dsi {
	panel@0{
		panel-init-sequence = [
			39 10 04 B9 FF 83 99
			39 10 10 B1 02 04 6D 8D 01 32 33 11 11 5A 5F 56 73 02 02
			39 10 0C B2 00 80 80 AE 05 07 5A 11 10 10 00
			...
			15 10 02 D0 39
			15 64 02 11 00
			15 64 02 29 00
		];
	};
};

命令解析:

39 10 04 B9 FF 83 99

Data Type:0x39 (DCS Long Write)
Delay:0x10 (16 ms)
Payload Length:0x04 (4 Bytes)
Payload:0xB9 0xFF 0x83 0x99

进一步分析,该命令前3个字节属于命令格式,后面“B9 FF 83 99”才是要传输的指令。
B9是要写入的命令,“FF 83 99”是该命令后面的3个参数。
在这里插入图片描述

设置时钟参数

&dsi {
	panel@0{
 		display-timings {
 			native-mode = <&timing0>;
			timing0: timing0 {
				clock-frequency = <120000000>;
				hactive = <1080>;
				vactive = <1920>;
				hback-porch = <32>;
				hfront-porch = <32>;
				vback-porch = <10>;
				vfront-porch = <8>;
				hsync-len = <32>;
				vsync-len = <4>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};
	};
};

设置完这些,单个屏幕就可以正常点亮显示了,但这不是我们的目的,我们的目的是双屏拼接。

dual-channel

使能dsi1节点,配置“rockchip,dual-channel”、“dsi,lanes”属性。
将horizontal方向上的显示参数增加一倍,并将时钟频率调高一倍。

&dsi {
	status = "okay";
	rockchip,dual-channel = <&dsi1>;
	
	panel@0{
		dsi,lanes = <8>;
		display-timings {
			native-mode = <&timing1>;
			timing1: timing1 {
				clock-frequency = <240000000>;
				hactive = <2160>;
				vactive = <1920>;
				hback-porch = <64>;
				hfront-porch = <64>;
				vback-porch = <10>;
				vfront-porch = <8>;
				hsync-len = <64>;
				vsync-len = <4>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};
	};
};

&dsi1 {
	status = "okay";
};

修改完就可以点亮两块mipi屏了,效果如下:
在这里插入图片描述
在这里插入图片描述
两个MIPI使用了VOP BIG,VOP LITTLE还可以再支持一路HDMI显示。再插入HDMI,显示效果如下:
在这里插入图片描述
这样就可以实现瑞芯微教学视频中的三屏显示方案了,通过写app就可以做出三屏拼接显示或者三屏异显的方案。

### RK3399 DSI显示不亮解决方案及固件驱动排查 #### 问题分析 RK3399 设备上的 MIPI-DSI 幕无法正常显示可能由多种原因引起,包括硬件连接、配置文件设置以及驱动程序兼容性等问题。针对此类情况,建议按照以下方法逐一排查。 #### 排查步骤 #### 验证硬件连接 确认所有物理接口均已正确安装并牢固连接,特别是MIPI-DSI线缆是否存在松动或损坏的情况[^4]。对于开发板而言,还需确保电源供应稳定可靠,因为不足的供电可能导致显示器工作异常。 #### 检查启动参数与环境变量 进入Uboot命令行界面,通过`printenv`指令查看当前加载的各项参数是否合理,重点关注有关LCD控制器初始化的部分,比如`splashpos=margins,3840x2160`这类涉及分辨率设定的内容。必要时调整这些值使之匹配实际使用的面板规格[^3]。 #### 更新至最新版本内核与补丁集 鉴于Linux Kernel不断迭代优化过程中修复了不少已知缺陷,因此推荐基于官方发布的源码编译适用于目标平台的新版镜像,并应用来自社区贡献者提交的相关改进措施来增强稳定性。 #### 审视DTB(Device Tree Blob) 设备树描述符定义了SoC内部资源分配状况及其外围组件间的映射关系,在此环节需特别留意是否有遗漏指定某些必要的属性节点,例如: ```dts &dsi { status = "okay"; }; ``` 上述片段表明启用了DSI子系统服务,反之则会禁用该功能模块从而造成黑现象发生。 #### 测试不同模式下的输出效果 尝试切换成其他类型的视频信号传输方式(如HDMI),以此判断问题是特指于某一特定链路还是普遍存在于整个图形渲染管道之中。如果仅限前者,则说明很可能是因为缺少针对性的支持而导致的表现形式受限;相反若是后者的话,则暗示着更深层次的原因有待挖掘[^1]。 #### 日志记录审查 利用串口调试工具收集从加电自检直至最终呈现画面期间产生的各类提示信息,重点寻找报错字样或者警告标志,它们往往能够提供关于故障根源的重要线索。常见的日志获取途径有如下几种: - **Bootloader阶段**:观察TTL端口中传来的字符流; - **Kernel booting过程**:借助`dmesg | grep -i mipi`过滤出感兴趣的消息条目; - **User space应用程序层面上**:执行`journalctl -b -u display-manager.service`检索Xorg/Wayland等相关进程的日志文档。 #### 调整显示引擎相关寄存器数值 当常规手段均未能奏效之后,不妨考虑深入探究底层实现细节部分——即直接操作控制芯片内部的工作状态。这通常涉及到修改对应的内存地址区间内的数据位,改变刷新率、亮度等级等视觉特效参数,甚至重置整个流水线架构以期达到恢复正常运作的目的。不过需要注意的是,这种做法风险较大,实施前务必备份好原始配置以免造成不可逆损害。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值