DSI屏幕参数配置¶
相关mipi的基础知识可以参考下面文章,这里不再对MIPI DSI基础知识进行详述。
配置参数前的准备¶
在配置DSI的参数前,用户需要对自己屏幕模组的参数指标有比较详细的认知,请参考以下列表,确认在配置前已经了解相关的信息。
DSI接口Data Lane数量,色彩格式,最高频率
DSI接口工作模式,Command模式/Video模式,不同模式需要参考不同的配置流程。
屏幕分辨率,刷新率
对于Command模式,确认屏幕TE的机制,是通过DSI协议,还是通过单独的引脚提供TE信号。
在准备好以上信息后,就可以根据DSI接口工作模式进行屏幕参数配置。
Command模式参数配置¶
Command模式下DSI相关可配置的参数主要有:
freq
DSI时钟频率color_mode
色彩格式,可以配置RGB888或者RGB565AutomaticClockLaneControl
Clock自动控制,使能后,clock lane在空闲时会进入低功耗状态,这样可以降低接口功耗。NumberOfLanes
DSI Data Lane数量,最高可以支持2 Data LaneTearingEffectSource
配置DSI的TE来源TEAcknowledgeRequest
配置Enable使能TE功能vsyn_delay_us
TE功能触发送数的延迟,该功能只有在TE使能时才有效,配置表示TE信号来之后,到正式发送屏幕数据之间的延迟
如下的源码中,涵盖了DSI Command模式的所有配置,上述提到的配置是需要根据屏幕要求进行更改的,其他配置,也有对应描述,但是不建议进行更改。
static LCDC_InitTypeDef lcdc_int_cfg_dsi =
{
.lcd_itf = LCDC_INTF_DSI, /* 选择DSI接口 */
.freq = DSI_FREQ_480Mbps, /* 选择DSI接口频率,这里选择480M */
.color_mode = LCDC_PIXEL_FORMAT_RGB888, /* DBI output color format, should match with .cfg.dsi.CmdCfg.ColorCoding */
.cfg = {
.dsi = {
.Init = {
/* clock lane时钟自动控制,enable后,clock lane会自动进入lp模式来节省功耗,默认关闭,如果需要控制接口功耗,再打开。*/
.AutomaticClockLaneControl = DSI_AUTO_CLK_LANE_CTRL_ENABLE,
.NumberOfLanes = DSI_ONE_DATA_LANE,/* DSI Data Lane数量 */
/*
lp模式下的时钟分频比,不用做更改
*/
.TXEscapeCkdiv = 0x4,
},
.CmdCfg = {
.VirtualChannelID = 0,/* channel ID, 不用做更改 */
.CommandSize = 0xFFFF, /* 这个值目前没有作用,忽略 */
/* 配置TE源来自外部还是内部 */
.TearingEffectSource = DSI_TE_EXTERNAL, /* DSI link TE */
.TEAcknowledgeRequest = DSI_TE_ACKNOWLEDGE_ENABLE, /* Enable TE */
/* DSI input & output color format,该配置后面会被移除,与之前配置重复 */
.ColorCoding = DSI_RGB888,//DSI input & output color format
},
/* 这部分寄存器都是dsi物理层相关配置,不建议用户进行更改 */
.PhyTimings = {
.ClockLaneHS2LPTime = 35,/* clock lane从hs切换到lp模式需要的时钟周期 */
.ClockLaneLP2HSTime = 35, /* clock lane从lp切换到hs模式需要的时钟周期 */
.DataLaneHS2LPTime = 35,/* data lane从hs切换到lp模式需要的时钟周期 */
.DataLaneLP2HSTime = 35, /* data lane从lp切换到hs模式需要的时钟周期 */
.DataLaneMaxReadTime = 0,/* 单次读取所需要的最大时钟周期数,因为现有使用状况下,读取不会发生在发数的阶段,所以该值没有被使用。 */
.StopWaitTime = 0, /* stop模式下,发送hs模式切换请求的最小等待时间 */
},
/* HostTimeouts 这一部分配置主要设计timeout报错,一般用来检测异常情况,方便以后debug,用户不需要修改 */
.HostTimeouts = {
.TimeoutCkdiv = 1,/* timeout的时钟分频比,timeout debug目前没有打开,没有生效 */
.HighSpeedTransmissionTimeout = 0,
.LowPowerReceptionTimeout = 0,
.HighSpeedReadTimeout = 0,
.LowPowerReadTimeout = 0,
.HighSpeedWriteTimeout = 0,
//.HighSpeedWritePrespMode = DSI_HS_PM_DISABLE,
.LowPowerWriteTimeout = 0,
.BTATimeout = 0,
},
/* LPCmd 这里的寄存器定义了command模式下,各种类型的指令对应的发送模式,LP模式发送速度慢,但是可以被逻分抓到,高速模式发送速度快,但常用仪器无法检测。这里建议对于generic接口的command,设置为低速即可,对于dcs的指令,除了longwrite,其他均可以设置为低速,这样便于通过逻分查看波形。这部分允许用户更改,但不太建议改动。*/
.LPCmd = {
.LPGenShortWriteNoP = DSI_LP_GSW0P_ENABLE,/* generic接口shortwrite指令无参数发送模式,enable为低速,disable为高速 */
.LPGenShortWriteOneP = DSI_LP_GSW1P_ENABLE,/* generic接口shortwrite指令单参数发送模式,enable为低速,disable为高速 */
.LPGenShortWriteTwoP = DSI_LP_GSW2P_ENABLE,/* generic接口shortwrite指令双参数发送模式,enable为低速,disable为高速 */
.LPGenShortReadNoP = DSI_LP_GSR0P_ENABLE,/* generic接口shortread指令无参数发送模式,enable为低速,disable为高速 */
.LPGenShortReadOneP = DSI_LP_GSR1P_ENABLE,/* generic接口shortread指令单参数发送模式,enable为低速,disable为高速 */
.LPGenShortReadTwoP = DSI_LP_GSR2P_ENABLE,/* generic接口shortread指令双参数发送模式,enable为低速,disable为高速 */
.LPGenLongWrite = DSI_LP_GLW_ENABLE, /* generic接口longwrite指令发送模式,enable为低速,disable为高速 */
.LPDcsShortWriteNoP = DSI_LP_DSW0P_ENABLE,/* dcs接口shortwrite指令无参数发送模式,enable为低速,disable为高速 */
.LPDcsShortWriteOneP = DSI_LP_DSW1P_ENABLE, /* dcs接口shortwrite指令单参数发送模式,enable为低速,disable为高速 */
.LPDcsShortReadNoP = DSI_LP_DSR0P_ENABLE, /* ddcs接口shortread指令无参数发送模式,enable为低速,disable为高速 */
.LPDcsLongWrite = DSI_LP_DLW_DISABLE, /* dcs接口longwrite指令单参数发送模式,enable为低速,disable为高速 */
.LPMaxReadPacket = DSI_LP_MRDP_ENABLE, /* 设置最大读取包尺寸指令模式发送模式,enable为低速,disable为高速*/
.AcknowledgeRequest = DSI_ACKNOWLEDGE_DISABLE, //disable LCD error reports 使能后允许屏幕端发送应答包,主要用于debug,一般场景下disable即可。
},
.vsyn_delay_us = 0,/* 该配置在使能TEAcknowledgeRequest后,才有意义,用于配置TE信号高电平延时多少us后,再给屏送数 */
},
},
};
#endif /* BSP_LCDC_USING_DSI */