Blame view

kernel/linux-imx6_3.14.28/Documentation/arm/OMAP/DSS 12.4 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
  OMAP2/3 Display Subsystem
  -------------------------
  
  This is an almost total rewrite of the OMAP FB driver in drivers/video/omap
  (let's call it DSS1). The main differences between DSS1 and DSS2 are DSI,
  TV-out and multiple display support, but there are lots of small improvements
  also.
  
  The DSS2 driver (omapdss module) is in arch/arm/plat-omap/dss/, and the FB,
  panel and controller drivers are in drivers/video/omap2/. DSS1 and DSS2 live
  currently side by side, you can choose which one to use.
  
  Features
  --------
  
  Working and tested features include:
  
  - MIPI DPI (parallel) output
  - MIPI DSI output in command mode
  - MIPI DBI (RFBI) output
  - SDI output
  - TV output
  - All pieces can be compiled as a module or inside kernel
  - Use DISPC to update any of the outputs
  - Use CPU to update RFBI or DSI output
  - OMAP DISPC planes
  - RGB16, RGB24 packed, RGB24 unpacked
  - YUV2, UYVY
  - Scaling
  - Adjusting DSS FCK to find a good pixel clock
  - Use DSI DPLL to create DSS FCK
  
  Tested boards include:
  - OMAP3 SDP board
  - Beagle board
  - N810
  
  omapdss driver
  --------------
  
  The DSS driver does not itself have any support for Linux framebuffer, V4L or
  such like the current ones, but it has an internal kernel API that upper level
  drivers can use.
  
  The DSS driver models OMAP's overlays, overlay managers and displays in a
  flexible way to enable non-common multi-display configuration. In addition to
  modelling the hardware overlays, omapdss supports virtual overlays and overlay
  managers. These can be used when updating a display with CPU or system DMA.
  
  omapdss driver support for audio
  --------------------------------
  There exist several display technologies and standards that support audio as
  well. Hence, it is relevant to update the DSS device driver to provide an audio
  interface that may be used by an audio driver or any other driver interested in
  the functionality.
  
  The audio_enable function is intended to prepare the relevant
  IP for playback (e.g., enabling an audio FIFO, taking in/out of reset
  some IP, enabling companion chips, etc). It is intended to be called before
  audio_start. The audio_disable function performs the reverse operation and is
  intended to be called after audio_stop.
  
  While a given DSS device driver may support audio, it is possible that for
  certain configurations audio is not supported (e.g., an HDMI display using a
  VESA video timing). The audio_supported function is intended to query whether
  the current configuration of the display supports audio.
  
  The audio_config function is intended to configure all the relevant audio
  parameters of the display. In order to make the function independent of any
  specific DSS device driver, a struct omap_dss_audio is defined. Its purpose
  is to contain all the required parameters for audio configuration. At the
  moment, such structure contains pointers to IEC-60958 channel status word
  and CEA-861 audio infoframe structures. This should be enough to support
  HDMI and DisplayPort, as both are based on CEA-861 and IEC-60958.
  
  The audio_enable/disable, audio_config and audio_supported functions could be
  implemented as functions that may sleep. Hence, they should not be called
  while holding a spinlock or a readlock.
  
  The audio_start/audio_stop function is intended to effectively start/stop audio
  playback after the configuration has taken place. These functions are designed
  to be used in an atomic context. Hence, audio_start should return quickly and be
  called only after all the needed resources for audio playback (audio FIFOs,
  DMA channels, companion chips, etc) have been enabled to begin data transfers.
  audio_stop is designed to only stop the audio transfers. The resources used
  for playback are released using audio_disable.
  
  The enum omap_dss_audio_state may be used to help the implementations of
  the interface to keep track of the audio state. The initial state is _DISABLED;
  then, the state transitions to _CONFIGURED, and then, when it is ready to
  play audio, to _ENABLED. The state _PLAYING is used when the audio is being
  rendered.
  
  
  Panel and controller drivers
  ----------------------------
  
  The drivers implement panel or controller specific functionality and are not
  usually visible to users except through omapfb driver.  They register
  themselves to the DSS driver.
  
  omapfb driver
  -------------
  
  The omapfb driver implements arbitrary number of standard linux framebuffers.
  These framebuffers can be routed flexibly to any overlays, thus allowing very
  dynamic display architecture.
  
  The driver exports some omapfb specific ioctls, which are compatible with the
  ioctls in the old driver.
  
  The rest of the non standard features are exported via sysfs. Whether the final
  implementation will use sysfs, or ioctls, is still open.
  
  V4L2 drivers
  ------------
  
  V4L2 is being implemented in TI.
  
  From omapdss point of view the V4L2 drivers should be similar to framebuffer
  driver.
  
  Architecture
  --------------------
  
  Some clarification what the different components do:
  
      - Framebuffer is a memory area inside OMAP's SRAM/SDRAM that contains the
        pixel data for the image. Framebuffer has width and height and color
        depth.
      - Overlay defines where the pixels are read from and where they go on the
        screen. The overlay may be smaller than framebuffer, thus displaying only
        part of the framebuffer. The position of the overlay may be changed if
        the overlay is smaller than the display.
      - Overlay manager combines the overlays in to one image and feeds them to
        display.
      - Display is the actual physical display device.
  
  A framebuffer can be connected to multiple overlays to show the same pixel data
  on all of the overlays. Note that in this case the overlay input sizes must be
  the same, but, in case of video overlays, the output size can be different. Any
  framebuffer can be connected to any overlay.
  
  An overlay can be connected to one overlay manager. Also DISPC overlays can be
  connected only to DISPC overlay managers, and virtual overlays can be only
  connected to virtual overlays.
  
  An overlay manager can be connected to one display. There are certain
  restrictions which kinds of displays an overlay manager can be connected:
  
      - DISPC TV overlay manager can be only connected to TV display.
      - Virtual overlay managers can only be connected to DBI or DSI displays.
      - DISPC LCD overlay manager can be connected to all displays, except TV
        display.
  
  Sysfs
  -----
  The sysfs interface is mainly used for testing. I don't think sysfs
  interface is the best for this in the final version, but I don't quite know
  what would be the best interfaces for these things.
  
  The sysfs interface is divided to two parts: DSS and FB.
  
  /sys/class/graphics/fb? directory:
  mirror		0=off, 1=on
  rotate		Rotation 0-3 for 0, 90, 180, 270 degrees
  rotate_type	0 = DMA rotation, 1 = VRFB rotation
  overlays	List of overlay numbers to which framebuffer pixels go
  phys_addr	Physical address of the framebuffer
  virt_addr	Virtual address of the framebuffer
  size		Size of the framebuffer
  
  /sys/devices/platform/omapdss/overlay? directory:
  enabled		0=off, 1=on
  input_size	width,height (ie. the framebuffer size)
  manager		Destination overlay manager name
  name
  output_size	width,height
  position	x,y
  screen_width	width
  global_alpha   	global alpha 0-255 0=transparent 255=opaque
  
  /sys/devices/platform/omapdss/manager? directory:
  display				Destination display
  name
  alpha_blending_enabled		0=off, 1=on
  trans_key_enabled		0=off, 1=on
  trans_key_type			gfx-destination, video-source
  trans_key_value			transparency color key (RGB24)
  default_color			default background color (RGB24)
  
  /sys/devices/platform/omapdss/display? directory:
  ctrl_name	Controller name
  mirror		0=off, 1=on
  update_mode	0=off, 1=auto, 2=manual
  enabled		0=off, 1=on
  name
  rotate		Rotation 0-3 for 0, 90, 180, 270 degrees
  timings		Display timings (pixclock,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw)
  		When writing, two special timings are accepted for tv-out:
  		"pal" and "ntsc"
  panel_name
  tear_elim	Tearing elimination 0=off, 1=on
  output_type	Output type (video encoder only): "composite" or "svideo"
  
  There are also some debugfs files at <debugfs>/omapdss/ which show information
  about clocks and registers.
  
  Examples
  --------
  
  The following definitions have been made for the examples below:
  
  ovl0=/sys/devices/platform/omapdss/overlay0
  ovl1=/sys/devices/platform/omapdss/overlay1
  ovl2=/sys/devices/platform/omapdss/overlay2
  
  mgr0=/sys/devices/platform/omapdss/manager0
  mgr1=/sys/devices/platform/omapdss/manager1
  
  lcd=/sys/devices/platform/omapdss/display0
  dvi=/sys/devices/platform/omapdss/display1
  tv=/sys/devices/platform/omapdss/display2
  
  fb0=/sys/class/graphics/fb0
  fb1=/sys/class/graphics/fb1
  fb2=/sys/class/graphics/fb2
  
  Default setup on OMAP3 SDP
  --------------------------
  
  Here's the default setup on OMAP3 SDP board. All planes go to LCD. DVI
  and TV-out are not in use. The columns from left to right are:
  framebuffers, overlays, overlay managers, displays. Framebuffers are
  handled by omapfb, and the rest by the DSS.
  
  FB0 --- GFX  -\            DVI
  FB1 --- VID1 --+- LCD ---- LCD
  FB2 --- VID2 -/   TV ----- TV
  
  Example: Switch from LCD to DVI
  ----------------------
  
  w=`cat $dvi/timings | cut -d "," -f 2 | cut -d "/" -f 1`
  h=`cat $dvi/timings | cut -d "," -f 3 | cut -d "/" -f 1`
  
  echo "0" > $lcd/enabled
  echo "" > $mgr0/display
  fbset -fb /dev/fb0 -xres $w -yres $h -vxres $w -vyres $h
  # at this point you have to switch the dvi/lcd dip-switch from the omap board
  echo "dvi" > $mgr0/display
  echo "1" > $dvi/enabled
  
  After this the configuration looks like:
  
  FB0 --- GFX  -\         -- DVI
  FB1 --- VID1 --+- LCD -/   LCD
  FB2 --- VID2 -/   TV ----- TV
  
  Example: Clone GFX overlay to LCD and TV
  -------------------------------
  
  w=`cat $tv/timings | cut -d "," -f 2 | cut -d "/" -f 1`
  h=`cat $tv/timings | cut -d "," -f 3 | cut -d "/" -f 1`
  
  echo "0" > $ovl0/enabled
  echo "0" > $ovl1/enabled
  
  echo "" > $fb1/overlays
  echo "0,1" > $fb0/overlays
  
  echo "$w,$h" > $ovl1/output_size
  echo "tv" > $ovl1/manager
  
  echo "1" > $ovl0/enabled
  echo "1" > $ovl1/enabled
  
  echo "1" > $tv/enabled
  
  After this the configuration looks like (only relevant parts shown):
  
  FB0 +-- GFX  ---- LCD ---- LCD
       \- VID1 ---- TV  ---- TV
  
  Misc notes
  ----------
  
  OMAP FB allocates the framebuffer memory using the standard dma allocator. You
  can enable Contiguous Memory Allocator (CONFIG_CMA) to improve the dma
  allocator, and if CMA is enabled, you use "cma=" kernel parameter to increase
  the global memory area for CMA.
  
  Using DSI DPLL to generate pixel clock it is possible produce the pixel clock
  of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI.
  
  Rotation and mirroring currently only supports RGB565 and RGB8888 modes. VRFB
  does not support mirroring.
  
  VRFB rotation requires much more memory than non-rotated framebuffer, so you
  probably need to increase your vram setting before using VRFB rotation. Also,
  many applications may not work with VRFB if they do not pay attention to all
  framebuffer parameters.
  
  Kernel boot arguments
  ---------------------
  
  omapfb.mode=<display>:<mode>[,...]
  	- Default video mode for specified displays. For example,
  	  "dvi:800x400MR-24@60".  See drivers/video/modedb.c.
  	  There are also two special modes: "pal" and "ntsc" that
  	  can be used to tv out.
  
  omapfb.vram=<fbnum>:<size>[@<physaddr>][,...]
  	- VRAM allocated for a framebuffer. Normally omapfb allocates vram
  	  depending on the display size. With this you can manually allocate
  	  more or define the physical address of each framebuffer. For example,
  	  "1:4M" to allocate 4M for fb1.
  
  omapfb.debug=<y|n>
  	- Enable debug printing. You have to have OMAPFB debug support enabled
  	  in kernel config.
  
  omapfb.test=<y|n>
  	- Draw test pattern to framebuffer whenever framebuffer settings change.
  	  You need to have OMAPFB debug support enabled in kernel config.
  
  omapfb.vrfb=<y|n>
  	- Use VRFB rotation for all framebuffers.
  
  omapfb.rotate=<angle>
  	- Default rotation applied to all framebuffers.
  	  0 - 0 degree rotation
  	  1 - 90 degree rotation
  	  2 - 180 degree rotation
  	  3 - 270 degree rotation
  
  omapfb.mirror=<y|n>
  	- Default mirror for all framebuffers. Only works with DMA rotation.
  
  omapdss.def_disp=<display>
  	- Name of default display, to which all overlays will be connected.
  	  Common examples are "lcd" or "tv".
  
  omapdss.debug=<y|n>
  	- Enable debug printing. You have to have DSS debug support enabled in
  	  kernel config.
  
  TODO
  ----
  
  DSS locking
  
  Error checking
  - Lots of checks are missing or implemented just as BUG()
  
  System DMA update for DSI
  - Can be used for RGB16 and RGB24P modes. Probably not for RGB24U (how
    to skip the empty byte?)
  
  OMAP1 support
  - Not sure if needed