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