---
tags: Android BSP Development
---
# Qucomm MIPI DSI LCD Bring Up
## MIPI DSI介紹
**MIPI**是**Mobile Industry Processor Interface**的縮寫。MIPI是MIPI聯盟發起的為手機處理器制定的開放標準。
已經完成和正在計畫的規範如下:

##### 名詞解釋
- DCS (DisplayCommandSet):DCS是一個標準化的命令集,用於命令模式的顯示模組
- DSI (DisplaySerialInterface) : DSI 定義一個介於處理器和顯示模组間的高速串行接口
- CSI (CameraSerialInterface) : CSI 定義一個介於處理器和攝像模组間的高速串行接口
- D-PHY:提供DSI和CSI的物理層定義
##### DSI分層結構
DSI分四層
- PHY層定義了傳輸媒介,輸入/輸出電路和和時鐘和信號機制。
- Lane Management層:發送和收集數據流到每條lane。
- Low Level Protocol層:定義了如何组帧和解析以及錯誤檢測等。
- Application層:描述高層編碼和解析數據流。

##### Command和Video模式
- DSI兼容的外設支持Command或Video操作模式,用哪個模式由外設的架構决定
- Command模式是指採用發送命令和數據到具有顯示缓存的控制器。主机通過命令間接的控制外設。Command模式採用雙向接口
- Video模式是指從主机傳輸到外設採用时实象素流。這種模式只能以**高速傳輸**。為减少複雜性和節約成本,只採用Video模式的系统可能只有一個單項數據路徑
## 使用Qcomm工具Bring up LCD
### Display Driver Development Procedure
1. Install the library by the command below.
```
$ sudo apt-get install libxml-libxml-perl libxml-perl
```
2. Enter the tools directory *$ cd device/qcom/common/display/tools* which will show information as below:
```
device/qcom/common/display/tools$ ls
panel_hx8394f_720p_video.xml panel_ili9881c_720p_video.xml panel_nt35590_720p_cmd.xml panel_nt35596_1080p_video.xml parser.pl platform-msm8610.xml README.txt
```
3. Copy the panel_nt35596_1080p_video.xml to a new <oem_panel_input_file>.xml, if the LCD is in
video mode.
In my case, LCD use vedio mode.
```
$ cp panel_nt35596_1080p_video.xml panel_mydemo_1080p_video.xml
```
### Edit the new XML to configure the display parameters. (According my LCD spec)
#### Panel Information
```
32 <GCDB>
33 <Version>"1.0"</Version>
34 <PanelId>mydemo-1080p-video</PanelId>
35 <PanelH>mydemo_1080p_video</PanelH>
36 <PanelEntry>
```
| XML Tag | Description |
| ------- | ----------------------------------------------- |
| Version | Each version is bind to be a set of panel tags. |
| PanelId | Name used to generate the .dtsi file for kernel |
| PanelH | Name used to generate the header file for LK |
#### Panel configuration
```
38 <!-- Panel configuration -->
39 <PanelName>"my demo 1080p video mode dsi panel"</PanelName>
40 <PanelController>"mdss_dsi0"</PanelController>
41 <PanelInterface>10</PanelInterface>
42 <PanelType>0</PanelType>
43 <PanelDestination>"DISPLAY_1"</PanelDestination>
44 <PanelOrientation>0</PanelOrientation>
45 <PanelFrameRate>60</PanelFrameRate>
46 <PanelChannelId>0</PanelChannelId>
47 <DSIVirtualChannelId>0</DSIVirtualChannelId>
48 <PanelBroadcastMode>0</PanelBroadcastMode>
49 <!-- Optional Panel configuration -->
50 <!--BitClockFrequency>0</BitClockFrequency -->
51 <DSIStream>0</DSIStream>
52 <PanelCompatible>"qcom,mdss-dsi-panel"</PanelCompatible>
53 <InterleaveMode>0</InterleaveMode>
```
| XML Tag | Description | Value |
| --------------------------------------- | ------------------------------------------------------- | ------------------------------------ |
| PanelName | PanelName | Name/label value |
| PanelType | Panel is in video mode or command mode | 0 = VIDEO_MODE<br />1 = COMMAND_MODE |
| PanelOrientation<br />(Only used in LK) | Panel rotation value. | 1 = 0 degree<br />2 = 180 degree |
| PanelFrameRate | An integer to define the panel refresh rate per second. | For example: 60 for 60fps panel. |
#### Panel Resolution
```
55 <!-- Panel Resolution -->
56 <PanelWidth>1200</PanelWidth>
57 <PanelHeight>1920</PanelHeight>
58 <HFrontPorch>60</HFrontPorch>
59 <HBackPorch>32</HBackPorch>
60 <HPulseWidth>1</HPulseWidth>
61 <HSyncSkew>0</HSyncSkew>
62 <VBackPorch>25</VBackPorch>
63 <VFrontPorch>35</VFrontPorch>
64 <VPulseWidth>1</VPulseWidth>
65 <HLeftBorder>0</HLeftBorder>
66 <HRightBorder>0</HRightBorder>
67 <VTopBorder>0</VTopBorder>
68 <VBottomBorder>0</VBottomBorder>
69 <!-- Optional Panel resolution configuration -->
70 <!--HActiveRes>0</HActiveRes>
71 <VActiveRes>100</VActiveRes>
72 <InvertDataPolarity>0</InvertDataPolarity>
73 <InvertVsyncPolarity>0</InvertVsyncPolarity>
74 <InvertHsyncPolarity>0</InvertHsyncPolarity -->
```

##### Panel Color Information
```
76 <!-- Panel Color Information -->
77 <ColorFormat>24</ColorFormat>
78 <ColorOrder>0</ColorOrder>
79 <UnderFlowColor>0xff</UnderFlowColor>
80 <BorderColor>0</BorderColor>
```
| XML Tag | Description | Value |
| ----------- | ---------------------------------------------------------- | ------------------------------------------------------------ |
| ColorFormat | Defines the bits per pixel. | 24 = 888_RGB<br />18 = 666_RGB<br />16 = 565_RGB<br />12 = 444_RGB<br />8 = 332_RGB<br />3 = 111_RGB |
| ColorOrder | Defines pixel component color order between MSM and panel. | 0 = DSI_RGB_SWAP_RGB<br />1 = DSI_RGB_SWAP_RBG<br />2 = DSI_RGB_SWAP_BGR<br />3 = DSI_RGB_SWAP_BRG<br />4 = DSI_RGB_SWAP_GRB<br />5 = DSI_RGB_SWAP_GBR |
#### Video mode panel information
```
608 <!-- Video mode panel information -->
609 <HSyncPulse>1</HSyncPulse>
610 <HFPPowerMode>0</HFPPowerMode>
611 <HBPPowerMode>0</HBPPowerMode>
612 <HSAPowerMode>0</HSAPowerMode>
613 <BLLPEOFPowerMode>1</BLLPEOFPowerMode>
614 <BLLPPowerMode>1</BLLPPowerMode>
615 <TrafficMode>2</TrafficMode>
616 <DMADelayAfterVsync>0</DMADelayAfterVsync>
617 <BLLPEOFPower>0x9</BLLPEOFPower>
```
| XML Tag | Description | Value |
| ----------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
| HSyncPulse | Horizontal sync pulses. <br />It determines whether the hardware <br />should send horizontal sync pulses<br />during the vertical blanking period. | 0 = Sync pulse disable<br />1 = Sync pulse enable |
| TrafficMode | Panel traffic mode type | 0 = non burst with sync pulses<br />1 = non burst with sync start event<br />2 = burst mode |
Usually these parameters do not need to be modified. The user may need to note the parameter
<TrafficMode> which may vary with the LCD chip.
#### Lane Configuration
```
619 <!-- Lane Configuration -->
620 <DSILanes>4</DSILanes>
621 <DSILaneMap>0</DSILaneMap>
622 <Lane0State>1</Lane0State>
623 <Lane1State>1</Lane1State>
624 <Lane2State>1</Lane2State>
625 <Lane3State>1</Lane3State>
```

#### Backlight Configuration
```
634 <!-- Backlight -->
635 <BLInterfaceType>1</BLInterfaceType>
636 <BLMinLevel>100</BLMinLevel>
637 <BLMaxLevel>4095</BLMaxLevel>
638 <BLStep>100</BLStep>
639 <BLPMICModel>"PMIC_8941"</BLPMICModel>
640 <BLPMICControlType>0</BLPMICControlType>
```
| XML Tag | Description | Value |
| ----------------- | -------------------------------------- | ------------------------------------------------------------ |
| BLMinLevel | Minimum value of backlight. | |
| BLMaxLevel | Maximum value of backlight. | |
| BLPMICControlType | PMIC controller for current backlight. | 0 = PWM GPIO<br />1 = WLED<br />2 = DCS COMMANDS<br />3 = LPG |
#### Panel Timing
| XML Tag | Description |
| ------------ | ------------------------------------------------------------ |
| PanelTimings | An array of length 12 that specifies the physical timing settings for the panel |
| TClkPost | DSI timing control clock post value |
| TClkPre | DSI timing control clock pre value |
Generate PanelTimings Value


```
627 <!-- Panel Timing -->
628 <PanelTimings>"0xf7, 0x3a, 0x28, 0x00, 0x6e, 0x72, 0x2c, 0x3e, 0x31, 0x03, 0x04, 0x00"</PanelTimings>
629 <DSIMDPTrigger>0</DSIMDPTrigger>
630 <DSIDMATrigger>4</DSIDMATrigger>
631 <TClkPost>0x2</TClkPost>
632 <TClkPre>0x2d</TClkPre>
```
#### Panel Command information
```
82 <!-- Panel Command information -->
83 <OnCommand>"0x05, 0x01, 0x00, 0x00, 0x96, 0x00, 0x02, 0x28, 0x00,
84 0x05, 0x01, 0x00, 0x00, 0x32, 0x00, 0x02, 0x10, 0x00,
85 0x05, 0x01, 0x00, 0x00, 0x96, 0x00, 0x02, 0x11, 0x00,
86 0x05, 0x01, 0x00, 0x00, 0x32, 0x00, 0x02, 0x29, 0x00"</OnCommand>
87 <OffCommand>"0x05, 0x01, 0x00, 0x00, 0x32, 0x00, 0x02, 0x28, 0x00,
88 0x05, 0x01, 0x00, 0x00, 0x78, 0x00, 0x02, 0x10, 0x00"</OffCommand>
89 <OnCommandState>0</OnCommandState>
90 <OffCommandState>1</OffCommandState>
```
| XML Tag | Description | Value |
| --------------- | ------------------------------------------------------------ | ------------------------------------ |
| OnCommand | Array of variable length that lists the initialization commands of the panel | |
| OffCommand | Array of variable length that lists the deinitialization commands of the panel | |
| OnCommandState | Panel state when sending the on command. | 0 = DSI_LP_MODE<br />1 = DSI_HP_MODE |
| OffCommandState | Panel state when sending the off command. | |
Generally speaking, <OnCommandState> and <OffCommandState> only need to keep the default value.
#### Panel Reset Sequence
```
126 <!-- Panel Reset Sequence -->
127 <ResetSequence>
128 <PinState1>1</PinState1>
129 <PulseWidth1>20</PulseWidth1>
130 <PinState2>0</PinState2>
131 <PulseWidth2>1</PulseWidth2>
132 <PinState3>1</PinState3>
133 <PulseWidth3>20</PulseWidth3>
134 <EnableBit>2</EnableBit>
135 </ResetSequence>
```
## Configure Kernel and LK
```
$ perl parser.pl panel_mydemo_1080p_video.xml panel
$ ls
dsi-panel-mydemo-1080p-video.dtsi panel_ili9881c_720p_video.xml panel_mydemo_1080p_video.xml panel_nt35596_1080p_video.xml platform-msm8610.xml
panel_hx8394f_720p_video.xml panel_mydemo_1080p_video.h panel_nt35590_720p_cmd.xml parser.pl README.txt
```
#### Configure Kernel
copy *dsi-panel-mydemo-1080p-video.dtsi* to the following directory: kernel/msm-3.18/arch/arm/boot/dts/qcom/.
1. Include .dtsi files.
Path: kernel/msm-3.18/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi

2. Modify .dtsi files.
Add DSI PHY 2.0.0 timing config to the following directory: kernel/msm-3.18/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi.

The parameters of timing “*mdss-dsi-panel-timings-phy-v2*” are the same as that of the timimg configured in LK (bootable/bootloader/lk/dev/gcdb/display/include/panel_mydemo_1080p_video.h)
“mydemo_1080p_phy2_video_timings”.

```
&dsi_mydemo_1080p_video {
qcom,mdss-dsi-panel-timings-phy-v2 = [
24 20 08 09 05 03 04 a0 /*Data 0*/
24 20 08 09 05 03 04 a0 /*Data 1*/
24 20 08 0a 05 03 04 a0 /*Data 2*/
24 20 08 09 05 03 04 a0 /*Data 3*/
24 1d 08 09 05 03 04 a0]; /*CLK lane*/
};
```
> For example,

The following part should be modified also:
Path: *kernel/msm-3.18/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi*

3. Configure the Backlight.
Path: kernel/msm-3.18/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi

The GPIO to control pwm is,
qcom,mdss-dsi-pwm-gpio = <&pm8953_mpps 4 0>;

Configure backlight type
qcom,mdss-dsi-bl-pmic-control-type: a string that specifies the implementation of backlight control for this
panel.
"bl_ctrl_pwm" = Backlight controlled by PWM GPIO
"bl_ctrl_wled" = Backlight controlled by WLED
"bl_ctrl_dcs" = Backlight controlled by DCS commands(for OLED panel backlight controller) Others: Unknown backlight control. (default)
#### Configure LK
After the file panel_mydemo_1080p_video.h is generated, please copy it to the directory bootable/bootloader/lk/dev/gcdb/display/include/. Customers need to configure the LK to add a new panel.
1. Add several parameters to panel_mydemo_1080p_video.h to avoid compiling error.


2. Add the DSI PHY 2.0.0 timing config

3. Add a new panel.
Path: bootable/bootloader/lk/target/msm8953/oem_panel.c



4. Add new panel selection branch in function “init_panel_data”.

5. Choose to use the new panel in function “oem_panel_select”. The “panel_id” will be passed to kernel.
