转载?高通Android msm8953 驱动开发(一)--LCD调试_高通驱动-CSDN博客
本篇记录Andoird9 高通msm8953 ili9881c LCD调试过程,主要涉及到以下几个知识点:
一、利用GCDB生成lk 头文件和 kernel dts,点亮屏幕;
二、LCD兼容;
三、LCD方向调整。
GCDB可以解析xml,我们需要将屏参配置到xml,可快速生成dts 和头文件,提升工作效率.
这个xml目录在device/qcom/common/display/tools,我们复制其中一个以此作为模板修改。
主要涉及到如下几个修改:
①. Panel configuration
②.Panel Resolution面板分辨率、前后沿等;
③.Panel Command informatio 面板命令参数;
④.Panel Timing 面板时序
Panel configuration:
仅需关注PanelType 、PanelFrameRate;
对于PanelType:描述面板支持的是video模式还是命令模式
0 = VIDEO_MODE
1 = COMMAND_MODE
对于大多LCD而言,用的是video模式,配置为0即可;
PanelFrameRate:刷新率,数值越大,显示越流畅,大多能支持到60的帧率。
?panel confgtation
Panel Resolution:
配置分辨率 、前后沿、脉冲宽度
panel resolution?
Panel Color Information:描述颜色格式和颜色顺序。?
ColorFormat:
24 = 888_RGB
18 = 666_RGB
16 = 565_RGB
12 = 444_RGB
8 = 332_RGB
3 = 111_RGB
ColorOrder:
0 = DSI_RGB_SWAP_RGB
1 = DSI_RGB_SWAP_RBG
2 = DSI_RGB_SWAP_BGR
3 = DSI_RGB_SWAP_BRG
4 = DSI_RGB_SWAP_GRB
5 = DSI_RGB_SWAP_GBR
对于9881c LCD 支持RGB888,故配置如下即可,不需交换顺序:
Panel Color Information?
Video mode panel information:
修改TrafficMode即可,TrafficMode:流量模式。
0 = non burst with sync pulses
1 = non burst with sync start event
2 = burst mode
?
video mode panel information?
Lane Configuration:
配置通道数量、通道使能及映射关系。
DSILaneMap:映射关系
?0 = DLANE_SWAP_0123
1 = DLANE_SWAP_3012
2 = DLANE_SWAP_2301
3 = DLANE_SWAP_1230
4 = DLANE_SWAP_0321
5 = DLANE_SWAP_1032
6 = DLANE_SWAP_2103
7 = DLANE_SWAP_3210
通常配置为0,不改变通道映射关系。
LaneXState:对应通道是否使能
1 = ENABLE
0 = DISABLE
DSILanes:通道数量:
2 for 2 lane panel
4 for 4 lane panel
9881c支持4通道,配置如下即可
Lane Configuration?
Backlight:
配置背光最小最大亮度以及背光方式
BLMinLevel:背光最小值
BLMaxLevel:背光最大值
BLPMICControlType:背光类型
0 = PWM GPIO
1 = WLED
2 = DCS COMMANDS (for OLED panel backlight controller)
3 = LPG
对于9881c 为WLED
配置如此下:
?Backlight
?Panel Command information:
mipi 命令,也是最重要的部分,这个决定了面板显示效果,通常调效果,更新主要是这部分,主要包含
OnCommand(上电初始化代码) 、OffCommand(下电反初始化代码)
通常给到的屏参格式如下:
REGISTER, CMD(Hex), Number(Hex), DATA(Hex), DATA(Hex), ....
?
?
屏厂给到的屏参
高通平台mipi参数格式如下:
REGISTER, WAIT, PayloadSize(2 byte), Payload(CMD,DATA,DATA)
其中:
REGISTER=0x39, 0x01, 0x00, 0x00,
PayloadSize = Number+1
Payload = CMD,DATA,DATA,
据此,可将屏厂给到的屏参转换如下:
REGISTER,FF,03,98,81,03 转换成:
0x39, 0x01, 0x00, 0x00, 0x00,0x00,0x00,0x04,0xFF,0x98,0x81,0x03
转换成平台格式屏参?
?Panel Timing:
需要配置如下三个值:
PanelTimings:长度为12的数组,用于指定面板时序
TClkPost:DSI timing control clock post value
TClkPre:DSI timing control clock pre value
这个时序需通过高通配套的excel 表格生成(注意,只能使用微软excel生成)
①.选择表单DSI and MDP registers,配置红框参数:
?Generate DSI Timing
②.选择表单DSI PHY timing setting,
按下Ctrl+j,如下:此时Check for T_CLK_ZERO为红色。
?
?ctr+j
再按下Ctrk+k,此时Check for T_CLK_ZERO变成绿色,说明参数有效。
?
?ctrk+k
再按下Ctrk+k,此时Check for T_CLK_ZERO变成绿色,说明参数有效。
此时DSI PHY registers的值即PanelTimings,TClkPost、TClkPre也得出
?
?时序生成
?到这里,就可以生成lk 和 kernel需要的dtsi 和头文件:
在/device/qcom/common/display/tools
执行perl parser.pl panel_xxx_xxx_vide.xml panel 生成对应的dtsi 和.h
其中,dtsi复制到kernel/msm-4.9/arch/arm64/boot/dts/qcom/
.h复制到bootable/bootloader/lk/dev/gcdb/display/include/
配置lk 和 kernel:
配置kernel:
包含dtsi:
kernel/msm-4.9/arch/arm64/boot/dts/qcom/msm8953-mdss-panels.dtsi
inclued dtsi?
?对于此平台,需添加DSI PHY 2.0.0 timing
?DSI PHY 2.0.0 timing
?
?dtsi添加DSI PHY 2.0.0 timing
?其对应关系如下:
?dtsi 与 DSI PHY 2.0.0 timing对应关系
?同理lk? .h也需添加DSI PHY 2.0.0 timing
?lk 添加DSI PHY 2.0.0 timing
?背光控制:
对于背光控制有如下3种类型:
"bl_ctrl_pwm" = Backlight controlled by PWM GPIO
"bl_ctrl_wled" = Backlight controlled by WLED
"bl_ctrl_dcs" = Backlight controlled by DCS commands
?
这里是pwm控制,设置qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm";
如果未配置或配置错误,那么进入kernel后,显示将无背光导致黑屏。
?配置dtsi
Panel configuration 和Lane configuration 需要稍微修改下,如下:
?修改Panel configuration
?
?修改Lane configuration
以及前面提到的lk 添加DSI PHY 2.0.0 timing。
接下来,把新增的面板添加lk 启动代码中:
仿照其它面板,添加新增的面板即可,如下:
?添加到面板数组
前面生成了.h头文件,其目的是在为了在下边函数调用,将头文件数据配置到panel_struct 结构体,方便调用。
?面板数据初始化
最后,在面板选择函数,新增面板。oem_panel_select()作用是lk在启动后通过auto_pan_loop计数,每遍历一个面板auto_pan_loop加1,直到auto_pan_loop不再增加,面板遍历完。在遍历过程中,lk通过上一步init_panel_data()配置的mipi.panel_read_cmds读取该面板的panel id,并与mipi.signature校验值比较,相等说明面板匹配上,否则遍历下一个面板。
这也是LCD兼容的原理。
?面板选择函数
说到这,我们在签名配置的面板初始化函数panel_read_cmds 和mipi.signature,在生成.h时是没生成相应的命令的,需要我们自己配置。
?panel id 读取相关命令
这个读取命令和正确值是屏厂给到的,没有的话给屏厂要即可。这里9881c panel id 读取和 正确值配置如下:?
?panel id 读取命令
?
?panel id 正确数值
经过上面一大串的配置修改,现在可以编译烧录了,编译lk 、kernel、 dtbo,并烧录开机。
现象:开机无显示,黑屏
说明 lk阶段屏显已经异常了!
查看串口信息,打印如下:
?kernel 阶段日志
可以知道lk 通过该cmdline 传递给kernel的屏是:qcom,mdss_dsi_ili9881d_720p_video,而我们接的是9881c,panel_node_id 是
qcom,mdss_dsi_wd10131ab_720p_video。说明在lk阶段面板选择上就已经出现问题。
再往前看lk 日志,如下
?lk阶段日志
?可知auto_pan_loop=:0,lk尝试加载WD10131AB这个我们实际接上的面板,但是dsi panel init error,即面板初始化失败。
接下来查找"dsi panel init error"出处,看具体错误:
bootable/bootloader/lk/platform/msm_shared/mipi_dsi.c:
?dsi panle init error 出处
?进一步往下排查:
mdss_dsi_config
? ? - ->mdss_dsi_panel_initialize
? ? ? ? ? ? ? ? -->mdss_dsi_read_panel_signature
增加打印,panel id 读取值打印为0,signature值与配置的一致,说明是panel id读取失败导致9881c面板初始化提前结束退出 ,在遍历到最后一个面板9881d默认选择了它,因此选择的屏与实际不一致,导致屏不亮!
?panle id校验函数
到这就有郁闷了。。。
这么看似乎是panel_read_cmds 与 mipi.signature值不对,然而并不是,这块屏在其它平台用过,确定panel_read_cmds 与 mipi.signature值没填错。
好吧,接下来排查其它因素,经过一番排查,发现是.h上电初始化命令 video_on_command需要增加一个命令ff 98 81 01.
重新编译烧录上电,成功!!!
如果有人知道何这串命令为会与panel id读取相关,欢迎留言告知,感谢~
?video_on_commadn上电初始化命令
到此,LCD已经点亮正常显示,还有个小问题需要解决:因结构原因,屏幕显示方向翻转180度。查阅手册,高通平台支持dtsi配置
项"qcom,mdss-dsi-panel-orientation"修改屏显方向。
其控制逻辑在:
kernel/msm-4.9/drivers/video/fbdev/msm/mdss_dsi_panel.c:
?面板方向控制逻辑
可知"qcom,mdss-dsi-panel-orientation"有如下取值:
qcom,mdss-dsi-panel-orientation="180"
qcom,mdss-dsi-panel-orientation="hflip"
qcom,mdss-dsi-panel-orientation="vflip"
故修改dtsi如下:
?dtsi配置面板方向
?到此,LCD调试完成,但是!!!此前用到的另一款屏是720*1080,这款是800*1280.
显然开机LOGO需要适配不同分辨率的LCD。