1 OMAP2/3 Display Subsystem
2 -------------------------
4 This is an almost total rewrite of the OMAP FB driver in drivers/video/omap
5 (let's call it DSS1). The main differences between DSS1 and DSS2 are DSI,
6 TV-out and multiple display support, but there are lots of small improvements
9 The DSS2 driver (omapdss module) is in arch/arm/plat-omap/dss/, and the FB,
10 panel and controller drivers are in drivers/video/omap2/. DSS1 and DSS2 live
11 currently side by side, you can choose which one to use.
16 Working and tested features include:
18 - MIPI DPI (parallel) output
19 - MIPI DSI output in command mode
20 - MIPI DBI (RFBI) output
23 - All pieces can be compiled as a module or inside kernel
24 - Use DISPC to update any of the outputs
25 - Use CPU to update RFBI or DSI output
27 - RGB16, RGB24 packed, RGB24 unpacked
30 - Adjusting DSS FCK to find a good pixel clock
31 - Use DSI DPLL to create DSS FCK
33 Tested boards include:
41 The DSS driver does not itself have any support for Linux framebuffer, V4L or
42 such like the current ones, but it has an internal kernel API that upper level
45 The DSS driver models OMAP's overlays, overlay managers and displays in a
46 flexible way to enable non-common multi-display configuration. In addition to
47 modelling the hardware overlays, omapdss supports virtual overlays and overlay
48 managers. These can be used when updating a display with CPU or system DMA.
50 Panel and controller drivers
51 ----------------------------
53 The drivers implement panel or controller specific functionality and are not
54 usually visible to users except through omapfb driver. They register
55 themselves to the DSS driver.
60 The omapfb driver implements arbitrary number of standard linux framebuffers.
61 These framebuffers can be routed flexibly to any overlays, thus allowing very
62 dynamic display architecture.
64 The driver exports some omapfb specific ioctls, which are compatible with the
65 ioctls in the old driver.
67 The rest of the non standard features are exported via sysfs. Whether the final
68 implementation will use sysfs, or ioctls, is still open.
73 V4L2 is being implemented in TI.
75 From omapdss point of view the V4L2 drivers should be similar to framebuffer
81 Some clarification what the different components do:
83 - Framebuffer is a memory area inside OMAP's SRAM/SDRAM that contains the
84 pixel data for the image. Framebuffer has width and height and color
86 - Overlay defines where the pixels are read from and where they go on the
87 screen. The overlay may be smaller than framebuffer, thus displaying only
88 part of the framebuffer. The position of the overlay may be changed if
89 the overlay is smaller than the display.
90 - Overlay manager combines the overlays in to one image and feeds them to
92 - Display is the actual physical display device.
94 A framebuffer can be connected to multiple overlays to show the same pixel data
95 on all of the overlays. Note that in this case the overlay input sizes must be
96 the same, but, in case of video overlays, the output size can be different. Any
97 framebuffer can be connected to any overlay.
99 An overlay can be connected to one overlay manager. Also DISPC overlays can be
100 connected only to DISPC overlay managers, and virtual overlays can be only
101 connected to virtual overlays.
103 An overlay manager can be connected to one display. There are certain
104 restrictions which kinds of displays an overlay manager can be connected:
106 - DISPC TV overlay manager can be only connected to TV display.
107 - Virtual overlay managers can only be connected to DBI or DSI displays.
108 - DISPC LCD overlay manager can be connected to all displays, except TV
113 The sysfs interface is mainly used for testing. I don't think sysfs
114 interface is the best for this in the final version, but I don't quite know
115 what would be the best interfaces for these things.
117 The sysfs interface is divided to two parts: DSS and FB.
119 /sys/class/graphics/fb? directory:
121 rotate Rotation 0-3 for 0, 90, 180, 270 degrees
122 rotate_type 0 = DMA rotation, 1 = VRFB rotation
123 overlays List of overlay numbers to which framebuffer pixels go
124 phys_addr Physical address of the framebuffer
125 virt_addr Virtual address of the framebuffer
126 size Size of the framebuffer
128 /sys/devices/platform/omapdss/overlay? directory:
130 input_size width,height (ie. the framebuffer size)
131 manager Destination overlay manager name
133 output_size width,height
137 /sys/devices/platform/omapdss/manager? directory:
138 display Destination display
141 /sys/devices/platform/omapdss/display? directory:
142 ctrl_name Controller name
144 update_mode 0=off, 1=auto, 2=manual
147 rotate Rotation 0-3 for 0, 90, 180, 270 degrees
148 timings Display timings (pixclock,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw)
149 When writing, two special timings are accepted for tv-out:
152 tear_elim Tearing elimination 0=off, 1=on
154 There are also some debugfs files at <debugfs>/omapdss/ which show information
155 about clocks and registers.
160 The following definitions have been made for the examples below:
162 ovl0=/sys/devices/platform/omapdss/overlay0
163 ovl1=/sys/devices/platform/omapdss/overlay1
164 ovl2=/sys/devices/platform/omapdss/overlay2
166 mgr0=/sys/devices/platform/omapdss/manager0
167 mgr1=/sys/devices/platform/omapdss/manager1
169 lcd=/sys/devices/platform/omapdss/display0
170 dvi=/sys/devices/platform/omapdss/display1
171 tv=/sys/devices/platform/omapdss/display2
173 fb0=/sys/class/graphics/fb0
174 fb1=/sys/class/graphics/fb1
175 fb2=/sys/class/graphics/fb2
177 Default setup on OMAP3 SDP
178 --------------------------
180 Here's the default setup on OMAP3 SDP board. All planes go to LCD. DVI
181 and TV-out are not in use. The columns from left to right are:
182 framebuffers, overlays, overlay managers, displays. Framebuffers are
183 handled by omapfb, and the rest by the DSS.
186 FB1 --- VID1 --+- LCD ---- LCD
187 FB2 --- VID2 -/ TV ----- TV
189 Example: Switch from LCD to DVI
190 ----------------------
192 w=`cat $dvi/horizontal | cut -d "," -f 1`
193 h=`cat $dvi/vertical | cut -d "," -f 1`
195 echo "0" > $lcd/enabled
196 echo "" > $mgr0/display
197 fbset -fb /dev/fb0 -xres $w -yres $h -vxres $w -vyres $h
198 # at this point you have to switch the dvi/lcd dip-switch from the omap board
199 echo "dvi" > $mgr0/display
200 echo "1" > $dvi/enabled
202 After this the configuration looks like:
204 FB0 --- GFX -\ -- DVI
205 FB1 --- VID1 --+- LCD -/ LCD
206 FB2 --- VID2 -/ TV ----- TV
208 Example: Clone GFX overlay to LCD and TV
209 -------------------------------
211 w=`cat $tv/horizontal | cut -d "," -f 1`
212 h=`cat $tv/vertical | cut -d "," -f 1`
214 echo "0" > $ovl0/enabled
215 echo "0" > $ovl1/enabled
217 echo "" > $fb1/overlays
218 echo "0,1" > $fb0/overlays
220 echo "$w,$h" > $ovl1/output_size
221 echo "tv" > $ovl1/manager
223 echo "1" > $ovl0/enabled
224 echo "1" > $ovl1/enabled
226 echo "1" > $tv/enabled
228 After this the configuration looks like (only relevant parts shown):
230 FB0 +-- GFX ---- LCD ---- LCD
231 \- VID1 ---- TV ---- TV
236 OMAP FB allocates the framebuffer memory using the OMAP VRAM allocator.
238 Using DSI DPLL to generate pixel clock it is possible produce the pixel clock
239 of 86.5MHz (max possible), and with that you get 1280x1024@57 output from DVI.
241 Rotation and mirroring currently only supports RGB565 and RGB8888 modes. VRFB
242 does not support mirroring.
244 VRFB rotation requires much more memory than non-rotated framebuffer, so you
245 probably need to increase your vram setting before using VRFB rotation. Also,
246 many applications may not work with VRFB if they do not pay attention to all
247 framebuffer parameters.
249 Kernel boot arguments
250 ---------------------
253 - Amount of total VRAM to preallocate. For example, "10M". omapfb
254 allocates memory for framebuffers from VRAM.
256 omapfb.mode=<display>:<mode>[,...]
257 - Default video mode for specified displays. For example,
258 "dvi:800x400MR-24@60". See drivers/video/modedb.c.
259 There are also two special modes: "pal" and "ntsc" that
260 can be used to tv out.
262 omapfb.vram=<fbnum>:<size>[@<physaddr>][,...]
263 - VRAM allocated for a framebuffer. Normally omapfb allocates vram
264 depending on the display size. With this you can manually allocate
265 more or define the physical address of each framebuffer. For example,
266 "1:4M" to allocate 4M for fb1.
269 - Enable debug printing. You have to have OMAPFB debug support enabled
273 - Draw test pattern to framebuffer whenever framebuffer settings change.
274 You need to have OMAPFB debug support enabled in kernel config.
277 - Use VRFB rotation for all framebuffers.
279 omapfb.rotate=<angle>
280 - Default rotation applied to all framebuffers.
281 0 - 0 degree rotation
282 1 - 90 degree rotation
283 2 - 180 degree rotation
284 3 - 270 degree rotation
287 - Default mirror for all framebuffers. Only works with DMA rotation.
289 omapdss.def_disp=<display>
290 - Name of default display, to which all overlays will be connected.
291 Common examples are "lcd" or "tv".
294 - Enable debug printing. You have to have DSS debug support enabled in
303 - Lots of checks are missing or implemented just as BUG()
305 System DMA update for DSI
306 - Can be used for RGB16 and RGB24P modes. Probably not for RGB24U (how
307 to skip the empty byte?)