123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- 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
|