DSI连续时钟和非连续时钟引发的DS90UB941低温(-40℃)黑屏分享

结论

懒得看文章的直接看这里的总结:

问题现象:低温-40度下,941的superframe会出现一边屏幕黑屏,常温情况下正常

问题原因:8155及941没有正确设置为DSI 连续时钟模式

Background

当前系统为了满足实现一机多屏的需求,比较常见的使用了superframe/split mode这种方式来实现分屏。大致原理如下,SOC侧输出一幅较大的图像画面(superframe),然后在941侧进行切分为左右两个画面,分别通过port0(DOUT0)、port1(DOUT1)经FPD-Link III发送到解串器上(948 Des)达到实现分屏目的.

汽车行业中对于设备元器件的温度范围要求是-40°~120°,在这个温度区间内能正常工作的元器件可以称为符合车规级要求的元器件。同样941作为车规级芯片,也应该能够满足这个要求. 

Symptom

在测试过程中发现,在温度还未到达-40°之前,所有的板子的port1口都会出现没有图像输出的现象,而port0口输出则正常.

  • 出现问题之后,重新上下电整个板子,无法使得问题复归
  • 出现问题之后,单独对941 reset,重新初始化941,无法使得问题复归
  • 出现问题之后,不管对941 or 948 写入test pattern都没有任何输出
  • 出现问题之后,单独对941 reset,使用941内部clk产生 teset pattern,可以正常输出test pattern

Analysis

主要怀疑点

从DSI信号传输来看,整个传输链条分为下面几个部分:

  1. 8155 → 941
  2. 941 internal
  3. 941 → 948

对于怀疑点1,其实很容易排除,因为系统输出的是一张superframe,对于8155来说就是一张比较大的画面,如果这段出现问题,那么port0也应该无法正常显示。

对于怀疑点2,主要涉及到941硬件问题,以及941内部寄存器配置,所以是重点调查的方向

对于怀疑点3,进行交叉验证之后,可以直接排除(把port0、port1调换)

怀疑点分析

拆分怀疑点2,大致可以分为:

  • 软件方向
    • 941寄存器配置,重点调查的方向
  • 硬件方向
    • 941外围硬件问题
      • MODE SEL问题, 硬件工程师更换过各种MODE,但是无效果,问题依旧
      • 时钟问题,尝试使用外部晶振作为时钟源,但是无法匹配941要求
    • 941芯片本身问题

问题前后寄存器对比

在发生问题前后我们都dump了整个941 main register,可以参考文件port1_after.txt port1_before.txt

主要差异点及分析如下:

Part 1

 0x0A: This indicates that a CRC error occurred during the I2C read/write process.

0x0C: Indicate that pixel clock is not detect on port1

Part 2

 0x58: Indicate that Line Video Error

0x5A:indicate that DSI Frequency is NOT Stable AND No DSI Clock Detected for selected port.

0x5F:Indicate that NO DSI Pixel Frequency.

Part 3

 0x6D:BCC error relate to I2C read/write

Part 4

 0xC4:

0xC5:

0xC7:

There are No description for these registers on DS90UB941AS-Q1.pdf.

分析结论

从寄存器对比来看,问题比较有可能来自于DSI的时钟.

Review register configuration on 941

当前我们对941的寄存器配置如下:

0x01,0x08,      //Disable DSI
0x1E,0x01,      //Select FPD-Link III Port 0
0x4F,0x0C,      //Set DSI_CONTINUOUS_CLOCK, 4 lanes, DSI Port 0
0x5B,0x07,      //Force Splitter mode
0x56,0x80,      //Enable Left/Right 3D processing to allow superframe splitting
0x1E,0x02,      //Select FPD-Link III Port 1
0x4F,0x0C,      //Set DSI_CONTINUOUS_CLOCK, 4 lanes, DSI Port 1
0x5B,0x07,      //Force Splitter mode
0x56,0x80,      //Enable Left/Right 3D processing to allow superframe splitting
0x32,0x80,      //Set the line size to 1920(LSB)
0x33,0x07,      //Set the line size to 1920 (MSB)
0x1E,0x01,      //Select FPD-Link III Port 1
0x36,0x00,      //Set crop start X position to 0 (LSB)
0x37,0x80,      //Set crop start X position to 0 (MSB) and enable cropping
0x38,0x7F,      //Set crop stop X position to 1919 (LSB)
0x39,0x07,      //Set crop stop X position to 1919 (MSB)
0x3A,0x00,      //Set crop start Y position to 0 (LSB)
0x3B,0x00,      //Set crop start Y position to 0 (MSB)
0x3C,0xCF,      //Set crop stop Y position to 719 (LSB)
0x3D,0x02,      //Set crop stop Y position to 719 (MSB)
0x1E,0x02,      //Select FPD-Link III Port 1
0x36,0x00,      //Set crop start X position to 0 (LSB)
0x37,0x80,      //Set crop start X position to 0 (MSB) and enable cropping
0x38,0x7F,      //Set crop stop X position to 1919 (LSB)
0x39,0x07,      //Set crop stop X position to 1919 (MSB)
0x3A,0x00,      //Set crop start Y position to 0 (LSB)
0x3B,0x00,      //Set crop start Y position to 0 (MSB)
0x3C,0xCF,      //Set crop stop Y position to 719 (LSB)
0x3D,0x02,      //Set crop stop Y position to 719 (MSB)
0x40,0x04,      //Select DSI Port 0 digital registers
0x41,0x05,      //Select DPHY_SKIP_TIMING register
0x30,0x01,  //Disable port1 remote interrupt due to we use same hw panel for touch interrupt
0x42,0x3C,      //Write TSKIP_CNT value for 300 MHz DSI clock frequency
0x01,0x00,      //enable DSI

The TI team didn't provide a split mode specific configuration, but we found a example code from Splitter Mode Operations With the 941.pdf.

TI手册里面并没有给出具体如何配置split mode,但是可以从文档 Splitter Mode Operations With the 941.pdf 中找到一个示例配置.

从新审视我们的配置代码之后,我们发现了一个明显的问题:

From the description of 0x56:

当前我们使用的是DSI 参考时钟作为941的时钟源,所以 BRIDGE_CTL:DSI_CONTINUOUS_CLK必须要设置,但是配置中对于0X4F的配置却是0x0c:

但是这里的寄存器描述并没有告诉我们如何设置enable  DSI CONTINUOUS CLK(到底是bit 7 = 1 means Continuous clock or bit 7 = 0 means Continuous clock?)

为此我们在e2e.ti.com上提了一个case,同时ti也及时回答了我们的问题:

 Solution

设置0X4F寄存器为0X8C来enable DSI CONTINUOUS CLOCK.

需要注意的是,SOC侧的DSI输出也必须设置为连续时钟模式.在8155上你可以通过读取寄存器HWIO_DSI_0_CPHY_MODE_CTRL_DLN0_CONTINUOUS_CLK_MODE_EN_BMSK 位来确认,或者你可以在QNX侧的驱动中设置sDeviceConfig.bEnableClkLaneHighPwrMode = TRUE来保证开启DSI连续时钟输出.

8155上DSI连续时钟的寄存器是:HWIO_DSI_0_LANE_CTRL_ADDR.

在8155 android 平台或者单linux平台上,可以通过配置dts中的qcom,mdss-dsi-force-clock-lane-hs来开启连续时钟模式.

如何确认DSI输出的时钟是否为连续时钟:

CONTINUOUS CLOCK(probing on DSI0_CLKP)

NON-CONTINUOUS CLOCK sample (probing on DSI0_CLKP)



 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值