SM7250(高通5G)平台LCD bringup
共 12975字,需浏览 26分钟
·
2021-04-24 01:38
写在前面的话
高通平台显示这一块,自从去年开始,高通全面使用SMxxxx命名的芯片
比如高端系列:SM8350(骁龙888),SM8250(骁龙865),SM8150(骁龙855)
中端系列:SM7250(骁龙765g),SM7350(骁龙775g)
低端系列:SM6250,SM6350
入门系列:SM4250,SM4350
SMxxxx系列跟SDMxxx系列相比较,主要变化如下:
SMxxxx系列采用了DRM显示架构(Direct Rendering Manager),代码位于: kernel/drivers/gpu/drm
SDMxxx系列采用FB(framebuffer)显示架构,代码位于: kernel/drivers/video/fbdev
1. 代码路径
display驱动路径:
部分平台kernel/msm-4.19/techpack/display
部分平台kernel/msm-4.19/drivers
总之都是在kernel下,可以搜素关键文件来查找find ./ -name dsi_display.c
displayDTS路径:
从arch/arm64/boot/dts
软连接到 vendor/qcom/proprietary/devicetree-4.19/qcom/display
display UEFI路径:
boot_images/QcomPkg/SocPkg/XXXpanPkg
2.准备工作:
原理图端:
查看原理图,确定LCD上电和接口 查看背光控制方式 查看与TP的连接
代码端:
根据原理图写出lcd的dts配置文件
查看驱动代码中的关键代码:
1> lcd panel的选择和加载
2> 背光的初始化和控制
3> Lcd 初始化时序和init code下载流程确认
3.点亮顺序:
先点亮kernel,再点亮UEFI。Lcd的点亮工作2-3天之内完成,kernel点亮后,lcd功能正常,不会影响别的模块的开发
工作,uefi可以慢慢调试,尽量自己掌握工作的进度,不要被工作牵着鼻子走。
关闭UEFI panel的添加(DISP_MODE_PANEL_NONE)和禁止连续显示(DISABLE_SEAMLESS_SPLASH) kernel正确加载dts中配置的panel,获取panel的name 点亮背光 点亮lcd 调试LCD的休眠唤醒 点亮UEFI。
4.LCD 原理图分析:
Lcd引脚主要包括:
MIPI信号线:(4对差分信号MIPI_DSI0~3_LANE0_P_CON MIPI_DSI0~3_LANE0_N_CON
1对时钟线:MIPI_DSI0_CLK_P>_CON、MIPI_DSI0_CLK_N_CON)
偏压供电:(+5V5_LCD_VSP -5V5_LCD_VSN),1.8v常用电(VREG_L1C_1P80)
LCD 复位引脚:LCM_RESET_N
背光控制引脚:PWM控制或者(PMIC DC控制,接背光led正极)
背光负极引脚:LCD_LED_K1、LCD_LED_K2(背光物理结构布局为2串并列起来,所以负极有2串)
Lcd TE引脚:LCM_FTE(video mode不用)
LCD兼容问题
LCD ID引脚: LCD_ID0 LCD_ID1 LCD_ID2这个3个引脚主要用来同一套代码,不同项目,不同屏幕之间的兼容。多
款屏幕兼容最极端的条件是,一套代码,做3-5款产品,都使用了相同的屏幕IC,相同的模组。兼容的方法有3种
1>通过ID引脚读取电平高低确定哪款LCD
2>通过读取lcd的只读寄存器确定哪款LCD
3>通过product id( 这个变量里面加入产品name IC name 模组name)
这些识别要在UEFI中实现,通过cmdline传递到kernel解析出来
LCD供电方式
Lcd的供电一般有两种方式:
1>外接regulator(外接的regulator本身也需要使能和控制),输出vsp和vsn(+-5.5V)
2>PMIC (ldo 和ncp)直接输出
为了方便描述,本例中lcd不外接背光IC和偏压IC,使用高通原生的设计方式。
5.点亮流程:
5.1 创建并配置Panel的dtsi文件
在目录 vendor/qcom/proprietary/devicetree-4.19/qcom/display
下,创建该主板配套Panel的dtsi文件:dsi-panel-ft8719p-1080p-video.dtsi
填写模块名:参考同目录下已有的其他型号Panel的dtsi文件,在文件 dsi-panel-ft8719p-1080p-video.dtsi
中输入文件头:
&mdss_mdp {
dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {
};
};
配置LCM参数:LCD屏参数:porch
根据从厂商处获取的porch资料,在文件dsi-panel-ft8719p-1080p-video.dtsi
中于步骤2.输入的{ };中输入:
qcom,mdss-dsi-panel-framerate = <60>;
qcom,mdss-dsi-panel-width = <1080>;
qcom,mdss-dsi-panel-height = <2340>;
qcom,mdss-dsi-h-front-porch = <24>;
qcom,mdss-dsi-h-back-porch = <24>;
qcom,mdss-dsi-h-pulse-width = <4>;
qcom,mdss-dsi-h-sync-skew = <0>;
qcom,mdss-dsi-v-back-porch = <26>;
qcom,mdss-dsi-v-front-porch = <112>;
qcom,mdss-dsi-v-pulse-width = <4>;
qcom,mdss-dsi-h-left-border = <0>;
qcom,mdss-dsi-h-right-border = <0>;
qcom,mdss-dsi-v-top-border = <0>;
qcom,mdss-dsi-v-bottom-border = <0>;
一般先直接使用厂商提供的porch值,若显示有问题再进行修改
配置on/off command:根据从厂商处获取的init code 在文件 dsi-panel-ft8719p-1080p-video.dtsi
中与步骤3.并列输入:
qcom,mdss-dsi-on-command = [
15 01 00 00 00 00 02 00 00
39 01 00 00 00 00 04 FF 87 19 01
15 01 00 00 00 00 02 00 80
39 01 00 00 00 00 03 FF 87 19
15 01 00 00 05 00 02 3A 70
39 01 00 00 00 00 07 B3 04 38 09 24 C0 F8
15 01 00 00 00 00 02 00 82
39 01 00 00 00 00 03 a7 22 04
15 01 00 00 00 00 02 00 83
...
05 01 00 00 78 00 02 11 00
05 01 00 00 32 00 02 29 00];
qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00
05 01 00 00 78 00 02 10 00];
qcom,mdss-dsi-on-command-state = "dsi_lp_mode";
qcom,mdss-dsi-off-command-state = "dsi_hs_mode";
厂商提供的initcode不可直接使用,需转换command格式,格式要求如下:
由多个基于 qcom DSI 控制器协议的 dcs 数据包构成的字节流。
字节 0:dcs 数据类型(无参数默认05;一参数默认15;多参数默认39)
字节 1:设定指明这是独立数据包(无链)
字节 2:虚拟通道数
字节 3:需要来自客户端的确认(dcs 读取命令)
字节 4:在传输 dcs 命令后等待指定的毫秒数
字节 5 和 6:按网络字节顺序列出的 16 位长度
字节 7 及以上:净荷的字节数
Example:第5行数据如图
字节0: 一参数写: 15(无参数默认05;一参数默认15;多参数默认39)
字节1\2\3: 01 00 00(一般不动)
字节4: 5ms: 05
字节5\6: 2bytes: 00 02
字节7+: 寄存器及参数:3A 70
5.配置MIPI信号:
根据从原理图中了解到的所使用的MIPI信号,在文件dsi-panel-ft8719p-1080p-video.dtsi
中与步骤3.并列输入:
qcom,mdss-dsi-lane-0-state;
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
6.配置CLK:
根据高通提供的计算timing的表格80-nh713-1_yb_dsi timing parameters user interactive spreadsheet.xls
m计算clk timing,在文件dsi-panel-ft8719p-1080p-video.dtsi中
与步骤3.并列输入:
qcom,mdss-dsi-panel-phy-timings = [
00 1E 09 08 0E 0C 09
09 06 02 04 00 19 0D];
SM7250使用的是DSI PHY 4.0.0 DPHY timing
,在DSI and MDP registers
sheet填写porch、frame rate(默认60),并选择chip,在DSI PHY 4.0.0 DPHY timing
处自动生成timing,举例如下图(不是本例中的portch值)结果如下:
qcom,mdss-dsi-display-timings {
timing@0 {
qcom,mdss-dsi-panel-phy-timings = [00 14 05 05 1f 1e 05
05 03 02 04 00 12 15];
qcom,mdss-dsi-t-clk-post
和 qcom,mdss-dsi-t-clk-pre
不再需要配置
7.配置Panel的其他参数:
&mdss_mdp {
dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {
qcom,mdss-dsi-panel-name = "ft8719p 1080p video mode dsi panel";
qcom,mdss-dsi-panel-type = "dsi_video_mode";
qcom,dsi-ctrl-num = <0>;
qcom,dsi-phy-num = <0>;
qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0";
qcom,mdss-dsi-virtual-channel-id = <0>;
qcom,mdss-dsi-stream = <0>;
qcom,mdss-dsi-bpp = <24>;
qcom,mdss-dsi-underflow-color = <0xff>;
qcom,mdss-dsi-border-color = <0>;
qcom,mdss-dsi-traffic-mode = "burst_mode";
qcom,mdss-dsi-bllp-eof-power-mode;
qcom,mdss-dsi-bllp-power-mode;
qcom,mdss-dsi-lane-0-state;
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
qcom,mdss-dsi-dma-trigger = "trigger_sw";
qcom,mdss-dsi-mdp-trigger = "none";
qcom,mdss-dsi-reset-sequence = <1 20>, <0 10>, <1 100>;
qcom,mdss-dsi-display-timings {
timing@0 {
qcom,mdss-dsi-panel-framerate = <60>;
qcom,mdss-dsi-panel-width = <1080>;
qcom,mdss-dsi-panel-height = <2340>;
qcom,mdss-dsi-h-front-porch = <24>;
qcom,mdss-dsi-h-back-porch = <24>;
qcom,mdss-dsi-h-pulse-width = <4>;
qcom,mdss-dsi-h-sync-skew = <0>;
qcom,mdss-dsi-v-back-porch = <26>;
qcom,mdss-dsi-v-front-porch = <112>;
qcom,mdss-dsi-v-pulse-width = <4>;
qcom,mdss-dsi-h-left-border = <0>;
qcom,mdss-dsi-h-right-border = <0>;
qcom,mdss-dsi-v-top-border = <0>;
qcom,mdss-dsi-v-bottom-border = <0>;
qcom,mdss-dsi-on-command = [
15 01 00 00 00 00 02 00 00
39 01 00 00 00 00 04 FF 87 19 01
15 01 00 00 00 00 02 00 80
......
05 01 00 00 78 00 02 11 00
05 01 00 00 32 00 02 29 00
];
qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00
05 01 00 00 78 00 02 10 00];
qcom,mdss-dsi-on-command-state = "dsi_lp_mode";
qcom,mdss-dsi-off-command-state = "dsi_hs_mode";
qcom,mdss-dsi-h-sync-pulse = <1>;
qcom,mdss-dsi-panel-phy-timings = [
00 1E 09 08 0E 0C 09
09 06 02 04 00 19 0D];
qcom,display-topology = <1 0 1>;
qcom,default-topology-index = <0>;
};
};
};
};
5.2 修改文件lito-sde-display.dtsi
将5.1步骤配置好的 dsi-panel-ft8719p-1080p-video.dtsi
文件添加到lito-sde-display.dtsi
+#include "dsi-panel-ft8719p-1080p-video.dtsi"
配置默认屏幕
lito-sde-display.dtsi
sde_dsi: qcom,dsi-display-primary {
qcom,dsi-default-panel = <&dsi_ft8719p_1080p_video>;
}
添加背光控制、LCD复位和上电
为了LCD dts的规范性,把背光控制、LCD复位和上电的配置放到了lito-sde-display.dtsi
文件中
&dsi_ft8719p_1080p_video {
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";
qcom,mdss-dsi-bl-min-level = <1>;
qcom,mdss-dsi-bl-max-level = <4095>;
qcom,mdss-brightness-max-level = <255>;
qcom,platform-reset-gpio = <&pm8150l_gpios 3 0>;
qcom,panel-supply-entries = <&dsi_panel_pwr_supply_labibb>;
};
5.3验证驱动是否正常加载
1.开机看屏幕是否可以正常显示开机logo,背光是否正常点亮,是否正常显示图像
2.进入系统后,按power键进行休眠唤醒,看屏幕是否可以正常灭屏、亮屏
3.调节背光亮度,查看背光亮度是否改变,也可以使用adb命令查看屏幕亮度及调节屏幕亮度:
adb shell
cd sys/class/leds/lcd-backlight
cat brightness // 查看当前屏幕亮度
echo * > brightness // 设置亮度,*可以是0~255之间任意的值
后面的文章会跟新LCD的dts分析以及其他LCD内容。