← Documents Documentation/devicetree/bindings/display/mipi-dsi-bus.txt GitHub 원문 ↗

Linux 6.18.37 · Devicetree Bindings

MIPI DSI Bus

DSI host, virtual channel peripheral과 dual-channel graph 표현을 정의합니다.

Source pathDocumentation/devicetree/bindings/display/mipi-dsi-bus.txt
Source versionLinux v6.18.37
TranslationDUJINLABS 전문 번역 + 해설

요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.

1. 요약·해설

원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.

요약과 해설

mipi-dsi-bus.txt:1-235

DSI bus addressing, control bus 유형과 다섯 가지 구성 예제를 설명합니다.

2. 영어 원문 전체

번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.

원문 전체 펼치기
1 MIPI DSI (Display Serial Interface) busses
2 ==========================================
3
4 The MIPI Display Serial Interface specifies a serial bus and a protocol for
5 communication between a host and up to four peripherals. This document will
6 define the syntax used to represent a DSI bus in a device tree.
7
8 This document describes DSI bus-specific properties only or defines existing
9 standard properties in the context of the DSI bus.
10
11 Each DSI host provides a DSI bus. The DSI host controller's node contains a
12 set of properties that characterize the bus. Child nodes describe individual
13 peripherals on that bus.
14
15 The following assumes that only a single peripheral is connected to a DSI
16 host. Experience shows that this is true for the large majority of setups.
17
18 DSI host
19 ========
20
21 In addition to the standard properties and those defined by the parent bus of
22 a DSI host, the following properties apply to a node representing a DSI host.
23
24 Required properties:
25 - #address-cells: The number of cells required to represent an address on the
26 bus. DSI peripherals are addressed using a 2-bit virtual channel number, so
27 a maximum of 4 devices can be addressed on a single bus. Hence the value of
28 this property should be 1.
29 - #size-cells: Should be 0. There are cases where it makes sense to use a
30 different value here. See below.
31
32 Optional properties:
33 - clock-master: boolean. Should be enabled if the host is being used in
34 conjunction with another DSI host to drive the same peripheral. Hardware
35 supporting such a configuration generally requires the data on both the busses
36 to be driven by the same clock. Only the DSI host instance controlling this
37 clock should contain this property.
38
39 DSI peripheral
40 ==============
41
42 Peripherals with DSI as control bus, or no control bus
43 ------------------------------------------------------
44
45 Peripherals with the DSI bus as the primary control bus, or peripherals with
46 no control bus but use the DSI bus to transmit pixel data are represented
47 as child nodes of the DSI host's node. Properties described here apply to all
48 DSI peripherals, but individual bindings may want to define additional,
49 device-specific properties.
50
51 Required properties:
52 - reg: The virtual channel number of a DSI peripheral. Must be in the range
53 from 0 to 3.
54
55 Some DSI peripherals respond to more than a single virtual channel. In that
56 case two alternative representations can be chosen:
57 - The reg property can take multiple entries, one for each virtual channel
58 that the peripheral responds to.
59 - If the virtual channels that a peripheral responds to are consecutive, the
60 #size-cells can be set to 1. The first cell of each entry in the reg
61 property is the number of the first virtual channel and the second cell is
62 the number of consecutive virtual channels.
63
64 Peripherals with a different control bus
65 ----------------------------------------
66
67 There are peripherals that have I2C/SPI (or some other non-DSI bus) as the
68 primary control bus, but are also connected to a DSI bus (mostly for the data
69 path). Connections between such peripherals and a DSI host can be represented
70 using the graph bindings [1], [2].
71
72 Peripherals that support dual channel DSI
73 -----------------------------------------
74
75 Peripherals with higher bandwidth requirements can be connected to 2 DSI
76 busses. Each DSI bus/channel drives some portion of the pixel data (generally
77 left/right half of each line of the display, or even/odd lines of the display).
78 The graph bindings should be used to represent the multiple DSI busses that are
79 connected to this peripheral. Each DSI host's output endpoint can be linked to
80 an input endpoint of the DSI peripheral.
81
82 [1] Documentation/devicetree/bindings/graph.txt
83 [2] Documentation/devicetree/bindings/media/video-interfaces.txt
84
85 Examples
86 ========
87 - (1), (2) and (3) are examples of a DSI host and peripheral on the DSI bus
88 with different virtual channel configurations.
89 - (4) is an example of a peripheral on a I2C control bus connected to a
90 DSI host using of-graph bindings.
91 - (5) is an example of 2 DSI hosts driving a dual-channel DSI peripheral,
92 which uses I2C as its primary control bus.
93
94 1)
95 dsi-host {
96 ...
97
98 #address-cells = <1>;
99 #size-cells = <0>;
100
101 /* peripheral responds to virtual channel 0 */
102 peripheral@0 {
103 compatible = "...";
104 reg = <0>;
105 };
106
107 ...
108 };
109
110 2)
111 dsi-host {
112 ...
113
114 #address-cells = <1>;
115 #size-cells = <0>;
116
117 /* peripheral responds to virtual channels 0 and 2 */
118 peripheral@0 {
119 compatible = "...";
120 reg = <0, 2>;
121 };
122
123 ...
124 };
125
126 3)
127 dsi-host {
128 ...
129
130 #address-cells = <1>;
131 #size-cells = <1>;
132
133 /* peripheral responds to virtual channels 1, 2 and 3 */
134 peripheral@1 {
135 compatible = "...";
136 reg = <1 3>;
137 };
138
139 ...
140 };
141
142 4)
143 i2c-host {
144 ...
145
146 dsi-bridge@35 {
147 compatible = "...";
148 reg = <0x35>;
149
150 ports {
151 ...
152
153 port {
154 bridge_mipi_in: endpoint {
155 remote-endpoint = <&host_mipi_out>;
156 };
157 };
158 };
159 };
160 };
161
162 dsi-host {
163 ...
164
165 ports {
166 ...
167
168 port {
169 host_mipi_out: endpoint {
170 remote-endpoint = <&bridge_mipi_in>;
171 };
172 };
173 };
174 };
175
176 5)
177 i2c-host {
178 dsi-bridge@35 {
179 compatible = "...";
180 reg = <0x35>;
181
182 ports {
183 #address-cells = <1>;
184 #size-cells = <0>;
185
186 port@0 {
187 reg = <0>;
188 dsi0_in: endpoint {
189 remote-endpoint = <&dsi0_out>;
190 };
191 };
192
193 port@1 {
194 reg = <1>;
195 dsi1_in: endpoint {
196 remote-endpoint = <&dsi1_out>;
197 };
198 };
199 };
200 };
201 };
202
203 dsi0-host {
204 ...
205
206 /*
207 * this DSI instance drives the clock for both the host
208 * controllers
209 */
210 clock-master;
211
212 ports {
213 ...
214
215 port {
216 dsi0_out: endpoint {
217 remote-endpoint = <&dsi0_in>;
218 };
219 };
220 };
221 };
222
223 dsi1-host {
224 ...
225
226 ports {
227 ...
228
229 port {
230 dsi1_out: endpoint {
231 remote-endpoint = <&dsi1_in>;
232 };
233 };
234 };
235 };
236

3. 한국어 전문 번역

영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.

MIPI DSI bus와 host

1-38

MIPI DSI(Display Serial Interface)는 host와 최대 네 peripheral 사이의 통신을 위한 serial bus와 protocol을 규정합니다. 이 문서는 Device Tree에서 DSI bus를 표현하는 문법을 정의하며, DSI 전용 속성 또는 기존 표준 속성이 DSI 문맥에서 갖는 의미만 설명합니다.

각 DSI host는 하나의 DSI bus를 제공합니다. Host controller node의 속성 집합이 bus의 특성을 나타내고, child node가 bus의 개별 peripheral을 나타냅니다. 여기서는 하나의 DSI host에 peripheral 하나만 연결한다고 가정하며, 실제 구성의 대다수가 이 형태입니다.

DSI host node에는 parent bus와 표준 속성에 더해 `#address-cells = <1>`이 필요합니다. DSI peripheral 주소는 2-bit virtual channel 번호이므로 한 bus에서 0부터 3까지 최대 네 device를 지정할 수 있습니다. `#size-cells`는 일반적으로 0이지만 아래에서 설명하는 연속 virtual channel 표현에는 다른 값을 사용할 수 있습니다.

선택 boolean `clock-master`는 두 DSI host가 같은 peripheral을 함께 구동할 때 clock을 제어하는 host에만 둡니다. 이런 hardware는 보통 두 bus의 data가 같은 clock으로 구동되어야 하므로 실제 공통 clock을 제어하는 DSI host instance 하나만 이 속성을 가져야 합니다.

DSI host와 bus 구조
DSI host controller#address-cells = 1
DSI bus2-bit virtual channels 0..3
Peripheral childreg = virtual channel
Optional second hostOne clock-master

Host node가 bus 속성을 소유하고 child node가 virtual channel로 주소 지정되는 peripheral을 나타냅니다.

DSI가 control bus인 peripheral

39-63

DSI를 primary control bus로 사용하는 peripheral, 또는 별도 control bus 없이 DSI로 pixel data만 전송하는 peripheral은 DSI host node의 child node로 표현합니다. 여기의 공통 속성 외에 개별 binding이 device 전용 속성을 추가할 수 있습니다.

필수 `reg`는 DSI peripheral의 virtual channel 번호이며 0부터 3 사이여야 합니다. Peripheral이 여러 virtual channel에 응답하면 `reg`에 channel마다 entry를 하나씩 나열할 수 있습니다.

응답하는 virtual channel이 연속이면 `#size-cells = <1>`로 설정하는 대안도 있습니다. 이때 `reg` entry의 첫 cell은 첫 virtual channel 번호이고 두 번째 cell은 연속 channel 수입니다.

DSI virtual channel 표현
구성#size-cellsreg 예의미
단일 channel0<0>VC 0
비연속 channel0<0, 2>VC 0과 2
연속 channel1<1 3>VC 1부터 3까지 3개

단일, 비연속 복수, 연속 복수 channel을 `reg`와 `#size-cells`로 표현합니다.

다른 control bus와 dual-channel DSI

64-84

Primary control bus가 I2C, SPI 또는 다른 non-DSI bus이면서 data path를 위해 DSI에도 연결되는 peripheral은 graph binding으로 DSI host와의 연결을 표현할 수 있습니다.

더 높은 bandwidth가 필요한 peripheral은 두 DSI bus에 연결할 수 있습니다. 각 bus 또는 channel은 일반적으로 display 각 scanline의 왼쪽/오른쪽 절반이나 짝수/홀수 line처럼 pixel data의 일부를 구동합니다. 각 DSI host output endpoint를 peripheral의 서로 다른 input endpoint에 연결합니다.

Graph 형식은 `[1] Documentation/devicetree/bindings/graph.txt`와 `[2] Documentation/devicetree/bindings/media/video-interfaces.txt`를 참조합니다.

Dual-channel DSI graph
I2C control busBridge configuration
DSI host 0 + clock-masterdsi0_out
DSI host 1dsi1_out
Dual-channel peripheraldsi0_in + dsi1_in
Pixel splitLeft/right 또는 even/odd lines

I2C가 제어하는 bridge의 두 DSI input을 두 host output에 각각 연결하고 한 host가 공통 clock을 제어합니다.

예제 1: 단일 virtual channel

85-109

다섯 예제 중 (1), (2), (3)은 서로 다른 virtual channel 구성을, (4)는 I2C control bus peripheral과 DSI host의 of-graph 연결을, (5)는 I2C로 제어되는 dual-channel peripheral을 두 DSI host가 구동하는 구성을 보여 줍니다.

예제 (1)은 `#address-cells = <1>`, `#size-cells = <0>`인 host 아래에서 `peripheral@0`이 virtual channel 0 하나에 응답하는 기본 형태입니다.

dsi-host {
        ...

        #address-cells = <1>;
        #size-cells = <0>;

        /* peripheral responds to virtual channel 0 */
        peripheral@0 {
                compatible = "...";
                reg = <0>;
        };

        ...
};

예제 2: 비연속 virtual channel

110-125

예제 (2)는 size cell 없이 `reg = <0, 2>`의 복수 entry를 사용하여 peripheral이 비연속 virtual channel 0과 2에 응답함을 나타냅니다.

dsi-host {
        ...

        #address-cells = <1>;
        #size-cells = <0>;

        /* peripheral responds to virtual channels 0 and 2 */
        peripheral@0 {
                compatible = "...";
                reg = <0, 2>;
        };

        ...
};

예제 3: 연속 virtual channel 범위

126-141

예제 (3)은 `#size-cells = <1>`로 바꾸고 `reg = <1 3>`을 사용합니다. 첫 channel 1부터 연속 3개, 즉 virtual channel 1, 2, 3에 peripheral이 응답합니다.

dsi-host {
        ...

        #address-cells = <1>;
        #size-cells = <1>;

        /* peripheral responds to virtual channels 1, 2 and 3 */
        peripheral@1 {
                compatible = "...";
                reg = <1 3>;
        };

        ...
};

예제 4: I2C control bus와 DSI data path

142-175

예제 (4)의 bridge는 I2C address `0x35`로 제어됩니다. Bridge의 `bridge_mipi_in` endpoint와 DSI host의 `host_mipi_out` endpoint가 서로를 `remote-endpoint`로 참조하여 DSI data path를 표현합니다. 원문의 생략 표기 `...`도 그대로 보존합니다.

i2c-host {
        ...

        dsi-bridge@35 {
                compatible = "...";
                reg = <0x35>;

                ports {
                        ...

                        port {
                                bridge_mipi_in: endpoint {
                                        remote-endpoint = <&host_mipi_out>;
                                };
                        };
                };
        };
};

dsi-host {
        ...

        ports {
                ...

                port {
                        host_mipi_out: endpoint {
                                remote-endpoint = <&bridge_mipi_in>;
                        };
                };
        };
};

예제 5: 두 host가 구동하는 dual-channel bridge

176-235

예제 (5)의 I2C bridge에는 input `port@0`과 `port@1`이 있으며 각각 `dsi0_in`과 `dsi1_in` endpoint를 갖습니다. 두 endpoint는 DSI host 0과 1의 output에 각각 연결됩니다.

`dsi0-host`만 `clock-master`를 선언하여 두 host controller의 clock을 구동합니다. `dsi1-host`는 별도 clock-master 선언 없이 두 번째 data channel만 제공합니다.

i2c-host {
        dsi-bridge@35 {
                compatible = "...";
                reg = <0x35>;

                ports {
                        #address-cells = <1>;
                        #size-cells = <0>;

                        port@0 {
                                reg = <0>;
                                dsi0_in: endpoint {
                                        remote-endpoint = <&dsi0_out>;
                                };
                        };

                        port@1 {
                                reg = <1>;
                                dsi1_in: endpoint {
                                        remote-endpoint = <&dsi1_out>;
                                };
                        };
                };
        };
};

dsi0-host {
        ...

        /*
         * this DSI instance drives the clock for both the host
         * controllers
         */
        clock-master;

        ports {
                ...

                port {
                        dsi0_out: endpoint {
                                remote-endpoint = <&dsi0_in>;
                        };
                };
        };
};

dsi1-host {
        ...

        ports {
                ...

                port {
                        dsi1_out: endpoint {
                                remote-endpoint = <&dsi1_in>;
                        };
                };
        };
};