目录调试流程设置 dts 中的参数 并 配置管脚背光部分 LCD 初始化序列 cmds 打开 config 检查电压调试顺序背光有没有亮开机 以及 从休眠状态唤醒 都没有显示内容我碰到的 cmds 问题 问题集锦我调试中碰到的问题其他一些杂散的需要确认的内容数据为 8 位16位显示偏移图像位置偏差白屏屏在进出睡眠或者显示过程中白屏花屏屏幕闪烁屏幕抖动屏幕闪动唤醒闪屏问题屏幕唤醒显示灰色底面水波纹调节对比度确认有没有 framebuffer 输出图像颜色不正常 感谢
仿造平台的其他 lcd-*-mipi.dtsi 编写 lcd-xxx-mipi.dtsi 后 需要在 主 dts 文件中包含这个 dtsi
#include “lcd-xxx-mipi.dtsi“
先看屏的手册
里面的关键信息有 分辨率(540×960) 接口(2条lanes)
## MIPI Host配置
disp_mipi_init: mipi_dsi_init{
compatible = "rockchip,mipi_dsi_init";
/* 是否要在 dtsi 中初始化 1 0 */
rockchip,screen_init = <1>;
/* 要几条数据 lane ,根据原理图和 mipi 规格书*/
rockchip,dsi_lane = <2>;
/* ddr clk 一条 lane 的传输速率 Mbits/s */
/* 100 + H_total×V_total×fps×3(一个rgb为3字节)×8(8bits)/lanes */
/* 这里的 total 指的是 sync + front + back + active */
/* 比如 H_total = Hsync + HFP(hfront-proch) + HBP(hback-porch) + Hactive */
rockchip,dsi_hs_clk = <1000>;
/* 单mipi 还是双 mipi*/
rockchip,mipi_dsi_num = <1>;
};
看原理图,完成管脚的配置
可以看到,我这里只用到了 LCD_RST,没有用到 LCD_EN (是 VCC_LCD),说明是默认使能的,也没有 LCD_CS
所以进行如下配置<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwcmUgY2xhc3M9"brush:sql;">## 屏电源控制配置disp_mipi_power_ctr: mipi_power_ctr { compatible = "rockchip,mipi_power_ctr"; mipi_lcd_rst:mipi_lcd_rst{ compatible = "rockchip,lcd_rst"; rockchip,gpios = <&gpio2 GPIO_B7 GPIO_ACTIVE_LOW>; rockchip,delay = <100>; }; /* // 配置 lcd_en GPIO 哪一路 ,有可能没有 LCD_EN 那么就是 VCC 常供电 mipi_lcd_en:mipi_lcd_en { compatible = "rockchip,lcd_en"; rockchip,gpios = <&gpio0 GPIO_C1 GPIO_ACTIVE_HIGH>; rockchip,delay = <100>; }; */ //还可能有片选 cs};
根据屏的规格书 完成 timings 配置
垂直方向的信息:
重要的参数有 垂直同步信号 VFP VBP VS 对应填充到屏参中的 Vfront-proch Vback-proch Vsync-len
同样
水平方向的信息:
要注意的是, HS HBP HFP 虽然最小值是 5,但是不能设置的这么低
因为后面还有两条要求,HBLK = HS + HBP + HFP >= 24 且 HS + HBP > 19
所以最初设置 HS = HBP = HFP = 10
!你设置的触发电平
你设置的触发电平
但是我设置的触发电平是 低电平有效 ACTIVE_LOW
即
!ACTIVE_LOW
ACTIVE_LOW
即先高再低,所以是错的,改为 ACTIVE_HIGH 后正常。
但是虽然填的是 ACTIVE_HIGH ,但是应该还是属于低电平有效的,这里是 RK 平台 driver 的实现有问题。
修改后 lane 有数据传递了。
但是有数据传递仍然怎么样都没有显示。
这时候有极大可能是 cmds 有问题。
下面着重讲一下我 cmds 碰到的问题。
我当时拿到 MTK 平台参数的时候,有的参数超过了 32个字节(有个有36个字节,有个有39个字节),完成 dtsi 中 cmds 编写后
烧录,板子跑飞,空指针异常。
发现传递 这个超长 参数的时候有内存溢出情况。
于是跟代码发现 dcs_cmd.cmds 的大小为 int cmds[32],所以擅自想当然的将包拆成了 39 = 28+11,还将其中的延时设置为 0 。
这样当然是不行的。但是一切都是基于这个拆了包的 cmds 来调,走了不少弯路。
后来一切的其他参数都确定没问题了。
于是去联系原厂的工程师,说平台参数大小有限制,咨询拆包是否可行。他们说建议修改 cmds[32] 改成了 cmds[400] 。
修改后发现屏幕终于点亮了。
终于点亮了。
点亮了。
RK 手册中已经有相当一部分很有参考价值的了。
这里的一部分是自己碰到的,有的是查资料时候收集到觉得很有意义的,都放这里了。
是否有framebuffer輸出,要是改動了display這塊的clk很有可能沒有buffer輸出的,可以通過cat /dev/graphyics/fb0查看有沒有輸出字符。(我是通过google 插件 vysor 直接连接开发板看有没有内容显示,windows 平台也可以用 total control 软件来看)
数据为 8 位 和 16 位 的时候,写命令和数据的函数要注意变化。
会发现 如果 参数为 8 位的时候, 传输模式会自动由 LP 模式 变成 HS 模式。
timing 中的参数设置有误。优先确认。
看着图像调节前扫、回扫进行左右上下移动
随机出现白屏有可能是静电问题,把LCD拿到头发上擦几下,如果很容易出现白屏那肯定就是静电问题了。另外一个在有Backend IC的情况下,也有可能bypass没处理好。
結束開機logo至android動畫出現之間出現閃屏或者閃白光的情況。原因:在這個時間點kernel會會對屏再次初始化,我們可以軟件上屏蔽第一次初始化動作從而解决。
喚醒屏幕閃白光問題,說白了是背光早亮了,很有可能是下序列mdelay太久,改小點就沒有這個問題了。根本原因屏幕初始化序列下慢了。
sleep out(0x11)和 display on(0x29)之间需要 mdelay(120ms)左右。
说明 lcd 初始化成功,但是没有 rgb 刷过来。
timing 中的参数设置有误。优先确认 pclk。
花屏 还可能是总线速度有问题。
开机就花屏最简单的解决方式是,在 Init 结束的地方加一个刷黑屏的功能。也可以在睡眠函数里加延时函数。
测时序,延时不足
通过调节电压来稳定,一般调节的电压为VRL、VRH、VDV和VCM
这是由於每次重新RST下序列過程delay久了導致,适當減少delay時間
寄存器没有使能外部升压电路
通常都是rgb interface polarity導致,需要調整pclk hsync vsync de極性使之符合平台極性
VRL、VRH、VDV和VCM,这些电压也可以用来调节亮暗(对比度)
也可以通过调节Gamma值来实现,要调节的对象为 PRP、PRN、VRP、VRN 等
要是改动了display这块的clk很有可能没有buffer输出的,可以通过cat /dev/graphyics/fb0 查看有没有输出字符
如果有说明是 mipi 还没有调通,如果没有说明是 fb 有问题
可能时钟型号极性反了
可能 VCOM 调节不正常
进行 GAMMA 校正
这段时间基本上把有些 Mipi 移植和 RK 平台 LCD 移植的文章看遍了。以下文章很有帮助。本文的问题集锦部分有一部分是将以下文章中的内容搜罗过来的:
android lcd調試 高通平台lcd調試深入分析總結(mipi和rgb接口)
firefly rk3288 的 wiki 百科
Mipi DSI 协议介绍
Mipi 调试经验
最后,得感谢这段时间师兄 Baker 和 Nick 的指点。
还有网上两位 RK 刘哥和“llg”和“勇气” 的指点。
收益颇丰。谢谢谢谢!
另外 刘哥 llg 提出了一种方法:不起 android ,直接写 framebuffer 。这样对像素点的直接操作会比对图片的操作更加直观。
暂时还不了解是什么意思,准备今晚下班了去了解一下。