SM7250(高通5G)平台LCD bringup

嵌入式Linux

共 12975字,需浏览 26分钟

 ·

2021-04-24 01:38


写在前面的话

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

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

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

低端系列:SM6250,SM6350

入门系列:SM4250,SM4350

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

  1. SMxxxx系列采用了DRM显示架构(Direct Rendering Manager),代码位于:kernel/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中输入文件头:
&mdss_mdp {
 dsi_ft8719p_1080p_video: qcom,mdss_dsi_ft8719p_1080p_video {
  };
};
  1. 配置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值,若显示有问题再进行修改

  1. 配置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.xlsm计算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-postqcom,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

  1. 将5.1步骤配置好的dsi-panel-ft8719p-1080p-video.dtsi文件添加到lito-sde-display.dtsi
+#include "dsi-panel-ft8719p-1080p-video.dtsi"
  1. 配置默认屏幕
lito-sde-display.dtsi
 sde_dsi: qcom,dsi-display-primary {
 qcom,dsi-default-panel = <&dsi_ft8719p_1080p_video>;
}
  1. 添加背光控制、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」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~



浏览 425
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报