[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加

Platform: RK3399
OS: Android 7.1
Kernel: v4.4.83

首先我想感谢下Rockchip闭工和Toshiba林工在技术上的大力支持,没有他们帮忙,调试周期将会拉更长。

背景:

产品需要接一块LVDS屏幕,rk3399并没有带LVDS接口,因此使用东芝的DSI->LVDS芯片TC358775来输出LVDS信号。
因此驱动里配置的就是MIPI DSI了。


原理图:

参考原理图设计使用的是TC358772, TC358775引脚和前者Pin To Pin兼容。
图中外部晶振并没有贴,EXTCLK直接通过电阻接地。

由于屏是1366*768的分辨率,计算得出使用TC358775的单8位就可以了,也就是LVDS屏幕连接LVTX1通道。
关于LVDS单双8位,可参考: LVDS接口分类,时序,输出格式
[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第1张图片

屏幕数据:

屏幕主要关注它的时钟和时序就可以了。
[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第2张图片

这些参数在两个地方会被用到:

  • TC358775配置init cmd时需要。
  • 平台配置timing以及计算clock时需要。

移植步骤:

  1. 打上kernel针对dsi的patch。这里先调试kernel,所以uboot显示(对应route_dsi节点)功能先关闭。
  2. 配置TC358775和panel对应的reset和enable gpio。
  3. 根据屏幕配置panel timing。
  4. 配置dsi init command。command一定要根据屏幕来做配置,虽然东芝有提供一个配置表可以自行配置,但是最好请厂商调好,避免掉坑。
  5. 关闭其他display通道,选择从dsi输出,即配置VOP。

调试步骤:

这次屏幕调试不太顺利,如下记录下调试的过程。

  • 修改dts中的dsi flags。
    默认的配置是burst mode:
    dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST | MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
    而东芝给的命令是基于video event mode。
    其实这个不用去动它,rockchip针对不同的模式已经做好了调试和修改。
  • 测量GPIO配置是否正确。
  1. 给的patch中对reset gpio是设置的低->高->低,而reset默认低有效,因此只要低->高就可以了。
  2. 下图中的C155本来是用于RES没有GPIO控制的时候利用充放电原理来模拟RES上电时序。由于代码中有通过GPIO控制,因此可以移除此电容。

[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第3张图片

加了C155的波形会有个慢慢上升过程,如下图绿色部分:

[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第4张图片

  • 测量各个电源是否正确。

I2C输出的电压要和TC358775的VDDIO保持一致。

  • 测量平台DSI的上电时序是否满足TC358775数据手册要求。

数据手册上电时序如下:
[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第5张图片

实际测试时序除了STBY是固定和VDDIO同时上电之外,其他的都是符合要求,测量的数据如下:

VDDIO -> VDD_LVDS_18: 75us
VDDIO -> VDD_MIPI_12 : 250us
VDDIO ->  STBY: 一起触发,因为STBY引脚直接接的3.3V 
VDDIO -> RESX: 6.2ms
VDDIO -> DSI_LP11: 6.5 ms
VDDIO -> DSI_HS: 8.5 ms

注意的是DSI clock上先要输出LP11然后再进入HS mode后TC358775才能工作。
LP11时是1.2V,HS mode时dsi clock是200mV。
vddio->dsi clock时序:
LP11高电平部分超出显示范围,这里没看到。
[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第6张图片

resx -> dsi clock时序:

  • 测量DSI clock是否符合计算要求。

dsi clock = (1560*806*60*24)/4/2 = 226MHz

实际测量到是270MHz, 这是由于默认驱动计算出来的HS clock不满足需求。
此问题可以通过在dts中直接指定bps来解决。

&dsi {
	...
	snps,bit-rate-per-lane = <452000000>;	// 452Mbps,DSI是DDR,因此最终输出频率和bitrate差一倍。
	...
};

另外,kernel log中有Mbps字样可以得知和你配置以及测量的是否一样,如果测量不一致,那么就要看下驱动的PLL分频算法有没有问题。

  • 通过I2C去读取判断init cmd是否有设置成功。
    TC385775有提供I2C和MIPI DSI command的方式去设置寄存器。
  • 当不能正常显示时可以通过I2C的方式读取寄存器配置。
  • 如果仅仅是判断I2C是否连通,那么可以利用rk3399平台提供的i2c_detect工具来探测成功与否。
  • I2C的电源和上拉记得检查。
  • 东芝技术支持有提及dsi clock满足LP11 -> HS mode的行为才可以使用I2C。
  • I2C的读取和mipi command的使用两者并不冲突。
  • 地址是0xf。
  • 多使用几块板子测量验证

由于时间关系,我们的第一批板子上TC358775是手工焊接,连续验证了4块板子后终于可以正常开机显示。
后面不能显示板子拿去照x-ray确实是不良。
这也是导致调试了那么久的原因☹
[RK3399][Android7.1] 移植笔记 --- DSI转LVDS芯片TC358775添加_第7张图片


参考:

LVDS应用详细说明_V1.0.pdf
DV185WHM-NM1 Product Specification_Rev.0.pdf
Rockchip_DRM_Panel_Porting_Guide_V1.5_20180830.pdf

你可能感兴趣的:(RK3399,子类__Display)