SM7250(高通5G)平台LCD bringup

写在前面的话

高通平台显示这一块,自从去年开始,高通全面使用SMxxxx命名的芯片

比如高端系列:SM8350(骁龙888),SM8250(骁龙865),SM8150(骁龙855)

中端系列:SM7250(骁龙765g),SM7350(骁龙775g)

低端系列:SM6250,SM6350

入门系列:SM4250,SM4350

SMxxxx系列跟SDMxxx系列相比较,主要变化如下:

  1. SMxxxx系列采用了DRM显示架构(Direct Rendering Manager),代码位于:kernel/msm-5.4/drivers/gpu/drm

  2. 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.准备工作:

原理图端:

  1. 查看原理图,确定LCD上电和接口

  2. 查看背光控制方式

  3. 查看与TP的连接

代码端:

  1. 根据原理图写出lcd的dts配置文件

  2. 查看驱动代码中的关键代码:

    1> lcd panel的选择和加载

    2> 背光的初始化和控制

    3> Lcd 初始化时序和init code下载流程确认

3.点亮顺序:

先点亮kernel,再点亮UEFI。Lcd的点亮工作2-3天之内完成,kernel点亮后,lcd功能正常,不会影响别的模块的开发

工作,uefi可以慢慢调试,尽量自己掌握工作的进度,不要被工作牵着鼻子走。

  1. 关闭UEFI panel的添加(DISP_MODE_PANEL_NONE)和禁止连续显示(DISABLE_SEAMLESS_SPLASH)

  2. kernel正确加载dts中配置的panel,获取panel的name

  3. 点亮背光

  4. 点亮lcd

  5. 调试LCD的休眠唤醒

  6. 点亮UEFI。

4.LCD 原理图分析:

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背光控制IC

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供电方式

Lcd的供电一般有两种方式:

1>外接regulator(外接的regulator本身也需要使能和控制),输出vsp和vsn(+-5.5V)

2>PMIC (ldo 和ncp)直接输出

为了方便描述,本例中lcd不外接背光IC和偏压IC,使用高通原生的设计方式。

5.点亮流程:

5.1 创建并配置Panel的dtsi文件

  1. 在目录vendor/qcom/proprietary/devicetree-4.19/qcom/display下,创建该主板配套Panel的dtsi文件:dsi-panel-ft8719p-1080p-video.dtsi

  2. 填写模块名:参考同目录下已有的其他型号Panel的dtsi文件,在文件dsi-panel-ft8719p-1080p-video.dtsi中输入文件头:

 
  1. &mdss_mdp {

  2.  dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {

  3.   };

  4. };

  1. 配置LCM参数:LCD屏参数:porch

根据从厂商处获取的porch资料,在文件dsi-panel-ft8719p-1080p-video.dtsi中于步骤2.输入的{ };中输入:

 
  1. qcom,mdss-dsi-panel-framerate = <60>;

  2.      qcom,mdss-dsi-panel-width = <1080>;

  3.      qcom,mdss-dsi-panel-height = <2340>;

  4.      qcom,mdss-dsi-h-front-porch = <24>;

  5.      qcom,mdss-dsi-h-back-porch = <24>;

  6.      qcom,mdss-dsi-h-pulse-width = <4>;

  7.      qcom,mdss-dsi-h-sync-skew = <0>;

  8.      qcom,mdss-dsi-v-back-porch = <26>;

  9.      qcom,mdss-dsi-v-front-porch = <112>;

  10.      qcom,mdss-dsi-v-pulse-width = <4>;

  11.      qcom,mdss-dsi-h-left-border = <0>;

  12.      qcom,mdss-dsi-h-right-border = <0>;

  13.      qcom,mdss-dsi-v-top-border = <0>;

  14.      qcom,mdss-dsi-v-bottom-border = <0>;

一般先直接使用厂商提供的porch值,若显示有问题再进行修改

  1. 配置on/off command:根据从厂商处获取的init code 在文件dsi-panel-ft8719p-1080p-video.dtsi中与步骤3.并列输入:

 
  1.  qcom,mdss-dsi-on-command = [       

  2.       15 01 00 00 00 00 02 00 00

  3.       39 01 00 00 00 00 04 FF 87 19 01

  4.       15 01 00 00 00 00 02 00 80

  5.       39 01 00 00 00 00 03 FF 87 19

  6.             15 01 00 00 05 00 02 3A 70

  7.       39 01 00 00 00 00 07 B3 04 38 09 24 C0 F8

  8.       15 01 00 00 00 00 02 00 82

  9.       39 01 00 00 00 00 03 a7 22 04

  10.       15 01 00 00 00 00 02 00 83

  11.             ...

  12.             05 01 00 00 78 00 02 11 00  

  13.             05 01 00 00 32 00 02 29 00];

  14. qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00

  15.             05 01 00 00 78 00 02 10 00];

  16. qcom,mdss-dsi-on-command-state = "dsi_lp_mode";

  17. 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.并列输入:

 
  1.  qcom,mdss-dsi-lane-0-state;

  2.   qcom,mdss-dsi-lane-1-state;

  3.   qcom,mdss-dsi-lane-2-state;

  4.   qcom,mdss-dsi-lane-3-state;

6.配置CLK:

根据高通提供的计算timing的表格80-nh713-1_yb_dsi timing parameters user interactive spreadsheet.xlsm计算clk timing,在文件dsi-panel-ft8719p-1080p-video.dtsi中与步骤3.并列输入:

 
  1. qcom,mdss-dsi-panel-phy-timings = [

  2.        00 1E 09 08  0E 0C 09

  3.        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值)结果如下:

 
  1. qcom,mdss-dsi-display-timings { 

  2. timing@0 { 

  3.         qcom,mdss-dsi-panel-phy-timings = [00 14 05 05 1f 1e 05 

  4.                                           05 03 02 04 00 12 15]; 

qcom,mdss-dsi-t-clk-post和 qcom,mdss-dsi-t-clk-pre 不再需要配置

7.配置Panel的其他参数:

 
  1. &mdss_mdp {

  2.  dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {

  3.   qcom,mdss-dsi-panel-name = "ft8719p 1080p video mode dsi panel"; 

  4.   qcom,mdss-dsi-panel-type = "dsi_video_mode"; 

  5.   qcom,dsi-ctrl-num = <0>;

  6.   qcom,dsi-phy-num = <0>;

  7.   qcom,dsi-select-clocks = "mux_byte_clk0", "mux_pixel_clk0";

  8.   qcom,mdss-dsi-virtual-channel-id = <0>;

  9.   qcom,mdss-dsi-stream = <0>;

  10.   qcom,mdss-dsi-bpp = <24>;

  11.   qcom,mdss-dsi-underflow-color = <0xff>;

  12.   qcom,mdss-dsi-border-color = <0>;

  13.   qcom,mdss-dsi-traffic-mode = "burst_mode";

  14.   qcom,mdss-dsi-bllp-eof-power-mode;

  15.   qcom,mdss-dsi-bllp-power-mode;

  16.   qcom,mdss-dsi-lane-0-state;

  17.   qcom,mdss-dsi-lane-1-state;

  18.   qcom,mdss-dsi-lane-2-state;

  19.   qcom,mdss-dsi-lane-3-state;

  20.   qcom,mdss-dsi-dma-trigger = "trigger_sw";

  21.   qcom,mdss-dsi-mdp-trigger = "none";

  22.   qcom,mdss-dsi-reset-sequence = <1 20>, <0 10>, <1 100>;

  23.   qcom,mdss-dsi-display-timings {

  24.    timing@0 {

  25.      qcom,mdss-dsi-panel-framerate = <60>;

  26.      qcom,mdss-dsi-panel-width = <1080>;

  27.      qcom,mdss-dsi-panel-height = <2340>;

  28.      qcom,mdss-dsi-h-front-porch = <24>;

  29.      qcom,mdss-dsi-h-back-porch = <24>;

  30.      qcom,mdss-dsi-h-pulse-width = <4>;

  31.      qcom,mdss-dsi-h-sync-skew = <0>;

  32.      qcom,mdss-dsi-v-back-porch = <26>;

  33.      qcom,mdss-dsi-v-front-porch = <112>;

  34.      qcom,mdss-dsi-v-pulse-width = <4>;

  35.      qcom,mdss-dsi-h-left-border = <0>;

  36.      qcom,mdss-dsi-h-right-border = <0>;

  37.      qcom,mdss-dsi-v-top-border = <0>;

  38.      qcom,mdss-dsi-v-bottom-border = <0>;

  39.      qcom,mdss-dsi-on-command = [       

  40.       15 01 00 00 00 00 02 00 00

  41.       39 01 00 00 00 00 04 FF 87 19 01

  42.       15 01 00 00 00 00 02 00 80

  43.       ......

  44.       05 01 00 00 78 00 02 11 00  

  45.       05 01 00 00 32 00 02 29 00

  46.       ];

  47.      qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00

  48.        05 01 00 00 78 00 02 10 00];

  49.      qcom,mdss-dsi-on-command-state = "dsi_lp_mode";

  50.      qcom,mdss-dsi-off-command-state = "dsi_hs_mode";

  51.      qcom,mdss-dsi-h-sync-pulse = <1>;

  52.      qcom,mdss-dsi-panel-phy-timings = [

  53.        00 1E 09 08  0E 0C 09

  54.        09 06 02 04  00 19 0D];

  55.      qcom,display-topology = <1 0 1>;

  56.      qcom,default-topology-index = <0>;

  57.    };

  58.         };

  59.  };

  60. };

5.2 修改文件lito-sde-display.dtsi

  1. 将5.1步骤配置好的dsi-panel-ft8719p-1080p-video.dtsi文件添加到lito-sde-display.dtsi

+#include "dsi-panel-ft8719p-1080p-video.dtsi"
  1. 配置默认屏幕

 
  1. lito-sde-display.dtsi

  2.  sde_dsi: qcom,dsi-display-primary {

  3.  qcom,dsi-default-panel = <&dsi_ft8719p_1080p_video>;

  4. }

  1. 添加背光控制、LCD复位和上电

为了LCD dts的规范性,把背光控制、LCD复位和上电的配置放到了lito-sde-display.dtsi文件中

 
  1. &dsi_ft8719p_1080p_video {

  2.  qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;

  3.  qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled";

  4.  qcom,mdss-dsi-bl-min-level = <1>;

  5.  qcom,mdss-dsi-bl-max-level = <4095>;

  6.  qcom,mdss-brightness-max-level = <255>;

  7.  qcom,platform-reset-gpio = <&pm8150l_gpios 3 0>; 

  8.  qcom,panel-supply-entries = <&dsi_panel_pwr_supply_labibb>;

  9. };

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内容。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值