RK356x MIPI屏显示调试


1. 前言

最近接触RK3566,同时也是第一次调试MIPI屏,本文主要记录,从拿到RK3566原厂SDK后到点亮MIPI屏的过程。

2. 环境介绍

硬件:野火鲁班猫1开发板(RK3566)、野火5.5寸MIPI屏
软件:原厂RK3566 SDK

3. 思路介绍

本文不仅分享点屏的过程,顺便分享当遇到一个新平台时,又应该做哪些准备?
其实在Linux中,想把一块屏幕点亮(无论是MIPI、RGB、LVDS),无非都是改改设备树,一般是不需要改驱动的。那第一个问题来了,既然要改设备树,那具体改哪个设备树文件?里面的参数怎么去改?改完之后怎么编译及如何验证?这些问题就是去熟悉新平台的SDK时,要做的准备工作。
对于MIPI屏而言,在调试层面上来看,只是比别的接口类型的屏幕多了一些调试参数,如初始化序列、反初始化序列,这部分参数要向屏幕厂商获取。
所以调试思路总结如下:
1、确认要修改的设备树文件;
2、设备树中修改关键引脚(背光脚、复位脚、使能脚);
3、修改屏幕timing时序
4、修改上下电时序
5、修改初始化序列和反初始化序列;
6、显示路由配置

4. 确认要修改的设备树文件

在SDK根目录执行./build.sh lunch选择板级配置时,会列出如下选择:
image.png
各配置单的说明如下表:
image.png
这里我选择的是rockchip_rk3566_evb2_lp4x_v10_defconfig,该配置文件的内容如下:

# <SDK>/device/rockchip/rk3566_rk3568/rockchip_rk3566_evb2_lp4x_v10_defconfig

RK_KERNEL_DTS_NAME="rk3566-evb2-lp4x-v10-linux"
RK_PARAMETER="parameter-buildroot-fit.txt"
RK_USE_FIT_IMG=y

可以看到,这里写出了编译时所使用的设备树文件为:rk3566-evb2-lp4x-v10-linux.dts
但是打开这个设备树文件一看,什么东西都没有:
image.png
这个设备树文件应该是RK留出来给用户修改用的,后续MIPI屏的适配,主要都是在这个设备树作修改。其它设备树节点的定义都在*.dtsi中。这个设备树文件最后总共会包含4个*.dtsi,分别是:rk3566-evb2-lp4x-v10.dtsirk3566.dtsirk3568.dtsirk3568-evb.dtsi

5. 设备树中修改关键引脚

5.1. 添加dsi0节点

RK3566有两个MIPI-DSI接口,鲁班猫1开发板上的MIPI接口使用的是MIPI-DSI0,那就复制rk3568-evb.dtsi中的dsi0节点到rk3566-evb2-lp4x-v10-linux.dts中,以备后续的修改。
同时先修改status属性为okay:
image.png

5.2. 修改屏幕背光引脚

背光用的是PWM0_M1,而原厂默认用的是PWM4。
image.png
自行添加backlight节点,修改pwms = <&pwm0 0 50000 0>:
image.png
继续自行添加pwm0节点,使能pwm0并修改pinctrl-0为pwm0m1:
image.png
至此,关于背光部分修改结束。

5.3. 添加屏幕复位引脚

根据原理图可以得出复位引脚为GPIO3_A4:
image.png
原本的dsi0节点没有描述复位引脚,所以这里自行添加复位引脚:
image.png

5.4. 添加屏幕使能引脚

根据原理图可以得出使能引脚为GPIO0_C0:
image.png
原本的dsi0节点没有描述使能引脚,所以这里自行添加使能引脚。但在最后的测试中,屏幕一直点不亮,对比野火已经适配好的设备树发现,这里的enable-gpios并不起作用,同时还需添加power-supply属性,这应该是屏幕电源相关的控制:
image.png
同时在rk3568-evb.dtsi中添加mipi_dsi0_power属性和在pinctrl节点下添加mipi_dsi0_pwr_en引脚:image.png
image.png

6. 修改屏幕timing参数

修改dsi0节点下的屏幕timing参数,这部分参考规格书或直接向屏厂咨询:
image.png

# 分辨率fps = 60
其中clock-frequency = (hactive+hsync+hbp+hfp) * (vactive+vsync+vbp+vfp) * fps

7. 修改上下电时序

MIPI屏的上下电时序通常都在规格书的Power on/off sequence章节中:
image.png

8. 修改初始化序列和反初始化序列

MIPI上下电后需要发送初始化或退出指令才能使之正常工作,我们需要向屏幕厂商获得所谓的初始化序列,如下图只是一部分:
image.png
图中的是初始化代码,不是初始化序列,我们需要将初始化代码转换成初始化序列后填入设备树中。
这些初始化代码可以总结出三个指令:SET_GENERIC、W_D、delay_ms,不同厂商呈现出的代码可能不同,但实际是一个意思。
SET_GENERIC:写命令
W_D:写数据
delay_ms:毫秒延时
了解了代码的基本构成后,如何将这些初始化代码转换成初始化序列呢?
首先初始化序列的格式如下:

命令类型 + 延时数量 + 数据长度 + 数据

转换可以分三个步骤:
1、确认数据的个数;
2、根据数据的个数确定命令类型;
3、确定延时时间;

现在以下图为例将初始化代码转换成初始化序列:
image.png
1、有几个W_D(),就代表数据个数有几个,这里的数据个数为4;
2、命令类型一共有三种(0x05、0x15、0x39):
0x05: 单字节数据 (DCS Short Write, no parameters)
0x15: 双字节数据 (DCS Short Write, 1 parameter)
0x39: 多字节数据 (DCS Long Write, n parameters n > 2)
这个例子中,数据个数超过了两个,所以命令类型为0x39;
3、这里没有延时时间,所以延时时间为0x00
所以最后的初始化序列为:

39 00 04 B9 FF 83 99

再举一个双字节数据的例子:
image.png
1、有几个W_D(),就代表数据个数有几个,这里的数据个数为2;
2、命令类型一共有三种(0x05、0x15、0x39):
0x05: 单字节数据 (DCS Short Write, no parameters)
0x15: 双字节数据 (DCS Short Write, 1 parameter)
0x39: 多字节数据 (DCS Long Write, n parameters n > 2)
这个例子中,数据个数为两个,所以命令类型为0x15;
3、这里没有延时时间,所以延时时间为0x00
所以最后的初始化序列为:

15 00 02 D2 77

再举一个有延时的例子:
image.png
1、有几个W_D(),就代表数据个数有几个,这里的数据个数为1;
2、命令类型一共有三种(0x05、0x15、0x39):
0x05: 单字节数据 (DCS Short Write, no parameters)
0x15: 双字节数据 (DCS Short Write, 1 parameter)
0x39: 多字节数据 (DCS Long Write, n parameters n > 2)
这个例子中,数据个数为1个,所以命令类型为0x05;
3、这里的延时时间为200ms,需要转为16进制,转换后为0xC8;
所以最后的初始化序列为:

05 C8 01 11

了解了转换方法后,将所有初始化代码转换成初始化序列,这个过程需要耐心。最后填到设备树dsi0节点的panel-init-sequence属性中:
image.png
反初始化序列也是如此:
image.png

9. 显示路由配置

Rockchip平台的LCD Controller称为VOP(Video Output Processor),芯片中一般集
成1~2个VOP。只有支持两个VOP的芯片,才能支持双屏异显。RK3566不支持双屏异显。
自行在设备树中添加关于dsi的相关配置:
image.png
route_dsi0:打开logo显示,指定VOP为vp0
video_phy0:使能phy0
dsi0_in_vp0:VOP Rounting,使能vp0
dsi0_in_vp1:VOP Rounting,关闭vp1
同时关闭hdmi的相关配置:
image.png

10. 最终的设备树文件

这里给出最终修改后的设备树文件作参考:

# rk3566-evb2-lp4x-v10-linux.dts

// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
/*
 * Copyright (c) 2020 Rockchip Electronics Co., Ltd.
 *
 */

#include "rk3566-evb2-lp4x-v10.dtsi"
#include "rk3568-linux.dtsi"
#include <dt-bindings/display/rockchip_vop.h>

&vp0 {
	cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>;
};

// 电源域配置,和本次调试MIPI屏无关
&pmu_io_domains {
	status = "okay";
	pmuio2-supply = <&vcc3v3_pmu>;
	vccio1-supply = <&vccio_acodec>;
	vccio3-supply = <&vccio_sd>;
	vccio4-supply = <&vcc_3v3>;
	vccio5-supply = <&vcc_3v3>;
	vccio6-supply = <&vcc_1v8>;
	vccio7-supply = <&vcc_3v3>;
};

// dsi Host
&dsi0 {
	status = "okay";
	#address-cells = <1>;
	#size-cells = <0>;

	dsi0_panel: panel@0 {
		compatible = "simple-panel-dsi";
		reg = <0>;
		backlight = <&backlight>;

		reset-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_LOW>;
		power-supply = <&mipi_dsi0_power>;
		//enable-gpios = <&gpio0 RK_PC0 GPIO_ACTIVE_HIGH>;
		
		enable-delay-ms = <35>;
		prepare-delay-ms = <6>;
		reset-delay-ms = <0>;
		init-delay-ms = <20>;
		unprepare-delay-ms = <0>;
		disable-delay-ms = <20>;

		size,width = <74>;
		size,height = <133>;

		dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
		dsi,format = <MIPI_DSI_FMT_RGB888>;
		dsi,lanes  = <4>;

		panel-init-sequence = [
			39 00 04 B9 FF 83 99
			15 00 02 D2 77
			39 00 10 B1 02 04 74 94 01 32 33 11 11 AB 4D 56 73 02 02
			39 00 10 B2 00 80 80 AE 05 07 5A 11 00 00 10 1E 70 03 D4
			15 00 02 36 02
			39 00 2D B4 00 FF 02 C0 02 C0 00 00 08 00 04 06 00 32 04 0A 08 21 03 01 00 0F B8 8B 02 C0 02 C0 00 00 08 00 04 06 00 32 04 0A 08 01 00 0F B8 01
			39 05 22 D3 00 00 00 00 00 00 06 00 00 10 04 00 04 00 00 00 00 00 00 00 00 00 00 01 00 05 05 07 00 00 00 05 40
			39 05 21 D5 18 18 19 19 18 18 21 20 01 00 07 06 05 04 03 02 18 18 18 18 18 18 2F 2F 30 30 31 31 18 18 18 18
			39 05 21 D6 18 18 19 19 40 40 20 21 06 07 00 01 02 03 04 05 40 40 40 40 40 40 2F 2F 30 30 31 31 40 40 40 40
			39 00 11 D8 A2 AA 02 A0 A2 A8 02 A0 B0 00 00 00 B0 00 00 00
			15 00 02 BD 01
			39 00 11 D8 B0 00 00 00 B0 00 00 00 E2 AA 03 F0 E2 AA 03 F0
			15 00 02 BD 02
			39 00 09 D8 E2 AA 03 F0 E2 AA 03 F0
			15 00 02 BD 00
			39 00 03 B6 8D 8D
			39 05 37 E0 00 0E 19 13 2E 39 48 44 4D 57 5F 66 6C 76 7F 85 8A 95 9A A4 9B AB B0 5C 58 64 77 00 0E 19 13 2E 39 48 44 4D 57 5F 66 6C 76 7F 85 8A 95 9A A4 9B AB B0 5C 58 64 77
			05 C8 01 11
			05 C8 01 29
		];

		panel-exit-sequence = [
			05 78 01 28
			05 00 01 10
		];

		disp_timings0: display-timings {
			native-mode = <&dsi0_timing0>;
			dsi0_timing0: timing0 {
				clock-frequency = <126884880>;
				hactive = <1080>;		//
				vactive = <1920>;		//
				hfront-porch = <5>;		//
				hsync-len = <5>;		//
				hback-porch = <5>;		//
				vfront-porch = <2>;		//
				vsync-len = <2>;		//
				vback-porch = <2>;		//
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <0>;
				pixelclk-active = <0>;
			};
		};

		ports {
			#address-cells = <1>;
			#size-cells = <0>;

			port@0 {
				reg = <0>;
				panel_in_dsi: endpoint {
					remote-endpoint = <&dsi_out_panel>;
				};
			};
		};
	};

	ports {
		#address-cells = <1>;
		#size-cells = <0>;

		port@1 {
			reg = <1>;
			dsi_out_panel: endpoint {
				remote-endpoint = <&panel_in_dsi>;
			};
		};
	};
};

// backlight
&backlight {
	pwms = <&pwm0 0 50000 0>;
};

// backlight
&pwm0 {
	status = "okay";
	pinctrl-0 = <&pwm0m1_pins>;
};

// dsi logo
&route_dsi0 {
	status = "okay";
	connect = <&vp0_out_dsi0>;
};

// dsi phy
&video_phy0 {
	status = "okay";
};

// dsi VOP Routing
&dsi0_in_vp0 {
	status = "okay";
};

// dsi VOP Routing
&dsi0_in_vp1 {
	status = "disabled";
};

// hdmi logo
&route_hdmi {
	status = "disabled";
};

// hdmi VOP Routing
&hdmi_in_vp0 {
	status = "disabled";
};

// hdmi VOP Routing
&hdmi_in_vp1 {
	status = "disabled";
};

// hdmi Host
&hdmi {
	status = "disabled";
};

11. 调试

编译设备树:

./build.sh kernel

打包:

./build.sh firware

更新镜像,如果成功的话,在启动过程中会显示RK的logo,最后会启动一个应用程序:
79200a8e-4209-4436-b53a-cdfff1d3daed.jpg

12. 总结

嵌入式Linux学习交流群:424571391

参考文章:LKD3568RK3399 Linux-SDK mipi屏幕驱动及调试

<think>好的,用户之前询问了海思3519A的开发资料获取方法,现在又问瑞芯微RK3588的资料获取。首先,我需要确定用户的需求是什么。可能用户正在比较不同芯片的开发资料获取难易程度,或者在选择合适的芯片方案。海思的资料需要官方授权,而瑞芯微作为国产芯片,可能有不同的获取途径。 接下来,我要分析瑞芯微RK3588的资料获取渠道。瑞芯微的官网通常是首要来源,需要检查官网是否有公开的文档下载,或者是否需要注册账号。另外,开发板供应商如Firefly或Rockchip官方提供的开发板可能会附带资料,这也是常见的情况。GitHub和开源社区可能有开发者分享的资源,比如SDK或工具链。技术论坛和社区如CSDN、知乎等也可能有用户分享的经验和教程。 还要考虑用户可能遇到的困难。例如,用户可能没有购买官方开发板,或者对如何注册和下载资料不熟悉。此外,用户可能需要具体的开发指导,比如系统移植、AI加速或者多媒体处理,这些部分在资料中是否容易找到。另外,用户可能对瑞芯微的技术支持和服务有疑问,比如如何联系技术支持,是否有活跃的社区支持。 需要比较之前回答的海思3519A的情况,瑞芯微可能更开放一些,资料更易获取,但具体情况需要核实。同时,提醒用户注意资料的版本兼容性,以及硬件设计时的注意事项,比如电源设计和接口配置。最后,可能还需要提到替代方案,但用户这次没有问,所以重点放在RK3588上。 总结,回答需要结构清晰,分点说明官方渠道、开发板供应商、开源社区、技术支持等,并给出注意事项和常见问题,确保用户能够顺利获取并有效利用开发资料。</think>瑞芯微(Rockchip)RK3588是一款高性能、多场景应用的国产SoC芯片,广泛应用于AIoT、边缘计算、智能NVR、AR/VR、车载等领域。其开发资料的获取相对开放,以下为详细的资料获取途径及开发指导建议: --- ### **一、官方资料获取渠道** #### 1. **瑞芯微官网与开发者平台** - **官网入口**:访问[瑞芯微官网](https://www.rock-chips.com/),进入“技术支持”或“开发者中心”页面。 - **注册账号**:需注册企业账号(个人开发者可能受限),通过审核后可下载部分资料。 - **核心资料内容**: - **SDK开发包**:Linux/Android系统源码、内核驱动、AI工具链(如RKNN-Toolkit)。 - **芯片手册**:Datasheet(功能模块说明)、硬件设计指南(HDK)、PCB参考设计。 - **工具链**:固件烧录工具(RKDevTool)、调试工具、性能分析工具。 #### 2. **开发板配套资料** - **官方开发板**:购买瑞芯微授权的开发板(如RK3588 EVB),通常会提供完整资料包。 - **第三方开发板**:如Firefly(萤火虫)的RK3588核心板,其官网提供: - 原理图与PCB设计文件(部分开放)。 - 预编译固件、Ubuntu/Android系统镜像。 - 外设驱动示例(如MIPI摄像头、PCIe接口配置)。 --- ### **二、开源社区与第三方资源** #### 1. **GitHub/Gitee开源仓库** - **官方仓库**:搜索 `rk3588`,可找到瑞芯微部分开源代码(如U-Boot、内核补丁)。 - **开发者贡献**: - 社区维护的Linux发行版(如Armbian、Debian适配)。 - AI模型部署示例(YOLO、ResNet等基于RKNN的推理代码)。 #### 2. **技术论坛与社群** - **国内论坛**: - [CSDN](https://blog.csdn.net/):搜索“RK3588开发笔记”,常见问题解答。 - [电子发烧友论坛](https://bbs.elecfans.com/):硬件设计经验分享。 - **海外社区**:XDA Developers、Reddit的嵌入式板块有开发者讨论。 --- ### **三、核心开发资料内容** 根据典型开发需求,重点关注以下资料: #### 1. **系统开发** - **Linux BSP**:内核配置(DTS文件)、设备树适配、外设驱动开发指南。 - **Android定制**:HAL层接口文档、传感器适配说明。 #### 2. **AI推理加速** - **RKNN-Toolkit2**:模型转换工具(支持TensorFlow/PyTorch转RKNN格式)。 - NPU文档:RK3588的6TOPS算力NPU使用指南、性能优化方法。 #### 3. **多媒体开发** - **视频编解码**:支持8K@60fps H.265的API接口文档。 - **多异显**:HDMI/DP/MIPI多路输出配置示例。 #### 4. **硬件设计** - **HDK硬件包**:包含电源设计、DDR4/LPDDR4布线规则、热设计建议。 - **信号完整性**:高速接口(PCIe 3.0、USB 3.1)的Layout指南。 --- ### **四、开发工具与调试支持** #### 1. **必备工具** - **RKDevTool**:用于烧录固件、分区擦写、日志抓取。 - **ADB/Fastboot**:Android系统调试。 - **OpenOCD/JTAG**:底层硬件调试(需配套调试器)。 #### 2. **技术支持** - 通过瑞芯微官方技术支持邮箱(support@rock-chips.com)提交问题。 - 购买开发板后,可联系供应商获取一对一技术支持(部分需付费)。 --- ### **五、注意事项** 1. **资料兼容性**:注意SDK版本与芯片型号的匹配(如RK3588与RK3588S的差异)。 2. **硬件设计门槛**:RK3588采用BGA封装,建议参考官方HDK或使用核心板方案。 3. **开源限制**:部分底层代码(如NPU驱动)未完全开源,需依赖官方库。 --- ### **六、替代资源推荐** 若官方资料获取困难,可尝试: - **第三方SDK整合包**:部分代理商提供简化版开发环境。 - **开发板社区**:如Firefly论坛提供丰富的RK3588教程与问答。 --- 建议优先通过官方开发板快速入门,结合社区资源解决具体问题。瑞芯微生态相对开放,适合中小企业和个人开发者快速验证产品原型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值