点击打开链接

版权声明: 作者:alex wang 版权:本文版权归作者和CSDN共有 转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢 要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任

目录(?)[+]

LCD

LCD 是指字面意思是液晶显示屏(Liquid Crystal Display), 而RAM: 随机存取存储器(Random-Access Memory)。控制IC是LCD的大脑。所谓的LCD RAM自然是指此大脑是否包含RAM.

LCD的种类分类标准比多,按驱动方式可以分为:被动矩阵式、主动矩阵式两种:

  • 被动矩阵式:被动矩阵式LCD又可分为TN-LCD(TwistedNematic-LCD,扭曲向列LCD)、STN—LCD(SuperTN-LCD,超扭曲向列LCD)和DSTN-LCD(Doublelayer STN-LCD,双层超扭曲向列LCD).
  • 主动矩阵式:目前应用比较广泛的主动矩阵式LCD,也称TFT-LCD。TFT-LCD 即是Thin-FilmTransistor Liquid-Crystal Display的缩写(薄膜电晶体液晶显示器)

TFT-LCD 结构侧视图

其具体的物理定义请参照Android LCD(一):LCD基本原理篇

LCD传输的信号有很多: 
* TTL(主要用于小屏) 
* LVDS,即Low Voltage Differential Signaling,是一种低压差分信号技术接口。克服以TTL电平方式传输宽带高码率数据时功耗大、EMI电磁干扰大等缺点而研制的一种数字视频信号传输方式 
* EDP 
* MIPI(我主要对此有过研究,因此在这个接口上会详细讲述)

PS:基本上作为手机制造商来讲,会使用mipi作为接口,据我现在工作的华硕公司来讲,基本上使用的都是TM、BOE的panel。

想要了解其他的借口信号可以参考Android LCD(二):LCD常用接口原理篇

MIPI

MIPI (Mobile Industry Processor Interface) 是2003年由ARM, Nokia, ST ,TI等公司成立的一个联盟,目的是把手机内部的接口如摄像头、显示屏接口、射频/基带接口等标准化,从而减少手机设计的复杂程度和增加设计灵活性。 MIPI联盟下面有不同的WorkGroup,分别定义了一系列的手机内部接口标准,比如摄像头接口CSI、显示接口DSI、射频接口DigRF、麦克风 /喇叭接口SLIMbus等。统一接口标准的好处是手机厂商根据需要可以从市面上灵活选择不同的芯片和模组,更改设计和功能时更加快捷方便。

下图是以mipi为例的手机内部框架图:

CSI/DSI分别是指其承载的是针对Camera或Display应用,都有复杂的协议结构。以DSI为例,其协议层结构如下:

DSI (Display Serial Interface)定义了一个位于处理器和显示模组之间的高速串行接口

DSI分四层,对应D-PHY、DSI、DCS规范

  • PHY 定义了传输媒介,输入/输出电路和和时钟和信号机制。
  • Lane Management层:发送和收集数据流到每条lane
  • Low Level Protocol层:定义了如何组帧和解析以及错误检测等
  • Application层:描述高层编码和解析数据流

屏幕传输中又对应的2种不同的传输模式:

  • Command mode:对应传输的是mpu接口
  • Video mode:对应的是RGB接口,这种传输数据方式只能通过hs mode进行传输
mipi传输模式
  • LP(low-power低功耗)用于控制,采用单端信号
  • HS(high-speed)用于高速传输,采用低压差分信号 (抑制共模噪声)

对于LP与HS各个状态所代表的状态表

DSI时钟信号

DSI 时钟 Lanes 有三种模式 Low power mode(LPM),Ultra Low power mode(ULPM超低俗),High Speed Clock mode(HSCM) 
可以参照上表做分析:

这部分内容主要是看时钟信号,后面会具体整理后上传

小结:传输图像等数据是通过HSmode传输保证了数据的快速传递,而下相关的command去控制panel的寄存器就需要使用LPmode传输,可以保证数据的正确性。

bring up panel

拿到panel板子,首先问厂商要该板子的code,包括initial code,reset sequence ,porch setting。

图中相关信息 
* step 1-7 电压配置,LP11 拉高。 
* step 8-12 reset sequence (重要) 
* step 13-18 on command 点亮屏幕

这个是上电的sequence,包括前面的电压配置(不同电压之间的延时),reset sequence , MIPI data&clock , command ,最后是数据传输

Porch setting 数据正如前面所说,是DSI video mode的Timing

根据厂商panel 的 IC 和 code 计算timging ,填写xml文档。

从device\qcom\common\display\tools下找到panel-xxxx.xml文件里面包含主要有9个部分。

xml文件每个配置具体含义可以查看高通的文档

<!-- Panel Command information -->根据前面的initial code
<OnCommand><OffCommand>格式
CommandType Data type of command 1
Last Specifies if this command packet is individual or not. 1
VC Virtual channel used to send this command 1
Ack Needs acknowledgement from panel 1
Wait Sleep in microsecond before sending next command. 1
PayloadSize Size of payload 2
Payload Actual command Based on payload size
example:
0x29, 0x01, 0x00 ,0x00, 0x80, 0x00, 0x02, 0x11, 0x00
<OnCommandState> Panel state when sending the on command.
0 = DSI_LP_MODE 1= DSI_HS_MODE
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
<!-- Panel Resolution -->根据上面porch setting
PanelWidth = Panel width in pixel = 1080
PanelHeight = Panel height in pixel = 1920
HFrontPorch = Horizontal back porch value = HFP = 120
HBackPorch = Horizontal front porch value = HBP = 60
HPulseWidth = Horizontal pulse width = HS = 4
HSyncSkew = Horizontal sync skew value 厂商没有特殊说明 都为0
VBackPorch=Vertical back porch value = VBP = 4
VFrontPorch= Vertical front porch value = VFP = 4
VPulseWidth=Vertical pulse width = VS = 4
HLeftBorder 厂商没有特殊说明 都为0
HRightBorder 厂商没有特殊说明 都为0
VTopBorder 厂商没有特殊说明 都为0
VBottomBorder 厂商没有特殊说明 都为0
Porch setting 设置完了。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
<!-- Panel Timing -->使用高通的计算timging tool  80-NH7131_x.xlsm
在DSI and MDP registers 选项中
  • 1
  • 2
  • 1
  • 2

Frame rate 已知,lane config 4 , pixel 3 (固定) ,clk 19.2 MHZ 
Chip 8x56 ,其他如porch setting 上。确认后点击check

在DSI PHY x timing settings 选项中 

如果出现INVALID的情况,通过改变T_CLK_PREPARE值使T_CLK_ZERO是VALID的,
计算公式是 (T_CLK_PREPARE+T_TCL_ZERO+T_HS_RQST)mod8 = 0
  • 1
  • 2
  • 1
  • 2
DSI PHY register 即为timing值。
<PanelTimings> 12位,最后一个为0x00
<TClkPost>为T_CLK_POST,<TClkPre>为T_CLK_PRE
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
<!-- Backlight -->
BLMinLevel Minimum value of backlight 1
BLMaxLevel Maximum value of backlight 255
BLPMICControlType PMIC controller for current backlight.
0 = PWM GPIO 1 = WLED 2 = DCS COMMANDS 3 = LPG
(看电路图 这个配置会影响到kernel的背光控制,一般使用WLED和DCS COMMAND ,若配置错误,系统调节背光不能使用) BLMinLevel 和 BLMaxLevel影响 backlight等级,设置1 - 255 控制背光范围较小,设置1 – 4095 控制背光范围较大
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
<!-- Panel Reset Sequence -->根据reset  sequence
<ResetSequence>
<PinState1>1</PinState1>
<PulseWidth1>20</PulseWidth1>
<PinState2>0</PinState2>
<PulseWidth2>10</PulseWidth2>
<PinState3>1</PinState3>
<PulseWidth3>20</PulseWidth3>
<EnableBit>2</EnableBit> Reset pin direction to enable it 默认2
</ResetSequence>
设置时序延时。高电平->延时20ms->低电平->延时10ms->高电平->延时20ms 如果panel 电压不对,则在这里面改
<!-- GPIO configuration -->查电路图看有哪些pin接上
<ResetGPIO> Reset GPIO pin to reset the DSI panel
<EnableGPIO> Enable GPIO pin to power on the DSI panel
<TEGPIO> TE pin for command mode panel
<PWMGPIO> Reset sequence using ResetGPIO with pulse width
<PinSource>“msmgpio”</PinSource> 一般固定string
<PinId>7</PinId> Integer GPIO pin number on source location 看电路图
<PinStrength>3</PinStrength> Power strength of GPIO pin mA. Valuesection describes the power strength table. 有 0=2mA 1=4mA 2=6mA 3=8mA 4=10mA 5=12mA 6=14mA 7=16mA
<PinDirection>1</PinDirection> GPIO pin direction 输入\输出
<PinPull>0</PinPull> GPIO pin pull direction
<PinState>1</PinState> GPIO Pin active state enable\disable
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
通过Perl生成相对应的.h,和.dtsi文件,分别放在不同的目录,.h放在lk,.dtsi放在kernel里面。
     在device\qcom\common\display\toos\下执行command
perl parser.pl panel_*******.xml panel 生成 .dtsi 和 .h两个文件
perl parser.pl platform_****.xml platform 生成.dtsi 和 .h 两个文件
.h文件用于lk点屏, .dtsi文件用于kernel点屏
把panel的.h文件放到 bootable\bootloader\lk\dev\gcdb\display\include\目录下
把platform的.h文件改成display.h放在bootable\bootloader\lk\target\msmxxxx\include\target下,或者直接target_display.c里面添加。(不同的chip和source code放的位置都不一样) 把panel的.dtsi文件放到 kernel\arch\arm64\boot\dts\qcom目录下
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
点亮屏幕 点亮屏幕分lk和kernel两部分。
bring up  LK  (添加不同的panel)
1.把panel的.h文件放到 bootable\bootloader\lk\dev\gcdb\display\include\目录下
2. 把platform的.h文件改成display.h放在bootable\bootloader\lk\target\msmxxxx\include\target下,或者直接target_display.c里面添加。(不同的chip和source code放的位置都不一样)
3.在bootable\bootloader\lk\plaform\msmxxxx\gpio.c中添加int gpio_get函数,用来获取相对应gpio口的状态。
4.在bootable\bootloader\lk\target\msmxxxx\init.c的target_init函数中给LCD_ID1和LCD_ID2所在的gpio口上电使能,即gpio_tlmm_config函数
5.在bootable\bootloader\lk\target\msmxxxx\oem_panel.c中添加生成的.h头文件,selection variable 和 list,并通过switch函数把.h参数配置到相对应的数据结构中
6.最后选择dsi_reg_mode(重要),有两种mode,DCDC mode(默认)和LDO mode,要问ee,我们使用的是哪个mode。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
bring up  kernel  (添加不同的panel)
1.在panel的.dtsi最后面添加 qcom,mdss-dsi-lp11-init;即时序中LP11初始化
2. 把panel的.dtsi文件放到 kernel\arch\arm64\boot\dts\qcom目录下
3.在kernel\arch\arm64\boot\dts\qcom\msmxxxx-mdss-panels.dtsi中添加.dtsi文件为头 文件,并把platform下.dtsi 的supply输入写到里面。
4.在 kernel\arch\arm64\boot\dts\qcom\msmxxxx-mdss-mtp.dtsi中&mdss_dsi0中添加对应panel ID 和 .dtsi入口地址,把platform的.dtsi中gpio信息填到&mdss_dsi最后。 编译aboot 和 boot ,烧入即可完成点屏

漫谈android系统(4)bring up panel的更多相关文章

  1. Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)

    在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...

  2. Android系统之LK启动流程分析(一)

    1.前言 LK是Little Kernel的缩写,在Qualcomm平台的Android系统中普遍采用LK作为bootloader,它是一个开源项目,LK是整个系统的引导部分,所以不是独立存在的,但是 ...

  3. Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80982869 Android系统在启动时安装应用程序的过程,这些应用程序安装好之 ...

  4. 最新Android系统版本与API等级对应关系表

    最新Android系统版本与API等级对应关系表 从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/mani ...

  5. Android系统全貌 (转)

    转自Gityuan的Android开篇,对自我学习作进一步整理. Android系统以Linux内核作为基底,上层采用Native层和Java层.系统分为内核空间和用户空间,并通过系统调用(Sysca ...

  6. android系统release签名

    转自:http://blog.csdn.net/yangkai6121/article/details/38682321 为什么需要给Android系统签个名才能进行CTS认证呢?原来我们通过make ...

  7. Android系统的五种数据存储形式(二)

    之前介绍了Android系统下三种数据存储形式,今天补充介绍另外两种,分别是内容提供者和网络存储.有些人可能认为内存提供者和网络存储更偏向于对数据的操作而不是数据的存储,但这两种方式确实与数据有关,所 ...

  8. Android系统的五种数据存储形式(一)

    Android系统有五种数据存储形式,分别是文件存储.SP存储.数据库存储.contentprovider 内容提供者.网络存储.其中,前四个是本地存储.存储的类型包括简单文本.窗口状态存储.音频视频 ...

  9. Android系统拍照源码

    个人对于Android系统拍照的一些总结:一种自定义图片拍照路径 ,另一种直接利用Android拍照后经过处理的缩略图 特别注意第一种方式需要增加SDK读写权限: <uses-permissio ...

随机推荐

  1. Python中的文件路径的分隔符

    主要是需要考虑分隔符的问题: 在Windows系统下的分隔符是:\ (反斜杠). 在Linux系统下的分隔符是:/(斜杠). 当在字符中出现\时,大家就要考虑到转义字符了. 转义字符的概念,参考维基百 ...

  2. jqGrid 使用心得

    参考: https://blog.csdn.net/u012411219/article/details/51315419 https://www.cnblogs.com/kissdodog/p/38 ...

  3. Linux下打包tar.gz

    将heben-addressbookinit打包成heben-addressbookinit.tar.gz格式 方式1:czvf heben-addressbookinit.tar.gz heben- ...

  4. ubuntu + 远程桌面连接命令 + rdesktop + 连接windows或者ubuntu远程桌面

    原文 https://www.cnblogs.com/xiaouisme/p/5166469.html sudo apt-get install rdesktop rdesktop 124.42.12 ...

  5. 匿名函数lambda

    匿名函数的定义 在python中,匿名函数的定义如下: func =lambda x:x+1 #定义匿名函数,x为传参,x+1为返回值,func为函数名 res = func(10) #执行匿名函数 ...

  6. jQuery 学习笔记一

  7. 在vs2013上的编译tesseract-ocr

    在vs2013上的编译tesseract-ocr OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程. Tesserac ...

  8. MySQL系列教程(一)

    摘要 MySQL的最初的核心思想,主要是开源.简便易用.其开发可追溯至1985年,而第一个内部发行版本诞生,已经是1995年.到1998年,MySQL已经可以支持10中操作系统了,其中就包括win平台 ...

  9. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

  10. java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener问题解决

    今天搭建SSH项目的时候出现了如下错误: 严重: Error configuring application listener of class org.springframework.web.con ...