MIPILCD调试总结(转载)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MIPILCD调试总结(转载)
近来在⽤SSD2828驱动⼩⽶屏,没有代码,没有技术⽀持,⾃⼰写代码反复调试,整死我了,⽬前已经能正常显⽰图⽚,现在总结⼀下与⼤家分享⼀下,
要点:
1. ⼩⽶3屏的分辨率是19201080, 24bit, ⾏列像素点为10801920, 默认显⽰⽅式为从左->右,上->下,这个可以通过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。