本文以Hi3516DV300为例

参考资料:

1.《HiMPP V4.0 媒体处理软件 FAQ.pdf》关于lcd屏和vo的部分
2.《MIPI使用指南.pdf》
3.开机画面使用指南.pdf
4.《LCD╱MIPI 屏幕对接 使用指南.pdf》
5.《HiMPP V4.0 媒体处理软件开发参考.pdf》中的视频输出章节
6.《Hi3516DV300 专业型 Smart IP Camera SoC 用户指南.pdf》

0x00. MIPI屏参数和VO参数的确定

LCD&MIPI设备的属性:

先了解MIPI DSI协议的LCD屏时序相关的参数:

  • 粉红色区域为 MIPI 屏显示的有效区域, 两条直线即 MIPI 屏的宽高;
  • 紫色区域的两条直线为行同步前后消隐区像素个数以及帧同步前后消隐区行数;
  • 淡黄色区域的两条直线为行同步脉冲区像素个数以及帧同步脉冲区行数;

对于一块新的屏幕,首先需要确定屏的下列显示参数。
VS(VSA),VFP,VBP,VACT,HS(HAS),HBP,HFP,HACT,PCLK,PHY_DATA_RATE,
这些参数需要从对应的屏的手册中获取或者计算得来。
如下图:


屏幕datasheet和hisi手册中的屏幕含义对照


由以上可知,需要计算获得phy_data_ratepixel_clk
phy_data_rate:MIPI_TX的数据输入速率,单位为 Mbps。
pixel_clk:像素时钟。
其中:
output_format: 输出色彩格式,根据厂家支持情况自主选择,一般为24位,即R,G,B各用一个字节表示。
frame_rate: 帧率,一般为60帧。
lane_num: mipi_tx使用的lane数。

0x01. MIPI屏幕初始化

一般屏幕都需要刷入一组厂家提供的命令来初始化屏幕,
屏幕厂商提供的初始化序列一般有寄存器地址和对应的数据, 因此需要根据屏幕厂商给的序列,填充数据类型。
命令的发送形式有这些:

详细例子参考《LCD╱MIPI 屏幕对接 使用指南.pdf》

0x02. VO输出参数配置和时钟配置





下面以 Hi3519AV100 上配置 384*288P@25fps 的用户时序为例,stSyncInfo 的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pstPubAttr->stSyncInfo.bSynm = 0;
pstPubAttr->stSyncInfo.bIop = 1;
pstPubAttr->stSyncInfo.u8Intfb = 0;
pstPubAttr->stSyncInfo.u16Vact = 288;
pstPubAttr->stSyncInfo.u16Vbb = 200;
pstPubAttr->stSyncInfo.u16Vfb = 112;
pstPubAttr->stSyncInfo.u16Hact = 384;
pstPubAttr->stSyncInfo.u16Hbb = 300;
pstPubAttr->stSyncInfo.u16Hfb = 216;
pstPubAttr->stSyncInfo.u16Hmid = 1;
pstPubAttr->stSyncInfo.u16Bvact = 1;
pstPubAttr->stSyncInfo.u16Bvbb = 1;
pstPubAttr->stSyncInfo.u16Bvfb = 1;
pstPubAttr->stSyncInfo.u16Hpw = 4;
pstPubAttr->stSyncInfo.u16Vpw = 5;
pstPubAttr->stSyncInfo.bIdv = 0;
pstPubAttr->stSyncInfo.bIhs = 0;
pstPubAttr->stSyncInfo.bIvs = 0;

此时,VO 的时钟配置应该为(384+300+216)(288+200+112)25=13500000,即
VO 的时钟应该配置为 13.5M。
计算公式为:
(有效宽+水平后消隐+水平前消隐)x(有效高+垂直后消隐+垂直前消隐)x 帧率=时钟
现在时钟的数值有了,那么怎么配置呢?
首先VDP HD的时钟源有两类:PLL和LCD时钟源,不同型号的芯片DHDx的个数不同。
hi3516dv300只有一个DHD0,只能选择PLL。

所以时钟的来源顺序是:晶振→PLL→PLL倍频/分频→VDP HD通道频率→VDP分频
VDP(VO)的时钟源寄存器对应的位设置为0x0,

意思是使用了下图中FOUTPOSTDIV方式的时钟源
一般而言只要要调整fbdiv这个参数,分辨率越高,这个值越大。

配置VDP(VO)中的分频比:

所以VDP(VO) CRG中的的分频比不配置。

0x03 相关代码修改

代码上的支持主要分2个部分。

  1. 为了支持开机显示图片,所以需要在boot阶段就配置屏幕,这阶段没有使用hisi的MPI接口,由boot中的代码直接配置寄存器来设置。
  2. 应用程序启动之后,需要通过MPI接口重新配置下mipi的相关参数,保证与boot下配置的一致。

设置寄存器的流程:配置VDP(VO)的CRG(Clock Reset Generator)—>配置mipi_tx寄存器和mipi_tx PHY寄存器—-> VDP(VO)寄存器

mipi_tx.c修改

屏的参数如下,需要注意的是phy_data_rate一般与实际计算值相差不大,微调即可,pixel_clk与实际计算值相差较大,一般小于计算值,建议从计算值的一半开始尝试,或参考之前相同分辨率的屏幕参数。


在boot代码中,不需要我们手动配置mipi_tx 的PHY寄存器,填写Phy_data_rate,调用相应的接口,会自动配置PHY PLL的寄存器。

mipi的屏一般还需要使用厂家提供的初始化代码对屏进行初始化,才能点亮,初始化代码需要与厂家获取确认,不匹配会导致屏幕无法点亮。下图描述了向屏幕发送厂家的初始化命令

vou_drv.c修改

在下面的函数里新增或者找到对应的分辨率的情况,vs,hs等参数参照屏的手册,个别情况下需要微调下vbb,vfb这两个参数,u32Fbdiv分频系数等参照上面的计算公式。