V4L/DVB (5184): Add cx23415 decoder register documentation
authorIan Armstrong <ian@iarmst.demon.co.uk>
Sat, 3 Feb 2007 09:37:25 +0000 (06:37 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Wed, 21 Feb 2007 15:35:15 +0000 (13:35 -0200)
Many thanks to Ian Armstrong for figuring out what all these registers do.

Signed-off-by: Ian Armstrong <ian@iarmst.demon.co.uk>
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Documentation/video4linux/cx2341x/fw-decoder-regs.txt [new file with mode: 0644]

diff --git a/Documentation/video4linux/cx2341x/fw-decoder-regs.txt b/Documentation/video4linux/cx2341x/fw-decoder-regs.txt
new file mode 100644 (file)
index 0000000..db2366c
--- /dev/null
@@ -0,0 +1,815 @@
+PVR350 Video decoder registers 0x02002800 -> 0x02002B00
+=======================================================
+
+This list has been worked out through trial and error. There will be mistakes
+and omissions. Some registers have no obvious effect so it's hard to say what
+they do, while others interact with each other, or require a certain load
+sequence. Horizontal filter setup is one example, with six registers working
+in unison and requiring a certain load sequence to correctly configure. The
+indexed colour palette is much easier to set at just two registers, but again
+it requires a certain load sequence.
+
+Some registers are fussy about what they are set to. Load in a bad value & the
+decoder will fail. A firmware reload will often recover, but sometimes a reset
+is required. For registers containing size information, setting them to 0 is
+generally a bad idea. For other control registers i.e. 2878, you'll only find
+out what values are bad when it hangs.
+
+--------------------------------------------------------------------------------
+2800
+      bit 0
+       Decoder enable
+         0 = disable
+         1 = enable
+--------------------------------------------------------------------------------
+2804
+      bits 0:31
+       Decoder horizontal Y alias register 1
+---------------
+2808
+      bits 0:31
+       Decoder horizontal Y alias register 2
+---------------
+280C
+      bits 0:31
+       Decoder horizontal Y alias register 3
+---------------
+2810
+      bits 0:31
+       Decoder horizontal Y alias register 4
+---------------
+2814
+      bits 0:31
+       Decoder horizontal Y alias register 5
+---------------
+2818
+      bits 0:31
+       Decoder horizontal Y alias trigger
+
+     These six registers control the horizontal aliasing filter for the Y plane.
+     The first five registers must all be loaded before accessing the trigger
+     (2818), as this register actually clocks the data through for the first
+     five.
+
+     To correctly program set the filter, this whole procedure must be done 16
+     times. The actual register contents are copied from a lookup-table in the
+     firmware which contains 4 different filter settings.
+
+--------------------------------------------------------------------------------
+281C
+      bits 0:31
+       Decoder horizontal UV alias register 1
+---------------
+2820
+      bits 0:31
+       Decoder horizontal UV alias register 2
+---------------
+2824
+      bits 0:31
+       Decoder horizontal UV alias register 3
+---------------
+2828
+      bits 0:31
+       Decoder horizontal UV alias register 4
+---------------
+282C
+      bits 0:31
+       Decoder horizontal UV alias register 5
+---------------
+2830
+      bits 0:31
+       Decoder horizontal UV alias trigger
+
+     These six registers control the horizontal aliasing for the UV plane.
+     Operation is the same as the Y filter, with 2830 being the trigger
+     register.
+
+--------------------------------------------------------------------------------
+2834
+      bits 0:15
+       Decoder Y source width in pixels
+
+      bits 16:31
+       Decoder Y destination width in pixels
+---------------
+2838
+      bits 0:15
+       Decoder UV source width in pixels
+
+      bits 16:31
+       Decoder UV destination width in pixels
+
+     NOTE: For both registers, the resulting image must be fully visible on
+     screen. If the image exceeds the right edge both the source and destination
+     size must be adjusted to reflect the visible portion. For the source width,
+     you must take into account the scaling when calculating the new value.
+--------------------------------------------------------------------------------
+
+283C
+      bits 0:31
+       Decoder Y horizontal scaling
+                   Normally = Reg 2854 >> 2
+---------------
+2840
+      bits 0:31
+       Decoder ?? unknown - horizontal scaling
+         Usually 0x00080514
+---------------
+2844
+      bits 0:31
+       Decoder UV horizontal scaling
+         Normally = Reg 2854 >> 2
+---------------
+2848
+      bits 0:31
+       Decoder ?? unknown - horizontal scaling
+         Usually 0x00100514
+---------------
+284C
+      bits 0:31
+       Decoder ?? unknown - Y plane
+         Usually 0x00200020
+---------------
+2850
+      bits 0:31
+       Decoder ?? unknown - UV plane
+         Usually 0x00200020
+---------------
+2854
+      bits 0:31
+       Decoder 'master' value for horizontal scaling
+---------------
+2858
+      bits 0:31
+       Decoder ?? unknown
+         Usually 0
+---------------
+285C
+      bits 0:31
+       Decoder ?? unknown
+         Normally = Reg 2854 >> 1
+---------------
+2860
+      bits 0:31
+       Decoder ?? unknown
+         Usually 0
+---------------
+2864
+      bits 0:31
+       Decoder ?? unknown
+         Normally = Reg 2854 >> 1
+---------------
+2868
+      bits 0:31
+       Decoder ?? unknown
+         Usually 0
+
+     Most of these registers either control horizontal scaling, or appear linked
+     to it in some way. Register 2854 contains the 'master' value & the other
+     registers can be calculated from that one. You must also remember to
+     correctly set the divider in Reg 2874.
+
+     To enlarge:
+            Reg 2854 = (source_width * 0x00200000) / destination_width
+            Reg 2874 = No divide
+
+     To reduce from full size down to half size:
+            Reg 2854 = (source_width/2 * 0x00200000) / destination width
+            Reg 2874 = Divide by 2
+
+     To reduce from half size down to quarter size:
+            Reg 2854 = (source_width/4 * 0x00200000) / destination width
+            Reg 2874 = Divide by 4
+
+     The result is always rounded up.
+
+--------------------------------------------------------------------------------
+286C
+      bits 0:15
+       Decoder horizontal Y buffer offset
+
+      bits 15:31
+       Decoder horizontal UV buffer offset
+
+     Offset into the video image buffer. If the offset is gradually incremented,
+     the on screen image will move left & wrap around higher up on the right.
+
+--------------------------------------------------------------------------------
+2870
+      bits 0:15
+       Decoder horizontal Y output offset
+
+      bits 16:31
+       Decoder horizontal UV output offset
+
+     Offsets the actual video output. Controls output alignment of the Y & UV
+     planes. The higher the value, the greater the shift to the left. Use
+     reg 2890 to move the image right.
+
+--------------------------------------------------------------------------------
+2874
+      bits 0:1
+       Decoder horizontal Y output size divider
+         00 = No divide
+         01 = Divide by 2
+         10 = Divide by 3
+
+      bits 4:5
+       Decoder horizontal UV output size divider
+         00 = No divide
+         01 = Divide by 2
+         10 = Divide by 3
+
+      bit 8
+       Decoder ?? unknown
+         0 = Normal
+         1 = Affects video output levels
+
+      bit 16
+       Decoder ?? unknown
+         0 = Normal
+         1 = Disable horizontal filter
+
+--------------------------------------------------------------------------------
+2878
+      bit 0
+       ?? unknown
+
+      bit 1
+       osd on/off
+         0 = osd off
+         1 = osd on
+
+      bit 2
+       Decoder + osd video timing
+         0 = NTSC
+         1 = PAL
+
+      bits 3:4
+       ?? unknown
+
+      bit 5
+       Decoder + osd
+         Swaps upper & lower fields
+
+--------------------------------------------------------------------------------
+287C
+      bits 0:10
+       Decoder & osd ?? unknown
+         Moves entire screen horizontally. Starts at 0x005 with the screen
+         shifted heavily to the right. Incrementing in steps of 0x004 will
+         gradually shift the screen to the left.
+
+      bits 11:31
+       ?? unknown
+
+     Normally contents are 0x00101111 (NTSC) or 0x1010111d (PAL)
+
+--------------------------------------------------------------------------------
+2880  --------    ?? unknown
+2884  --------    ?? unknown
+--------------------------------------------------------------------------------
+2888
+      bit 0
+       Decoder + osd ?? unknown
+         0 = Normal
+         1 = Misaligned fields (Correctable through 289C & 28A4)
+
+      bit 4
+       ?? unknown
+
+      bit 8
+       ?? unknown
+
+     Warning: Bad values will require a firmware reload to recover.
+                Known to be bad are 0x000,0x011,0x100,0x111
+--------------------------------------------------------------------------------
+288C
+      bits 0:15
+       osd ?? unknown
+         Appears to affect the osd position stability. The higher the value the
+         more unstable it becomes. Decoder output remains stable.
+
+      bits 16:31
+       osd ?? unknown
+         Same as bits 0:15
+
+--------------------------------------------------------------------------------
+2890
+      bits 0:11
+       Decoder output horizontal offset.
+
+     Horizontal offset moves the video image right. A small left shift is
+     possible, but it's better to use reg 2870 for that due to its greater
+     range.
+
+     NOTE: Video corruption will occur if video window is shifted off the right
+     edge. To avoid this read the notes for 2834 & 2838.
+--------------------------------------------------------------------------------
+2894
+      bits 0:23
+       Decoder output video surround colour.
+
+     Contains the colour (in yuv) used to fill the screen when the video is
+     running in a window.
+--------------------------------------------------------------------------------
+2898
+      bits 0:23
+       Decoder video window colour
+         Contains the colour (in yuv) used to fill the video window when the
+         video is turned off.
+
+      bit 24
+       Decoder video output
+         0 = Video on
+         1 = Video off
+
+      bit 28
+       Decoder plane order
+         0 = Y,UV
+         1 = UV,Y
+
+      bit 29
+       Decoder second plane byte order
+         0 = Normal (UV)
+         1 = Swapped (VU)
+
+     In normal usage, the first plane is Y & the second plane is UV. Though the
+     order of the planes can be swapped, only the byte order of the second plane
+     can be swapped. This isn't much use for the Y plane, but can be useful for
+     the UV plane.
+
+--------------------------------------------------------------------------------
+289C
+      bits 0:15
+       Decoder vertical field offset 1
+
+      bits 16:31
+       Decoder vertical field offset 2
+
+     Controls field output vertical alignment. The higher the number, the lower
+     the image on screen. Known starting values are 0x011E0017 (NTSC) &
+     0x01500017 (PAL)
+--------------------------------------------------------------------------------
+28A0
+      bits 0:15
+       Decoder & osd width in pixels
+
+      bits 16:31
+       Decoder & osd height in pixels
+
+     All output from the decoder & osd are disabled beyond this area. Decoder
+     output will simply go black outside of this region. If the osd tries to
+     exceed this area it will become corrupt.
+--------------------------------------------------------------------------------
+28A4
+      bits 0:11
+       osd left shift.
+
+     Has a range of 0x770->0x7FF. With the exception of 0, any value outside of
+     this range corrupts the osd.
+--------------------------------------------------------------------------------
+28A8
+      bits 0:15
+       osd vertical field offset 1
+
+      bits 16:31
+       osd vertical field offset 2
+
+     Controls field output vertical alignment. The higher the number, the lower
+     the image on screen. Known starting values are 0x011E0017 (NTSC) &
+     0x01500017 (PAL)
+--------------------------------------------------------------------------------
+28AC  --------    ?? unknown
+ |
+ V
+28BC  --------    ?? unknown
+--------------------------------------------------------------------------------
+28C0
+      bit 0
+       Current output field
+         0 = first field
+         1 = second field
+
+      bits 16:31
+       Current scanline
+         The scanline counts from the top line of the first field
+         through to the last line of the second field.
+--------------------------------------------------------------------------------
+28C4  --------    ?? unknown
+ |
+ V
+28F8  --------    ?? unknown
+--------------------------------------------------------------------------------
+28FC
+      bit 0
+       ?? unknown
+         0 = Normal
+         1 = Breaks decoder & osd output
+--------------------------------------------------------------------------------
+2900
+      bits 0:31
+       Decoder vertical Y alias register 1
+---------------
+2904
+      bits 0:31
+       Decoder vertical Y alias register 2
+---------------
+2908
+      bits 0:31
+       Decoder vertical Y alias trigger
+
+     These three registers control the vertical aliasing filter for the Y plane.
+     Operation is similar to the horizontal Y filter (2804). The only real
+     difference is that there are only two registers to set before accessing
+     the trigger register (2908). As for the horizontal filter, the values are
+     taken from a lookup table in the firmware, and the procedure must be
+     repeated 16 times to fully program the filter.
+--------------------------------------------------------------------------------
+290C
+      bits 0:31
+       Decoder vertical UV alias register 1
+---------------
+2910
+      bits 0:31
+       Decoder vertical UV alias register 2
+---------------
+2914
+      bits 0:31
+       Decoder vertical UV alias trigger
+
+     These three registers control the vertical aliasing filter for the UV
+     plane. Operation is the same as the Y filter, with 2914 being the trigger.
+--------------------------------------------------------------------------------
+2918
+      bits 0:15
+       Decoder Y source height in pixels
+
+      bits 16:31
+       Decoder Y destination height in pixels
+---------------
+291C
+      bits 0:15
+       Decoder UV source height in pixels divided by 2
+
+      bits 16:31
+       Decoder UV destination height in pixels
+
+     NOTE: For both registers, the resulting image must be fully visible on
+     screen. If the image exceeds the bottom edge both the source and
+     destination size must be adjusted to reflect the visible portion. For the
+     source height, you must take into account the scaling when calculating the
+     new value.
+--------------------------------------------------------------------------------
+2920
+      bits 0:31
+       Decoder Y vertical scaling
+         Normally = Reg 2930 >> 2
+---------------
+2924
+      bits 0:31
+       Decoder Y vertical scaling
+         Normally = Reg 2920 + 0x514
+---------------
+2928
+      bits 0:31
+       Decoder UV vertical scaling
+         When enlarging = Reg 2930 >> 2
+         When reducing = Reg 2930 >> 3
+---------------
+292C
+      bits 0:31
+       Decoder UV vertical scaling
+         Normally = Reg 2928 + 0x514
+---------------
+2930
+      bits 0:31
+       Decoder 'master' value for vertical scaling
+---------------
+2934
+      bits 0:31
+       Decoder ?? unknown - Y vertical scaling
+---------------
+2938
+      bits 0:31
+       Decoder Y vertical scaling
+         Normally = Reg 2930
+---------------
+293C
+      bits 0:31
+       Decoder ?? unknown - Y vertical scaling
+---------------
+2940
+      bits 0:31
+       Decoder UV vertical scaling
+         When enlarging = Reg 2930 >> 1
+         When reducing = Reg 2930
+---------------
+2944
+      bits 0:31
+       Decoder ?? unknown - UV vertical scaling
+---------------
+2948
+      bits 0:31
+       Decoder UV vertical scaling
+         Normally = Reg 2940
+---------------
+294C
+      bits 0:31
+       Decoder ?? unknown - UV vertical scaling
+
+     Most of these registers either control vertical scaling, or appear linked
+     to it in some way. Register 2930 contains the 'master' value & all other
+     registers can be calculated from that one. You must also remember to
+     correctly set the divider in Reg 296C
+
+     To enlarge:
+            Reg 2930 = (source_height * 0x00200000) / destination_height
+            Reg 296C = No divide
+
+     To reduce from full size down to half size:
+            Reg 2930 = (source_height/2 * 0x00200000) / destination height
+            Reg 296C = Divide by 2
+
+      To reduce from half down to quarter.
+            Reg 2930 = (source_height/4 * 0x00200000) / destination height
+            Reg 296C = Divide by 4
+
+--------------------------------------------------------------------------------
+2950
+      bits 0:15
+       Decoder Y line index into display buffer, first field
+
+      bits 16:31
+       Decoder Y vertical line skip, first field
+--------------------------------------------------------------------------------
+2954
+      bits 0:15
+       Decoder Y line index into display buffer, second field
+
+      bits 16:31
+       Decoder Y vertical line skip, second field
+--------------------------------------------------------------------------------
+2958
+      bits 0:15
+       Decoder UV line index into display buffer, first field
+
+      bits 16:31
+       Decoder UV vertical line skip, first field
+--------------------------------------------------------------------------------
+295C
+      bits 0:15
+       Decoder UV line index into display buffer, second field
+
+      bits 16:31
+       Decoder UV vertical line skip, second field
+--------------------------------------------------------------------------------
+2960
+      bits 0:15
+       Decoder destination height minus 1
+
+      bits 16:31
+       Decoder destination height divided by 2
+--------------------------------------------------------------------------------
+2964
+      bits 0:15
+       Decoder Y vertical offset, second field
+
+      bits 16:31
+       Decoder Y vertical offset, first field
+
+     These two registers shift the Y plane up. The higher the number, the
+     greater the shift.
+--------------------------------------------------------------------------------
+2968
+      bits 0:15
+       Decoder UV vertical offset, second field
+
+      bits 16:31
+       Decoder UV vertical offset, first field
+
+     These two registers shift the UV plane up. The higher the number, the
+     greater the shift.
+--------------------------------------------------------------------------------
+296C
+      bits 0:1
+       Decoder vertical Y output size divider
+         00 = No divide
+         01 = Divide by 2
+         10 = Divide by 4
+
+      bits 8:9
+       Decoder vertical UV output size divider
+         00 = No divide
+         01 = Divide by 2
+         10 = Divide by 4
+--------------------------------------------------------------------------------
+2970
+      bit 0
+       Decoder ?? unknown
+         0 = Normal
+         1 = Affect video output levels
+
+      bit 16
+       Decoder ?? unknown
+         0 = Normal
+         1 = Disable vertical filter
+
+--------------------------------------------------------------------------------
+2974  --------   ?? unknown
+ |
+ V
+29EF  --------   ?? unknown
+--------------------------------------------------------------------------------
+2A00
+      bits 0:2
+       osd colour mode
+         001 = 16 bit (565)
+         010 = 15 bit (555)
+         011 = 12 bit (444)
+         100 = 32 bit (8888)
+         101 = 8 bit indexed
+
+      bits 4:5
+       osd display bpp
+         01 = 8 bit
+         10 = 16 bit
+         11 = 32 bit
+
+      bit 8
+       osd global alpha
+         0 = Off
+         1 = On
+
+      bit 9
+       osd local alpha
+         0 = Off
+         1 = On
+
+      bit 10
+       osd colour key
+         0 = Off
+         1 = On
+
+      bit 11
+       osd ?? unknown
+         Must be 1
+
+      bit 13
+       osd colour space
+         0 = ARGB
+         1 = AYVU
+
+      bits 16:31
+       osd ?? unknown
+         Must be 0x001B (some kind of buffer pointer ?)
+
+     When the bits-per-pixel is set to 8, the colour mode is ignored and
+     assumed to be 8 bit indexed. For 16 & 32 bits-per-pixel the colour depth
+     is honoured, and when using a colour depth that requires fewer bytes than
+     allocated the extra bytes are used as padding. So for a 32 bpp with 8 bit
+     index colour, there are 3 padding bytes per pixel. It's also possible to
+     select 16bpp with a 32 bit colour mode. This results in the pixel width
+     being doubled, but the color key will not work as expected in this mode.
+
+     Colour key is as it suggests. You designate a colour which will become
+     completely transparent. When using 565, 555 or 444 colour modes, the
+     colour key is always 16 bits wide. The colour to key on is set in Reg 2A18.
+
+     Local alpha is a per-pixel 256 step transparency, with 0 being transparent
+     and 255 being solid. This is only available in 32 bit & 8 bit indexed
+     colour modes.
+
+     Global alpha is a 256 step transparency that applies to the entire osd,
+     with 0 being transparent & 255 being solid.
+
+     It's possible to combine colour key, local alpha & global alpha.
+--------------------------------------------------------------------------------
+2A04
+      bits 0:15
+       osd x coord for left edge
+
+      bits 16:31
+       osd y coord for top edge
+---------------
+2A08
+      bits 0:15
+       osd x coord for right edge
+
+      bits 16:31
+       osd y coord for bottom edge
+
+     For both registers, (0,0) = top left corner of the display area. These
+     registers do not control the osd size, only where it's positioned & how
+     much is visible. The visible osd area cannot exceed the right edge of the
+     display, otherwise the osd will become corrupt. See reg 2A10 for
+     setting osd width.
+--------------------------------------------------------------------------------
+2A0C
+      bits 0:31
+       osd buffer index
+
+     An index into the osd buffer. Slowly incrementing this moves the osd left,
+     wrapping around onto the right edge
+--------------------------------------------------------------------------------
+2A10
+      bits 0:11
+       osd buffer 32 bit word width
+
+     Contains the width of the osd measured in 32 bit words. This means that all
+     colour modes are restricted to a byte width which is divisible by 4.
+--------------------------------------------------------------------------------
+2A14
+      bits 0:15
+       osd height in pixels
+
+      bits 16:32
+       osd line index into buffer
+         osd will start displaying from this line.
+--------------------------------------------------------------------------------
+2A18
+      bits 0:31
+       osd colour key
+
+     Contains the colour value which will be transparent.
+--------------------------------------------------------------------------------
+2A1C
+      bits 0:7
+       osd global alpha
+
+     Contains the global alpha value (equiv ivtvfbctl --alpha XX)
+--------------------------------------------------------------------------------
+2A20  --------    ?? unknown
+ |
+ V
+2A2C  --------    ?? unknown
+--------------------------------------------------------------------------------
+2A30
+      bits 0:7
+       osd colour to change in indexed palette
+---------------
+2A34
+      bits 0:31
+       osd colour for indexed palette
+
+     To set the new palette, first load the index of the colour to change into
+     2A30, then load the new colour into 2A34. The full palette is 256 colours,
+     so the index range is 0x00-0xFF
+--------------------------------------------------------------------------------
+2A38  --------    ?? unknown
+2A3C  --------    ?? unknown
+--------------------------------------------------------------------------------
+2A40
+      bits 0:31
+       osd ?? unknown
+
+     Affects overall brightness, wrapping around to black
+--------------------------------------------------------------------------------
+2A44
+      bits 0:31
+       osd ?? unknown
+
+     Green tint
+--------------------------------------------------------------------------------
+2A48
+      bits 0:31
+       osd ?? unknown
+
+     Red tint
+--------------------------------------------------------------------------------
+2A4C
+      bits 0:31
+       osd ?? unknown
+
+     Affects overall brightness, wrapping around to black
+--------------------------------------------------------------------------------
+2A50
+      bits 0:31
+       osd ?? unknown
+
+     Colour shift
+--------------------------------------------------------------------------------
+2A54
+      bits 0:31
+       osd ?? unknown
+
+     Colour shift
+--------------------------------------------------------------------------------
+2A58  --------    ?? unknown
+ |
+ V
+2AFC  --------    ?? unknown
+--------------------------------------------------------------------------------
+2B00
+      bit 0
+       osd filter control
+         0 = filter off
+         1 = filter on
+
+      bits 1:4
+       osd ?? unknown
+
+--------------------------------------------------------------------------------
+
+v0.3 - 2 February 2007 - Ian Armstrong (ian@iarmst.demon.co.uk)
+