近来在用SSD2828驱动小米屏,没有代码,没有技术支持,自己写代码反复调试,整死我了,目前已经能正常显示图片,现在总结一下与大家分享一下,
要点:
1. 小米3屏的分辨率是1920*1080, 24bit, 行列像素点为1080*1920, 默认显示方式为从左->右,上->下,这个可以通过DCS指令修改.
2. SSD2828手册上说SSD2828一行最大可显示1920个像素点(60Hz),而官网上说SSD2828的最大分辨率为1920x1200,所以我一直认为SSD2828
行像素最大可设置为1920,列最大像素可设置为1200,实际上驱动小米3屏时,行列分别设置为1080*1920.
3. 要用SSD2828最新的手册,目前能找到的是V1.3,旧版本有些地方是错的,误导人.
4. SSD2828 RGB接口和MIPI接口的位数是一起设置的(通过B6寄存器设置),即没有RGB为24bit,MIPI为16bit的这种情况.
5. SSD2828可支持的16,18,24bit的屏,而有的屏不支持16bit的,如小米3的屏就不支持,这个要看清楚.
6. 屏的data lane和SSD2828设置的要一致
7. SSD2828的VBP, VFP, HBP, HFP,和CPU这端设置不能一致,显示不正常,我也不知道为什么.
驱动初始化包括SSD2828,LCD屏的初始化
1. SSD2828初始化主要有设置PLL, 设置LCD参数(分辨率,VBP, VFP, HBP, HFP).
CPU这端的Pclk设置为90~120MHz, SSD2828 PLL output为800MHz左右,900以上有些危险,干扰大(跟PCB有关系咯)
2. SSD2828提供给CPU接口,通过DCS设置LCD的一些参数,这个要看LCD手册有哪些参数要设置,最主要的是0x29,0x11指令,
让LCD exit sleep mode和display on.
屏不显示可能有几种情况
1. 0x29,0x11指令发送不对,LCD没收到,一直在sleep状态.
2. 屏要显示,data lane上肯定有波型,如果data lane波型都没有,那就是ssd2828都没有配置好,跟CPU这端没有关系.
3. data lane有波型,可能跟C9, CA, CB,这几个寄存器有关,随便设置几个值试一下(最大,最小,中间值),我调试了一周,就是C9没有设置对,所以一直没显示
屏幕抖动可能跟VBP, VFP, HBP, HFP,这几个参数有关,修改SSD2828和CPU LCD controler的这几个参数试一下
颜色过度失真,右能跟B6寄存器中的PCLK_P和0xDB中的CLK_DELAY_SEL有关,我设置PCLK_P为1, CLK_DELAY_SEL为0,显示图片就好了.
不行可修改CLK_DELAY_SEL试一下,再不行我也没办法了.
除了必须设置的参数外,对显示有影响的寄存器主要有:
C9, CA, CB, DB, DD, ED, 调试中主要修改了这些寄存器
************************
在展讯平台上点亮MIPI接口屏正常显示需要满足以下几条就可以:
1:确认Lcd的驱动文件被正常编译编译进去,并且lcd 和board name里面注册一质,我有一次就是因为编译出现问题了,导致在kernel中无法正确读取LCD的ic的id,导致系统加载屏的驱动失败,造成系统进入kernel显示花屏,这部分是非常重要的,假如未能正确的编译进系统,你再怎么调试,屏照样无法正常的显示,这非常的关键!
2. 必须保证数据能够正确的传输到屏上,我有一次调试屏驱动时,发现屏上的显示始终是一些横竖条纹,或者直接灰屏,通过在示波器上检测屏引脚的波形,发现屏上的数据不正常,根本没有切换到hp下刷数据,导致屏无法正常的显示,一般在读取ic 的id和初始化设置指令时,都是在mipi的低速(lp)模式下,在初始化完成后,需要切换到高速(hp)状态下,才能正常的显示!
3. 必须保证ic设置的proch和timing,通道,速率正确,屏才可以正常的显示,一般显示出现花屏,显示偏移等问题,通常情况下,就是因为你设置的某些参数不正确,导致显示异常!
4:仔细检查上电同时测量,同时将28根rgb interface对应gpio设为lcdc func。对于传统的lcd不需要RST操作只需拉高即可,对于mipi和需要下code的RGB panel需要RST高低高操作,这样code才生效。注意一般sleep out(0x11)和display on(0x29)之间需要mdelay(120)左右,貌似这个对于大部分panel是必须的。如果这部分延时不够,会导致屏在进出睡眠或者显示过程中出现白屏,无法正常的显示!
5:最后还要确认是否有framebuffer输出,要是改动了display这块的clk很有可能没有buffer输出的,可以通过cat /dev/graphyics/fb0查看有没有输出字符。曾经调试开机logo连续显示时遇到过好几次没有buffer输出导致kernel卡住,屏也不亮按power键没有反映的情况。
注:一般wvga以及更高分辨率的陪你过通常采用2 line甚至更高的通道数,hvga及以下分辨率的屏则通常采用单通道的mipi接口
一般情况下屏幕显示有flicker,可采用点翻转解决该问题,但是会带来功耗和潜在的不兼容问题,因为有些玻璃不支持点翻转,可能会带来显示的异常
**********************************
五.主要调试经验总结(个人+网络):
个人:
(1) DPI LCD最关键的配置是:DPI时钟频率,DE的极性,DPI CLK的极性。特别是DE的极性
如果反了,往往不能正常显示(常见现象为屏幕出现麻点)。如果DE正确,DPI CLK反了,图像一般能显示,但会倾斜。DPI时钟频率(PCLK)按照datasheet和LCD的分辨率来配,过高过低都可能导致不能正常显示。PCLK的设置公式为:PCLK=(WIDTH+前尖/后尖)*(HEGHT+前尖/后尖)*60~70(刷新率)*1.1(补偿)
(2) params->dpi.rgb_order 或 params->dbi.data_format.color_order 往往固定的配置为RGB顺序。当
与LCD的实际顺序不匹配时,会出现偏蓝或偏红的现象。这时可以通过修改LCD初始化代码中相关寄存器的设置来试其匹配。大部分LCD驱动IC使用0x36这个寄存器的某一位来设定RGB或BGR。
(3) 当图像显示左右反或上下反时,可以修改寄存器0x36的设置。
(4) DBI LCD的寄存器0x3A一般用于定义数据宽度,其设置一定要与params->dbi.data_width一
致。否则导致数据不全,显示的图片颜色错乱,清晰度大大降低。
(5) DBI LCD的寄存器0xC5一般用于定义刷新频率frame rate。多数LCD的default值为70~
80HZ。但在某些应用中,会出现顶部显示有锯齿,或者矩形图标摇动时边缘锯齿。这时提高frame rate到90~100HZ,就能改善。
(6) LCD 的亮度可以通过修改power setting来提高或降低。这些设置一般在初始化代码中,不建议
自己修改,最好联系厂家。
(7) 有时FPC上的器件与LCD的背面金属壳接触导致短路,拉低,会影响显示效果。
(8) 部分LCD调好过后,在切屏的时候会有中间被分割的现象,这主要是LCD的刷新方向不对导
致的,这个也是在0x36寄存器里面设置的
(9) Tuna上的国显LCD(rm68120),出现部分模组低部有重影区域的现象,我们试过降低PCLK到
很低,可以解决重影现象,但这不是解决办法。看上去是LCD的一致性的问题,最后芯片商给了一个修改方案,修改B300寄存器,这个寄存器在规格书上都没有描述。所以具体的真正原因只有芯片上知道了。
(10) DBI接口,写入初始化代码后,在其他信号均正常的情况下,屏幕没有反应,还是为白屏,看上
去是没有写成功,仔细检查是写命令的引脚控制不对,一些芯片的写命令pin为D[0-7],一些为D[1-8],所以需要区别对待,在发命令的时候做一个移位
(11) 系统在休眠的时候功耗较大,而且经过排查就是LCD导致的,查看了休眠代码suspend,发现
是休眠代码的delay时间过短,导致LCD根本未完全进入休眠,系统就休眠了
(12) 还有出现的比较多的就是白屏问题,原因也很多,常见的为:背光亮的太早,初始化不成功,
suspend/resume的delay时间不合适等
(13) 屏幕出现抖动,除了要排查相关的信号线,最好也去看看给的工作电压是否匹配(不要太迷信自
己设的,最好能用仪器测试)
(14) 还有各种其他问题,归结起来所有的bug要不是host这段的信号设置有问题,要不是初始化代
码中的寄存器设置问题,这些都是可以通过具体硬件情况和相关datasheet来解决的
******************************************************
* 调试记录
LCD半边闪屏问题,原厂给的信息:分析了系統板送出的 video mode timing,資訊摘要如下
HSCLK: 160MHz
Per lane bit-rate: 320Mbps (UI=3.125ns)
HS SoT HS-prepare + HS-zero 約 155ns
由上述的 timing 懷疑與現象是因為 IC HS data settle timing 搭配不當所導致
看来是我们输出的mipi信号 HS-prepare + HS-zero 比 LCD 默认设置短引起的。还有随机整屏闪动的问题通过调节 VFP 和 VBP 的值调到了理想状态。另外 LCD 的 VCC 在使用 mos 管控制后休眠后会有 2.0V 的悬浮电压,通过 RC 电路将电压放掉,将 C78 换成了 10K 电阻。
LCD电路上有几个比较重要的电压: AVDD、VCC、VGH、VGL、HAVDD、VCOM(由AVDD通过电阻分压得到)
* 唤醒慢的问题
在最初调试的几款 LCD 里面初始化 cmd 都比较少,后来在调试一款 IPS 屏的时候发现唤醒需要 3 秒左右,这款 LCD 初始化 cmd 有100多条,之前在调试一款 LCD 的时候每条 cmd 发送之后需要 delay 10ms 再发下一条 cmd,所以在这款 LCD 这里不能有 delay,并且经过调试在确保发送成功的情况下将 LP 的传输速度提高了 3 倍(这里需要读取每条 cmd 的返回值 0x84 确认命令是否发送成功),优化后唤醒时间不到 1 秒。
* LCD 参数理解更正
才发现之前一直对 LCD 的几个参数 HFP、HBP、VFP、VBP 理解有错误,正确的应该是以同步信号(HSYNC、VSYNC)为基准,在同步信号之前的称为 Front,在同步信号之后的称为 Back,而不是之前理解的以有效像素为基准。
* LCD 显示呈锯齿状问题
这两天(12.11)还调试了一款 540 x 960 分辨率的 mipi LCD,在开始的时候一直点不亮,和供应商确认了好久无意间才发现是他们给的初始化代码是错的,使用正确的初始化代码就能点亮了,不过显示出来的图像却是呈锯齿状的,即没有对齐。之前在别的平台也遇到过类似问题,也就是分辨率不是 16 的整数倍,LCD controller 在取数据的时候会对不齐。边研究 Datasheet 边和 ASIC 同事讨论,后来确定了一个方案:即在 DSI、LCD 寄存器里面设置分辨率为 540 x 960 以让 LCD 正确识别信号,但 framebuffer 需要设置为 544 x 960 以对齐,并且设置 Source pitch 寄存器为 544,这样显示就正常了,相当于 framebuffer 里每一行的最后 4 个 pixel 会被 LCD controller 丢掉。
今天(12.12)在和 ASIC 同事的讨论下更正了之前的理解:LCD controller 在计算取数据的时候,地址是根据(x,y)坐标来算的,差不多是address = y * pitch + x + base,pitch 就是一行 pixel 在内存里的大小,这个至少是要对齐到 8byte, 因为 bus 宽度是 8byte,如 Data sheet 中的描述 ”Source pitch for RGB channel, QWORD aligned if linear mode“。之前计算 pitch 值的公式为:xres / 8 * bits_per_pixel / 8,如果 xres = 540,bits_per_pixel = 32,计算的结果因为取整的原因为 0x10c,实际上正确的值应该是 0x10e,所以需要将公式改为:xres * (bits_per_pixel / 8) / 8,即在每个像素占 4byte 的情况下只要 xres 为偶数就可以满足对齐的要求,而不用改为 544。
!