接着上一篇文章
6.HDMI、MIPI转LVDS功能开发
RK3568本身有两个MIPI DSI接口,在GI-3568-B上,MIPI DSI0使用GM8775转换成LVDS接口。LVDS使用的是标准的2*15pin接口。

原理图如下

MIPI DSI1在板子背面,那个接口没有焊接。目前MIPI DSI的接口定义是没有通用标准的,不同分辨率的屏,是否带背光控制,是否带触摸,都会影响那个接口的定义,而且MIPI DSI的线不能拉太长,所以在商显上基本没有哪家使用MIPI DSI接口的。它的调试方法跟MIPI DSI0是类似的,这里就不介绍了。
RK3568B2上面有一个LCD控制器VOP2,最多可以支持三种不同的显示屏,根据这个板上实际的布局,使用HDMI+MIPI0的组合。

在RK3568上面,HDMI和MIPI DSI0均可以由VOP的port0 或者port1输出,不过VOP port0最大分辨率是4096*2304,port1最大分辨率是1920*1080,而HDMI本身最大输出是3840*2160,MIPI DSI本身最大输出是1920*1080,因此这里配置port 0输出到HDMI,port 1输出到MIPI DSI0,设备树配置如下


RK3568上面的VOP还支持多个图层,不过对于不需要特殊功能的Android来说,它的图层分配没有特殊要求,建议平均分配,如下图

这里vp0和vp1调换也是可以的
按上面的配置后,编译一个boot.img,烧录到板上,此时HDMI屏应该可以正常显示的。插上一个HDMI显示屏,如果显示屏支持EDID功能,那么这时应该能将分辨率配置为3840*2160,即4K。笔者的显示屏能支持EDID,如下图

输入命令cat /d/dri/0/summary可以查看此时VOP的状态,如下图,可以看到目前HDMI确实输出3840*2160分辨率

下面介绍如何配置显示屏和GM8775的参数。GM8775是成都振芯科技推出的一款DSI 转双通道 LVDS 发送器。其介绍如下图所示

上面有三个点需要关注,其一,LVDS支持单通道也支持双通道,这里要看LVDS显示屏的具体规格,一般1080p的屏使用的是双通道,720p以下的使用单通道。
然后它可以支持MIPI时钟作为它的工作时钟,也可以支持外部晶振,不过要注意,如果使用MIPI时钟,在MIPI控制器工作之前,这个芯片是不工作的,它的IO状态未知。GI-3568-B上,这款芯片接了外部25M晶振,因此使用外部晶振给它提供时钟。
最后一个点,它支持MIPI命令模式配置寄存器,也支持I2C方式配置寄存器,两种的效果是一样的,笔者这里使用MIPI命令的方式。
然后GM8775厂家有个工具,可以生成寄存器配置表,如下

然后点击GENERATE按钮生成一个配置。将这个配置填到设备树dsi0_panel的panel-init-sequence属性里面。如下图

这个MIPI的command填写方式,RK文档RKDocs/common/display/Rockchip_Developer_Guide_DRM_Panel_Porting_CN&EN.pdf里面有介绍。其中0x23是2个参数的,第一个参数是寄存器,第二个参数是寄存器值。

屏幕TCON板电源从那个2*15pin的座子上面取,注意不同屏幕的TCON板电源是不同的,需要通过板上J17选择电压。

这个电源通过GPIO2_D7,原理图如下

在设备树配置

最后还有MIPI 本身的分辨率需要配置,按照屏幕的规格书填写即可。有些屏幕只提供了htotal和vtotal,没有具体的vfp hfp这些信息的,那就是满足
Htotal = Hactive + Hsync + HfrontPorch + HbackPorch
Vtotal = Vactive + Vsync + VfrontPorch + VbackPorch
关系即可

另外还有个PWM背光控制,不过笔者这里的屏不支持亮度调整,因此不需要关注。
设备树修改之后,编译一个boot.img,再烧录到板上,接上屏幕,可以看到屏幕正常显示

其VOP信息如下

可以看到DSI确实输出1920*1080分辨率。
如果屏不亮,首先要检查背光,有些屏的背光需要使能,然后万用表测量TCON板的供电是否有问题。如果显示花屏,则需要再对照屏幕规格书看参数是否有误。