写在前面的话
高通平台显示这一块,自从去年开始,高通全面使用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 0039 01 00 00 00 00 04 FF 87 19 0115 01 00 00 00 00 02 00 8039 01 00 00 00 00 03 FF 87 1915 01 00 00 05 00 02 3A 7039 01 00 00 00 00 07 B3 04 38 09 24 C0 F815 01 00 00 00 00 02 00 8239 01 00 00 00 00 03 a7 22 0415 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 0005 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 0909 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 0039 01 00 00 00 00 04 FF 87 19 0115 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 0005 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 0909 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.dtsisde_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内容。
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~