i.MX 8M Plus是NXP推出的一款具有高可靠性,适合用于机器学习和视觉、高级多媒体和工业物联网的处理器。为发挥其强大的多媒体性能,启扬在i.MX8M Plus配套底板上引出1 路 4 通道 MIPI-DSI 显示接口、1 路双通道 LVDS 显示接口、1 路 HDMI 显示接口(内含 eARC 功能),支持三屏同显和三屏异显。
今天小编将简单分享一下启扬IAC-IMX8MP-Kit开发板在连接LVDS屏幕的过程中所进行的一系列调试过程。
注意:本文不着重于硬件的适配过程,只从软件角度分析,默认LVDS屏幕连接正确,背光等连接正常。
工具:启扬IAC-IMX8MP-Kit开发板、1920x1080@60双通道LVDS屏幕
1、分析屏幕手册
首先,我们需要查看LVDS屏幕的datasheet,然后从中找出屏幕引脚图说明,如图所示:
从上图我们可以看出该屏幕是一个双通道的LVDS屏幕,一般来说这种屏幕的颜色模式是3x8bit。
从数据手册中我们能看到LVDS接口类型和信号格式。一般来说LVDS显示屏有VESA和JEIDA两种接口标准,两种接口标准的区别在于每对低压差分信号上传输的R、G、B三色的位数和HS、VS、DE位置不同。8bit液晶屏需要4对差分对传输R、G、B三色和HS、VS、DE控制信号,如下图所示
根据下面数据手册中内容与上图接口标准的对照,我们可以看出本次调试使用的LVDS屏幕的接口标准属于VESA标准。
除了上述信息外,我们还需要timing参数,这个参数能够详细地表述屏幕的显示区域,在数据手册中显示如下图所示
一般来说,我们需要Vactive+vbp+vfp+vsync以及Hactive+hbp+hfp+hsync还有时钟等信息,这些参数有的屏幕手册会详细写出,而有的则给出如上图类似的信息。
这里笔者给大家简要说明一下参数的关系,具体参数的意义因篇幅原因大家可以搜专业的解说帖子。
图中V_active以及H_active就是我们屏幕实际的分辨率参数,也就是1920*1080。上图中H_active之所以显示为960,这是因为该屏幕是一个分割屏幕,由两块儿屏幕组装而成,所以Horizontal显示的参数都要乘以2。
图中TVB=bp+fp+sync,所以vbp+vfp+vsync=36、hbp+hfp+hsync=92x2=184,时钟这里直接给出是70.5Mhz,因此不需要进行计算。
以上就是数据手册中上我们需要在意的参数部分。
此外我们需要重点关注的还有电压电流以及上电时序等信息,只是这部分信息一般情况下都由硬件工程师通过硬件手段帮忙适配。如果需要参与软件控制也不属于LVDS适配层面,那么这里就不再过多的讲述,那么就期待我们下章关于代码部分的适配工作吧。
2、 软件代码适配
本次启扬i.MX8M Plus开发板需要适配一款1920*1080@60 的双通道LVDS屏幕,适配流程与以往i.MX系列的适配仅需要在相关设备节点写timing不同,本次屏幕适配采用DRM驱动框架适配,因此我们需要先从设备树开始入手。
不着重分析DRM驱动以及详细的适配过程,仅从修改适配方向入手,为如何快速的适配一组LVDS屏幕提供参考。
打开设备树文件(arch/arm64/boot/dts/freescale/imx8mp-qiyang-NV156FHM.dts)。
这里为适配多屏而单独新建了一个设备树文件,这样就可以加载不同的设备树点不同的屏幕,避免了在同一个设备树上持续更改的繁琐。
首先,#include一行直接带入主设备树,将开发板周边设备一同囊括进来。
其次,lvds0_panel_pwr节点是通过适配开发板上的电源管理芯片,将电源管理芯片的输出电压拉到lvds上使用,所以lvds供电由一个电源管理芯片来控制。
lvds0_panel节点主要是描述lvds的相关属性。例如compatible属性是为了匹配DRM相关驱动,因为此次适配的是一个双通道的屏幕,所以写“regulator-fixed”属性;backlight节点是背光节点;power节点引用上面lvds0_panel_pwr节点,描述电源的部分;重要的是port节点,该节点指明LVDS屏幕是接在哪个显示通道上,需要结合下面ldb节点的内容来看。
(这里只是简单描述一下这些节点的意思,具体包含的详细信息需要查看启扬开发板内核资料
Documentation/devicetree/bindings/media/video-interfaces.txt)
lvds-channel@0节点表示显示适配器开通了一个lvds的通道,然后该通道有mapping以及width两个属性,mapping表示颜色的模式,width表示数据宽度,这里我们根据屏幕数据手册的内容可以直接写spwg以及24。
port@1表示使用的是通道1。现在图形处理器日益强大,很多图形处理器可以开多通道,这里我们就开一个通道,然后将端点设置为我们上面描述的lvds,这样的话我们就把ldb部分给配通了。
(更加详细的解释可以到提供的开发板系列资料Documentation/devicetree/bindings/display/imx/ldb.txt查看。)
总结一下就是我们需要在显示适配器开通一个通道,然后这个通道是用来点lvds的,具体点哪个lvds需要endpoint节点的指引,然后再描述lvds,一般里面要写具体是哪个屏幕,电源,背光等一系列信息,还要跟ldb的内容互通,这样保证两者能够相互找到,启动之后驱动就会根据compatible节点去匹配屏幕。