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
<!-- 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 設置完了。
<!-- Panel Timing -->使用高通的計算timging tool 80-NH7131_x.xlsm
在DSI and MDP registers 選項中
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
DSI PHY register 即爲timing值。
<PanelTimings> 12位,最後一個爲0x00
<TClkPost>爲T_CLK_POST,<TClkPre>爲T_CLK_PRE
<!-- 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 控制背光範圍較大
<!-- 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
通過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目錄下
點亮屏幕 點亮屏幕分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。
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 ,燒入即可完成點屏