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/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 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.xlsm计算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-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 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

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

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

lito-sde-display.dtsisde_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」获取学习资料网盘链接。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/466072.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络管理人员的未来?

这是流传已久的一张带讽刺性的照片。一名网络专业的学生的未来难道真会如此&#xff1f;或者&#xff0c;是某些人理解错了这个专业的诸多特性&#xff1f;转载于:https://blog.51cto.com/zhangbikai/166694

python笔记-1(import导入、time/datetime/random/os/sys模块)

python笔记-6&#xff08;import导入、time/datetime/random/os/sys模块&#xff09; 一、了解模块导入的基本知识 此部分此处不展开细说import导入&#xff0c;仅写几个点目前的认知即可。其它内容待日后有深入理解了再来细说 1、import可以导入的两种不同的内容 1.1 *.py文件…

嵌入式里如何给内存做压力测试?不妨试试memtester

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是内存读写正确性压力测试程序memtester。在嵌入式系统中&#xff0c;内存(RAM)的重要性不言而喻&#xff0c;系统性能及稳定性都与内存息息相关。关于内存性能有很多个不同指标&#xff0…

一位嵌入式工程师的成长之路

有些事并不是因为有希望才去坚持&#xff0c;而是因为坚持了才有希望。分享一位嵌入式工程师的成长之路&#xff0c;希望能给朋友一点勉励。刚毕业找不着工作2008年大专毕业后&#xff0c;意气风发南下深圳找工作&#xff0c;想找一份电子技术员的工作&#xff0c;白天上班&…

分享GitHub上一些嵌入式相关的高星开源项目

关于GitHub&#xff0c;可能很多人误以为这是互联网人的专属&#xff0c;其实并不是&#xff0c;那上面嵌入式相关的开源项目是有很多的。现分享一些高星开源项目&#xff08;像RT-Thread、AWTK等大家都熟知的就不介绍了&#xff09;&#xff1a;Avem项目链接&#xff1a;https…

安全四部曲之一---***工具简单使用

所需工具&#xff1a;ASP小旋风5.asp(黑防)鸽子2006ie_xpsp2网马生成器##############Michael分割线################先给大家几个外网路由的地址你们进去捣乱捣乱,没事的,因为没有日志记录用户名密码 全都是admin,别搞太破坏哦如果改动里面的设置,记得把登录密码改了,否则他们…

第 8 章 配置listener监听器

第 8 章 配置listener监听器注意 还记得我们之前讲过的在线列表吗&#xff1f;第 4.2 节 “例子&#xff1a;在线列表”。我们曾经说过那个在线列表无法判断用户非法退出&#xff0c;很可能造成在线列表无限增大&#xff0c;现在我们可以用listener来弥补这一问题了。如果你不满…

集合(collection)

使用数组存放数据的弊端&#xff1a;长度不可变&#xff0c;而集合可以动态的添加值 java集合类不仅可以存储数量不等的多个对象&#xff0c;还可以保存具有映射关系的关联数组 /* * 1.存储对象可以考虑&#xff1a;①数组 ②集合 * 2.数组存储对象的特点&#xff1a;Student[]…

聊培训跳槽的事

■原来跟我沟通有压力这是我最近跟一个微信好友聊天才知道的事情&#xff0c;说跟我沟通还挺有压力的。实话说&#xff0c;我多少对这样的感觉感同身受&#xff0c;记得刚毕业那会&#xff0c;跟我师傅聊天说事情&#xff0c;总担心自己会说错了什么&#xff0c;有问题的时候也…

iOS开发针对对Masonry下的FPS优化讨论

今天博客的内容就系统的讨论一下Masonry对FSP的影响&#xff0c;以及如何更好的使用Masonry。如果你对iOS开发足够熟悉的话&#xff0c;那么对Masonry框架应该不陌生。简单的说&#xff0c;Masonry的诞生让AutoLayout的使用更为优雅&#xff0c;让控件的布局更为方便。使用辩证…

导师带学生卡Bug,这波操作~

本文来自知乎https://www.zhihu.com/question/455891395/answer/1847953969事情的起因是明尼苏达大学计算机科学&工程系的助理教授 Kangjie Lu 和他的 Ph. D. 学生 Qiushi Wu 的论文《通过伪君子提交在开源软件中隐蔽地引入漏洞的可行性》&#xff0c;据称将在 2021 年五月…

我想做个MP3,要怎么入手?

从我更新的频率&#xff0c;大家应该猜出来了&#xff0c;最近有点忙。忙完了设备调试的工作&#xff0c;又来了个画图的活。本来改动不大&#xff0c;但怎料...哎&#xff0c;一言难尽。今天回答一个粉丝的提问&#xff1a;看完这个回复&#xff0c;我依然没明白他到底想做哪部…

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

关于进程上下文&#xff0c;中断上下文&#xff0c;请看这篇文章Linux进程上下文和中断上下文内核空间和用户空间自旋锁的初衷&#xff1a;在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间)&#xff0c;所以…

网络流24题 洛谷 3355 骑士共存

转换成最小割&#xff1b; #include <bits/stdc.h>using namespace std ;const int mx [ 9 ] { 2 , 2 , -2 , -2 , -1 , 1 , -1 , 1 } ; const int my [ 9 ] { -1 , 1 , -1 , 1 , 2 , 2 , -2 , -2 } ; const int N 100000 10 , inf 1e8 7 ;queue < int …

从零开始设计CPU

CPU&#xff0c;中文全称为中央处理单元&#xff0c;简称处理器&#xff0c;是现代电子计算机的核心器件。如果你想了解一台计算机是如何构建并工作的&#xff0c;那么深入了解CPU的设计非常有用。不过&#xff0c;这个美好的愿望是否会遭遇“骨感”的现实呢&#xff1f;毕竟一…

嵌入式OS入门笔记-以RTX为案例:一.简介

嵌入式OS入门笔记-以RTX为案例&#xff1a;一.简介 最近在做OS相关的项目&#xff0c;一方面涉及到大量&#xff08;通用&#xff09;操作系统的概念和理解&#xff0c;另一方面要深入到一个小实时操作系统的源代码中&#xff0c;并在此操作系统上开发应用。虽然说内容上并不难…

Linux进程O(1)调度算法,面试必考哦

进程调度有很多方法&#xff0c;这里只讨论Linux下的进程调度&#xff0c;先说下&#xff0c;这个是高端面试必考题&#xff0c;既然我发文了&#xff0c;大家最好看看&#xff0c;而且目前看到的写得最好的文章&#xff0c;推荐给大家。Linux是一个支持多任务的操作系统&#…

让Visual Studio 也支持JS代码折叠 —— 续 [ Visual Studio | Js | ScriptOutline | SmallOutline ]...

前言 上文让JS代码折叠的功能能用了&#xff0c;本文将对代码继续改进以期更好用、更实用&#xff0c;随后有介绍Visual Studio JS方面的几个插件。 文章 1. VS2003折叠代码的Micro 2. MSDN 3. Document Outline for Client Script in Visual Studio 2005 正文 …

嵌入式OS入门笔记-以RTX为案例:二.快速移植到RTX

嵌入式OS入门笔记-以RTX为案例&#xff1a;二.快速移植到RTX本篇笔记将简单介绍RTX&#xff0c;包括基本架构&#xff0c;如何在Keil中配置。需要安装ARM-MDK和一块硬件板&#xff0c;笔记以STM32F4Discovery为例子。1.为什么要用RTOS&#xff1f;尽管把所有程序放在一个大的循…

再解析下内核自旋锁和优先级翻转问题

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析漫画|Linux 并发、竞态、互斥锁、自旋锁、信号量都是什么鬼&#xff1f;Linux内核自旋锁之前写的自旋锁的文章&#xff0c;现在再加一篇&#xff0c;可能单纯的一两次说明不能把问题说清楚。所以再写一篇文…