xref: /OK3568_Linux_fs/kernel/Documentation/driver-api/media/drivers/cx2341x-devel.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun.. SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun
3*4882a593SmuzhiyunThe cx2341x driver
4*4882a593Smuzhiyun==================
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunMemory at cx2341x chips
7*4882a593Smuzhiyun-----------------------
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunThis section describes the cx2341x memory map and documents some of the
10*4882a593Smuzhiyunregister space.
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun.. note:: the memory long words are little-endian ('intel format').
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun.. warning::
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun	This information was figured out from searching through the memory
17*4882a593Smuzhiyun	and registers, this information may not be correct and is certainly
18*4882a593Smuzhiyun	not complete, and was not derived from anything more than searching
19*4882a593Smuzhiyun	through the memory space with commands like:
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun	.. code-block:: none
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun		ivtvctl -O min=0x02000000,max=0x020000ff
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun	So take this as is, I'm always searching for more stuff, it's a large
26*4882a593Smuzhiyun	register space :-).
27*4882a593Smuzhiyun
28*4882a593SmuzhiyunMemory Map
29*4882a593Smuzhiyun~~~~~~~~~~
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunThe cx2341x exposes its entire 64M memory space to the PCI host via the PCI BAR0
32*4882a593Smuzhiyun(Base Address Register 0). The addresses here are offsets relative to the
33*4882a593Smuzhiyunaddress held in BAR0.
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun.. code-block:: none
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun	0x00000000-0x00ffffff Encoder memory space
38*4882a593Smuzhiyun	0x00000000-0x0003ffff Encode.rom
39*4882a593Smuzhiyun	???-???         MPEG buffer(s)
40*4882a593Smuzhiyun	???-???         Raw video capture buffer(s)
41*4882a593Smuzhiyun	???-???         Raw audio capture buffer(s)
42*4882a593Smuzhiyun	???-???         Display buffers (6 or 9)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	0x01000000-0x01ffffff Decoder memory space
45*4882a593Smuzhiyun	0x01000000-0x0103ffff Decode.rom
46*4882a593Smuzhiyun	???-???         MPEG buffers(s)
47*4882a593Smuzhiyun	0x0114b000-0x0115afff Audio.rom (deprecated?)
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun	0x02000000-0x0200ffff Register Space
50*4882a593Smuzhiyun
51*4882a593SmuzhiyunRegisters
52*4882a593Smuzhiyun~~~~~~~~~
53*4882a593Smuzhiyun
54*4882a593SmuzhiyunThe registers occupy the 64k space starting at the 0x02000000 offset from BAR0.
55*4882a593SmuzhiyunAll of these registers are 32 bits wide.
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun.. code-block:: none
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun	DMA Registers 0x000-0xff:
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun	0x00 - Control:
62*4882a593Smuzhiyun		0=reset/cancel, 1=read, 2=write, 4=stop
63*4882a593Smuzhiyun	0x04 - DMA status:
64*4882a593Smuzhiyun		1=read busy, 2=write busy, 4=read error, 8=write error, 16=link list error
65*4882a593Smuzhiyun	0x08 - pci DMA pointer for read link list
66*4882a593Smuzhiyun	0x0c - pci DMA pointer for write link list
67*4882a593Smuzhiyun	0x10 - read/write DMA enable:
68*4882a593Smuzhiyun		1=read enable, 2=write enable
69*4882a593Smuzhiyun	0x14 - always 0xffffffff, if set any lower instability occurs, 0x00 crashes
70*4882a593Smuzhiyun	0x18 - ??
71*4882a593Smuzhiyun	0x1c - always 0x20 or 32, smaller values slow down DMA transactions
72*4882a593Smuzhiyun	0x20 - always value of 0x780a010a
73*4882a593Smuzhiyun	0x24-0x3c - usually just random values???
74*4882a593Smuzhiyun	0x40 - Interrupt status
75*4882a593Smuzhiyun	0x44 - Write a bit here and shows up in Interrupt status 0x40
76*4882a593Smuzhiyun	0x48 - Interrupt Mask
77*4882a593Smuzhiyun	0x4C - always value of 0xfffdffff,
78*4882a593Smuzhiyun		if changed to 0xffffffff DMA write interrupts break.
79*4882a593Smuzhiyun	0x50 - always 0xffffffff
80*4882a593Smuzhiyun	0x54 - always 0xffffffff (0x4c, 0x50, 0x54 seem like interrupt masks, are
81*4882a593Smuzhiyun		3 processors on chip, Java ones, VPU, SPU, APU, maybe these are the
82*4882a593Smuzhiyun		interrupt masks???).
83*4882a593Smuzhiyun	0x60-0x7C - random values
84*4882a593Smuzhiyun	0x80 - first write linked list reg, for Encoder Memory addr
85*4882a593Smuzhiyun	0x84 - first write linked list reg, for pci memory addr
86*4882a593Smuzhiyun	0x88 - first write linked list reg, for length of buffer in memory addr
87*4882a593Smuzhiyun		(|0x80000000 or this for last link)
88*4882a593Smuzhiyun	0x8c-0xdc - rest of write linked list reg, 8 sets of 3 total, DMA goes here
89*4882a593Smuzhiyun		from linked list addr in reg 0x0c, firmware must push through or
90*4882a593Smuzhiyun		something.
91*4882a593Smuzhiyun	0xe0 - first (and only) read linked list reg, for pci memory addr
92*4882a593Smuzhiyun	0xe4 - first (and only) read linked list reg, for Decoder memory addr
93*4882a593Smuzhiyun	0xe8 - first (and only) read linked list reg, for length of buffer
94*4882a593Smuzhiyun	0xec-0xff - Nothing seems to be in these registers, 0xec-f4 are 0x00000000.
95*4882a593Smuzhiyun
96*4882a593SmuzhiyunMemory locations for Encoder Buffers 0x700-0x7ff:
97*4882a593Smuzhiyun
98*4882a593SmuzhiyunThese registers show offsets of memory locations pertaining to each
99*4882a593Smuzhiyunbuffer area used for encoding, have to shift them by <<1 first.
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun- 0x07F8: Encoder SDRAM refresh
102*4882a593Smuzhiyun- 0x07FC: Encoder SDRAM pre-charge
103*4882a593Smuzhiyun
104*4882a593SmuzhiyunMemory locations for Decoder Buffers 0x800-0x8ff:
105*4882a593Smuzhiyun
106*4882a593SmuzhiyunThese registers show offsets of memory locations pertaining to each
107*4882a593Smuzhiyunbuffer area used for decoding, have to shift them by <<1 first.
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun- 0x08F8: Decoder SDRAM refresh
110*4882a593Smuzhiyun- 0x08FC: Decoder SDRAM pre-charge
111*4882a593Smuzhiyun
112*4882a593SmuzhiyunOther memory locations:
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun- 0x2800: Video Display Module control
115*4882a593Smuzhiyun- 0x2D00: AO (audio output?) control
116*4882a593Smuzhiyun- 0x2D24: Bytes Flushed
117*4882a593Smuzhiyun- 0x7000: LSB I2C write clock bit (inverted)
118*4882a593Smuzhiyun- 0x7004: LSB I2C write data bit (inverted)
119*4882a593Smuzhiyun- 0x7008: LSB I2C read clock bit
120*4882a593Smuzhiyun- 0x700c: LSB I2C read data bit
121*4882a593Smuzhiyun- 0x9008: GPIO get input state
122*4882a593Smuzhiyun- 0x900c: GPIO set output state
123*4882a593Smuzhiyun- 0x9020: GPIO direction (Bit7 (GPIO 0..7) - 0:input, 1:output)
124*4882a593Smuzhiyun- 0x9050: SPU control
125*4882a593Smuzhiyun- 0x9054: Reset HW blocks
126*4882a593Smuzhiyun- 0x9058: VPU control
127*4882a593Smuzhiyun- 0xA018: Bit6: interrupt pending?
128*4882a593Smuzhiyun- 0xA064: APU command
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun
131*4882a593SmuzhiyunInterrupt Status Register
132*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
133*4882a593Smuzhiyun
134*4882a593SmuzhiyunThe definition of the bits in the interrupt status register 0x0040, and the
135*4882a593Smuzhiyuninterrupt mask 0x0048. If a bit is cleared in the mask, then we want our ISR to
136*4882a593Smuzhiyunexecute.
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun- bit 31 Encoder Start Capture
139*4882a593Smuzhiyun- bit 30 Encoder EOS
140*4882a593Smuzhiyun- bit 29 Encoder VBI capture
141*4882a593Smuzhiyun- bit 28 Encoder Video Input Module reset event
142*4882a593Smuzhiyun- bit 27 Encoder DMA complete
143*4882a593Smuzhiyun- bit 24 Decoder audio mode change detection event (through event notification)
144*4882a593Smuzhiyun- bit 22 Decoder data request
145*4882a593Smuzhiyun- bit 20 Decoder DMA complete
146*4882a593Smuzhiyun- bit 19 Decoder VBI re-insertion
147*4882a593Smuzhiyun- bit 18 Decoder DMA err (linked-list bad)
148*4882a593Smuzhiyun
149*4882a593SmuzhiyunMissing documentation
150*4882a593Smuzhiyun---------------------
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun- Encoder API post(?)
153*4882a593Smuzhiyun- Decoder API post(?)
154*4882a593Smuzhiyun- Decoder VTRACE event
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun
157*4882a593SmuzhiyunThe cx2341x firmware upload
158*4882a593Smuzhiyun---------------------------
159*4882a593Smuzhiyun
160*4882a593SmuzhiyunThis document describes how to upload the cx2341x firmware to the card.
161*4882a593Smuzhiyun
162*4882a593SmuzhiyunHow to find
163*4882a593Smuzhiyun~~~~~~~~~~~
164*4882a593Smuzhiyun
165*4882a593SmuzhiyunSee the web pages of the various projects that uses this chip for information
166*4882a593Smuzhiyunon how to obtain the firmware.
167*4882a593Smuzhiyun
168*4882a593SmuzhiyunThe firmware stored in a Windows driver can be detected as follows:
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun- Each firmware image is 256k bytes.
171*4882a593Smuzhiyun- The 1st 32-bit word of the Encoder image is 0x0000da7
172*4882a593Smuzhiyun- The 1st 32-bit word of the Decoder image is 0x00003a7
173*4882a593Smuzhiyun- The 2nd 32-bit word of both images is 0xaa55bb66
174*4882a593Smuzhiyun
175*4882a593SmuzhiyunHow to load
176*4882a593Smuzhiyun~~~~~~~~~~~
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun- Issue the FWapi command to stop the encoder if it is running. Wait for the
179*4882a593Smuzhiyun  command to complete.
180*4882a593Smuzhiyun- Issue the FWapi command to stop the decoder if it is running. Wait for the
181*4882a593Smuzhiyun  command to complete.
182*4882a593Smuzhiyun- Issue the I2C command to the digitizer to stop emitting VSYNC events.
183*4882a593Smuzhiyun- Issue the FWapi command to halt the encoder's firmware.
184*4882a593Smuzhiyun- Sleep for 10ms.
185*4882a593Smuzhiyun- Issue the FWapi command to halt the decoder's firmware.
186*4882a593Smuzhiyun- Sleep for 10ms.
187*4882a593Smuzhiyun- Write 0x00000000 to register 0x2800 to stop the Video Display Module.
188*4882a593Smuzhiyun- Write 0x00000005 to register 0x2D00 to stop the AO (audio output?).
189*4882a593Smuzhiyun- Write 0x00000000 to register 0xA064 to ping? the APU.
190*4882a593Smuzhiyun- Write 0xFFFFFFFE to register 0x9058 to stop the VPU.
191*4882a593Smuzhiyun- Write 0xFFFFFFFF to register 0x9054 to reset the HW blocks.
192*4882a593Smuzhiyun- Write 0x00000001 to register 0x9050 to stop the SPU.
193*4882a593Smuzhiyun- Sleep for 10ms.
194*4882a593Smuzhiyun- Write 0x0000001A to register 0x07FC to init the Encoder SDRAM's pre-charge.
195*4882a593Smuzhiyun- Write 0x80000640 to register 0x07F8 to init the Encoder SDRAM's refresh to 1us.
196*4882a593Smuzhiyun- Write 0x0000001A to register 0x08FC to init the Decoder SDRAM's pre-charge.
197*4882a593Smuzhiyun- Write 0x80000640 to register 0x08F8 to init the Decoder SDRAM's refresh to 1us.
198*4882a593Smuzhiyun- Sleep for 512ms. (600ms is recommended)
199*4882a593Smuzhiyun- Transfer the encoder's firmware image to offset 0 in Encoder memory space.
200*4882a593Smuzhiyun- Transfer the decoder's firmware image to offset 0 in Decoder memory space.
201*4882a593Smuzhiyun- Use a read-modify-write operation to Clear bit 0 of register 0x9050 to
202*4882a593Smuzhiyun  re-enable the SPU.
203*4882a593Smuzhiyun- Sleep for 1 second.
204*4882a593Smuzhiyun- Use a read-modify-write operation to Clear bits 3 and 0 of register 0x9058
205*4882a593Smuzhiyun  to re-enable the VPU.
206*4882a593Smuzhiyun- Sleep for 1 second.
207*4882a593Smuzhiyun- Issue status API commands to both firmware images to verify.
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun
210*4882a593SmuzhiyunHow to call the firmware API
211*4882a593Smuzhiyun----------------------------
212*4882a593Smuzhiyun
213*4882a593SmuzhiyunThe preferred calling convention is known as the firmware mailbox. The
214*4882a593Smuzhiyunmailboxes are basically a fixed length array that serves as the call-stack.
215*4882a593Smuzhiyun
216*4882a593SmuzhiyunFirmware mailboxes can be located by searching the encoder and decoder memory
217*4882a593Smuzhiyunfor a 16 byte signature. That signature will be located on a 256-byte boundary.
218*4882a593Smuzhiyun
219*4882a593SmuzhiyunSignature:
220*4882a593Smuzhiyun
221*4882a593Smuzhiyun.. code-block:: none
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun	0x78, 0x56, 0x34, 0x12, 0x12, 0x78, 0x56, 0x34,
224*4882a593Smuzhiyun	0x34, 0x12, 0x78, 0x56, 0x56, 0x34, 0x12, 0x78
225*4882a593Smuzhiyun
226*4882a593SmuzhiyunThe firmware implements 20 mailboxes of 20 32-bit words. The first 10 are
227*4882a593Smuzhiyunreserved for API calls. The second 10 are used by the firmware for event
228*4882a593Smuzhiyunnotification.
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun  ====== =================
231*4882a593Smuzhiyun  Index  Name
232*4882a593Smuzhiyun  ====== =================
233*4882a593Smuzhiyun  0      Flags
234*4882a593Smuzhiyun  1      Command
235*4882a593Smuzhiyun  2      Return value
236*4882a593Smuzhiyun  3      Timeout
237*4882a593Smuzhiyun  4-19   Parameter/Result
238*4882a593Smuzhiyun  ====== =================
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun
241*4882a593SmuzhiyunThe flags are defined in the following table. The direction is from the
242*4882a593Smuzhiyunperspective of the firmware.
243*4882a593Smuzhiyun
244*4882a593Smuzhiyun  ==== ========== ============================================
245*4882a593Smuzhiyun  Bit  Direction  Purpose
246*4882a593Smuzhiyun  ==== ========== ============================================
247*4882a593Smuzhiyun  2    O          Firmware has processed the command.
248*4882a593Smuzhiyun  1    I          Driver has finished setting the parameters.
249*4882a593Smuzhiyun  0    I          Driver is using this mailbox.
250*4882a593Smuzhiyun  ==== ========== ============================================
251*4882a593Smuzhiyun
252*4882a593SmuzhiyunThe command is a 32-bit enumerator. The API specifics may be found in this
253*4882a593Smuzhiyunchapter.
254*4882a593Smuzhiyun
255*4882a593SmuzhiyunThe return value is a 32-bit enumerator. Only two values are currently defined:
256*4882a593Smuzhiyun
257*4882a593Smuzhiyun- 0=success
258*4882a593Smuzhiyun- -1=command undefined.
259*4882a593Smuzhiyun
260*4882a593SmuzhiyunThere are 16 parameters/results 32-bit fields. The driver populates these fields
261*4882a593Smuzhiyunwith values for all the parameters required by the call. The driver overwrites
262*4882a593Smuzhiyunthese fields with result values returned by the call.
263*4882a593Smuzhiyun
264*4882a593SmuzhiyunThe timeout value protects the card from a hung driver thread. If the driver
265*4882a593Smuzhiyundoesn't handle the completed call within the timeout specified, the firmware
266*4882a593Smuzhiyunwill reset that mailbox.
267*4882a593Smuzhiyun
268*4882a593SmuzhiyunTo make an API call, the driver iterates over each mailbox looking for the
269*4882a593Smuzhiyunfirst one available (bit 0 has been cleared). The driver sets that bit, fills
270*4882a593Smuzhiyunin the command enumerator, the timeout value and any required parameters. The
271*4882a593Smuzhiyundriver then sets the parameter ready bit (bit 1). The firmware scans the
272*4882a593Smuzhiyunmailboxes for pending commands, processes them, sets the result code, populates
273*4882a593Smuzhiyunthe result value array with that call's return values and sets the call
274*4882a593Smuzhiyuncomplete bit (bit 2). Once bit 2 is set, the driver should retrieve the results
275*4882a593Smuzhiyunand clear all the flags. If the driver does not perform this task within the
276*4882a593Smuzhiyuntime set in the timeout register, the firmware will reset that mailbox.
277*4882a593Smuzhiyun
278*4882a593SmuzhiyunEvent notifications are sent from the firmware to the host. The host tells the
279*4882a593Smuzhiyunfirmware which events it is interested in via an API call. That call tells the
280*4882a593Smuzhiyunfirmware which notification mailbox to use. The firmware signals the host via
281*4882a593Smuzhiyunan interrupt. Only the 16 Results fields are used, the Flags, Command, Return
282*4882a593Smuzhiyunvalue and Timeout words are not used.
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun
285*4882a593SmuzhiyunOSD firmware API description
286*4882a593Smuzhiyun----------------------------
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun.. note:: this API is part of the decoder firmware, so it's cx23415 only.
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun
291*4882a593Smuzhiyun
292*4882a593SmuzhiyunCX2341X_OSD_GET_FRAMEBUFFER
293*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~
294*4882a593Smuzhiyun
295*4882a593SmuzhiyunEnum: 65/0x41
296*4882a593Smuzhiyun
297*4882a593SmuzhiyunDescription
298*4882a593Smuzhiyun^^^^^^^^^^^
299*4882a593Smuzhiyun
300*4882a593SmuzhiyunReturn base and length of contiguous OSD memory.
301*4882a593Smuzhiyun
302*4882a593SmuzhiyunResult[0]
303*4882a593Smuzhiyun^^^^^^^^^
304*4882a593Smuzhiyun
305*4882a593SmuzhiyunOSD base address
306*4882a593Smuzhiyun
307*4882a593SmuzhiyunResult[1]
308*4882a593Smuzhiyun^^^^^^^^^
309*4882a593Smuzhiyun
310*4882a593SmuzhiyunOSD length
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun
314*4882a593SmuzhiyunCX2341X_OSD_GET_PIXEL_FORMAT
315*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
316*4882a593Smuzhiyun
317*4882a593SmuzhiyunEnum: 66/0x42
318*4882a593Smuzhiyun
319*4882a593SmuzhiyunDescription
320*4882a593Smuzhiyun^^^^^^^^^^^
321*4882a593Smuzhiyun
322*4882a593SmuzhiyunQuery OSD format
323*4882a593Smuzhiyun
324*4882a593SmuzhiyunResult[0]
325*4882a593Smuzhiyun^^^^^^^^^
326*4882a593Smuzhiyun
327*4882a593Smuzhiyun0=8bit index
328*4882a593Smuzhiyun1=16bit RGB 5:6:5
329*4882a593Smuzhiyun2=16bit ARGB 1:5:5:5
330*4882a593Smuzhiyun3=16bit ARGB 1:4:4:4
331*4882a593Smuzhiyun4=32bit ARGB 8:8:8:8
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun
334*4882a593Smuzhiyun
335*4882a593SmuzhiyunCX2341X_OSD_SET_PIXEL_FORMAT
336*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
337*4882a593Smuzhiyun
338*4882a593SmuzhiyunEnum: 67/0x43
339*4882a593Smuzhiyun
340*4882a593SmuzhiyunDescription
341*4882a593Smuzhiyun^^^^^^^^^^^
342*4882a593Smuzhiyun
343*4882a593SmuzhiyunAssign pixel format
344*4882a593Smuzhiyun
345*4882a593SmuzhiyunParam[0]
346*4882a593Smuzhiyun^^^^^^^^
347*4882a593Smuzhiyun
348*4882a593Smuzhiyun- 0=8bit index
349*4882a593Smuzhiyun- 1=16bit RGB 5:6:5
350*4882a593Smuzhiyun- 2=16bit ARGB 1:5:5:5
351*4882a593Smuzhiyun- 3=16bit ARGB 1:4:4:4
352*4882a593Smuzhiyun- 4=32bit ARGB 8:8:8:8
353*4882a593Smuzhiyun
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun
356*4882a593SmuzhiyunCX2341X_OSD_GET_STATE
357*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~
358*4882a593Smuzhiyun
359*4882a593SmuzhiyunEnum: 68/0x44
360*4882a593Smuzhiyun
361*4882a593SmuzhiyunDescription
362*4882a593Smuzhiyun^^^^^^^^^^^
363*4882a593Smuzhiyun
364*4882a593SmuzhiyunQuery OSD state
365*4882a593Smuzhiyun
366*4882a593SmuzhiyunResult[0]
367*4882a593Smuzhiyun^^^^^^^^^
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun- Bit  0   0=off, 1=on
370*4882a593Smuzhiyun- Bits 1:2 alpha control
371*4882a593Smuzhiyun- Bits 3:5 pixel format
372*4882a593Smuzhiyun
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun
375*4882a593SmuzhiyunCX2341X_OSD_SET_STATE
376*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~
377*4882a593Smuzhiyun
378*4882a593SmuzhiyunEnum: 69/0x45
379*4882a593Smuzhiyun
380*4882a593SmuzhiyunDescription
381*4882a593Smuzhiyun^^^^^^^^^^^
382*4882a593Smuzhiyun
383*4882a593SmuzhiyunOSD switch
384*4882a593Smuzhiyun
385*4882a593SmuzhiyunParam[0]
386*4882a593Smuzhiyun^^^^^^^^
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun0=off, 1=on
389*4882a593Smuzhiyun
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun
392*4882a593SmuzhiyunCX2341X_OSD_GET_OSD_COORDS
393*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
394*4882a593Smuzhiyun
395*4882a593SmuzhiyunEnum: 70/0x46
396*4882a593Smuzhiyun
397*4882a593SmuzhiyunDescription
398*4882a593Smuzhiyun^^^^^^^^^^^
399*4882a593Smuzhiyun
400*4882a593SmuzhiyunRetrieve coordinates of OSD area blended with video
401*4882a593Smuzhiyun
402*4882a593SmuzhiyunResult[0]
403*4882a593Smuzhiyun^^^^^^^^^
404*4882a593Smuzhiyun
405*4882a593SmuzhiyunOSD buffer address
406*4882a593Smuzhiyun
407*4882a593SmuzhiyunResult[1]
408*4882a593Smuzhiyun^^^^^^^^^
409*4882a593Smuzhiyun
410*4882a593SmuzhiyunStride in pixels
411*4882a593Smuzhiyun
412*4882a593SmuzhiyunResult[2]
413*4882a593Smuzhiyun^^^^^^^^^
414*4882a593Smuzhiyun
415*4882a593SmuzhiyunLines in OSD buffer
416*4882a593Smuzhiyun
417*4882a593SmuzhiyunResult[3]
418*4882a593Smuzhiyun^^^^^^^^^
419*4882a593Smuzhiyun
420*4882a593SmuzhiyunHorizontal offset in buffer
421*4882a593Smuzhiyun
422*4882a593SmuzhiyunResult[4]
423*4882a593Smuzhiyun^^^^^^^^^
424*4882a593Smuzhiyun
425*4882a593SmuzhiyunVertical offset in buffer
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun
429*4882a593SmuzhiyunCX2341X_OSD_SET_OSD_COORDS
430*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
431*4882a593Smuzhiyun
432*4882a593SmuzhiyunEnum: 71/0x47
433*4882a593Smuzhiyun
434*4882a593SmuzhiyunDescription
435*4882a593Smuzhiyun^^^^^^^^^^^
436*4882a593Smuzhiyun
437*4882a593SmuzhiyunAssign the coordinates of the OSD area to blend with video
438*4882a593Smuzhiyun
439*4882a593SmuzhiyunParam[0]
440*4882a593Smuzhiyun^^^^^^^^
441*4882a593Smuzhiyun
442*4882a593Smuzhiyunbuffer address
443*4882a593Smuzhiyun
444*4882a593SmuzhiyunParam[1]
445*4882a593Smuzhiyun^^^^^^^^
446*4882a593Smuzhiyun
447*4882a593Smuzhiyunbuffer stride in pixels
448*4882a593Smuzhiyun
449*4882a593SmuzhiyunParam[2]
450*4882a593Smuzhiyun^^^^^^^^
451*4882a593Smuzhiyun
452*4882a593Smuzhiyunlines in buffer
453*4882a593Smuzhiyun
454*4882a593SmuzhiyunParam[3]
455*4882a593Smuzhiyun^^^^^^^^
456*4882a593Smuzhiyun
457*4882a593Smuzhiyunhorizontal offset
458*4882a593Smuzhiyun
459*4882a593SmuzhiyunParam[4]
460*4882a593Smuzhiyun^^^^^^^^
461*4882a593Smuzhiyun
462*4882a593Smuzhiyunvertical offset
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun
465*4882a593Smuzhiyun
466*4882a593SmuzhiyunCX2341X_OSD_GET_SCREEN_COORDS
467*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
468*4882a593Smuzhiyun
469*4882a593SmuzhiyunEnum: 72/0x48
470*4882a593Smuzhiyun
471*4882a593SmuzhiyunDescription
472*4882a593Smuzhiyun^^^^^^^^^^^
473*4882a593Smuzhiyun
474*4882a593SmuzhiyunRetrieve OSD screen area coordinates
475*4882a593Smuzhiyun
476*4882a593SmuzhiyunResult[0]
477*4882a593Smuzhiyun^^^^^^^^^
478*4882a593Smuzhiyun
479*4882a593Smuzhiyuntop left horizontal offset
480*4882a593Smuzhiyun
481*4882a593SmuzhiyunResult[1]
482*4882a593Smuzhiyun^^^^^^^^^
483*4882a593Smuzhiyun
484*4882a593Smuzhiyuntop left vertical offset
485*4882a593Smuzhiyun
486*4882a593SmuzhiyunResult[2]
487*4882a593Smuzhiyun^^^^^^^^^
488*4882a593Smuzhiyun
489*4882a593Smuzhiyunbottom right horizontal offset
490*4882a593Smuzhiyun
491*4882a593SmuzhiyunResult[3]
492*4882a593Smuzhiyun^^^^^^^^^
493*4882a593Smuzhiyun
494*4882a593Smuzhiyunbottom right vertical offset
495*4882a593Smuzhiyun
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun
498*4882a593SmuzhiyunCX2341X_OSD_SET_SCREEN_COORDS
499*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
500*4882a593Smuzhiyun
501*4882a593SmuzhiyunEnum: 73/0x49
502*4882a593Smuzhiyun
503*4882a593SmuzhiyunDescription
504*4882a593Smuzhiyun^^^^^^^^^^^
505*4882a593Smuzhiyun
506*4882a593SmuzhiyunAssign the coordinates of the screen area to blend with video
507*4882a593Smuzhiyun
508*4882a593SmuzhiyunParam[0]
509*4882a593Smuzhiyun^^^^^^^^
510*4882a593Smuzhiyun
511*4882a593Smuzhiyuntop left horizontal offset
512*4882a593Smuzhiyun
513*4882a593SmuzhiyunParam[1]
514*4882a593Smuzhiyun^^^^^^^^
515*4882a593Smuzhiyun
516*4882a593Smuzhiyuntop left vertical offset
517*4882a593Smuzhiyun
518*4882a593SmuzhiyunParam[2]
519*4882a593Smuzhiyun^^^^^^^^
520*4882a593Smuzhiyun
521*4882a593Smuzhiyunbottom left horizontal offset
522*4882a593Smuzhiyun
523*4882a593SmuzhiyunParam[3]
524*4882a593Smuzhiyun^^^^^^^^
525*4882a593Smuzhiyun
526*4882a593Smuzhiyunbottom left vertical offset
527*4882a593Smuzhiyun
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun
530*4882a593SmuzhiyunCX2341X_OSD_GET_GLOBAL_ALPHA
531*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
532*4882a593Smuzhiyun
533*4882a593SmuzhiyunEnum: 74/0x4A
534*4882a593Smuzhiyun
535*4882a593SmuzhiyunDescription
536*4882a593Smuzhiyun^^^^^^^^^^^
537*4882a593Smuzhiyun
538*4882a593SmuzhiyunRetrieve OSD global alpha
539*4882a593Smuzhiyun
540*4882a593SmuzhiyunResult[0]
541*4882a593Smuzhiyun^^^^^^^^^
542*4882a593Smuzhiyun
543*4882a593Smuzhiyunglobal alpha: 0=off, 1=on
544*4882a593Smuzhiyun
545*4882a593SmuzhiyunResult[1]
546*4882a593Smuzhiyun^^^^^^^^^
547*4882a593Smuzhiyun
548*4882a593Smuzhiyunbits 0:7 global alpha
549*4882a593Smuzhiyun
550*4882a593Smuzhiyun
551*4882a593Smuzhiyun
552*4882a593SmuzhiyunCX2341X_OSD_SET_GLOBAL_ALPHA
553*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
554*4882a593Smuzhiyun
555*4882a593SmuzhiyunEnum: 75/0x4B
556*4882a593Smuzhiyun
557*4882a593SmuzhiyunDescription
558*4882a593Smuzhiyun^^^^^^^^^^^
559*4882a593Smuzhiyun
560*4882a593SmuzhiyunUpdate global alpha
561*4882a593Smuzhiyun
562*4882a593SmuzhiyunParam[0]
563*4882a593Smuzhiyun^^^^^^^^
564*4882a593Smuzhiyun
565*4882a593Smuzhiyunglobal alpha: 0=off, 1=on
566*4882a593Smuzhiyun
567*4882a593SmuzhiyunParam[1]
568*4882a593Smuzhiyun^^^^^^^^
569*4882a593Smuzhiyun
570*4882a593Smuzhiyunglobal alpha (8 bits)
571*4882a593Smuzhiyun
572*4882a593SmuzhiyunParam[2]
573*4882a593Smuzhiyun^^^^^^^^
574*4882a593Smuzhiyun
575*4882a593Smuzhiyunlocal alpha: 0=on, 1=off
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun
578*4882a593Smuzhiyun
579*4882a593SmuzhiyunCX2341X_OSD_SET_BLEND_COORDS
580*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
581*4882a593Smuzhiyun
582*4882a593SmuzhiyunEnum: 78/0x4C
583*4882a593Smuzhiyun
584*4882a593SmuzhiyunDescription
585*4882a593Smuzhiyun^^^^^^^^^^^
586*4882a593Smuzhiyun
587*4882a593SmuzhiyunMove start of blending area within display buffer
588*4882a593Smuzhiyun
589*4882a593SmuzhiyunParam[0]
590*4882a593Smuzhiyun^^^^^^^^
591*4882a593Smuzhiyun
592*4882a593Smuzhiyunhorizontal offset in buffer
593*4882a593Smuzhiyun
594*4882a593SmuzhiyunParam[1]
595*4882a593Smuzhiyun^^^^^^^^
596*4882a593Smuzhiyun
597*4882a593Smuzhiyunvertical offset in buffer
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun
601*4882a593SmuzhiyunCX2341X_OSD_GET_FLICKER_STATE
602*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
603*4882a593Smuzhiyun
604*4882a593SmuzhiyunEnum: 79/0x4F
605*4882a593Smuzhiyun
606*4882a593SmuzhiyunDescription
607*4882a593Smuzhiyun^^^^^^^^^^^
608*4882a593Smuzhiyun
609*4882a593SmuzhiyunRetrieve flicker reduction module state
610*4882a593Smuzhiyun
611*4882a593SmuzhiyunResult[0]
612*4882a593Smuzhiyun^^^^^^^^^
613*4882a593Smuzhiyun
614*4882a593Smuzhiyunflicker state: 0=off, 1=on
615*4882a593Smuzhiyun
616*4882a593Smuzhiyun
617*4882a593Smuzhiyun
618*4882a593SmuzhiyunCX2341X_OSD_SET_FLICKER_STATE
619*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
620*4882a593Smuzhiyun
621*4882a593SmuzhiyunEnum: 80/0x50
622*4882a593Smuzhiyun
623*4882a593SmuzhiyunDescription
624*4882a593Smuzhiyun^^^^^^^^^^^
625*4882a593Smuzhiyun
626*4882a593SmuzhiyunSet flicker reduction module state
627*4882a593Smuzhiyun
628*4882a593SmuzhiyunParam[0]
629*4882a593Smuzhiyun^^^^^^^^
630*4882a593Smuzhiyun
631*4882a593SmuzhiyunState: 0=off, 1=on
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun
635*4882a593SmuzhiyunCX2341X_OSD_BLT_COPY
636*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~
637*4882a593Smuzhiyun
638*4882a593SmuzhiyunEnum: 82/0x52
639*4882a593Smuzhiyun
640*4882a593SmuzhiyunDescription
641*4882a593Smuzhiyun^^^^^^^^^^^
642*4882a593Smuzhiyun
643*4882a593SmuzhiyunBLT copy
644*4882a593Smuzhiyun
645*4882a593SmuzhiyunParam[0]
646*4882a593Smuzhiyun^^^^^^^^
647*4882a593Smuzhiyun
648*4882a593Smuzhiyun.. code-block:: none
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun	'0000'  zero
651*4882a593Smuzhiyun	'0001' ~destination AND ~source
652*4882a593Smuzhiyun	'0010' ~destination AND  source
653*4882a593Smuzhiyun	'0011' ~destination
654*4882a593Smuzhiyun	'0100'  destination AND ~source
655*4882a593Smuzhiyun	'0101'                  ~source
656*4882a593Smuzhiyun	'0110'  destination XOR  source
657*4882a593Smuzhiyun	'0111' ~destination OR  ~source
658*4882a593Smuzhiyun	'1000' ~destination AND ~source
659*4882a593Smuzhiyun	'1001'  destination XNOR source
660*4882a593Smuzhiyun	'1010'                   source
661*4882a593Smuzhiyun	'1011' ~destination OR   source
662*4882a593Smuzhiyun	'1100'  destination
663*4882a593Smuzhiyun	'1101'  destination OR  ~source
664*4882a593Smuzhiyun	'1110'  destination OR   source
665*4882a593Smuzhiyun	'1111'  one
666*4882a593Smuzhiyun
667*4882a593Smuzhiyun
668*4882a593SmuzhiyunParam[1]
669*4882a593Smuzhiyun^^^^^^^^
670*4882a593Smuzhiyun
671*4882a593SmuzhiyunResulting alpha blending
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun- '01' source_alpha
674*4882a593Smuzhiyun- '10' destination_alpha
675*4882a593Smuzhiyun- '11' source_alpha*destination_alpha+1
676*4882a593Smuzhiyun  (zero if both source and destination alpha are zero)
677*4882a593Smuzhiyun
678*4882a593SmuzhiyunParam[2]
679*4882a593Smuzhiyun^^^^^^^^
680*4882a593Smuzhiyun
681*4882a593Smuzhiyun.. code-block:: none
682*4882a593Smuzhiyun
683*4882a593Smuzhiyun	'00' output_pixel = source_pixel
684*4882a593Smuzhiyun
685*4882a593Smuzhiyun	'01' if source_alpha=0:
686*4882a593Smuzhiyun		 output_pixel = destination_pixel
687*4882a593Smuzhiyun	     if 256 > source_alpha > 1:
688*4882a593Smuzhiyun		 output_pixel = ((source_alpha + 1)*source_pixel +
689*4882a593Smuzhiyun				 (255 - source_alpha)*destination_pixel)/256
690*4882a593Smuzhiyun
691*4882a593Smuzhiyun	'10' if destination_alpha=0:
692*4882a593Smuzhiyun		 output_pixel = source_pixel
693*4882a593Smuzhiyun	      if 255 > destination_alpha > 0:
694*4882a593Smuzhiyun		 output_pixel = ((255 - destination_alpha)*source_pixel +
695*4882a593Smuzhiyun				 (destination_alpha + 1)*destination_pixel)/256
696*4882a593Smuzhiyun
697*4882a593Smuzhiyun	'11' if source_alpha=0:
698*4882a593Smuzhiyun		 source_temp = 0
699*4882a593Smuzhiyun	     if source_alpha=255:
700*4882a593Smuzhiyun		 source_temp = source_pixel*256
701*4882a593Smuzhiyun	     if 255 > source_alpha > 0:
702*4882a593Smuzhiyun		 source_temp = source_pixel*(source_alpha + 1)
703*4882a593Smuzhiyun	     if destination_alpha=0:
704*4882a593Smuzhiyun		 destination_temp = 0
705*4882a593Smuzhiyun	     if destination_alpha=255:
706*4882a593Smuzhiyun		 destination_temp = destination_pixel*256
707*4882a593Smuzhiyun	     if 255 > destination_alpha > 0:
708*4882a593Smuzhiyun		 destination_temp = destination_pixel*(destination_alpha + 1)
709*4882a593Smuzhiyun	     output_pixel = (source_temp + destination_temp)/256
710*4882a593Smuzhiyun
711*4882a593SmuzhiyunParam[3]
712*4882a593Smuzhiyun^^^^^^^^
713*4882a593Smuzhiyun
714*4882a593Smuzhiyunwidth
715*4882a593Smuzhiyun
716*4882a593SmuzhiyunParam[4]
717*4882a593Smuzhiyun^^^^^^^^
718*4882a593Smuzhiyun
719*4882a593Smuzhiyunheight
720*4882a593Smuzhiyun
721*4882a593SmuzhiyunParam[5]
722*4882a593Smuzhiyun^^^^^^^^
723*4882a593Smuzhiyun
724*4882a593Smuzhiyundestination pixel mask
725*4882a593Smuzhiyun
726*4882a593SmuzhiyunParam[6]
727*4882a593Smuzhiyun^^^^^^^^
728*4882a593Smuzhiyun
729*4882a593Smuzhiyundestination rectangle start address
730*4882a593Smuzhiyun
731*4882a593SmuzhiyunParam[7]
732*4882a593Smuzhiyun^^^^^^^^
733*4882a593Smuzhiyun
734*4882a593Smuzhiyundestination stride in dwords
735*4882a593Smuzhiyun
736*4882a593SmuzhiyunParam[8]
737*4882a593Smuzhiyun^^^^^^^^
738*4882a593Smuzhiyun
739*4882a593Smuzhiyunsource stride in dwords
740*4882a593Smuzhiyun
741*4882a593SmuzhiyunParam[9]
742*4882a593Smuzhiyun^^^^^^^^
743*4882a593Smuzhiyun
744*4882a593Smuzhiyunsource rectangle start address
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun
747*4882a593Smuzhiyun
748*4882a593SmuzhiyunCX2341X_OSD_BLT_FILL
749*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~
750*4882a593Smuzhiyun
751*4882a593SmuzhiyunEnum: 83/0x53
752*4882a593Smuzhiyun
753*4882a593SmuzhiyunDescription
754*4882a593Smuzhiyun^^^^^^^^^^^
755*4882a593Smuzhiyun
756*4882a593SmuzhiyunBLT fill color
757*4882a593Smuzhiyun
758*4882a593SmuzhiyunParam[0]
759*4882a593Smuzhiyun^^^^^^^^
760*4882a593Smuzhiyun
761*4882a593SmuzhiyunSame as Param[0] on API 0x52
762*4882a593Smuzhiyun
763*4882a593SmuzhiyunParam[1]
764*4882a593Smuzhiyun^^^^^^^^
765*4882a593Smuzhiyun
766*4882a593SmuzhiyunSame as Param[1] on API 0x52
767*4882a593Smuzhiyun
768*4882a593SmuzhiyunParam[2]
769*4882a593Smuzhiyun^^^^^^^^
770*4882a593Smuzhiyun
771*4882a593SmuzhiyunSame as Param[2] on API 0x52
772*4882a593Smuzhiyun
773*4882a593SmuzhiyunParam[3]
774*4882a593Smuzhiyun^^^^^^^^
775*4882a593Smuzhiyun
776*4882a593Smuzhiyunwidth
777*4882a593Smuzhiyun
778*4882a593SmuzhiyunParam[4]
779*4882a593Smuzhiyun^^^^^^^^
780*4882a593Smuzhiyun
781*4882a593Smuzhiyunheight
782*4882a593Smuzhiyun
783*4882a593SmuzhiyunParam[5]
784*4882a593Smuzhiyun^^^^^^^^
785*4882a593Smuzhiyun
786*4882a593Smuzhiyundestination pixel mask
787*4882a593Smuzhiyun
788*4882a593SmuzhiyunParam[6]
789*4882a593Smuzhiyun^^^^^^^^
790*4882a593Smuzhiyun
791*4882a593Smuzhiyundestination rectangle start address
792*4882a593Smuzhiyun
793*4882a593SmuzhiyunParam[7]
794*4882a593Smuzhiyun^^^^^^^^
795*4882a593Smuzhiyun
796*4882a593Smuzhiyundestination stride in dwords
797*4882a593Smuzhiyun
798*4882a593SmuzhiyunParam[8]
799*4882a593Smuzhiyun^^^^^^^^
800*4882a593Smuzhiyun
801*4882a593Smuzhiyuncolor fill value
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun
805*4882a593SmuzhiyunCX2341X_OSD_BLT_TEXT
806*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~
807*4882a593Smuzhiyun
808*4882a593SmuzhiyunEnum: 84/0x54
809*4882a593Smuzhiyun
810*4882a593SmuzhiyunDescription
811*4882a593Smuzhiyun^^^^^^^^^^^
812*4882a593Smuzhiyun
813*4882a593SmuzhiyunBLT for 8 bit alpha text source
814*4882a593Smuzhiyun
815*4882a593SmuzhiyunParam[0]
816*4882a593Smuzhiyun^^^^^^^^
817*4882a593Smuzhiyun
818*4882a593SmuzhiyunSame as Param[0] on API 0x52
819*4882a593Smuzhiyun
820*4882a593SmuzhiyunParam[1]
821*4882a593Smuzhiyun^^^^^^^^
822*4882a593Smuzhiyun
823*4882a593SmuzhiyunSame as Param[1] on API 0x52
824*4882a593Smuzhiyun
825*4882a593SmuzhiyunParam[2]
826*4882a593Smuzhiyun^^^^^^^^
827*4882a593Smuzhiyun
828*4882a593SmuzhiyunSame as Param[2] on API 0x52
829*4882a593Smuzhiyun
830*4882a593SmuzhiyunParam[3]
831*4882a593Smuzhiyun^^^^^^^^
832*4882a593Smuzhiyun
833*4882a593Smuzhiyunwidth
834*4882a593Smuzhiyun
835*4882a593SmuzhiyunParam[4]
836*4882a593Smuzhiyun^^^^^^^^
837*4882a593Smuzhiyun
838*4882a593Smuzhiyunheight
839*4882a593Smuzhiyun
840*4882a593SmuzhiyunParam[5]
841*4882a593Smuzhiyun^^^^^^^^
842*4882a593Smuzhiyun
843*4882a593Smuzhiyundestination pixel mask
844*4882a593Smuzhiyun
845*4882a593SmuzhiyunParam[6]
846*4882a593Smuzhiyun^^^^^^^^
847*4882a593Smuzhiyun
848*4882a593Smuzhiyundestination rectangle start address
849*4882a593Smuzhiyun
850*4882a593SmuzhiyunParam[7]
851*4882a593Smuzhiyun^^^^^^^^
852*4882a593Smuzhiyun
853*4882a593Smuzhiyundestination stride in dwords
854*4882a593Smuzhiyun
855*4882a593SmuzhiyunParam[8]
856*4882a593Smuzhiyun^^^^^^^^
857*4882a593Smuzhiyun
858*4882a593Smuzhiyunsource stride in dwords
859*4882a593Smuzhiyun
860*4882a593SmuzhiyunParam[9]
861*4882a593Smuzhiyun^^^^^^^^
862*4882a593Smuzhiyun
863*4882a593Smuzhiyunsource rectangle start address
864*4882a593Smuzhiyun
865*4882a593SmuzhiyunParam[10]
866*4882a593Smuzhiyun^^^^^^^^^
867*4882a593Smuzhiyun
868*4882a593Smuzhiyuncolor fill value
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun
871*4882a593Smuzhiyun
872*4882a593SmuzhiyunCX2341X_OSD_SET_FRAMEBUFFER_WINDOW
873*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
874*4882a593Smuzhiyun
875*4882a593SmuzhiyunEnum: 86/0x56
876*4882a593Smuzhiyun
877*4882a593SmuzhiyunDescription
878*4882a593Smuzhiyun^^^^^^^^^^^
879*4882a593Smuzhiyun
880*4882a593SmuzhiyunPositions the main output window on the screen. The coordinates must be
881*4882a593Smuzhiyunsuch that the entire window fits on the screen.
882*4882a593Smuzhiyun
883*4882a593SmuzhiyunParam[0]
884*4882a593Smuzhiyun^^^^^^^^
885*4882a593Smuzhiyun
886*4882a593Smuzhiyunwindow width
887*4882a593Smuzhiyun
888*4882a593SmuzhiyunParam[1]
889*4882a593Smuzhiyun^^^^^^^^
890*4882a593Smuzhiyun
891*4882a593Smuzhiyunwindow height
892*4882a593Smuzhiyun
893*4882a593SmuzhiyunParam[2]
894*4882a593Smuzhiyun^^^^^^^^
895*4882a593Smuzhiyun
896*4882a593Smuzhiyuntop left window corner horizontal offset
897*4882a593Smuzhiyun
898*4882a593SmuzhiyunParam[3]
899*4882a593Smuzhiyun^^^^^^^^
900*4882a593Smuzhiyun
901*4882a593Smuzhiyuntop left window corner vertical offset
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun
904*4882a593Smuzhiyun
905*4882a593SmuzhiyunCX2341X_OSD_SET_CHROMA_KEY
906*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
907*4882a593Smuzhiyun
908*4882a593SmuzhiyunEnum: 96/0x60
909*4882a593Smuzhiyun
910*4882a593SmuzhiyunDescription
911*4882a593Smuzhiyun^^^^^^^^^^^
912*4882a593Smuzhiyun
913*4882a593SmuzhiyunChroma key switch and color
914*4882a593Smuzhiyun
915*4882a593SmuzhiyunParam[0]
916*4882a593Smuzhiyun^^^^^^^^
917*4882a593Smuzhiyun
918*4882a593Smuzhiyunstate: 0=off, 1=on
919*4882a593Smuzhiyun
920*4882a593SmuzhiyunParam[1]
921*4882a593Smuzhiyun^^^^^^^^
922*4882a593Smuzhiyun
923*4882a593Smuzhiyuncolor
924*4882a593Smuzhiyun
925*4882a593Smuzhiyun
926*4882a593Smuzhiyun
927*4882a593SmuzhiyunCX2341X_OSD_GET_ALPHA_CONTENT_INDEX
928*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
929*4882a593Smuzhiyun
930*4882a593SmuzhiyunEnum: 97/0x61
931*4882a593Smuzhiyun
932*4882a593SmuzhiyunDescription
933*4882a593Smuzhiyun^^^^^^^^^^^
934*4882a593Smuzhiyun
935*4882a593SmuzhiyunRetrieve alpha content index
936*4882a593Smuzhiyun
937*4882a593SmuzhiyunResult[0]
938*4882a593Smuzhiyun^^^^^^^^^
939*4882a593Smuzhiyun
940*4882a593Smuzhiyunalpha content index, Range 0:15
941*4882a593Smuzhiyun
942*4882a593Smuzhiyun
943*4882a593Smuzhiyun
944*4882a593SmuzhiyunCX2341X_OSD_SET_ALPHA_CONTENT_INDEX
945*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
946*4882a593Smuzhiyun
947*4882a593SmuzhiyunEnum: 98/0x62
948*4882a593Smuzhiyun
949*4882a593SmuzhiyunDescription
950*4882a593Smuzhiyun^^^^^^^^^^^
951*4882a593Smuzhiyun
952*4882a593SmuzhiyunAssign alpha content index
953*4882a593Smuzhiyun
954*4882a593SmuzhiyunParam[0]
955*4882a593Smuzhiyun^^^^^^^^
956*4882a593Smuzhiyun
957*4882a593Smuzhiyunalpha content index, range 0:15
958*4882a593Smuzhiyun
959*4882a593Smuzhiyun
960*4882a593SmuzhiyunEncoder firmware API description
961*4882a593Smuzhiyun--------------------------------
962*4882a593Smuzhiyun
963*4882a593SmuzhiyunCX2341X_ENC_PING_FW
964*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~
965*4882a593Smuzhiyun
966*4882a593SmuzhiyunEnum: 128/0x80
967*4882a593Smuzhiyun
968*4882a593SmuzhiyunDescription
969*4882a593Smuzhiyun^^^^^^^^^^^
970*4882a593Smuzhiyun
971*4882a593SmuzhiyunDoes nothing. Can be used to check if the firmware is responding.
972*4882a593Smuzhiyun
973*4882a593Smuzhiyun
974*4882a593Smuzhiyun
975*4882a593SmuzhiyunCX2341X_ENC_START_CAPTURE
976*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
977*4882a593Smuzhiyun
978*4882a593SmuzhiyunEnum: 129/0x81
979*4882a593Smuzhiyun
980*4882a593SmuzhiyunDescription
981*4882a593Smuzhiyun^^^^^^^^^^^
982*4882a593Smuzhiyun
983*4882a593SmuzhiyunCommences the capture of video, audio and/or VBI data. All encoding
984*4882a593Smuzhiyunparameters must be initialized prior to this API call. Captures frames
985*4882a593Smuzhiyuncontinuously or until a predefined number of frames have been captured.
986*4882a593Smuzhiyun
987*4882a593SmuzhiyunParam[0]
988*4882a593Smuzhiyun^^^^^^^^
989*4882a593Smuzhiyun
990*4882a593SmuzhiyunCapture stream type:
991*4882a593Smuzhiyun
992*4882a593Smuzhiyun	- 0=MPEG
993*4882a593Smuzhiyun	- 1=Raw
994*4882a593Smuzhiyun	- 2=Raw passthrough
995*4882a593Smuzhiyun	- 3=VBI
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun
998*4882a593SmuzhiyunParam[1]
999*4882a593Smuzhiyun^^^^^^^^
1000*4882a593Smuzhiyun
1001*4882a593SmuzhiyunBitmask:
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun	- Bit 0 when set, captures YUV
1004*4882a593Smuzhiyun	- Bit 1 when set, captures PCM audio
1005*4882a593Smuzhiyun	- Bit 2 when set, captures VBI (same as param[0]=3)
1006*4882a593Smuzhiyun	- Bit 3 when set, the capture destination is the decoder
1007*4882a593Smuzhiyun	  (same as param[0]=2)
1008*4882a593Smuzhiyun	- Bit 4 when set, the capture destination is the host
1009*4882a593Smuzhiyun
1010*4882a593Smuzhiyun.. note:: this parameter is only meaningful for RAW capture type.
1011*4882a593Smuzhiyun
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun
1014*4882a593SmuzhiyunCX2341X_ENC_STOP_CAPTURE
1015*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~
1016*4882a593Smuzhiyun
1017*4882a593SmuzhiyunEnum: 130/0x82
1018*4882a593Smuzhiyun
1019*4882a593SmuzhiyunDescription
1020*4882a593Smuzhiyun^^^^^^^^^^^
1021*4882a593Smuzhiyun
1022*4882a593SmuzhiyunEnds a capture in progress
1023*4882a593Smuzhiyun
1024*4882a593SmuzhiyunParam[0]
1025*4882a593Smuzhiyun^^^^^^^^
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun- 0=stop at end of GOP (generates IRQ)
1028*4882a593Smuzhiyun- 1=stop immediate (no IRQ)
1029*4882a593Smuzhiyun
1030*4882a593SmuzhiyunParam[1]
1031*4882a593Smuzhiyun^^^^^^^^
1032*4882a593Smuzhiyun
1033*4882a593SmuzhiyunStream type to stop, see param[0] of API 0x81
1034*4882a593Smuzhiyun
1035*4882a593SmuzhiyunParam[2]
1036*4882a593Smuzhiyun^^^^^^^^
1037*4882a593Smuzhiyun
1038*4882a593SmuzhiyunSubtype, see param[1] of API 0x81
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun
1041*4882a593Smuzhiyun
1042*4882a593SmuzhiyunCX2341X_ENC_SET_AUDIO_ID
1043*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~
1044*4882a593Smuzhiyun
1045*4882a593SmuzhiyunEnum: 137/0x89
1046*4882a593Smuzhiyun
1047*4882a593SmuzhiyunDescription
1048*4882a593Smuzhiyun^^^^^^^^^^^
1049*4882a593Smuzhiyun
1050*4882a593SmuzhiyunAssigns the transport stream ID of the encoded audio stream
1051*4882a593Smuzhiyun
1052*4882a593SmuzhiyunParam[0]
1053*4882a593Smuzhiyun^^^^^^^^
1054*4882a593Smuzhiyun
1055*4882a593SmuzhiyunAudio Stream ID
1056*4882a593Smuzhiyun
1057*4882a593Smuzhiyun
1058*4882a593Smuzhiyun
1059*4882a593SmuzhiyunCX2341X_ENC_SET_VIDEO_ID
1060*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~
1061*4882a593Smuzhiyun
1062*4882a593SmuzhiyunEnum: 139/0x8B
1063*4882a593Smuzhiyun
1064*4882a593SmuzhiyunDescription
1065*4882a593Smuzhiyun^^^^^^^^^^^
1066*4882a593Smuzhiyun
1067*4882a593SmuzhiyunSet video transport stream ID
1068*4882a593Smuzhiyun
1069*4882a593SmuzhiyunParam[0]
1070*4882a593Smuzhiyun^^^^^^^^
1071*4882a593Smuzhiyun
1072*4882a593SmuzhiyunVideo stream ID
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun
1076*4882a593SmuzhiyunCX2341X_ENC_SET_PCR_ID
1077*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~
1078*4882a593Smuzhiyun
1079*4882a593SmuzhiyunEnum: 141/0x8D
1080*4882a593Smuzhiyun
1081*4882a593SmuzhiyunDescription
1082*4882a593Smuzhiyun^^^^^^^^^^^
1083*4882a593Smuzhiyun
1084*4882a593SmuzhiyunAssigns the transport stream ID for PCR packets
1085*4882a593Smuzhiyun
1086*4882a593SmuzhiyunParam[0]
1087*4882a593Smuzhiyun^^^^^^^^
1088*4882a593Smuzhiyun
1089*4882a593SmuzhiyunPCR Stream ID
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun
1092*4882a593Smuzhiyun
1093*4882a593SmuzhiyunCX2341X_ENC_SET_FRAME_RATE
1094*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
1095*4882a593Smuzhiyun
1096*4882a593SmuzhiyunEnum: 143/0x8F
1097*4882a593Smuzhiyun
1098*4882a593SmuzhiyunDescription
1099*4882a593Smuzhiyun^^^^^^^^^^^
1100*4882a593Smuzhiyun
1101*4882a593SmuzhiyunSet video frames per second. Change occurs at start of new GOP.
1102*4882a593Smuzhiyun
1103*4882a593SmuzhiyunParam[0]
1104*4882a593Smuzhiyun^^^^^^^^
1105*4882a593Smuzhiyun
1106*4882a593Smuzhiyun- 0=30fps
1107*4882a593Smuzhiyun- 1=25fps
1108*4882a593Smuzhiyun
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun
1111*4882a593SmuzhiyunCX2341X_ENC_SET_FRAME_SIZE
1112*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
1113*4882a593Smuzhiyun
1114*4882a593SmuzhiyunEnum: 145/0x91
1115*4882a593Smuzhiyun
1116*4882a593SmuzhiyunDescription
1117*4882a593Smuzhiyun^^^^^^^^^^^
1118*4882a593Smuzhiyun
1119*4882a593SmuzhiyunSelect video stream encoding resolution.
1120*4882a593Smuzhiyun
1121*4882a593SmuzhiyunParam[0]
1122*4882a593Smuzhiyun^^^^^^^^
1123*4882a593Smuzhiyun
1124*4882a593SmuzhiyunHeight in lines. Default 480
1125*4882a593Smuzhiyun
1126*4882a593SmuzhiyunParam[1]
1127*4882a593Smuzhiyun^^^^^^^^
1128*4882a593Smuzhiyun
1129*4882a593SmuzhiyunWidth in pixels. Default 720
1130*4882a593Smuzhiyun
1131*4882a593Smuzhiyun
1132*4882a593Smuzhiyun
1133*4882a593SmuzhiyunCX2341X_ENC_SET_BIT_RATE
1134*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~
1135*4882a593Smuzhiyun
1136*4882a593SmuzhiyunEnum: 149/0x95
1137*4882a593Smuzhiyun
1138*4882a593SmuzhiyunDescription
1139*4882a593Smuzhiyun^^^^^^^^^^^
1140*4882a593Smuzhiyun
1141*4882a593SmuzhiyunAssign average video stream bitrate.
1142*4882a593Smuzhiyun
1143*4882a593SmuzhiyunParam[0]
1144*4882a593Smuzhiyun^^^^^^^^
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun0=variable bitrate, 1=constant bitrate
1147*4882a593Smuzhiyun
1148*4882a593SmuzhiyunParam[1]
1149*4882a593Smuzhiyun^^^^^^^^
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyunbitrate in bits per second
1152*4882a593Smuzhiyun
1153*4882a593SmuzhiyunParam[2]
1154*4882a593Smuzhiyun^^^^^^^^
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyunpeak bitrate in bits per second, divided by 400
1157*4882a593Smuzhiyun
1158*4882a593SmuzhiyunParam[3]
1159*4882a593Smuzhiyun^^^^^^^^
1160*4882a593Smuzhiyun
1161*4882a593SmuzhiyunMux bitrate in bits per second, divided by 400. May be 0 (default).
1162*4882a593Smuzhiyun
1163*4882a593SmuzhiyunParam[4]
1164*4882a593Smuzhiyun^^^^^^^^
1165*4882a593Smuzhiyun
1166*4882a593SmuzhiyunRate Control VBR Padding
1167*4882a593Smuzhiyun
1168*4882a593SmuzhiyunParam[5]
1169*4882a593Smuzhiyun^^^^^^^^
1170*4882a593Smuzhiyun
1171*4882a593SmuzhiyunVBV Buffer used by encoder
1172*4882a593Smuzhiyun
1173*4882a593Smuzhiyun.. note::
1174*4882a593Smuzhiyun
1175*4882a593Smuzhiyun	#) Param\[3\] and Param\[4\] seem to be always 0
1176*4882a593Smuzhiyun	#) Param\[5\] doesn't seem to be used.
1177*4882a593Smuzhiyun
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun
1180*4882a593SmuzhiyunCX2341X_ENC_SET_GOP_PROPERTIES
1181*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1182*4882a593Smuzhiyun
1183*4882a593SmuzhiyunEnum: 151/0x97
1184*4882a593Smuzhiyun
1185*4882a593SmuzhiyunDescription
1186*4882a593Smuzhiyun^^^^^^^^^^^
1187*4882a593Smuzhiyun
1188*4882a593SmuzhiyunSetup the GOP structure
1189*4882a593Smuzhiyun
1190*4882a593SmuzhiyunParam[0]
1191*4882a593Smuzhiyun^^^^^^^^
1192*4882a593Smuzhiyun
1193*4882a593SmuzhiyunGOP size (maximum is 34)
1194*4882a593Smuzhiyun
1195*4882a593SmuzhiyunParam[1]
1196*4882a593Smuzhiyun^^^^^^^^
1197*4882a593Smuzhiyun
1198*4882a593SmuzhiyunNumber of B frames between the I and P frame, plus 1.
1199*4882a593SmuzhiyunFor example: IBBPBBPBBPBB --> GOP size: 12, number of B frames: 2+1 = 3
1200*4882a593Smuzhiyun
1201*4882a593Smuzhiyun.. note::
1202*4882a593Smuzhiyun
1203*4882a593Smuzhiyun	GOP size must be a multiple of (B-frames + 1).
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun
1206*4882a593Smuzhiyun
1207*4882a593SmuzhiyunCX2341X_ENC_SET_ASPECT_RATIO
1208*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1209*4882a593Smuzhiyun
1210*4882a593SmuzhiyunEnum: 153/0x99
1211*4882a593Smuzhiyun
1212*4882a593SmuzhiyunDescription
1213*4882a593Smuzhiyun^^^^^^^^^^^
1214*4882a593Smuzhiyun
1215*4882a593SmuzhiyunSets the encoding aspect ratio. Changes in the aspect ratio take effect
1216*4882a593Smuzhiyunat the start of the next GOP.
1217*4882a593Smuzhiyun
1218*4882a593SmuzhiyunParam[0]
1219*4882a593Smuzhiyun^^^^^^^^
1220*4882a593Smuzhiyun
1221*4882a593Smuzhiyun- '0000' forbidden
1222*4882a593Smuzhiyun- '0001' 1:1 square
1223*4882a593Smuzhiyun- '0010' 4:3
1224*4882a593Smuzhiyun- '0011' 16:9
1225*4882a593Smuzhiyun- '0100' 2.21:1
1226*4882a593Smuzhiyun- '0101' to '1111' reserved
1227*4882a593Smuzhiyun
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun
1230*4882a593SmuzhiyunCX2341X_ENC_SET_DNR_FILTER_MODE
1231*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1232*4882a593Smuzhiyun
1233*4882a593SmuzhiyunEnum: 155/0x9B
1234*4882a593Smuzhiyun
1235*4882a593SmuzhiyunDescription
1236*4882a593Smuzhiyun^^^^^^^^^^^
1237*4882a593Smuzhiyun
1238*4882a593SmuzhiyunAssign Dynamic Noise Reduction operating mode
1239*4882a593Smuzhiyun
1240*4882a593SmuzhiyunParam[0]
1241*4882a593Smuzhiyun^^^^^^^^
1242*4882a593Smuzhiyun
1243*4882a593SmuzhiyunBit0: Spatial filter, set=auto, clear=manual
1244*4882a593SmuzhiyunBit1: Temporal filter, set=auto, clear=manual
1245*4882a593Smuzhiyun
1246*4882a593SmuzhiyunParam[1]
1247*4882a593Smuzhiyun^^^^^^^^
1248*4882a593Smuzhiyun
1249*4882a593SmuzhiyunMedian filter:
1250*4882a593Smuzhiyun
1251*4882a593Smuzhiyun- 0=Disabled
1252*4882a593Smuzhiyun- 1=Horizontal
1253*4882a593Smuzhiyun- 2=Vertical
1254*4882a593Smuzhiyun- 3=Horiz/Vert
1255*4882a593Smuzhiyun- 4=Diagonal
1256*4882a593Smuzhiyun
1257*4882a593Smuzhiyun
1258*4882a593Smuzhiyun
1259*4882a593SmuzhiyunCX2341X_ENC_SET_DNR_FILTER_PROPS
1260*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1261*4882a593Smuzhiyun
1262*4882a593SmuzhiyunEnum: 157/0x9D
1263*4882a593Smuzhiyun
1264*4882a593SmuzhiyunDescription
1265*4882a593Smuzhiyun^^^^^^^^^^^
1266*4882a593Smuzhiyun
1267*4882a593SmuzhiyunThese Dynamic Noise Reduction filter values are only meaningful when
1268*4882a593Smuzhiyunthe respective filter is set to "manual" (See API 0x9B)
1269*4882a593Smuzhiyun
1270*4882a593SmuzhiyunParam[0]
1271*4882a593Smuzhiyun^^^^^^^^
1272*4882a593Smuzhiyun
1273*4882a593SmuzhiyunSpatial filter: default 0, range 0:15
1274*4882a593Smuzhiyun
1275*4882a593SmuzhiyunParam[1]
1276*4882a593Smuzhiyun^^^^^^^^
1277*4882a593Smuzhiyun
1278*4882a593SmuzhiyunTemporal filter: default 0, range 0:31
1279*4882a593Smuzhiyun
1280*4882a593Smuzhiyun
1281*4882a593Smuzhiyun
1282*4882a593SmuzhiyunCX2341X_ENC_SET_CORING_LEVELS
1283*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1284*4882a593Smuzhiyun
1285*4882a593SmuzhiyunEnum: 159/0x9F
1286*4882a593Smuzhiyun
1287*4882a593SmuzhiyunDescription
1288*4882a593Smuzhiyun^^^^^^^^^^^
1289*4882a593Smuzhiyun
1290*4882a593SmuzhiyunAssign Dynamic Noise Reduction median filter properties.
1291*4882a593Smuzhiyun
1292*4882a593SmuzhiyunParam[0]
1293*4882a593Smuzhiyun^^^^^^^^
1294*4882a593Smuzhiyun
1295*4882a593SmuzhiyunThreshold above which the luminance median filter is enabled.
1296*4882a593SmuzhiyunDefault: 0, range 0:255
1297*4882a593Smuzhiyun
1298*4882a593SmuzhiyunParam[1]
1299*4882a593Smuzhiyun^^^^^^^^
1300*4882a593Smuzhiyun
1301*4882a593SmuzhiyunThreshold below which the luminance median filter is enabled.
1302*4882a593SmuzhiyunDefault: 255, range 0:255
1303*4882a593Smuzhiyun
1304*4882a593SmuzhiyunParam[2]
1305*4882a593Smuzhiyun^^^^^^^^
1306*4882a593Smuzhiyun
1307*4882a593SmuzhiyunThreshold above which the chrominance median filter is enabled.
1308*4882a593SmuzhiyunDefault: 0, range 0:255
1309*4882a593Smuzhiyun
1310*4882a593SmuzhiyunParam[3]
1311*4882a593Smuzhiyun^^^^^^^^
1312*4882a593Smuzhiyun
1313*4882a593SmuzhiyunThreshold below which the chrominance median filter is enabled.
1314*4882a593SmuzhiyunDefault: 255, range 0:255
1315*4882a593Smuzhiyun
1316*4882a593Smuzhiyun
1317*4882a593Smuzhiyun
1318*4882a593SmuzhiyunCX2341X_ENC_SET_SPATIAL_FILTER_TYPE
1319*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1320*4882a593Smuzhiyun
1321*4882a593SmuzhiyunEnum: 161/0xA1
1322*4882a593Smuzhiyun
1323*4882a593SmuzhiyunDescription
1324*4882a593Smuzhiyun^^^^^^^^^^^
1325*4882a593Smuzhiyun
1326*4882a593SmuzhiyunAssign spatial prefilter parameters
1327*4882a593Smuzhiyun
1328*4882a593SmuzhiyunParam[0]
1329*4882a593Smuzhiyun^^^^^^^^
1330*4882a593Smuzhiyun
1331*4882a593SmuzhiyunLuminance filter
1332*4882a593Smuzhiyun
1333*4882a593Smuzhiyun- 0=Off
1334*4882a593Smuzhiyun- 1=1D Horizontal
1335*4882a593Smuzhiyun- 2=1D Vertical
1336*4882a593Smuzhiyun- 3=2D H/V Separable (default)
1337*4882a593Smuzhiyun- 4=2D Symmetric non-separable
1338*4882a593Smuzhiyun
1339*4882a593SmuzhiyunParam[1]
1340*4882a593Smuzhiyun^^^^^^^^
1341*4882a593Smuzhiyun
1342*4882a593SmuzhiyunChrominance filter
1343*4882a593Smuzhiyun
1344*4882a593Smuzhiyun- 0=Off
1345*4882a593Smuzhiyun- 1=1D Horizontal (default)
1346*4882a593Smuzhiyun
1347*4882a593Smuzhiyun
1348*4882a593Smuzhiyun
1349*4882a593SmuzhiyunCX2341X_ENC_SET_VBI_LINE
1350*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~
1351*4882a593Smuzhiyun
1352*4882a593SmuzhiyunEnum: 183/0xB7
1353*4882a593Smuzhiyun
1354*4882a593SmuzhiyunDescription
1355*4882a593Smuzhiyun^^^^^^^^^^^
1356*4882a593Smuzhiyun
1357*4882a593SmuzhiyunSelects VBI line number.
1358*4882a593Smuzhiyun
1359*4882a593SmuzhiyunParam[0]
1360*4882a593Smuzhiyun^^^^^^^^
1361*4882a593Smuzhiyun
1362*4882a593Smuzhiyun- Bits 0:4 	line number
1363*4882a593Smuzhiyun- Bit  31		0=top_field, 1=bottom_field
1364*4882a593Smuzhiyun- Bits 0:31 	all set specifies "all lines"
1365*4882a593Smuzhiyun
1366*4882a593SmuzhiyunParam[1]
1367*4882a593Smuzhiyun^^^^^^^^
1368*4882a593Smuzhiyun
1369*4882a593SmuzhiyunVBI line information features: 0=disabled, 1=enabled
1370*4882a593Smuzhiyun
1371*4882a593SmuzhiyunParam[2]
1372*4882a593Smuzhiyun^^^^^^^^
1373*4882a593Smuzhiyun
1374*4882a593SmuzhiyunSlicing: 0=None, 1=Closed Caption
1375*4882a593SmuzhiyunAlmost certainly not implemented. Set to 0.
1376*4882a593Smuzhiyun
1377*4882a593SmuzhiyunParam[3]
1378*4882a593Smuzhiyun^^^^^^^^
1379*4882a593Smuzhiyun
1380*4882a593SmuzhiyunLuminance samples in this line.
1381*4882a593SmuzhiyunAlmost certainly not implemented. Set to 0.
1382*4882a593Smuzhiyun
1383*4882a593SmuzhiyunParam[4]
1384*4882a593Smuzhiyun^^^^^^^^
1385*4882a593Smuzhiyun
1386*4882a593SmuzhiyunChrominance samples in this line
1387*4882a593SmuzhiyunAlmost certainly not implemented. Set to 0.
1388*4882a593Smuzhiyun
1389*4882a593Smuzhiyun
1390*4882a593Smuzhiyun
1391*4882a593SmuzhiyunCX2341X_ENC_SET_STREAM_TYPE
1392*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~
1393*4882a593Smuzhiyun
1394*4882a593SmuzhiyunEnum: 185/0xB9
1395*4882a593Smuzhiyun
1396*4882a593SmuzhiyunDescription
1397*4882a593Smuzhiyun^^^^^^^^^^^
1398*4882a593Smuzhiyun
1399*4882a593SmuzhiyunAssign stream type
1400*4882a593Smuzhiyun
1401*4882a593Smuzhiyun.. note::
1402*4882a593Smuzhiyun
1403*4882a593Smuzhiyun	Transport stream is not working in recent firmwares.
1404*4882a593Smuzhiyun	And in older firmwares the timestamps in the TS seem to be
1405*4882a593Smuzhiyun	unreliable.
1406*4882a593Smuzhiyun
1407*4882a593SmuzhiyunParam[0]
1408*4882a593Smuzhiyun^^^^^^^^
1409*4882a593Smuzhiyun
1410*4882a593Smuzhiyun- 0=Program stream
1411*4882a593Smuzhiyun- 1=Transport stream
1412*4882a593Smuzhiyun- 2=MPEG1 stream
1413*4882a593Smuzhiyun- 3=PES A/V stream
1414*4882a593Smuzhiyun- 5=PES Video stream
1415*4882a593Smuzhiyun- 7=PES Audio stream
1416*4882a593Smuzhiyun- 10=DVD stream
1417*4882a593Smuzhiyun- 11=VCD stream
1418*4882a593Smuzhiyun- 12=SVCD stream
1419*4882a593Smuzhiyun- 13=DVD_S1 stream
1420*4882a593Smuzhiyun- 14=DVD_S2 stream
1421*4882a593Smuzhiyun
1422*4882a593Smuzhiyun
1423*4882a593Smuzhiyun
1424*4882a593SmuzhiyunCX2341X_ENC_SET_OUTPUT_PORT
1425*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~
1426*4882a593Smuzhiyun
1427*4882a593SmuzhiyunEnum: 187/0xBB
1428*4882a593Smuzhiyun
1429*4882a593SmuzhiyunDescription
1430*4882a593Smuzhiyun^^^^^^^^^^^
1431*4882a593Smuzhiyun
1432*4882a593SmuzhiyunAssign stream output port. Normally 0 when the data is copied through
1433*4882a593Smuzhiyunthe PCI bus (DMA), and 1 when the data is streamed to another chip
1434*4882a593Smuzhiyun(pvrusb and cx88-blackbird).
1435*4882a593Smuzhiyun
1436*4882a593SmuzhiyunParam[0]
1437*4882a593Smuzhiyun^^^^^^^^
1438*4882a593Smuzhiyun
1439*4882a593Smuzhiyun- 0=Memory (default)
1440*4882a593Smuzhiyun- 1=Streaming
1441*4882a593Smuzhiyun- 2=Serial
1442*4882a593Smuzhiyun
1443*4882a593SmuzhiyunParam[1]
1444*4882a593Smuzhiyun^^^^^^^^
1445*4882a593Smuzhiyun
1446*4882a593SmuzhiyunUnknown, but leaving this to 0 seems to work best. Indications are that
1447*4882a593Smuzhiyunthis might have to do with USB support, although passing anything but 0
1448*4882a593Smuzhiyunonly breaks things.
1449*4882a593Smuzhiyun
1450*4882a593Smuzhiyun
1451*4882a593Smuzhiyun
1452*4882a593SmuzhiyunCX2341X_ENC_SET_AUDIO_PROPERTIES
1453*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1454*4882a593Smuzhiyun
1455*4882a593SmuzhiyunEnum: 189/0xBD
1456*4882a593Smuzhiyun
1457*4882a593SmuzhiyunDescription
1458*4882a593Smuzhiyun^^^^^^^^^^^
1459*4882a593Smuzhiyun
1460*4882a593SmuzhiyunSet audio stream properties, may be called while encoding is in progress.
1461*4882a593Smuzhiyun
1462*4882a593Smuzhiyun.. note::
1463*4882a593Smuzhiyun
1464*4882a593Smuzhiyun	All bitfields are consistent with ISO11172 documentation except
1465*4882a593Smuzhiyun	bits 2:3 which ISO docs define as:
1466*4882a593Smuzhiyun
1467*4882a593Smuzhiyun	- '11' Layer I
1468*4882a593Smuzhiyun	- '10' Layer II
1469*4882a593Smuzhiyun	- '01' Layer III
1470*4882a593Smuzhiyun	- '00' Undefined
1471*4882a593Smuzhiyun
1472*4882a593Smuzhiyun	This discrepancy may indicate a possible error in the documentation.
1473*4882a593Smuzhiyun	Testing indicated that only Layer II is actually working, and that
1474*4882a593Smuzhiyun	the minimum bitrate should be 192 kbps.
1475*4882a593Smuzhiyun
1476*4882a593SmuzhiyunParam[0]
1477*4882a593Smuzhiyun^^^^^^^^
1478*4882a593Smuzhiyun
1479*4882a593SmuzhiyunBitmask:
1480*4882a593Smuzhiyun
1481*4882a593Smuzhiyun.. code-block:: none
1482*4882a593Smuzhiyun
1483*4882a593Smuzhiyun	   0:1  '00' 44.1Khz
1484*4882a593Smuzhiyun		'01' 48Khz
1485*4882a593Smuzhiyun		'10' 32Khz
1486*4882a593Smuzhiyun		'11' reserved
1487*4882a593Smuzhiyun
1488*4882a593Smuzhiyun	   2:3  '01'=Layer I
1489*4882a593Smuzhiyun		'10'=Layer II
1490*4882a593Smuzhiyun
1491*4882a593Smuzhiyun	   4:7  Bitrate:
1492*4882a593Smuzhiyun		     Index | Layer I     | Layer II
1493*4882a593Smuzhiyun		     ------+-------------+------------
1494*4882a593Smuzhiyun		    '0000' | free format | free format
1495*4882a593Smuzhiyun		    '0001' |  32 kbit/s  |  32 kbit/s
1496*4882a593Smuzhiyun		    '0010' |  64 kbit/s  |  48 kbit/s
1497*4882a593Smuzhiyun		    '0011' |  96 kbit/s  |  56 kbit/s
1498*4882a593Smuzhiyun		    '0100' | 128 kbit/s  |  64 kbit/s
1499*4882a593Smuzhiyun		    '0101' | 160 kbit/s  |  80 kbit/s
1500*4882a593Smuzhiyun		    '0110' | 192 kbit/s  |  96 kbit/s
1501*4882a593Smuzhiyun		    '0111' | 224 kbit/s  | 112 kbit/s
1502*4882a593Smuzhiyun		    '1000' | 256 kbit/s  | 128 kbit/s
1503*4882a593Smuzhiyun		    '1001' | 288 kbit/s  | 160 kbit/s
1504*4882a593Smuzhiyun		    '1010' | 320 kbit/s  | 192 kbit/s
1505*4882a593Smuzhiyun		    '1011' | 352 kbit/s  | 224 kbit/s
1506*4882a593Smuzhiyun		    '1100' | 384 kbit/s  | 256 kbit/s
1507*4882a593Smuzhiyun		    '1101' | 416 kbit/s  | 320 kbit/s
1508*4882a593Smuzhiyun		    '1110' | 448 kbit/s  | 384 kbit/s
1509*4882a593Smuzhiyun
1510*4882a593Smuzhiyun		.. note::
1511*4882a593Smuzhiyun
1512*4882a593Smuzhiyun			For Layer II, not all combinations of total bitrate
1513*4882a593Smuzhiyun			and mode are allowed. See ISO11172-3 3-Annex B,
1514*4882a593Smuzhiyun			Table 3-B.2
1515*4882a593Smuzhiyun
1516*4882a593Smuzhiyun	   8:9  '00'=Stereo
1517*4882a593Smuzhiyun		'01'=JointStereo
1518*4882a593Smuzhiyun		'10'=Dual
1519*4882a593Smuzhiyun		'11'=Mono
1520*4882a593Smuzhiyun
1521*4882a593Smuzhiyun		.. note::
1522*4882a593Smuzhiyun
1523*4882a593Smuzhiyun			The cx23415 cannot decode Joint Stereo properly.
1524*4882a593Smuzhiyun
1525*4882a593Smuzhiyun	  10:11 Mode Extension used in joint_stereo mode.
1526*4882a593Smuzhiyun		In Layer I and II they indicate which subbands are in
1527*4882a593Smuzhiyun		intensity_stereo. All other subbands are coded in stereo.
1528*4882a593Smuzhiyun		    '00' subbands 4-31 in intensity_stereo, bound==4
1529*4882a593Smuzhiyun		    '01' subbands 8-31 in intensity_stereo, bound==8
1530*4882a593Smuzhiyun		    '10' subbands 12-31 in intensity_stereo, bound==12
1531*4882a593Smuzhiyun		    '11' subbands 16-31 in intensity_stereo, bound==16
1532*4882a593Smuzhiyun
1533*4882a593Smuzhiyun	  12:13 Emphasis:
1534*4882a593Smuzhiyun		    '00' None
1535*4882a593Smuzhiyun		    '01' 50/15uS
1536*4882a593Smuzhiyun		    '10' reserved
1537*4882a593Smuzhiyun		    '11' CCITT J.17
1538*4882a593Smuzhiyun
1539*4882a593Smuzhiyun	  14 	CRC:
1540*4882a593Smuzhiyun		    '0' off
1541*4882a593Smuzhiyun		    '1' on
1542*4882a593Smuzhiyun
1543*4882a593Smuzhiyun	  15    Copyright:
1544*4882a593Smuzhiyun		    '0' off
1545*4882a593Smuzhiyun		    '1' on
1546*4882a593Smuzhiyun
1547*4882a593Smuzhiyun	  16    Generation:
1548*4882a593Smuzhiyun		    '0' copy
1549*4882a593Smuzhiyun		    '1' original
1550*4882a593Smuzhiyun
1551*4882a593Smuzhiyun
1552*4882a593Smuzhiyun
1553*4882a593SmuzhiyunCX2341X_ENC_HALT_FW
1554*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~
1555*4882a593Smuzhiyun
1556*4882a593SmuzhiyunEnum: 195/0xC3
1557*4882a593Smuzhiyun
1558*4882a593SmuzhiyunDescription
1559*4882a593Smuzhiyun^^^^^^^^^^^
1560*4882a593Smuzhiyun
1561*4882a593SmuzhiyunThe firmware is halted and no further API calls are serviced until the
1562*4882a593Smuzhiyunfirmware is uploaded again.
1563*4882a593Smuzhiyun
1564*4882a593Smuzhiyun
1565*4882a593Smuzhiyun
1566*4882a593SmuzhiyunCX2341X_ENC_GET_VERSION
1567*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~
1568*4882a593Smuzhiyun
1569*4882a593SmuzhiyunEnum: 196/0xC4
1570*4882a593Smuzhiyun
1571*4882a593SmuzhiyunDescription
1572*4882a593Smuzhiyun^^^^^^^^^^^
1573*4882a593Smuzhiyun
1574*4882a593SmuzhiyunReturns the version of the encoder firmware.
1575*4882a593Smuzhiyun
1576*4882a593SmuzhiyunResult[0]
1577*4882a593Smuzhiyun^^^^^^^^^
1578*4882a593Smuzhiyun
1579*4882a593SmuzhiyunVersion bitmask:
1580*4882a593Smuzhiyun- Bits  0:15 build
1581*4882a593Smuzhiyun- Bits 16:23 minor
1582*4882a593Smuzhiyun- Bits 24:31 major
1583*4882a593Smuzhiyun
1584*4882a593Smuzhiyun
1585*4882a593Smuzhiyun
1586*4882a593SmuzhiyunCX2341X_ENC_SET_GOP_CLOSURE
1587*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~
1588*4882a593Smuzhiyun
1589*4882a593SmuzhiyunEnum: 197/0xC5
1590*4882a593Smuzhiyun
1591*4882a593SmuzhiyunDescription
1592*4882a593Smuzhiyun^^^^^^^^^^^
1593*4882a593Smuzhiyun
1594*4882a593SmuzhiyunAssigns the GOP open/close property.
1595*4882a593Smuzhiyun
1596*4882a593SmuzhiyunParam[0]
1597*4882a593Smuzhiyun^^^^^^^^
1598*4882a593Smuzhiyun
1599*4882a593Smuzhiyun- 0=Open
1600*4882a593Smuzhiyun- 1=Closed
1601*4882a593Smuzhiyun
1602*4882a593Smuzhiyun
1603*4882a593Smuzhiyun
1604*4882a593SmuzhiyunCX2341X_ENC_GET_SEQ_END
1605*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~
1606*4882a593Smuzhiyun
1607*4882a593SmuzhiyunEnum: 198/0xC6
1608*4882a593Smuzhiyun
1609*4882a593SmuzhiyunDescription
1610*4882a593Smuzhiyun^^^^^^^^^^^
1611*4882a593Smuzhiyun
1612*4882a593SmuzhiyunObtains the sequence end code of the encoder's buffer. When a capture
1613*4882a593Smuzhiyunis started a number of interrupts are still generated, the last of
1614*4882a593Smuzhiyunwhich will have Result[0] set to 1 and Result[1] will contain the size
1615*4882a593Smuzhiyunof the buffer.
1616*4882a593Smuzhiyun
1617*4882a593SmuzhiyunResult[0]
1618*4882a593Smuzhiyun^^^^^^^^^
1619*4882a593Smuzhiyun
1620*4882a593SmuzhiyunState of the transfer (1 if last buffer)
1621*4882a593Smuzhiyun
1622*4882a593SmuzhiyunResult[1]
1623*4882a593Smuzhiyun^^^^^^^^^
1624*4882a593Smuzhiyun
1625*4882a593SmuzhiyunIf Result[0] is 1, this contains the size of the last buffer, undefined
1626*4882a593Smuzhiyunotherwise.
1627*4882a593Smuzhiyun
1628*4882a593Smuzhiyun
1629*4882a593Smuzhiyun
1630*4882a593SmuzhiyunCX2341X_ENC_SET_PGM_INDEX_INFO
1631*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1632*4882a593Smuzhiyun
1633*4882a593SmuzhiyunEnum: 199/0xC7
1634*4882a593Smuzhiyun
1635*4882a593SmuzhiyunDescription
1636*4882a593Smuzhiyun^^^^^^^^^^^
1637*4882a593Smuzhiyun
1638*4882a593SmuzhiyunSets the Program Index Information.
1639*4882a593SmuzhiyunThe information is stored as follows:
1640*4882a593Smuzhiyun
1641*4882a593Smuzhiyun.. code-block:: c
1642*4882a593Smuzhiyun
1643*4882a593Smuzhiyun	struct info {
1644*4882a593Smuzhiyun		u32 length;		// Length of this frame
1645*4882a593Smuzhiyun		u32 offset_low;		// Offset in the file of the
1646*4882a593Smuzhiyun		u32 offset_high;	// start of this frame
1647*4882a593Smuzhiyun		u32 mask1;		// Bits 0-2 are the type mask:
1648*4882a593Smuzhiyun					// 1=I, 2=P, 4=B
1649*4882a593Smuzhiyun					// 0=End of Program Index, other fields
1650*4882a593Smuzhiyun					//   are invalid.
1651*4882a593Smuzhiyun		u32 pts;		// The PTS of the frame
1652*4882a593Smuzhiyun		u32 mask2;		// Bit 0 is bit 32 of the pts.
1653*4882a593Smuzhiyun	};
1654*4882a593Smuzhiyun	u32 table_ptr;
1655*4882a593Smuzhiyun	struct info index[400];
1656*4882a593Smuzhiyun
1657*4882a593SmuzhiyunThe table_ptr is the encoder memory address in the table were
1658*4882a593Smuzhiyun*new* entries will be written.
1659*4882a593Smuzhiyun
1660*4882a593Smuzhiyun.. note:: This is a ringbuffer, so the table_ptr will wraparound.
1661*4882a593Smuzhiyun
1662*4882a593SmuzhiyunParam[0]
1663*4882a593Smuzhiyun^^^^^^^^
1664*4882a593Smuzhiyun
1665*4882a593SmuzhiyunPicture Mask:
1666*4882a593Smuzhiyun- 0=No index capture
1667*4882a593Smuzhiyun- 1=I frames
1668*4882a593Smuzhiyun- 3=I,P frames
1669*4882a593Smuzhiyun- 7=I,P,B frames
1670*4882a593Smuzhiyun
1671*4882a593Smuzhiyun(Seems to be ignored, it always indexes I, P and B frames)
1672*4882a593Smuzhiyun
1673*4882a593SmuzhiyunParam[1]
1674*4882a593Smuzhiyun^^^^^^^^
1675*4882a593Smuzhiyun
1676*4882a593SmuzhiyunElements requested (up to 400)
1677*4882a593Smuzhiyun
1678*4882a593SmuzhiyunResult[0]
1679*4882a593Smuzhiyun^^^^^^^^^
1680*4882a593Smuzhiyun
1681*4882a593SmuzhiyunOffset in the encoder memory of the start of the table.
1682*4882a593Smuzhiyun
1683*4882a593SmuzhiyunResult[1]
1684*4882a593Smuzhiyun^^^^^^^^^
1685*4882a593Smuzhiyun
1686*4882a593SmuzhiyunNumber of allocated elements up to a maximum of Param[1]
1687*4882a593Smuzhiyun
1688*4882a593Smuzhiyun
1689*4882a593Smuzhiyun
1690*4882a593SmuzhiyunCX2341X_ENC_SET_VBI_CONFIG
1691*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
1692*4882a593Smuzhiyun
1693*4882a593SmuzhiyunEnum: 200/0xC8
1694*4882a593Smuzhiyun
1695*4882a593SmuzhiyunDescription
1696*4882a593Smuzhiyun^^^^^^^^^^^
1697*4882a593Smuzhiyun
1698*4882a593SmuzhiyunConfigure VBI settings
1699*4882a593Smuzhiyun
1700*4882a593SmuzhiyunParam[0]
1701*4882a593Smuzhiyun^^^^^^^^
1702*4882a593Smuzhiyun
1703*4882a593SmuzhiyunBitmap:
1704*4882a593Smuzhiyun
1705*4882a593Smuzhiyun.. code-block:: none
1706*4882a593Smuzhiyun
1707*4882a593Smuzhiyun	    0    Mode '0' Sliced, '1' Raw
1708*4882a593Smuzhiyun	    1:3  Insertion:
1709*4882a593Smuzhiyun		     '000' insert in extension & user data
1710*4882a593Smuzhiyun		     '001' insert in private packets
1711*4882a593Smuzhiyun		     '010' separate stream and user data
1712*4882a593Smuzhiyun		     '111' separate stream and private data
1713*4882a593Smuzhiyun	    8:15 Stream ID (normally 0xBD)
1714*4882a593Smuzhiyun
1715*4882a593SmuzhiyunParam[1]
1716*4882a593Smuzhiyun^^^^^^^^
1717*4882a593Smuzhiyun
1718*4882a593SmuzhiyunFrames per interrupt (max 8). Only valid in raw mode.
1719*4882a593Smuzhiyun
1720*4882a593SmuzhiyunParam[2]
1721*4882a593Smuzhiyun^^^^^^^^
1722*4882a593Smuzhiyun
1723*4882a593SmuzhiyunTotal raw VBI frames. Only valid in raw mode.
1724*4882a593Smuzhiyun
1725*4882a593SmuzhiyunParam[3]
1726*4882a593Smuzhiyun^^^^^^^^
1727*4882a593Smuzhiyun
1728*4882a593SmuzhiyunStart codes
1729*4882a593Smuzhiyun
1730*4882a593SmuzhiyunParam[4]
1731*4882a593Smuzhiyun^^^^^^^^
1732*4882a593Smuzhiyun
1733*4882a593SmuzhiyunStop codes
1734*4882a593Smuzhiyun
1735*4882a593SmuzhiyunParam[5]
1736*4882a593Smuzhiyun^^^^^^^^
1737*4882a593Smuzhiyun
1738*4882a593SmuzhiyunLines per frame
1739*4882a593Smuzhiyun
1740*4882a593SmuzhiyunParam[6]
1741*4882a593Smuzhiyun^^^^^^^^
1742*4882a593Smuzhiyun
1743*4882a593SmuzhiyunByte per line
1744*4882a593Smuzhiyun
1745*4882a593SmuzhiyunResult[0]
1746*4882a593Smuzhiyun^^^^^^^^^
1747*4882a593Smuzhiyun
1748*4882a593SmuzhiyunObserved frames per interrupt in raw mode only. Rage 1 to Param[1]
1749*4882a593Smuzhiyun
1750*4882a593SmuzhiyunResult[1]
1751*4882a593Smuzhiyun^^^^^^^^^
1752*4882a593Smuzhiyun
1753*4882a593SmuzhiyunObserved number of frames in raw mode. Range 1 to Param[2]
1754*4882a593Smuzhiyun
1755*4882a593SmuzhiyunResult[2]
1756*4882a593Smuzhiyun^^^^^^^^^
1757*4882a593Smuzhiyun
1758*4882a593SmuzhiyunMemory offset to start or raw VBI data
1759*4882a593Smuzhiyun
1760*4882a593Smuzhiyun
1761*4882a593Smuzhiyun
1762*4882a593SmuzhiyunCX2341X_ENC_SET_DMA_BLOCK_SIZE
1763*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1764*4882a593Smuzhiyun
1765*4882a593SmuzhiyunEnum: 201/0xC9
1766*4882a593Smuzhiyun
1767*4882a593SmuzhiyunDescription
1768*4882a593Smuzhiyun^^^^^^^^^^^
1769*4882a593Smuzhiyun
1770*4882a593SmuzhiyunSet DMA transfer block size
1771*4882a593Smuzhiyun
1772*4882a593SmuzhiyunParam[0]
1773*4882a593Smuzhiyun^^^^^^^^
1774*4882a593Smuzhiyun
1775*4882a593SmuzhiyunDMA transfer block size in bytes or frames. When unit is bytes,
1776*4882a593Smuzhiyunsupported block sizes are 2^7, 2^8 and 2^9 bytes.
1777*4882a593Smuzhiyun
1778*4882a593SmuzhiyunParam[1]
1779*4882a593Smuzhiyun^^^^^^^^
1780*4882a593Smuzhiyun
1781*4882a593SmuzhiyunUnit: 0=bytes, 1=frames
1782*4882a593Smuzhiyun
1783*4882a593Smuzhiyun
1784*4882a593Smuzhiyun
1785*4882a593SmuzhiyunCX2341X_ENC_GET_PREV_DMA_INFO_MB_10
1786*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1787*4882a593Smuzhiyun
1788*4882a593SmuzhiyunEnum: 202/0xCA
1789*4882a593Smuzhiyun
1790*4882a593SmuzhiyunDescription
1791*4882a593Smuzhiyun^^^^^^^^^^^
1792*4882a593Smuzhiyun
1793*4882a593SmuzhiyunReturns information on the previous DMA transfer in conjunction with
1794*4882a593Smuzhiyunbit 27 of the interrupt mask. Uses mailbox 10.
1795*4882a593Smuzhiyun
1796*4882a593SmuzhiyunResult[0]
1797*4882a593Smuzhiyun^^^^^^^^^
1798*4882a593Smuzhiyun
1799*4882a593SmuzhiyunType of stream
1800*4882a593Smuzhiyun
1801*4882a593SmuzhiyunResult[1]
1802*4882a593Smuzhiyun^^^^^^^^^
1803*4882a593Smuzhiyun
1804*4882a593SmuzhiyunAddress Offset
1805*4882a593Smuzhiyun
1806*4882a593SmuzhiyunResult[2]
1807*4882a593Smuzhiyun^^^^^^^^^
1808*4882a593Smuzhiyun
1809*4882a593SmuzhiyunMaximum size of transfer
1810*4882a593Smuzhiyun
1811*4882a593Smuzhiyun
1812*4882a593Smuzhiyun
1813*4882a593SmuzhiyunCX2341X_ENC_GET_PREV_DMA_INFO_MB_9
1814*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1815*4882a593Smuzhiyun
1816*4882a593SmuzhiyunEnum: 203/0xCB
1817*4882a593Smuzhiyun
1818*4882a593SmuzhiyunDescription
1819*4882a593Smuzhiyun^^^^^^^^^^^
1820*4882a593Smuzhiyun
1821*4882a593SmuzhiyunReturns information on the previous DMA transfer in conjunction with
1822*4882a593Smuzhiyunbit 27 or 18 of the interrupt mask. Uses mailbox 9.
1823*4882a593Smuzhiyun
1824*4882a593SmuzhiyunResult[0]
1825*4882a593Smuzhiyun^^^^^^^^^
1826*4882a593Smuzhiyun
1827*4882a593SmuzhiyunStatus bits:
1828*4882a593Smuzhiyun- 0   read completed
1829*4882a593Smuzhiyun- 1   write completed
1830*4882a593Smuzhiyun- 2   DMA read error
1831*4882a593Smuzhiyun- 3   DMA write error
1832*4882a593Smuzhiyun- 4   Scatter-Gather array error
1833*4882a593Smuzhiyun
1834*4882a593SmuzhiyunResult[1]
1835*4882a593Smuzhiyun^^^^^^^^^
1836*4882a593Smuzhiyun
1837*4882a593SmuzhiyunDMA type
1838*4882a593Smuzhiyun
1839*4882a593SmuzhiyunResult[2]
1840*4882a593Smuzhiyun^^^^^^^^^
1841*4882a593Smuzhiyun
1842*4882a593SmuzhiyunPresentation Time Stamp bits 0..31
1843*4882a593Smuzhiyun
1844*4882a593SmuzhiyunResult[3]
1845*4882a593Smuzhiyun^^^^^^^^^
1846*4882a593Smuzhiyun
1847*4882a593SmuzhiyunPresentation Time Stamp bit 32
1848*4882a593Smuzhiyun
1849*4882a593Smuzhiyun
1850*4882a593Smuzhiyun
1851*4882a593SmuzhiyunCX2341X_ENC_SCHED_DMA_TO_HOST
1852*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1853*4882a593Smuzhiyun
1854*4882a593SmuzhiyunEnum: 204/0xCC
1855*4882a593Smuzhiyun
1856*4882a593SmuzhiyunDescription
1857*4882a593Smuzhiyun^^^^^^^^^^^
1858*4882a593Smuzhiyun
1859*4882a593SmuzhiyunSetup DMA to host operation
1860*4882a593Smuzhiyun
1861*4882a593SmuzhiyunParam[0]
1862*4882a593Smuzhiyun^^^^^^^^
1863*4882a593Smuzhiyun
1864*4882a593SmuzhiyunMemory address of link list
1865*4882a593Smuzhiyun
1866*4882a593SmuzhiyunParam[1]
1867*4882a593Smuzhiyun^^^^^^^^
1868*4882a593Smuzhiyun
1869*4882a593SmuzhiyunLength of link list (wtf: what units ???)
1870*4882a593Smuzhiyun
1871*4882a593SmuzhiyunParam[2]
1872*4882a593Smuzhiyun^^^^^^^^
1873*4882a593Smuzhiyun
1874*4882a593SmuzhiyunDMA type (0=MPEG)
1875*4882a593Smuzhiyun
1876*4882a593Smuzhiyun
1877*4882a593Smuzhiyun
1878*4882a593SmuzhiyunCX2341X_ENC_INITIALIZE_INPUT
1879*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1880*4882a593Smuzhiyun
1881*4882a593SmuzhiyunEnum: 205/0xCD
1882*4882a593Smuzhiyun
1883*4882a593SmuzhiyunDescription
1884*4882a593Smuzhiyun^^^^^^^^^^^
1885*4882a593Smuzhiyun
1886*4882a593SmuzhiyunInitializes the video input
1887*4882a593Smuzhiyun
1888*4882a593Smuzhiyun
1889*4882a593Smuzhiyun
1890*4882a593SmuzhiyunCX2341X_ENC_SET_FRAME_DROP_RATE
1891*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1892*4882a593Smuzhiyun
1893*4882a593SmuzhiyunEnum: 208/0xD0
1894*4882a593Smuzhiyun
1895*4882a593SmuzhiyunDescription
1896*4882a593Smuzhiyun^^^^^^^^^^^
1897*4882a593Smuzhiyun
1898*4882a593SmuzhiyunFor each frame captured, skip specified number of frames.
1899*4882a593Smuzhiyun
1900*4882a593SmuzhiyunParam[0]
1901*4882a593Smuzhiyun^^^^^^^^
1902*4882a593Smuzhiyun
1903*4882a593SmuzhiyunNumber of frames to skip
1904*4882a593Smuzhiyun
1905*4882a593Smuzhiyun
1906*4882a593Smuzhiyun
1907*4882a593SmuzhiyunCX2341X_ENC_PAUSE_ENCODER
1908*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
1909*4882a593Smuzhiyun
1910*4882a593SmuzhiyunEnum: 210/0xD2
1911*4882a593Smuzhiyun
1912*4882a593SmuzhiyunDescription
1913*4882a593Smuzhiyun^^^^^^^^^^^
1914*4882a593Smuzhiyun
1915*4882a593SmuzhiyunDuring a pause condition, all frames are dropped instead of being encoded.
1916*4882a593Smuzhiyun
1917*4882a593SmuzhiyunParam[0]
1918*4882a593Smuzhiyun^^^^^^^^
1919*4882a593Smuzhiyun
1920*4882a593Smuzhiyun- 0=Pause encoding
1921*4882a593Smuzhiyun- 1=Continue encoding
1922*4882a593Smuzhiyun
1923*4882a593Smuzhiyun
1924*4882a593Smuzhiyun
1925*4882a593SmuzhiyunCX2341X_ENC_REFRESH_INPUT
1926*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
1927*4882a593Smuzhiyun
1928*4882a593SmuzhiyunEnum: 211/0xD3
1929*4882a593Smuzhiyun
1930*4882a593SmuzhiyunDescription
1931*4882a593Smuzhiyun^^^^^^^^^^^
1932*4882a593Smuzhiyun
1933*4882a593SmuzhiyunRefreshes the video input
1934*4882a593Smuzhiyun
1935*4882a593Smuzhiyun
1936*4882a593Smuzhiyun
1937*4882a593SmuzhiyunCX2341X_ENC_SET_COPYRIGHT
1938*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
1939*4882a593Smuzhiyun
1940*4882a593SmuzhiyunEnum: 212/0xD4
1941*4882a593Smuzhiyun
1942*4882a593SmuzhiyunDescription
1943*4882a593Smuzhiyun^^^^^^^^^^^
1944*4882a593Smuzhiyun
1945*4882a593SmuzhiyunSets stream copyright property
1946*4882a593Smuzhiyun
1947*4882a593SmuzhiyunParam[0]
1948*4882a593Smuzhiyun^^^^^^^^
1949*4882a593Smuzhiyun
1950*4882a593Smuzhiyun
1951*4882a593Smuzhiyun- 0=Stream is not copyrighted
1952*4882a593Smuzhiyun- 1=Stream is copyrighted
1953*4882a593Smuzhiyun
1954*4882a593Smuzhiyun
1955*4882a593Smuzhiyun
1956*4882a593SmuzhiyunCX2341X_ENC_SET_EVENT_NOTIFICATION
1957*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1958*4882a593Smuzhiyun
1959*4882a593SmuzhiyunEnum: 213/0xD5
1960*4882a593Smuzhiyun
1961*4882a593SmuzhiyunDescription
1962*4882a593Smuzhiyun^^^^^^^^^^^
1963*4882a593Smuzhiyun
1964*4882a593SmuzhiyunSetup firmware to notify the host about a particular event. Host must
1965*4882a593Smuzhiyununmask the interrupt bit.
1966*4882a593Smuzhiyun
1967*4882a593SmuzhiyunParam[0]
1968*4882a593Smuzhiyun^^^^^^^^
1969*4882a593Smuzhiyun
1970*4882a593SmuzhiyunEvent (0=refresh encoder input)
1971*4882a593Smuzhiyun
1972*4882a593SmuzhiyunParam[1]
1973*4882a593Smuzhiyun^^^^^^^^
1974*4882a593Smuzhiyun
1975*4882a593SmuzhiyunNotification 0=disabled 1=enabled
1976*4882a593Smuzhiyun
1977*4882a593SmuzhiyunParam[2]
1978*4882a593Smuzhiyun^^^^^^^^
1979*4882a593Smuzhiyun
1980*4882a593SmuzhiyunInterrupt bit
1981*4882a593Smuzhiyun
1982*4882a593SmuzhiyunParam[3]
1983*4882a593Smuzhiyun^^^^^^^^
1984*4882a593Smuzhiyun
1985*4882a593SmuzhiyunMailbox slot, -1 if no mailbox required.
1986*4882a593Smuzhiyun
1987*4882a593Smuzhiyun
1988*4882a593Smuzhiyun
1989*4882a593SmuzhiyunCX2341X_ENC_SET_NUM_VSYNC_LINES
1990*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1991*4882a593Smuzhiyun
1992*4882a593SmuzhiyunEnum: 214/0xD6
1993*4882a593Smuzhiyun
1994*4882a593SmuzhiyunDescription
1995*4882a593Smuzhiyun^^^^^^^^^^^
1996*4882a593Smuzhiyun
1997*4882a593SmuzhiyunDepending on the analog video decoder used, this assigns the number
1998*4882a593Smuzhiyunof lines for field 1 and 2.
1999*4882a593Smuzhiyun
2000*4882a593SmuzhiyunParam[0]
2001*4882a593Smuzhiyun^^^^^^^^
2002*4882a593Smuzhiyun
2003*4882a593SmuzhiyunField 1 number of lines:
2004*4882a593Smuzhiyun- 0x00EF for SAA7114
2005*4882a593Smuzhiyun- 0x00F0 for SAA7115
2006*4882a593Smuzhiyun- 0x0105 for Micronas
2007*4882a593Smuzhiyun
2008*4882a593SmuzhiyunParam[1]
2009*4882a593Smuzhiyun^^^^^^^^
2010*4882a593Smuzhiyun
2011*4882a593SmuzhiyunField 2 number of lines:
2012*4882a593Smuzhiyun- 0x00EF for SAA7114
2013*4882a593Smuzhiyun- 0x00F0 for SAA7115
2014*4882a593Smuzhiyun- 0x0106 for Micronas
2015*4882a593Smuzhiyun
2016*4882a593Smuzhiyun
2017*4882a593Smuzhiyun
2018*4882a593SmuzhiyunCX2341X_ENC_SET_PLACEHOLDER
2019*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~
2020*4882a593Smuzhiyun
2021*4882a593SmuzhiyunEnum: 215/0xD7
2022*4882a593Smuzhiyun
2023*4882a593SmuzhiyunDescription
2024*4882a593Smuzhiyun^^^^^^^^^^^
2025*4882a593Smuzhiyun
2026*4882a593SmuzhiyunProvides a mechanism of inserting custom user data in the MPEG stream.
2027*4882a593Smuzhiyun
2028*4882a593SmuzhiyunParam[0]
2029*4882a593Smuzhiyun^^^^^^^^
2030*4882a593Smuzhiyun
2031*4882a593Smuzhiyun- 0=extension & user data
2032*4882a593Smuzhiyun- 1=private packet with stream ID 0xBD
2033*4882a593Smuzhiyun
2034*4882a593SmuzhiyunParam[1]
2035*4882a593Smuzhiyun^^^^^^^^
2036*4882a593Smuzhiyun
2037*4882a593SmuzhiyunRate at which to insert data, in units of frames (for private packet)
2038*4882a593Smuzhiyunor GOPs (for ext. & user data)
2039*4882a593Smuzhiyun
2040*4882a593SmuzhiyunParam[2]
2041*4882a593Smuzhiyun^^^^^^^^
2042*4882a593Smuzhiyun
2043*4882a593SmuzhiyunNumber of data DWORDs (below) to insert
2044*4882a593Smuzhiyun
2045*4882a593SmuzhiyunParam[3]
2046*4882a593Smuzhiyun^^^^^^^^
2047*4882a593Smuzhiyun
2048*4882a593SmuzhiyunCustom data 0
2049*4882a593Smuzhiyun
2050*4882a593SmuzhiyunParam[4]
2051*4882a593Smuzhiyun^^^^^^^^
2052*4882a593Smuzhiyun
2053*4882a593SmuzhiyunCustom data 1
2054*4882a593Smuzhiyun
2055*4882a593SmuzhiyunParam[5]
2056*4882a593Smuzhiyun^^^^^^^^
2057*4882a593Smuzhiyun
2058*4882a593SmuzhiyunCustom data 2
2059*4882a593Smuzhiyun
2060*4882a593SmuzhiyunParam[6]
2061*4882a593Smuzhiyun^^^^^^^^
2062*4882a593Smuzhiyun
2063*4882a593SmuzhiyunCustom data 3
2064*4882a593Smuzhiyun
2065*4882a593SmuzhiyunParam[7]
2066*4882a593Smuzhiyun^^^^^^^^
2067*4882a593Smuzhiyun
2068*4882a593SmuzhiyunCustom data 4
2069*4882a593Smuzhiyun
2070*4882a593SmuzhiyunParam[8]
2071*4882a593Smuzhiyun^^^^^^^^
2072*4882a593Smuzhiyun
2073*4882a593SmuzhiyunCustom data 5
2074*4882a593Smuzhiyun
2075*4882a593SmuzhiyunParam[9]
2076*4882a593Smuzhiyun^^^^^^^^
2077*4882a593Smuzhiyun
2078*4882a593SmuzhiyunCustom data 6
2079*4882a593Smuzhiyun
2080*4882a593SmuzhiyunParam[10]
2081*4882a593Smuzhiyun^^^^^^^^^
2082*4882a593Smuzhiyun
2083*4882a593SmuzhiyunCustom data 7
2084*4882a593Smuzhiyun
2085*4882a593SmuzhiyunParam[11]
2086*4882a593Smuzhiyun^^^^^^^^^
2087*4882a593Smuzhiyun
2088*4882a593SmuzhiyunCustom data 8
2089*4882a593Smuzhiyun
2090*4882a593Smuzhiyun
2091*4882a593Smuzhiyun
2092*4882a593SmuzhiyunCX2341X_ENC_MUTE_VIDEO
2093*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~
2094*4882a593Smuzhiyun
2095*4882a593SmuzhiyunEnum: 217/0xD9
2096*4882a593Smuzhiyun
2097*4882a593SmuzhiyunDescription
2098*4882a593Smuzhiyun^^^^^^^^^^^
2099*4882a593Smuzhiyun
2100*4882a593SmuzhiyunVideo muting
2101*4882a593Smuzhiyun
2102*4882a593SmuzhiyunParam[0]
2103*4882a593Smuzhiyun^^^^^^^^
2104*4882a593Smuzhiyun
2105*4882a593SmuzhiyunBit usage:
2106*4882a593Smuzhiyun
2107*4882a593Smuzhiyun.. code-block:: none
2108*4882a593Smuzhiyun
2109*4882a593Smuzhiyun	 0    	'0'=video not muted
2110*4882a593Smuzhiyun		'1'=video muted, creates frames with the YUV color defined below
2111*4882a593Smuzhiyun	 1:7  	Unused
2112*4882a593Smuzhiyun	 8:15 	V chrominance information
2113*4882a593Smuzhiyun	16:23 	U chrominance information
2114*4882a593Smuzhiyun	24:31 	Y luminance information
2115*4882a593Smuzhiyun
2116*4882a593Smuzhiyun
2117*4882a593Smuzhiyun
2118*4882a593SmuzhiyunCX2341X_ENC_MUTE_AUDIO
2119*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~
2120*4882a593Smuzhiyun
2121*4882a593SmuzhiyunEnum: 218/0xDA
2122*4882a593Smuzhiyun
2123*4882a593SmuzhiyunDescription
2124*4882a593Smuzhiyun^^^^^^^^^^^
2125*4882a593Smuzhiyun
2126*4882a593SmuzhiyunAudio muting
2127*4882a593Smuzhiyun
2128*4882a593SmuzhiyunParam[0]
2129*4882a593Smuzhiyun^^^^^^^^
2130*4882a593Smuzhiyun
2131*4882a593Smuzhiyun- 0=audio not muted
2132*4882a593Smuzhiyun- 1=audio muted (produces silent mpeg audio stream)
2133*4882a593Smuzhiyun
2134*4882a593Smuzhiyun
2135*4882a593Smuzhiyun
2136*4882a593SmuzhiyunCX2341X_ENC_SET_VERT_CROP_LINE
2137*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2138*4882a593Smuzhiyun
2139*4882a593SmuzhiyunEnum: 219/0xDB
2140*4882a593Smuzhiyun
2141*4882a593SmuzhiyunDescription
2142*4882a593Smuzhiyun^^^^^^^^^^^
2143*4882a593Smuzhiyun
2144*4882a593SmuzhiyunSomething to do with 'Vertical Crop Line'
2145*4882a593Smuzhiyun
2146*4882a593SmuzhiyunParam[0]
2147*4882a593Smuzhiyun^^^^^^^^
2148*4882a593Smuzhiyun
2149*4882a593SmuzhiyunIf saa7114 and raw VBI capture and 60 Hz, then set to 10001.
2150*4882a593SmuzhiyunElse 0.
2151*4882a593Smuzhiyun
2152*4882a593Smuzhiyun
2153*4882a593Smuzhiyun
2154*4882a593SmuzhiyunCX2341X_ENC_MISC
2155*4882a593Smuzhiyun~~~~~~~~~~~~~~~~
2156*4882a593Smuzhiyun
2157*4882a593SmuzhiyunEnum: 220/0xDC
2158*4882a593Smuzhiyun
2159*4882a593SmuzhiyunDescription
2160*4882a593Smuzhiyun^^^^^^^^^^^
2161*4882a593Smuzhiyun
2162*4882a593SmuzhiyunMiscellaneous actions. Not known for 100% what it does. It's really a
2163*4882a593Smuzhiyunsort of ioctl call. The first parameter is a command number, the second
2164*4882a593Smuzhiyunthe value.
2165*4882a593Smuzhiyun
2166*4882a593SmuzhiyunParam[0]
2167*4882a593Smuzhiyun^^^^^^^^
2168*4882a593Smuzhiyun
2169*4882a593SmuzhiyunCommand number:
2170*4882a593Smuzhiyun
2171*4882a593Smuzhiyun.. code-block:: none
2172*4882a593Smuzhiyun
2173*4882a593Smuzhiyun	 1=set initial SCR value when starting encoding (works).
2174*4882a593Smuzhiyun	 2=set quality mode (apparently some test setting).
2175*4882a593Smuzhiyun	 3=setup advanced VIM protection handling.
2176*4882a593Smuzhiyun	   Always 1 for the cx23416 and 0 for cx23415.
2177*4882a593Smuzhiyun	 4=generate DVD compatible PTS timestamps
2178*4882a593Smuzhiyun	 5=USB flush mode
2179*4882a593Smuzhiyun	 6=something to do with the quantization matrix
2180*4882a593Smuzhiyun	 7=set navigation pack insertion for DVD: adds 0xbf (private stream 2)
2181*4882a593Smuzhiyun	   packets to the MPEG. The size of these packets is 2048 bytes (including
2182*4882a593Smuzhiyun	   the header of 6 bytes: 0x000001bf + length). The payload is zeroed and
2183*4882a593Smuzhiyun	   it is up to the application to fill them in. These packets are apparently
2184*4882a593Smuzhiyun	   inserted every four frames.
2185*4882a593Smuzhiyun	 8=enable scene change detection (seems to be a failure)
2186*4882a593Smuzhiyun	 9=set history parameters of the video input module
2187*4882a593Smuzhiyun	10=set input field order of VIM
2188*4882a593Smuzhiyun	11=set quantization matrix
2189*4882a593Smuzhiyun	12=reset audio interface after channel change or input switch (has no argument).
2190*4882a593Smuzhiyun	   Needed for the cx2584x, not needed for the mspx4xx, but it doesn't seem to
2191*4882a593Smuzhiyun	   do any harm calling it regardless.
2192*4882a593Smuzhiyun	13=set audio volume delay
2193*4882a593Smuzhiyun	14=set audio delay
2194*4882a593Smuzhiyun
2195*4882a593Smuzhiyun
2196*4882a593SmuzhiyunParam[1]
2197*4882a593Smuzhiyun^^^^^^^^
2198*4882a593Smuzhiyun
2199*4882a593SmuzhiyunCommand value.
2200*4882a593Smuzhiyun
2201*4882a593SmuzhiyunDecoder firmware API description
2202*4882a593Smuzhiyun--------------------------------
2203*4882a593Smuzhiyun
2204*4882a593Smuzhiyun.. note:: this API is part of the decoder firmware, so it's cx23415 only.
2205*4882a593Smuzhiyun
2206*4882a593Smuzhiyun
2207*4882a593Smuzhiyun
2208*4882a593SmuzhiyunCX2341X_DEC_PING_FW
2209*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~
2210*4882a593Smuzhiyun
2211*4882a593SmuzhiyunEnum: 0/0x00
2212*4882a593Smuzhiyun
2213*4882a593SmuzhiyunDescription
2214*4882a593Smuzhiyun^^^^^^^^^^^
2215*4882a593Smuzhiyun
2216*4882a593SmuzhiyunThis API call does nothing. It may be used to check if the firmware
2217*4882a593Smuzhiyunis responding.
2218*4882a593Smuzhiyun
2219*4882a593Smuzhiyun
2220*4882a593Smuzhiyun
2221*4882a593SmuzhiyunCX2341X_DEC_START_PLAYBACK
2222*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
2223*4882a593Smuzhiyun
2224*4882a593SmuzhiyunEnum: 1/0x01
2225*4882a593Smuzhiyun
2226*4882a593SmuzhiyunDescription
2227*4882a593Smuzhiyun^^^^^^^^^^^
2228*4882a593Smuzhiyun
2229*4882a593SmuzhiyunBegin or resume playback.
2230*4882a593Smuzhiyun
2231*4882a593SmuzhiyunParam[0]
2232*4882a593Smuzhiyun^^^^^^^^
2233*4882a593Smuzhiyun
2234*4882a593Smuzhiyun0 based frame number in GOP to begin playback from.
2235*4882a593Smuzhiyun
2236*4882a593SmuzhiyunParam[1]
2237*4882a593Smuzhiyun^^^^^^^^
2238*4882a593Smuzhiyun
2239*4882a593SmuzhiyunSpecifies the number of muted audio frames to play before normal
2240*4882a593Smuzhiyunaudio resumes. (This is not implemented in the firmware, leave at 0)
2241*4882a593Smuzhiyun
2242*4882a593Smuzhiyun
2243*4882a593Smuzhiyun
2244*4882a593SmuzhiyunCX2341X_DEC_STOP_PLAYBACK
2245*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
2246*4882a593Smuzhiyun
2247*4882a593SmuzhiyunEnum: 2/0x02
2248*4882a593Smuzhiyun
2249*4882a593SmuzhiyunDescription
2250*4882a593Smuzhiyun^^^^^^^^^^^
2251*4882a593Smuzhiyun
2252*4882a593SmuzhiyunEnds playback and clears all decoder buffers. If PTS is not zero,
2253*4882a593Smuzhiyunplayback stops at specified PTS.
2254*4882a593Smuzhiyun
2255*4882a593SmuzhiyunParam[0]
2256*4882a593Smuzhiyun^^^^^^^^
2257*4882a593Smuzhiyun
2258*4882a593SmuzhiyunDisplay 0=last frame, 1=black
2259*4882a593Smuzhiyun
2260*4882a593Smuzhiyun.. note::
2261*4882a593Smuzhiyun
2262*4882a593Smuzhiyun	this takes effect immediately, so if you want to wait for a PTS,
2263*4882a593Smuzhiyun	then use '0', otherwise the screen goes to black at once.
2264*4882a593Smuzhiyun	You can call this later (even if there is no playback) with a 1 value
2265*4882a593Smuzhiyun	to set the screen to black.
2266*4882a593Smuzhiyun
2267*4882a593SmuzhiyunParam[1]
2268*4882a593Smuzhiyun^^^^^^^^
2269*4882a593Smuzhiyun
2270*4882a593SmuzhiyunPTS low
2271*4882a593Smuzhiyun
2272*4882a593SmuzhiyunParam[2]
2273*4882a593Smuzhiyun^^^^^^^^
2274*4882a593Smuzhiyun
2275*4882a593SmuzhiyunPTS high
2276*4882a593Smuzhiyun
2277*4882a593Smuzhiyun
2278*4882a593Smuzhiyun
2279*4882a593SmuzhiyunCX2341X_DEC_SET_PLAYBACK_SPEED
2280*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2281*4882a593Smuzhiyun
2282*4882a593SmuzhiyunEnum: 3/0x03
2283*4882a593Smuzhiyun
2284*4882a593SmuzhiyunDescription
2285*4882a593Smuzhiyun^^^^^^^^^^^
2286*4882a593Smuzhiyun
2287*4882a593SmuzhiyunPlayback stream at speed other than normal. There are two modes of
2288*4882a593Smuzhiyunoperation:
2289*4882a593Smuzhiyun
2290*4882a593Smuzhiyun	- Smooth: host transfers entire stream and firmware drops unused
2291*4882a593Smuzhiyun	  frames.
2292*4882a593Smuzhiyun	- Coarse: host drops frames based on indexing as required to achieve
2293*4882a593Smuzhiyun	  desired speed.
2294*4882a593Smuzhiyun
2295*4882a593SmuzhiyunParam[0]
2296*4882a593Smuzhiyun^^^^^^^^
2297*4882a593Smuzhiyun
2298*4882a593Smuzhiyun.. code-block:: none
2299*4882a593Smuzhiyun
2300*4882a593Smuzhiyun	Bitmap:
2301*4882a593Smuzhiyun	    0:7  0 normal
2302*4882a593Smuzhiyun		 1 fast only "1.5 times"
2303*4882a593Smuzhiyun		 n nX fast, 1/nX slow
2304*4882a593Smuzhiyun	    30   Framedrop:
2305*4882a593Smuzhiyun		     '0' during 1.5 times play, every other B frame is dropped
2306*4882a593Smuzhiyun		     '1' during 1.5 times play, stream is unchanged (bitrate
2307*4882a593Smuzhiyun			 must not exceed 8mbps)
2308*4882a593Smuzhiyun	    31   Speed:
2309*4882a593Smuzhiyun		     '0' slow
2310*4882a593Smuzhiyun		     '1' fast
2311*4882a593Smuzhiyun
2312*4882a593Smuzhiyun.. note::
2313*4882a593Smuzhiyun
2314*4882a593Smuzhiyun	n is limited to 2. Anything higher does not result in
2315*4882a593Smuzhiyun	faster playback. Instead the host should start dropping frames.
2316*4882a593Smuzhiyun
2317*4882a593SmuzhiyunParam[1]
2318*4882a593Smuzhiyun^^^^^^^^
2319*4882a593Smuzhiyun
2320*4882a593SmuzhiyunDirection: 0=forward, 1=reverse
2321*4882a593Smuzhiyun
2322*4882a593Smuzhiyun.. note::
2323*4882a593Smuzhiyun
2324*4882a593Smuzhiyun	to make reverse playback work you have to write full GOPs in
2325*4882a593Smuzhiyun	reverse order.
2326*4882a593Smuzhiyun
2327*4882a593SmuzhiyunParam[2]
2328*4882a593Smuzhiyun^^^^^^^^
2329*4882a593Smuzhiyun
2330*4882a593Smuzhiyun.. code-block:: none
2331*4882a593Smuzhiyun
2332*4882a593Smuzhiyun	Picture mask:
2333*4882a593Smuzhiyun	    1=I frames
2334*4882a593Smuzhiyun	    3=I, P frames
2335*4882a593Smuzhiyun	    7=I, P, B frames
2336*4882a593Smuzhiyun
2337*4882a593SmuzhiyunParam[3]
2338*4882a593Smuzhiyun^^^^^^^^
2339*4882a593Smuzhiyun
2340*4882a593SmuzhiyunB frames per GOP (for reverse play only)
2341*4882a593Smuzhiyun
2342*4882a593Smuzhiyun.. note::
2343*4882a593Smuzhiyun
2344*4882a593Smuzhiyun	for reverse playback the Picture Mask should be set to I or I, P.
2345*4882a593Smuzhiyun	Adding B frames to the mask will result in corrupt video. This field
2346*4882a593Smuzhiyun	has to be set to the correct value in order to keep the timing correct.
2347*4882a593Smuzhiyun
2348*4882a593SmuzhiyunParam[4]
2349*4882a593Smuzhiyun^^^^^^^^
2350*4882a593Smuzhiyun
2351*4882a593SmuzhiyunMute audio: 0=disable, 1=enable
2352*4882a593Smuzhiyun
2353*4882a593SmuzhiyunParam[5]
2354*4882a593Smuzhiyun^^^^^^^^
2355*4882a593Smuzhiyun
2356*4882a593SmuzhiyunDisplay 0=frame, 1=field
2357*4882a593Smuzhiyun
2358*4882a593SmuzhiyunParam[6]
2359*4882a593Smuzhiyun^^^^^^^^
2360*4882a593Smuzhiyun
2361*4882a593SmuzhiyunSpecifies the number of muted audio frames to play before normal audio
2362*4882a593Smuzhiyunresumes. (Not implemented in the firmware, leave at 0)
2363*4882a593Smuzhiyun
2364*4882a593Smuzhiyun
2365*4882a593Smuzhiyun
2366*4882a593SmuzhiyunCX2341X_DEC_STEP_VIDEO
2367*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~
2368*4882a593Smuzhiyun
2369*4882a593SmuzhiyunEnum: 5/0x05
2370*4882a593Smuzhiyun
2371*4882a593SmuzhiyunDescription
2372*4882a593Smuzhiyun^^^^^^^^^^^
2373*4882a593Smuzhiyun
2374*4882a593SmuzhiyunEach call to this API steps the playback to the next unit defined below
2375*4882a593Smuzhiyunin the current playback direction.
2376*4882a593Smuzhiyun
2377*4882a593SmuzhiyunParam[0]
2378*4882a593Smuzhiyun^^^^^^^^
2379*4882a593Smuzhiyun
2380*4882a593Smuzhiyun0=frame, 1=top field, 2=bottom field
2381*4882a593Smuzhiyun
2382*4882a593Smuzhiyun
2383*4882a593Smuzhiyun
2384*4882a593SmuzhiyunCX2341X_DEC_SET_DMA_BLOCK_SIZE
2385*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2386*4882a593Smuzhiyun
2387*4882a593SmuzhiyunEnum: 8/0x08
2388*4882a593Smuzhiyun
2389*4882a593SmuzhiyunDescription
2390*4882a593Smuzhiyun^^^^^^^^^^^
2391*4882a593Smuzhiyun
2392*4882a593SmuzhiyunSet DMA transfer block size. Counterpart to API 0xC9
2393*4882a593Smuzhiyun
2394*4882a593SmuzhiyunParam[0]
2395*4882a593Smuzhiyun^^^^^^^^
2396*4882a593Smuzhiyun
2397*4882a593SmuzhiyunDMA transfer block size in bytes. A different size may be specified
2398*4882a593Smuzhiyunwhen issuing the DMA transfer command.
2399*4882a593Smuzhiyun
2400*4882a593Smuzhiyun
2401*4882a593Smuzhiyun
2402*4882a593SmuzhiyunCX2341X_DEC_GET_XFER_INFO
2403*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~
2404*4882a593Smuzhiyun
2405*4882a593SmuzhiyunEnum: 9/0x09
2406*4882a593Smuzhiyun
2407*4882a593SmuzhiyunDescription
2408*4882a593Smuzhiyun^^^^^^^^^^^
2409*4882a593Smuzhiyun
2410*4882a593SmuzhiyunThis API call may be used to detect an end of stream condition.
2411*4882a593Smuzhiyun
2412*4882a593SmuzhiyunResult[0]
2413*4882a593Smuzhiyun^^^^^^^^^
2414*4882a593Smuzhiyun
2415*4882a593SmuzhiyunStream type
2416*4882a593Smuzhiyun
2417*4882a593SmuzhiyunResult[1]
2418*4882a593Smuzhiyun^^^^^^^^^
2419*4882a593Smuzhiyun
2420*4882a593SmuzhiyunAddress offset
2421*4882a593Smuzhiyun
2422*4882a593SmuzhiyunResult[2]
2423*4882a593Smuzhiyun^^^^^^^^^
2424*4882a593Smuzhiyun
2425*4882a593SmuzhiyunMaximum bytes to transfer
2426*4882a593Smuzhiyun
2427*4882a593SmuzhiyunResult[3]
2428*4882a593Smuzhiyun^^^^^^^^^
2429*4882a593Smuzhiyun
2430*4882a593SmuzhiyunBuffer fullness
2431*4882a593Smuzhiyun
2432*4882a593Smuzhiyun
2433*4882a593Smuzhiyun
2434*4882a593SmuzhiyunCX2341X_DEC_GET_DMA_STATUS
2435*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
2436*4882a593Smuzhiyun
2437*4882a593SmuzhiyunEnum: 10/0x0A
2438*4882a593Smuzhiyun
2439*4882a593SmuzhiyunDescription
2440*4882a593Smuzhiyun^^^^^^^^^^^
2441*4882a593Smuzhiyun
2442*4882a593SmuzhiyunStatus of the last DMA transfer
2443*4882a593Smuzhiyun
2444*4882a593SmuzhiyunResult[0]
2445*4882a593Smuzhiyun^^^^^^^^^
2446*4882a593Smuzhiyun
2447*4882a593SmuzhiyunBit 1 set means transfer complete
2448*4882a593SmuzhiyunBit 2 set means DMA error
2449*4882a593SmuzhiyunBit 3 set means linked list error
2450*4882a593Smuzhiyun
2451*4882a593SmuzhiyunResult[1]
2452*4882a593Smuzhiyun^^^^^^^^^
2453*4882a593Smuzhiyun
2454*4882a593SmuzhiyunDMA type: 0=MPEG, 1=OSD, 2=YUV
2455*4882a593Smuzhiyun
2456*4882a593Smuzhiyun
2457*4882a593Smuzhiyun
2458*4882a593SmuzhiyunCX2341X_DEC_SCHED_DMA_FROM_HOST
2459*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2460*4882a593Smuzhiyun
2461*4882a593SmuzhiyunEnum: 11/0x0B
2462*4882a593Smuzhiyun
2463*4882a593SmuzhiyunDescription
2464*4882a593Smuzhiyun^^^^^^^^^^^
2465*4882a593Smuzhiyun
2466*4882a593SmuzhiyunSetup DMA from host operation. Counterpart to API 0xCC
2467*4882a593Smuzhiyun
2468*4882a593SmuzhiyunParam[0]
2469*4882a593Smuzhiyun^^^^^^^^
2470*4882a593Smuzhiyun
2471*4882a593SmuzhiyunMemory address of link list
2472*4882a593Smuzhiyun
2473*4882a593SmuzhiyunParam[1]
2474*4882a593Smuzhiyun^^^^^^^^
2475*4882a593Smuzhiyun
2476*4882a593SmuzhiyunTotal # of bytes to transfer
2477*4882a593Smuzhiyun
2478*4882a593SmuzhiyunParam[2]
2479*4882a593Smuzhiyun^^^^^^^^
2480*4882a593Smuzhiyun
2481*4882a593SmuzhiyunDMA type (0=MPEG, 1=OSD, 2=YUV)
2482*4882a593Smuzhiyun
2483*4882a593Smuzhiyun
2484*4882a593Smuzhiyun
2485*4882a593SmuzhiyunCX2341X_DEC_PAUSE_PLAYBACK
2486*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
2487*4882a593Smuzhiyun
2488*4882a593SmuzhiyunEnum: 13/0x0D
2489*4882a593Smuzhiyun
2490*4882a593SmuzhiyunDescription
2491*4882a593Smuzhiyun^^^^^^^^^^^
2492*4882a593Smuzhiyun
2493*4882a593SmuzhiyunFreeze playback immediately. In this mode, when internal buffers are
2494*4882a593Smuzhiyunfull, no more data will be accepted and data request IRQs will be
2495*4882a593Smuzhiyunmasked.
2496*4882a593Smuzhiyun
2497*4882a593SmuzhiyunParam[0]
2498*4882a593Smuzhiyun^^^^^^^^
2499*4882a593Smuzhiyun
2500*4882a593SmuzhiyunDisplay: 0=last frame, 1=black
2501*4882a593Smuzhiyun
2502*4882a593Smuzhiyun
2503*4882a593Smuzhiyun
2504*4882a593SmuzhiyunCX2341X_DEC_HALT_FW
2505*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~
2506*4882a593Smuzhiyun
2507*4882a593SmuzhiyunEnum: 14/0x0E
2508*4882a593Smuzhiyun
2509*4882a593SmuzhiyunDescription
2510*4882a593Smuzhiyun^^^^^^^^^^^
2511*4882a593Smuzhiyun
2512*4882a593SmuzhiyunThe firmware is halted and no further API calls are serviced until
2513*4882a593Smuzhiyunthe firmware is uploaded again.
2514*4882a593Smuzhiyun
2515*4882a593Smuzhiyun
2516*4882a593Smuzhiyun
2517*4882a593SmuzhiyunCX2341X_DEC_SET_STANDARD
2518*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~
2519*4882a593Smuzhiyun
2520*4882a593SmuzhiyunEnum: 16/0x10
2521*4882a593Smuzhiyun
2522*4882a593SmuzhiyunDescription
2523*4882a593Smuzhiyun^^^^^^^^^^^
2524*4882a593Smuzhiyun
2525*4882a593SmuzhiyunSelects display standard
2526*4882a593Smuzhiyun
2527*4882a593SmuzhiyunParam[0]
2528*4882a593Smuzhiyun^^^^^^^^
2529*4882a593Smuzhiyun
2530*4882a593Smuzhiyun0=NTSC, 1=PAL
2531*4882a593Smuzhiyun
2532*4882a593Smuzhiyun
2533*4882a593Smuzhiyun
2534*4882a593SmuzhiyunCX2341X_DEC_GET_VERSION
2535*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~
2536*4882a593Smuzhiyun
2537*4882a593SmuzhiyunEnum: 17/0x11
2538*4882a593Smuzhiyun
2539*4882a593SmuzhiyunDescription
2540*4882a593Smuzhiyun^^^^^^^^^^^
2541*4882a593Smuzhiyun
2542*4882a593SmuzhiyunReturns decoder firmware version information
2543*4882a593Smuzhiyun
2544*4882a593SmuzhiyunResult[0]
2545*4882a593Smuzhiyun^^^^^^^^^
2546*4882a593Smuzhiyun
2547*4882a593SmuzhiyunVersion bitmask:
2548*4882a593Smuzhiyun	- Bits  0:15 build
2549*4882a593Smuzhiyun	- Bits 16:23 minor
2550*4882a593Smuzhiyun	- Bits 24:31 major
2551*4882a593Smuzhiyun
2552*4882a593Smuzhiyun
2553*4882a593Smuzhiyun
2554*4882a593SmuzhiyunCX2341X_DEC_SET_STREAM_INPUT
2555*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2556*4882a593Smuzhiyun
2557*4882a593SmuzhiyunEnum: 20/0x14
2558*4882a593Smuzhiyun
2559*4882a593SmuzhiyunDescription
2560*4882a593Smuzhiyun^^^^^^^^^^^
2561*4882a593Smuzhiyun
2562*4882a593SmuzhiyunSelect decoder stream input port
2563*4882a593Smuzhiyun
2564*4882a593SmuzhiyunParam[0]
2565*4882a593Smuzhiyun^^^^^^^^
2566*4882a593Smuzhiyun
2567*4882a593Smuzhiyun0=memory (default), 1=streaming
2568*4882a593Smuzhiyun
2569*4882a593Smuzhiyun
2570*4882a593Smuzhiyun
2571*4882a593SmuzhiyunCX2341X_DEC_GET_TIMING_INFO
2572*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~
2573*4882a593Smuzhiyun
2574*4882a593SmuzhiyunEnum: 21/0x15
2575*4882a593Smuzhiyun
2576*4882a593SmuzhiyunDescription
2577*4882a593Smuzhiyun^^^^^^^^^^^
2578*4882a593Smuzhiyun
2579*4882a593SmuzhiyunReturns timing information from start of playback
2580*4882a593Smuzhiyun
2581*4882a593SmuzhiyunResult[0]
2582*4882a593Smuzhiyun^^^^^^^^^
2583*4882a593Smuzhiyun
2584*4882a593SmuzhiyunFrame count by decode order
2585*4882a593Smuzhiyun
2586*4882a593SmuzhiyunResult[1]
2587*4882a593Smuzhiyun^^^^^^^^^
2588*4882a593Smuzhiyun
2589*4882a593SmuzhiyunVideo PTS bits 0:31 by display order
2590*4882a593Smuzhiyun
2591*4882a593SmuzhiyunResult[2]
2592*4882a593Smuzhiyun^^^^^^^^^
2593*4882a593Smuzhiyun
2594*4882a593SmuzhiyunVideo PTS bit 32 by display order
2595*4882a593Smuzhiyun
2596*4882a593SmuzhiyunResult[3]
2597*4882a593Smuzhiyun^^^^^^^^^
2598*4882a593Smuzhiyun
2599*4882a593SmuzhiyunSCR bits 0:31 by display order
2600*4882a593Smuzhiyun
2601*4882a593SmuzhiyunResult[4]
2602*4882a593Smuzhiyun^^^^^^^^^
2603*4882a593Smuzhiyun
2604*4882a593SmuzhiyunSCR bit 32 by display order
2605*4882a593Smuzhiyun
2606*4882a593Smuzhiyun
2607*4882a593Smuzhiyun
2608*4882a593SmuzhiyunCX2341X_DEC_SET_AUDIO_MODE
2609*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~
2610*4882a593Smuzhiyun
2611*4882a593SmuzhiyunEnum: 22/0x16
2612*4882a593Smuzhiyun
2613*4882a593SmuzhiyunDescription
2614*4882a593Smuzhiyun^^^^^^^^^^^
2615*4882a593Smuzhiyun
2616*4882a593SmuzhiyunSelect audio mode
2617*4882a593Smuzhiyun
2618*4882a593SmuzhiyunParam[0]
2619*4882a593Smuzhiyun^^^^^^^^
2620*4882a593Smuzhiyun
2621*4882a593SmuzhiyunDual mono mode action
2622*4882a593Smuzhiyun	0=Stereo, 1=Left, 2=Right, 3=Mono, 4=Swap, -1=Unchanged
2623*4882a593Smuzhiyun
2624*4882a593SmuzhiyunParam[1]
2625*4882a593Smuzhiyun^^^^^^^^
2626*4882a593Smuzhiyun
2627*4882a593SmuzhiyunStereo mode action:
2628*4882a593Smuzhiyun	0=Stereo, 1=Left, 2=Right, 3=Mono, 4=Swap, -1=Unchanged
2629*4882a593Smuzhiyun
2630*4882a593Smuzhiyun
2631*4882a593Smuzhiyun
2632*4882a593SmuzhiyunCX2341X_DEC_SET_EVENT_NOTIFICATION
2633*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2634*4882a593Smuzhiyun
2635*4882a593SmuzhiyunEnum: 23/0x17
2636*4882a593Smuzhiyun
2637*4882a593SmuzhiyunDescription
2638*4882a593Smuzhiyun^^^^^^^^^^^
2639*4882a593Smuzhiyun
2640*4882a593SmuzhiyunSetup firmware to notify the host about a particular event.
2641*4882a593SmuzhiyunCounterpart to API 0xD5
2642*4882a593Smuzhiyun
2643*4882a593SmuzhiyunParam[0]
2644*4882a593Smuzhiyun^^^^^^^^
2645*4882a593Smuzhiyun
2646*4882a593SmuzhiyunEvent:
2647*4882a593Smuzhiyun	- 0=Audio mode change between mono, (joint) stereo and dual channel.
2648*4882a593Smuzhiyun	- 3=Decoder started
2649*4882a593Smuzhiyun	- 4=Unknown: goes off 10-15 times per second while decoding.
2650*4882a593Smuzhiyun	- 5=Some sync event: goes off once per frame.
2651*4882a593Smuzhiyun
2652*4882a593SmuzhiyunParam[1]
2653*4882a593Smuzhiyun^^^^^^^^
2654*4882a593Smuzhiyun
2655*4882a593SmuzhiyunNotification 0=disabled, 1=enabled
2656*4882a593Smuzhiyun
2657*4882a593SmuzhiyunParam[2]
2658*4882a593Smuzhiyun^^^^^^^^
2659*4882a593Smuzhiyun
2660*4882a593SmuzhiyunInterrupt bit
2661*4882a593Smuzhiyun
2662*4882a593SmuzhiyunParam[3]
2663*4882a593Smuzhiyun^^^^^^^^
2664*4882a593Smuzhiyun
2665*4882a593SmuzhiyunMailbox slot, -1 if no mailbox required.
2666*4882a593Smuzhiyun
2667*4882a593Smuzhiyun
2668*4882a593Smuzhiyun
2669*4882a593SmuzhiyunCX2341X_DEC_SET_DISPLAY_BUFFERS
2670*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2671*4882a593Smuzhiyun
2672*4882a593SmuzhiyunEnum: 24/0x18
2673*4882a593Smuzhiyun
2674*4882a593SmuzhiyunDescription
2675*4882a593Smuzhiyun^^^^^^^^^^^
2676*4882a593Smuzhiyun
2677*4882a593SmuzhiyunNumber of display buffers. To decode all frames in reverse playback you
2678*4882a593Smuzhiyunmust use nine buffers.
2679*4882a593Smuzhiyun
2680*4882a593SmuzhiyunParam[0]
2681*4882a593Smuzhiyun^^^^^^^^
2682*4882a593Smuzhiyun
2683*4882a593Smuzhiyun0=six buffers, 1=nine buffers
2684*4882a593Smuzhiyun
2685*4882a593Smuzhiyun
2686*4882a593Smuzhiyun
2687*4882a593SmuzhiyunCX2341X_DEC_EXTRACT_VBI
2688*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~
2689*4882a593Smuzhiyun
2690*4882a593SmuzhiyunEnum: 25/0x19
2691*4882a593Smuzhiyun
2692*4882a593SmuzhiyunDescription
2693*4882a593Smuzhiyun^^^^^^^^^^^
2694*4882a593Smuzhiyun
2695*4882a593SmuzhiyunExtracts VBI data
2696*4882a593Smuzhiyun
2697*4882a593SmuzhiyunParam[0]
2698*4882a593Smuzhiyun^^^^^^^^
2699*4882a593Smuzhiyun
2700*4882a593Smuzhiyun0=extract from extension & user data, 1=extract from private packets
2701*4882a593Smuzhiyun
2702*4882a593SmuzhiyunResult[0]
2703*4882a593Smuzhiyun^^^^^^^^^
2704*4882a593Smuzhiyun
2705*4882a593SmuzhiyunVBI table location
2706*4882a593Smuzhiyun
2707*4882a593SmuzhiyunResult[1]
2708*4882a593Smuzhiyun^^^^^^^^^
2709*4882a593Smuzhiyun
2710*4882a593SmuzhiyunVBI table size
2711*4882a593Smuzhiyun
2712*4882a593Smuzhiyun
2713*4882a593Smuzhiyun
2714*4882a593SmuzhiyunCX2341X_DEC_SET_DECODER_SOURCE
2715*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2716*4882a593Smuzhiyun
2717*4882a593SmuzhiyunEnum: 26/0x1A
2718*4882a593Smuzhiyun
2719*4882a593SmuzhiyunDescription
2720*4882a593Smuzhiyun^^^^^^^^^^^
2721*4882a593Smuzhiyun
2722*4882a593SmuzhiyunSelects decoder source. Ensure that the parameters passed to this
2723*4882a593SmuzhiyunAPI match the encoder settings.
2724*4882a593Smuzhiyun
2725*4882a593SmuzhiyunParam[0]
2726*4882a593Smuzhiyun^^^^^^^^
2727*4882a593Smuzhiyun
2728*4882a593SmuzhiyunMode: 0=MPEG from host, 1=YUV from encoder, 2=YUV from host
2729*4882a593Smuzhiyun
2730*4882a593SmuzhiyunParam[1]
2731*4882a593Smuzhiyun^^^^^^^^
2732*4882a593Smuzhiyun
2733*4882a593SmuzhiyunYUV picture width
2734*4882a593Smuzhiyun
2735*4882a593SmuzhiyunParam[2]
2736*4882a593Smuzhiyun^^^^^^^^
2737*4882a593Smuzhiyun
2738*4882a593SmuzhiyunYUV picture height
2739*4882a593Smuzhiyun
2740*4882a593SmuzhiyunParam[3]
2741*4882a593Smuzhiyun^^^^^^^^
2742*4882a593Smuzhiyun
2743*4882a593SmuzhiyunBitmap: see Param[0] of API 0xBD
2744*4882a593Smuzhiyun
2745*4882a593Smuzhiyun
2746*4882a593Smuzhiyun
2747*4882a593SmuzhiyunCX2341X_DEC_SET_PREBUFFERING
2748*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2749*4882a593Smuzhiyun
2750*4882a593SmuzhiyunEnum: 30/0x1E
2751*4882a593Smuzhiyun
2752*4882a593SmuzhiyunDescription
2753*4882a593Smuzhiyun^^^^^^^^^^^
2754*4882a593Smuzhiyun
2755*4882a593SmuzhiyunDecoder prebuffering, when enabled up to 128KB are buffered for
2756*4882a593Smuzhiyunstreams <8mpbs or 640KB for streams >8mbps
2757*4882a593Smuzhiyun
2758*4882a593SmuzhiyunParam[0]
2759*4882a593Smuzhiyun^^^^^^^^
2760*4882a593Smuzhiyun
2761*4882a593Smuzhiyun0=off, 1=on
2762*4882a593Smuzhiyun
2763*4882a593SmuzhiyunPVR350 Video decoder registers 0x02002800 -> 0x02002B00
2764*4882a593Smuzhiyun-------------------------------------------------------
2765*4882a593Smuzhiyun
2766*4882a593SmuzhiyunAuthor: Ian Armstrong <ian@iarmst.demon.co.uk>
2767*4882a593Smuzhiyun
2768*4882a593SmuzhiyunVersion: v0.4
2769*4882a593Smuzhiyun
2770*4882a593SmuzhiyunDate: 12 March 2007
2771*4882a593Smuzhiyun
2772*4882a593Smuzhiyun
2773*4882a593SmuzhiyunThis list has been worked out through trial and error. There will be mistakes
2774*4882a593Smuzhiyunand omissions. Some registers have no obvious effect so it's hard to say what
2775*4882a593Smuzhiyunthey do, while others interact with each other, or require a certain load
2776*4882a593Smuzhiyunsequence. Horizontal filter setup is one example, with six registers working
2777*4882a593Smuzhiyunin unison and requiring a certain load sequence to correctly configure. The
2778*4882a593Smuzhiyunindexed colour palette is much easier to set at just two registers, but again
2779*4882a593Smuzhiyunit requires a certain load sequence.
2780*4882a593Smuzhiyun
2781*4882a593SmuzhiyunSome registers are fussy about what they are set to. Load in a bad value & the
2782*4882a593Smuzhiyundecoder will fail. A firmware reload will often recover, but sometimes a reset
2783*4882a593Smuzhiyunis required. For registers containing size information, setting them to 0 is
2784*4882a593Smuzhiyungenerally a bad idea. For other control registers i.e. 2878, you'll only find
2785*4882a593Smuzhiyunout what values are bad when it hangs.
2786*4882a593Smuzhiyun
2787*4882a593Smuzhiyun.. code-block:: none
2788*4882a593Smuzhiyun
2789*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2790*4882a593Smuzhiyun	2800
2791*4882a593Smuzhiyun	bit 0
2792*4882a593Smuzhiyun		Decoder enable
2793*4882a593Smuzhiyun		0 = disable
2794*4882a593Smuzhiyun		1 = enable
2795*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2796*4882a593Smuzhiyun	2804
2797*4882a593Smuzhiyun	bits 0:31
2798*4882a593Smuzhiyun		Decoder horizontal Y alias register 1
2799*4882a593Smuzhiyun	---------------
2800*4882a593Smuzhiyun	2808
2801*4882a593Smuzhiyun	bits 0:31
2802*4882a593Smuzhiyun		Decoder horizontal Y alias register 2
2803*4882a593Smuzhiyun	---------------
2804*4882a593Smuzhiyun	280C
2805*4882a593Smuzhiyun	bits 0:31
2806*4882a593Smuzhiyun		Decoder horizontal Y alias register 3
2807*4882a593Smuzhiyun	---------------
2808*4882a593Smuzhiyun	2810
2809*4882a593Smuzhiyun	bits 0:31
2810*4882a593Smuzhiyun		Decoder horizontal Y alias register 4
2811*4882a593Smuzhiyun	---------------
2812*4882a593Smuzhiyun	2814
2813*4882a593Smuzhiyun	bits 0:31
2814*4882a593Smuzhiyun		Decoder horizontal Y alias register 5
2815*4882a593Smuzhiyun	---------------
2816*4882a593Smuzhiyun	2818
2817*4882a593Smuzhiyun	bits 0:31
2818*4882a593Smuzhiyun		Decoder horizontal Y alias trigger
2819*4882a593Smuzhiyun
2820*4882a593Smuzhiyun	These six registers control the horizontal aliasing filter for the Y plane.
2821*4882a593Smuzhiyun	The first five registers must all be loaded before accessing the trigger
2822*4882a593Smuzhiyun	(2818), as this register actually clocks the data through for the first
2823*4882a593Smuzhiyun	five.
2824*4882a593Smuzhiyun
2825*4882a593Smuzhiyun	To correctly program set the filter, this whole procedure must be done 16
2826*4882a593Smuzhiyun	times. The actual register contents are copied from a lookup-table in the
2827*4882a593Smuzhiyun	firmware which contains 4 different filter settings.
2828*4882a593Smuzhiyun
2829*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2830*4882a593Smuzhiyun	281C
2831*4882a593Smuzhiyun	bits 0:31
2832*4882a593Smuzhiyun		Decoder horizontal UV alias register 1
2833*4882a593Smuzhiyun	---------------
2834*4882a593Smuzhiyun	2820
2835*4882a593Smuzhiyun	bits 0:31
2836*4882a593Smuzhiyun		Decoder horizontal UV alias register 2
2837*4882a593Smuzhiyun	---------------
2838*4882a593Smuzhiyun	2824
2839*4882a593Smuzhiyun	bits 0:31
2840*4882a593Smuzhiyun		Decoder horizontal UV alias register 3
2841*4882a593Smuzhiyun	---------------
2842*4882a593Smuzhiyun	2828
2843*4882a593Smuzhiyun	bits 0:31
2844*4882a593Smuzhiyun		Decoder horizontal UV alias register 4
2845*4882a593Smuzhiyun	---------------
2846*4882a593Smuzhiyun	282C
2847*4882a593Smuzhiyun	bits 0:31
2848*4882a593Smuzhiyun		Decoder horizontal UV alias register 5
2849*4882a593Smuzhiyun	---------------
2850*4882a593Smuzhiyun	2830
2851*4882a593Smuzhiyun	bits 0:31
2852*4882a593Smuzhiyun		Decoder horizontal UV alias trigger
2853*4882a593Smuzhiyun
2854*4882a593Smuzhiyun	These six registers control the horizontal aliasing for the UV plane.
2855*4882a593Smuzhiyun	Operation is the same as the Y filter, with 2830 being the trigger
2856*4882a593Smuzhiyun	register.
2857*4882a593Smuzhiyun
2858*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2859*4882a593Smuzhiyun	2834
2860*4882a593Smuzhiyun	bits 0:15
2861*4882a593Smuzhiyun		Decoder Y source width in pixels
2862*4882a593Smuzhiyun
2863*4882a593Smuzhiyun	bits 16:31
2864*4882a593Smuzhiyun		Decoder Y destination width in pixels
2865*4882a593Smuzhiyun	---------------
2866*4882a593Smuzhiyun	2838
2867*4882a593Smuzhiyun	bits 0:15
2868*4882a593Smuzhiyun		Decoder UV source width in pixels
2869*4882a593Smuzhiyun
2870*4882a593Smuzhiyun	bits 16:31
2871*4882a593Smuzhiyun		Decoder UV destination width in pixels
2872*4882a593Smuzhiyun
2873*4882a593Smuzhiyun	NOTE: For both registers, the resulting image must be fully visible on
2874*4882a593Smuzhiyun	screen. If the image exceeds the right edge both the source and destination
2875*4882a593Smuzhiyun	size must be adjusted to reflect the visible portion. For the source width,
2876*4882a593Smuzhiyun	you must take into account the scaling when calculating the new value.
2877*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2878*4882a593Smuzhiyun
2879*4882a593Smuzhiyun	283C
2880*4882a593Smuzhiyun	bits 0:31
2881*4882a593Smuzhiyun		Decoder Y horizontal scaling
2882*4882a593Smuzhiyun			Normally = Reg 2854 >> 2
2883*4882a593Smuzhiyun	---------------
2884*4882a593Smuzhiyun	2840
2885*4882a593Smuzhiyun	bits 0:31
2886*4882a593Smuzhiyun		Decoder ?? unknown - horizontal scaling
2887*4882a593Smuzhiyun		Usually 0x00080514
2888*4882a593Smuzhiyun	---------------
2889*4882a593Smuzhiyun	2844
2890*4882a593Smuzhiyun	bits 0:31
2891*4882a593Smuzhiyun		Decoder UV horizontal scaling
2892*4882a593Smuzhiyun		Normally = Reg 2854 >> 2
2893*4882a593Smuzhiyun	---------------
2894*4882a593Smuzhiyun	2848
2895*4882a593Smuzhiyun	bits 0:31
2896*4882a593Smuzhiyun		Decoder ?? unknown - horizontal scaling
2897*4882a593Smuzhiyun		Usually 0x00100514
2898*4882a593Smuzhiyun	---------------
2899*4882a593Smuzhiyun	284C
2900*4882a593Smuzhiyun	bits 0:31
2901*4882a593Smuzhiyun		Decoder ?? unknown - Y plane
2902*4882a593Smuzhiyun		Usually 0x00200020
2903*4882a593Smuzhiyun	---------------
2904*4882a593Smuzhiyun	2850
2905*4882a593Smuzhiyun	bits 0:31
2906*4882a593Smuzhiyun		Decoder ?? unknown - UV plane
2907*4882a593Smuzhiyun		Usually 0x00200020
2908*4882a593Smuzhiyun	---------------
2909*4882a593Smuzhiyun	2854
2910*4882a593Smuzhiyun	bits 0:31
2911*4882a593Smuzhiyun		Decoder 'master' value for horizontal scaling
2912*4882a593Smuzhiyun	---------------
2913*4882a593Smuzhiyun	2858
2914*4882a593Smuzhiyun	bits 0:31
2915*4882a593Smuzhiyun		Decoder ?? unknown
2916*4882a593Smuzhiyun		Usually 0
2917*4882a593Smuzhiyun	---------------
2918*4882a593Smuzhiyun	285C
2919*4882a593Smuzhiyun	bits 0:31
2920*4882a593Smuzhiyun		Decoder ?? unknown
2921*4882a593Smuzhiyun		Normally = Reg 2854 >> 1
2922*4882a593Smuzhiyun	---------------
2923*4882a593Smuzhiyun	2860
2924*4882a593Smuzhiyun	bits 0:31
2925*4882a593Smuzhiyun		Decoder ?? unknown
2926*4882a593Smuzhiyun		Usually 0
2927*4882a593Smuzhiyun	---------------
2928*4882a593Smuzhiyun	2864
2929*4882a593Smuzhiyun	bits 0:31
2930*4882a593Smuzhiyun		Decoder ?? unknown
2931*4882a593Smuzhiyun		Normally = Reg 2854 >> 1
2932*4882a593Smuzhiyun	---------------
2933*4882a593Smuzhiyun	2868
2934*4882a593Smuzhiyun	bits 0:31
2935*4882a593Smuzhiyun		Decoder ?? unknown
2936*4882a593Smuzhiyun		Usually 0
2937*4882a593Smuzhiyun
2938*4882a593Smuzhiyun	Most of these registers either control horizontal scaling, or appear linked
2939*4882a593Smuzhiyun	to it in some way. Register 2854 contains the 'master' value & the other
2940*4882a593Smuzhiyun	registers can be calculated from that one. You must also remember to
2941*4882a593Smuzhiyun	correctly set the divider in Reg 2874.
2942*4882a593Smuzhiyun
2943*4882a593Smuzhiyun	To enlarge:
2944*4882a593Smuzhiyun		Reg 2854 = (source_width * 0x00200000) / destination_width
2945*4882a593Smuzhiyun		Reg 2874 = No divide
2946*4882a593Smuzhiyun
2947*4882a593Smuzhiyun	To reduce from full size down to half size:
2948*4882a593Smuzhiyun		Reg 2854 = (source_width/2 * 0x00200000) / destination width
2949*4882a593Smuzhiyun		Reg 2874 = Divide by 2
2950*4882a593Smuzhiyun
2951*4882a593Smuzhiyun	To reduce from half size down to quarter size:
2952*4882a593Smuzhiyun		Reg 2854 = (source_width/4 * 0x00200000) / destination width
2953*4882a593Smuzhiyun		Reg 2874 = Divide by 4
2954*4882a593Smuzhiyun
2955*4882a593Smuzhiyun	The result is always rounded up.
2956*4882a593Smuzhiyun
2957*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2958*4882a593Smuzhiyun	286C
2959*4882a593Smuzhiyun	bits 0:15
2960*4882a593Smuzhiyun		Decoder horizontal Y buffer offset
2961*4882a593Smuzhiyun
2962*4882a593Smuzhiyun	bits 15:31
2963*4882a593Smuzhiyun		Decoder horizontal UV buffer offset
2964*4882a593Smuzhiyun
2965*4882a593Smuzhiyun	Offset into the video image buffer. If the offset is gradually incremented,
2966*4882a593Smuzhiyun	the on screen image will move left & wrap around higher up on the right.
2967*4882a593Smuzhiyun
2968*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2969*4882a593Smuzhiyun	2870
2970*4882a593Smuzhiyun	bits 0:15
2971*4882a593Smuzhiyun		Decoder horizontal Y output offset
2972*4882a593Smuzhiyun
2973*4882a593Smuzhiyun	bits 16:31
2974*4882a593Smuzhiyun		Decoder horizontal UV output offset
2975*4882a593Smuzhiyun
2976*4882a593Smuzhiyun	Offsets the actual video output. Controls output alignment of the Y & UV
2977*4882a593Smuzhiyun	planes. The higher the value, the greater the shift to the left. Use
2978*4882a593Smuzhiyun	reg 2890 to move the image right.
2979*4882a593Smuzhiyun
2980*4882a593Smuzhiyun	--------------------------------------------------------------------------------
2981*4882a593Smuzhiyun	2874
2982*4882a593Smuzhiyun	bits 0:1
2983*4882a593Smuzhiyun		Decoder horizontal Y output size divider
2984*4882a593Smuzhiyun		00 = No divide
2985*4882a593Smuzhiyun		01 = Divide by 2
2986*4882a593Smuzhiyun		10 = Divide by 3
2987*4882a593Smuzhiyun
2988*4882a593Smuzhiyun	bits 4:5
2989*4882a593Smuzhiyun		Decoder horizontal UV output size divider
2990*4882a593Smuzhiyun		00 = No divide
2991*4882a593Smuzhiyun		01 = Divide by 2
2992*4882a593Smuzhiyun		10 = Divide by 3
2993*4882a593Smuzhiyun
2994*4882a593Smuzhiyun	bit 8
2995*4882a593Smuzhiyun		Decoder ?? unknown
2996*4882a593Smuzhiyun		0 = Normal
2997*4882a593Smuzhiyun		1 = Affects video output levels
2998*4882a593Smuzhiyun
2999*4882a593Smuzhiyun	bit 16
3000*4882a593Smuzhiyun		Decoder ?? unknown
3001*4882a593Smuzhiyun		0 = Normal
3002*4882a593Smuzhiyun		1 = Disable horizontal filter
3003*4882a593Smuzhiyun
3004*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3005*4882a593Smuzhiyun	2878
3006*4882a593Smuzhiyun	bit 0
3007*4882a593Smuzhiyun		?? unknown
3008*4882a593Smuzhiyun
3009*4882a593Smuzhiyun	bit 1
3010*4882a593Smuzhiyun		osd on/off
3011*4882a593Smuzhiyun		0 = osd off
3012*4882a593Smuzhiyun		1 = osd on
3013*4882a593Smuzhiyun
3014*4882a593Smuzhiyun	bit 2
3015*4882a593Smuzhiyun		Decoder + osd video timing
3016*4882a593Smuzhiyun		0 = NTSC
3017*4882a593Smuzhiyun		1 = PAL
3018*4882a593Smuzhiyun
3019*4882a593Smuzhiyun	bits 3:4
3020*4882a593Smuzhiyun		?? unknown
3021*4882a593Smuzhiyun
3022*4882a593Smuzhiyun	bit 5
3023*4882a593Smuzhiyun		Decoder + osd
3024*4882a593Smuzhiyun		Swaps upper & lower fields
3025*4882a593Smuzhiyun
3026*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3027*4882a593Smuzhiyun	287C
3028*4882a593Smuzhiyun	bits 0:10
3029*4882a593Smuzhiyun		Decoder & osd ?? unknown
3030*4882a593Smuzhiyun		Moves entire screen horizontally. Starts at 0x005 with the screen
3031*4882a593Smuzhiyun		shifted heavily to the right. Incrementing in steps of 0x004 will
3032*4882a593Smuzhiyun		gradually shift the screen to the left.
3033*4882a593Smuzhiyun
3034*4882a593Smuzhiyun	bits 11:31
3035*4882a593Smuzhiyun		?? unknown
3036*4882a593Smuzhiyun
3037*4882a593Smuzhiyun	Normally contents are 0x00101111 (NTSC) or 0x1010111d (PAL)
3038*4882a593Smuzhiyun
3039*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3040*4882a593Smuzhiyun	2880  --------    ?? unknown
3041*4882a593Smuzhiyun	2884  --------    ?? unknown
3042*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3043*4882a593Smuzhiyun	2888
3044*4882a593Smuzhiyun	bit 0
3045*4882a593Smuzhiyun		Decoder + osd ?? unknown
3046*4882a593Smuzhiyun		0 = Normal
3047*4882a593Smuzhiyun		1 = Misaligned fields (Correctable through 289C & 28A4)
3048*4882a593Smuzhiyun
3049*4882a593Smuzhiyun	bit 4
3050*4882a593Smuzhiyun		?? unknown
3051*4882a593Smuzhiyun
3052*4882a593Smuzhiyun	bit 8
3053*4882a593Smuzhiyun		?? unknown
3054*4882a593Smuzhiyun
3055*4882a593Smuzhiyun	Warning: Bad values will require a firmware reload to recover.
3056*4882a593Smuzhiyun			Known to be bad are 0x000,0x011,0x100,0x111
3057*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3058*4882a593Smuzhiyun	288C
3059*4882a593Smuzhiyun	bits 0:15
3060*4882a593Smuzhiyun		osd ?? unknown
3061*4882a593Smuzhiyun		Appears to affect the osd position stability. The higher the value the
3062*4882a593Smuzhiyun		more unstable it becomes. Decoder output remains stable.
3063*4882a593Smuzhiyun
3064*4882a593Smuzhiyun	bits 16:31
3065*4882a593Smuzhiyun		osd ?? unknown
3066*4882a593Smuzhiyun		Same as bits 0:15
3067*4882a593Smuzhiyun
3068*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3069*4882a593Smuzhiyun	2890
3070*4882a593Smuzhiyun	bits 0:11
3071*4882a593Smuzhiyun		Decoder output horizontal offset.
3072*4882a593Smuzhiyun
3073*4882a593Smuzhiyun	Horizontal offset moves the video image right. A small left shift is
3074*4882a593Smuzhiyun	possible, but it's better to use reg 2870 for that due to its greater
3075*4882a593Smuzhiyun	range.
3076*4882a593Smuzhiyun
3077*4882a593Smuzhiyun	NOTE: Video corruption will occur if video window is shifted off the right
3078*4882a593Smuzhiyun	edge. To avoid this read the notes for 2834 & 2838.
3079*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3080*4882a593Smuzhiyun	2894
3081*4882a593Smuzhiyun	bits 0:23
3082*4882a593Smuzhiyun		Decoder output video surround colour.
3083*4882a593Smuzhiyun
3084*4882a593Smuzhiyun	Contains the colour (in yuv) used to fill the screen when the video is
3085*4882a593Smuzhiyun	running in a window.
3086*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3087*4882a593Smuzhiyun	2898
3088*4882a593Smuzhiyun	bits 0:23
3089*4882a593Smuzhiyun		Decoder video window colour
3090*4882a593Smuzhiyun		Contains the colour (in yuv) used to fill the video window when the
3091*4882a593Smuzhiyun		video is turned off.
3092*4882a593Smuzhiyun
3093*4882a593Smuzhiyun	bit 24
3094*4882a593Smuzhiyun		Decoder video output
3095*4882a593Smuzhiyun		0 = Video on
3096*4882a593Smuzhiyun		1 = Video off
3097*4882a593Smuzhiyun
3098*4882a593Smuzhiyun	bit 28
3099*4882a593Smuzhiyun		Decoder plane order
3100*4882a593Smuzhiyun		0 = Y,UV
3101*4882a593Smuzhiyun		1 = UV,Y
3102*4882a593Smuzhiyun
3103*4882a593Smuzhiyun	bit 29
3104*4882a593Smuzhiyun		Decoder second plane byte order
3105*4882a593Smuzhiyun		0 = Normal (UV)
3106*4882a593Smuzhiyun		1 = Swapped (VU)
3107*4882a593Smuzhiyun
3108*4882a593Smuzhiyun	In normal usage, the first plane is Y & the second plane is UV. Though the
3109*4882a593Smuzhiyun	order of the planes can be swapped, only the byte order of the second plane
3110*4882a593Smuzhiyun	can be swapped. This isn't much use for the Y plane, but can be useful for
3111*4882a593Smuzhiyun	the UV plane.
3112*4882a593Smuzhiyun
3113*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3114*4882a593Smuzhiyun	289C
3115*4882a593Smuzhiyun	bits 0:15
3116*4882a593Smuzhiyun		Decoder vertical field offset 1
3117*4882a593Smuzhiyun
3118*4882a593Smuzhiyun	bits 16:31
3119*4882a593Smuzhiyun		Decoder vertical field offset 2
3120*4882a593Smuzhiyun
3121*4882a593Smuzhiyun	Controls field output vertical alignment. The higher the number, the lower
3122*4882a593Smuzhiyun	the image on screen. Known starting values are 0x011E0017 (NTSC) &
3123*4882a593Smuzhiyun	0x01500017 (PAL)
3124*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3125*4882a593Smuzhiyun	28A0
3126*4882a593Smuzhiyun	bits 0:15
3127*4882a593Smuzhiyun		Decoder & osd width in pixels
3128*4882a593Smuzhiyun
3129*4882a593Smuzhiyun	bits 16:31
3130*4882a593Smuzhiyun		Decoder & osd height in pixels
3131*4882a593Smuzhiyun
3132*4882a593Smuzhiyun	All output from the decoder & osd are disabled beyond this area. Decoder
3133*4882a593Smuzhiyun	output will simply go black outside of this region. If the osd tries to
3134*4882a593Smuzhiyun	exceed this area it will become corrupt.
3135*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3136*4882a593Smuzhiyun	28A4
3137*4882a593Smuzhiyun	bits 0:11
3138*4882a593Smuzhiyun		osd left shift.
3139*4882a593Smuzhiyun
3140*4882a593Smuzhiyun	Has a range of 0x770->0x7FF. With the exception of 0, any value outside of
3141*4882a593Smuzhiyun	this range corrupts the osd.
3142*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3143*4882a593Smuzhiyun	28A8
3144*4882a593Smuzhiyun	bits 0:15
3145*4882a593Smuzhiyun		osd vertical field offset 1
3146*4882a593Smuzhiyun
3147*4882a593Smuzhiyun	bits 16:31
3148*4882a593Smuzhiyun		osd vertical field offset 2
3149*4882a593Smuzhiyun
3150*4882a593Smuzhiyun	Controls field output vertical alignment. The higher the number, the lower
3151*4882a593Smuzhiyun	the image on screen. Known starting values are 0x011E0017 (NTSC) &
3152*4882a593Smuzhiyun	0x01500017 (PAL)
3153*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3154*4882a593Smuzhiyun	28AC  --------    ?? unknown
3155*4882a593Smuzhiyun	|
3156*4882a593Smuzhiyun	V
3157*4882a593Smuzhiyun	28BC  --------    ?? unknown
3158*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3159*4882a593Smuzhiyun	28C0
3160*4882a593Smuzhiyun	bit 0
3161*4882a593Smuzhiyun		Current output field
3162*4882a593Smuzhiyun		0 = first field
3163*4882a593Smuzhiyun		1 = second field
3164*4882a593Smuzhiyun
3165*4882a593Smuzhiyun	bits 16:31
3166*4882a593Smuzhiyun		Current scanline
3167*4882a593Smuzhiyun		The scanline counts from the top line of the first field
3168*4882a593Smuzhiyun		through to the last line of the second field.
3169*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3170*4882a593Smuzhiyun	28C4  --------    ?? unknown
3171*4882a593Smuzhiyun	|
3172*4882a593Smuzhiyun	V
3173*4882a593Smuzhiyun	28F8  --------    ?? unknown
3174*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3175*4882a593Smuzhiyun	28FC
3176*4882a593Smuzhiyun	bit 0
3177*4882a593Smuzhiyun		?? unknown
3178*4882a593Smuzhiyun		0 = Normal
3179*4882a593Smuzhiyun		1 = Breaks decoder & osd output
3180*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3181*4882a593Smuzhiyun	2900
3182*4882a593Smuzhiyun	bits 0:31
3183*4882a593Smuzhiyun		Decoder vertical Y alias register 1
3184*4882a593Smuzhiyun	---------------
3185*4882a593Smuzhiyun	2904
3186*4882a593Smuzhiyun	bits 0:31
3187*4882a593Smuzhiyun		Decoder vertical Y alias register 2
3188*4882a593Smuzhiyun	---------------
3189*4882a593Smuzhiyun	2908
3190*4882a593Smuzhiyun	bits 0:31
3191*4882a593Smuzhiyun		Decoder vertical Y alias trigger
3192*4882a593Smuzhiyun
3193*4882a593Smuzhiyun	These three registers control the vertical aliasing filter for the Y plane.
3194*4882a593Smuzhiyun	Operation is similar to the horizontal Y filter (2804). The only real
3195*4882a593Smuzhiyun	difference is that there are only two registers to set before accessing
3196*4882a593Smuzhiyun	the trigger register (2908). As for the horizontal filter, the values are
3197*4882a593Smuzhiyun	taken from a lookup table in the firmware, and the procedure must be
3198*4882a593Smuzhiyun	repeated 16 times to fully program the filter.
3199*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3200*4882a593Smuzhiyun	290C
3201*4882a593Smuzhiyun	bits 0:31
3202*4882a593Smuzhiyun		Decoder vertical UV alias register 1
3203*4882a593Smuzhiyun	---------------
3204*4882a593Smuzhiyun	2910
3205*4882a593Smuzhiyun	bits 0:31
3206*4882a593Smuzhiyun		Decoder vertical UV alias register 2
3207*4882a593Smuzhiyun	---------------
3208*4882a593Smuzhiyun	2914
3209*4882a593Smuzhiyun	bits 0:31
3210*4882a593Smuzhiyun		Decoder vertical UV alias trigger
3211*4882a593Smuzhiyun
3212*4882a593Smuzhiyun	These three registers control the vertical aliasing filter for the UV
3213*4882a593Smuzhiyun	plane. Operation is the same as the Y filter, with 2914 being the trigger.
3214*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3215*4882a593Smuzhiyun	2918
3216*4882a593Smuzhiyun	bits 0:15
3217*4882a593Smuzhiyun		Decoder Y source height in pixels
3218*4882a593Smuzhiyun
3219*4882a593Smuzhiyun	bits 16:31
3220*4882a593Smuzhiyun		Decoder Y destination height in pixels
3221*4882a593Smuzhiyun	---------------
3222*4882a593Smuzhiyun	291C
3223*4882a593Smuzhiyun	bits 0:15
3224*4882a593Smuzhiyun		Decoder UV source height in pixels divided by 2
3225*4882a593Smuzhiyun
3226*4882a593Smuzhiyun	bits 16:31
3227*4882a593Smuzhiyun		Decoder UV destination height in pixels
3228*4882a593Smuzhiyun
3229*4882a593Smuzhiyun	NOTE: For both registers, the resulting image must be fully visible on
3230*4882a593Smuzhiyun	screen. If the image exceeds the bottom edge both the source and
3231*4882a593Smuzhiyun	destination size must be adjusted to reflect the visible portion. For the
3232*4882a593Smuzhiyun	source height, you must take into account the scaling when calculating the
3233*4882a593Smuzhiyun	new value.
3234*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3235*4882a593Smuzhiyun	2920
3236*4882a593Smuzhiyun	bits 0:31
3237*4882a593Smuzhiyun		Decoder Y vertical scaling
3238*4882a593Smuzhiyun		Normally = Reg 2930 >> 2
3239*4882a593Smuzhiyun	---------------
3240*4882a593Smuzhiyun	2924
3241*4882a593Smuzhiyun	bits 0:31
3242*4882a593Smuzhiyun		Decoder Y vertical scaling
3243*4882a593Smuzhiyun		Normally = Reg 2920 + 0x514
3244*4882a593Smuzhiyun	---------------
3245*4882a593Smuzhiyun	2928
3246*4882a593Smuzhiyun	bits 0:31
3247*4882a593Smuzhiyun		Decoder UV vertical scaling
3248*4882a593Smuzhiyun		When enlarging = Reg 2930 >> 2
3249*4882a593Smuzhiyun		When reducing = Reg 2930 >> 3
3250*4882a593Smuzhiyun	---------------
3251*4882a593Smuzhiyun	292C
3252*4882a593Smuzhiyun	bits 0:31
3253*4882a593Smuzhiyun		Decoder UV vertical scaling
3254*4882a593Smuzhiyun		Normally = Reg 2928 + 0x514
3255*4882a593Smuzhiyun	---------------
3256*4882a593Smuzhiyun	2930
3257*4882a593Smuzhiyun	bits 0:31
3258*4882a593Smuzhiyun		Decoder 'master' value for vertical scaling
3259*4882a593Smuzhiyun	---------------
3260*4882a593Smuzhiyun	2934
3261*4882a593Smuzhiyun	bits 0:31
3262*4882a593Smuzhiyun		Decoder ?? unknown - Y vertical scaling
3263*4882a593Smuzhiyun	---------------
3264*4882a593Smuzhiyun	2938
3265*4882a593Smuzhiyun	bits 0:31
3266*4882a593Smuzhiyun		Decoder Y vertical scaling
3267*4882a593Smuzhiyun		Normally = Reg 2930
3268*4882a593Smuzhiyun	---------------
3269*4882a593Smuzhiyun	293C
3270*4882a593Smuzhiyun	bits 0:31
3271*4882a593Smuzhiyun		Decoder ?? unknown - Y vertical scaling
3272*4882a593Smuzhiyun	---------------
3273*4882a593Smuzhiyun	2940
3274*4882a593Smuzhiyun	bits 0:31
3275*4882a593Smuzhiyun		Decoder UV vertical scaling
3276*4882a593Smuzhiyun		When enlarging = Reg 2930 >> 1
3277*4882a593Smuzhiyun		When reducing = Reg 2930
3278*4882a593Smuzhiyun	---------------
3279*4882a593Smuzhiyun	2944
3280*4882a593Smuzhiyun	bits 0:31
3281*4882a593Smuzhiyun		Decoder ?? unknown - UV vertical scaling
3282*4882a593Smuzhiyun	---------------
3283*4882a593Smuzhiyun	2948
3284*4882a593Smuzhiyun	bits 0:31
3285*4882a593Smuzhiyun		Decoder UV vertical scaling
3286*4882a593Smuzhiyun		Normally = Reg 2940
3287*4882a593Smuzhiyun	---------------
3288*4882a593Smuzhiyun	294C
3289*4882a593Smuzhiyun	bits 0:31
3290*4882a593Smuzhiyun		Decoder ?? unknown - UV vertical scaling
3291*4882a593Smuzhiyun
3292*4882a593Smuzhiyun	Most of these registers either control vertical scaling, or appear linked
3293*4882a593Smuzhiyun	to it in some way. Register 2930 contains the 'master' value & all other
3294*4882a593Smuzhiyun	registers can be calculated from that one. You must also remember to
3295*4882a593Smuzhiyun	correctly set the divider in Reg 296C
3296*4882a593Smuzhiyun
3297*4882a593Smuzhiyun	To enlarge:
3298*4882a593Smuzhiyun		Reg 2930 = (source_height * 0x00200000) / destination_height
3299*4882a593Smuzhiyun		Reg 296C = No divide
3300*4882a593Smuzhiyun
3301*4882a593Smuzhiyun	To reduce from full size down to half size:
3302*4882a593Smuzhiyun		Reg 2930 = (source_height/2 * 0x00200000) / destination height
3303*4882a593Smuzhiyun		Reg 296C = Divide by 2
3304*4882a593Smuzhiyun
3305*4882a593Smuzhiyun	To reduce from half down to quarter.
3306*4882a593Smuzhiyun		Reg 2930 = (source_height/4 * 0x00200000) / destination height
3307*4882a593Smuzhiyun		Reg 296C = Divide by 4
3308*4882a593Smuzhiyun
3309*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3310*4882a593Smuzhiyun	2950
3311*4882a593Smuzhiyun	bits 0:15
3312*4882a593Smuzhiyun		Decoder Y line index into display buffer, first field
3313*4882a593Smuzhiyun
3314*4882a593Smuzhiyun	bits 16:31
3315*4882a593Smuzhiyun		Decoder Y vertical line skip, first field
3316*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3317*4882a593Smuzhiyun	2954
3318*4882a593Smuzhiyun	bits 0:15
3319*4882a593Smuzhiyun		Decoder Y line index into display buffer, second field
3320*4882a593Smuzhiyun
3321*4882a593Smuzhiyun	bits 16:31
3322*4882a593Smuzhiyun		Decoder Y vertical line skip, second field
3323*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3324*4882a593Smuzhiyun	2958
3325*4882a593Smuzhiyun	bits 0:15
3326*4882a593Smuzhiyun		Decoder UV line index into display buffer, first field
3327*4882a593Smuzhiyun
3328*4882a593Smuzhiyun	bits 16:31
3329*4882a593Smuzhiyun		Decoder UV vertical line skip, first field
3330*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3331*4882a593Smuzhiyun	295C
3332*4882a593Smuzhiyun	bits 0:15
3333*4882a593Smuzhiyun		Decoder UV line index into display buffer, second field
3334*4882a593Smuzhiyun
3335*4882a593Smuzhiyun	bits 16:31
3336*4882a593Smuzhiyun		Decoder UV vertical line skip, second field
3337*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3338*4882a593Smuzhiyun	2960
3339*4882a593Smuzhiyun	bits 0:15
3340*4882a593Smuzhiyun		Decoder destination height minus 1
3341*4882a593Smuzhiyun
3342*4882a593Smuzhiyun	bits 16:31
3343*4882a593Smuzhiyun		Decoder destination height divided by 2
3344*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3345*4882a593Smuzhiyun	2964
3346*4882a593Smuzhiyun	bits 0:15
3347*4882a593Smuzhiyun		Decoder Y vertical offset, second field
3348*4882a593Smuzhiyun
3349*4882a593Smuzhiyun	bits 16:31
3350*4882a593Smuzhiyun		Decoder Y vertical offset, first field
3351*4882a593Smuzhiyun
3352*4882a593Smuzhiyun	These two registers shift the Y plane up. The higher the number, the
3353*4882a593Smuzhiyun	greater the shift.
3354*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3355*4882a593Smuzhiyun	2968
3356*4882a593Smuzhiyun	bits 0:15
3357*4882a593Smuzhiyun		Decoder UV vertical offset, second field
3358*4882a593Smuzhiyun
3359*4882a593Smuzhiyun	bits 16:31
3360*4882a593Smuzhiyun		Decoder UV vertical offset, first field
3361*4882a593Smuzhiyun
3362*4882a593Smuzhiyun	These two registers shift the UV plane up. The higher the number, the
3363*4882a593Smuzhiyun	greater the shift.
3364*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3365*4882a593Smuzhiyun	296C
3366*4882a593Smuzhiyun	bits 0:1
3367*4882a593Smuzhiyun		Decoder vertical Y output size divider
3368*4882a593Smuzhiyun		00 = No divide
3369*4882a593Smuzhiyun		01 = Divide by 2
3370*4882a593Smuzhiyun		10 = Divide by 4
3371*4882a593Smuzhiyun
3372*4882a593Smuzhiyun	bits 8:9
3373*4882a593Smuzhiyun		Decoder vertical UV output size divider
3374*4882a593Smuzhiyun		00 = No divide
3375*4882a593Smuzhiyun		01 = Divide by 2
3376*4882a593Smuzhiyun		10 = Divide by 4
3377*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3378*4882a593Smuzhiyun	2970
3379*4882a593Smuzhiyun	bit 0
3380*4882a593Smuzhiyun		Decoder ?? unknown
3381*4882a593Smuzhiyun		0 = Normal
3382*4882a593Smuzhiyun		1 = Affect video output levels
3383*4882a593Smuzhiyun
3384*4882a593Smuzhiyun	bit 16
3385*4882a593Smuzhiyun		Decoder ?? unknown
3386*4882a593Smuzhiyun		0 = Normal
3387*4882a593Smuzhiyun		1 = Disable vertical filter
3388*4882a593Smuzhiyun
3389*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3390*4882a593Smuzhiyun	2974  --------   ?? unknown
3391*4882a593Smuzhiyun	|
3392*4882a593Smuzhiyun	V
3393*4882a593Smuzhiyun	29EF  --------   ?? unknown
3394*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3395*4882a593Smuzhiyun	2A00
3396*4882a593Smuzhiyun	bits 0:2
3397*4882a593Smuzhiyun		osd colour mode
3398*4882a593Smuzhiyun		000 = 8 bit indexed
3399*4882a593Smuzhiyun		001 = 16 bit (565)
3400*4882a593Smuzhiyun		010 = 15 bit (555)
3401*4882a593Smuzhiyun		011 = 12 bit (444)
3402*4882a593Smuzhiyun		100 = 32 bit (8888)
3403*4882a593Smuzhiyun
3404*4882a593Smuzhiyun	bits 4:5
3405*4882a593Smuzhiyun		osd display bpp
3406*4882a593Smuzhiyun		01 = 8 bit
3407*4882a593Smuzhiyun		10 = 16 bit
3408*4882a593Smuzhiyun		11 = 32 bit
3409*4882a593Smuzhiyun
3410*4882a593Smuzhiyun	bit 8
3411*4882a593Smuzhiyun		osd global alpha
3412*4882a593Smuzhiyun		0 = Off
3413*4882a593Smuzhiyun		1 = On
3414*4882a593Smuzhiyun
3415*4882a593Smuzhiyun	bit 9
3416*4882a593Smuzhiyun		osd local alpha
3417*4882a593Smuzhiyun		0 = Off
3418*4882a593Smuzhiyun		1 = On
3419*4882a593Smuzhiyun
3420*4882a593Smuzhiyun	bit 10
3421*4882a593Smuzhiyun		osd colour key
3422*4882a593Smuzhiyun		0 = Off
3423*4882a593Smuzhiyun		1 = On
3424*4882a593Smuzhiyun
3425*4882a593Smuzhiyun	bit 11
3426*4882a593Smuzhiyun		osd ?? unknown
3427*4882a593Smuzhiyun		Must be 1
3428*4882a593Smuzhiyun
3429*4882a593Smuzhiyun	bit 13
3430*4882a593Smuzhiyun		osd colour space
3431*4882a593Smuzhiyun		0 = ARGB
3432*4882a593Smuzhiyun		1 = AYVU
3433*4882a593Smuzhiyun
3434*4882a593Smuzhiyun	bits 16:31
3435*4882a593Smuzhiyun		osd ?? unknown
3436*4882a593Smuzhiyun		Must be 0x001B (some kind of buffer pointer ?)
3437*4882a593Smuzhiyun
3438*4882a593Smuzhiyun	When the bits-per-pixel is set to 8, the colour mode is ignored and
3439*4882a593Smuzhiyun	assumed to be 8 bit indexed. For 16 & 32 bits-per-pixel the colour depth
3440*4882a593Smuzhiyun	is honoured, and when using a colour depth that requires fewer bytes than
3441*4882a593Smuzhiyun	allocated the extra bytes are used as padding. So for a 32 bpp with 8 bit
3442*4882a593Smuzhiyun	index colour, there are 3 padding bytes per pixel. It's also possible to
3443*4882a593Smuzhiyun	select 16bpp with a 32 bit colour mode. This results in the pixel width
3444*4882a593Smuzhiyun	being doubled, but the color key will not work as expected in this mode.
3445*4882a593Smuzhiyun
3446*4882a593Smuzhiyun	Colour key is as it suggests. You designate a colour which will become
3447*4882a593Smuzhiyun	completely transparent. When using 565, 555 or 444 colour modes, the
3448*4882a593Smuzhiyun	colour key is always 16 bits wide. The colour to key on is set in Reg 2A18.
3449*4882a593Smuzhiyun
3450*4882a593Smuzhiyun	Local alpha works differently depending on the colour mode. For 32bpp & 8
3451*4882a593Smuzhiyun	bit indexed, local alpha is a per-pixel 256 step transparency, with 0 being
3452*4882a593Smuzhiyun	transparent and 255 being solid. For the 16bpp modes 555 & 444, the unused
3453*4882a593Smuzhiyun	bit(s) act as a simple transparency switch, with 0 being solid & 1 being
3454*4882a593Smuzhiyun	fully transparent. There is no local alpha support for 16bit 565.
3455*4882a593Smuzhiyun
3456*4882a593Smuzhiyun	Global alpha is a 256 step transparency that applies to the entire osd,
3457*4882a593Smuzhiyun	with 0 being transparent & 255 being solid.
3458*4882a593Smuzhiyun
3459*4882a593Smuzhiyun	It's possible to combine colour key, local alpha & global alpha.
3460*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3461*4882a593Smuzhiyun	2A04
3462*4882a593Smuzhiyun	bits 0:15
3463*4882a593Smuzhiyun		osd x coord for left edge
3464*4882a593Smuzhiyun
3465*4882a593Smuzhiyun	bits 16:31
3466*4882a593Smuzhiyun		osd y coord for top edge
3467*4882a593Smuzhiyun	---------------
3468*4882a593Smuzhiyun	2A08
3469*4882a593Smuzhiyun	bits 0:15
3470*4882a593Smuzhiyun		osd x coord for right edge
3471*4882a593Smuzhiyun
3472*4882a593Smuzhiyun	bits 16:31
3473*4882a593Smuzhiyun		osd y coord for bottom edge
3474*4882a593Smuzhiyun
3475*4882a593Smuzhiyun	For both registers, (0,0) = top left corner of the display area. These
3476*4882a593Smuzhiyun	registers do not control the osd size, only where it's positioned & how
3477*4882a593Smuzhiyun	much is visible. The visible osd area cannot exceed the right edge of the
3478*4882a593Smuzhiyun	display, otherwise the osd will become corrupt. See reg 2A10 for
3479*4882a593Smuzhiyun	setting osd width.
3480*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3481*4882a593Smuzhiyun	2A0C
3482*4882a593Smuzhiyun	bits 0:31
3483*4882a593Smuzhiyun		osd buffer index
3484*4882a593Smuzhiyun
3485*4882a593Smuzhiyun	An index into the osd buffer. Slowly incrementing this moves the osd left,
3486*4882a593Smuzhiyun	wrapping around onto the right edge
3487*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3488*4882a593Smuzhiyun	2A10
3489*4882a593Smuzhiyun	bits 0:11
3490*4882a593Smuzhiyun		osd buffer 32 bit word width
3491*4882a593Smuzhiyun
3492*4882a593Smuzhiyun	Contains the width of the osd measured in 32 bit words. This means that all
3493*4882a593Smuzhiyun	colour modes are restricted to a byte width which is divisible by 4.
3494*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3495*4882a593Smuzhiyun	2A14
3496*4882a593Smuzhiyun	bits 0:15
3497*4882a593Smuzhiyun		osd height in pixels
3498*4882a593Smuzhiyun
3499*4882a593Smuzhiyun	bits 16:32
3500*4882a593Smuzhiyun		osd line index into buffer
3501*4882a593Smuzhiyun		osd will start displaying from this line.
3502*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3503*4882a593Smuzhiyun	2A18
3504*4882a593Smuzhiyun	bits 0:31
3505*4882a593Smuzhiyun		osd colour key
3506*4882a593Smuzhiyun
3507*4882a593Smuzhiyun	Contains the colour value which will be transparent.
3508*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3509*4882a593Smuzhiyun	2A1C
3510*4882a593Smuzhiyun	bits 0:7
3511*4882a593Smuzhiyun		osd global alpha
3512*4882a593Smuzhiyun
3513*4882a593Smuzhiyun	Contains the global alpha value (equiv ivtvfbctl --alpha XX)
3514*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3515*4882a593Smuzhiyun	2A20  --------    ?? unknown
3516*4882a593Smuzhiyun	|
3517*4882a593Smuzhiyun	V
3518*4882a593Smuzhiyun	2A2C  --------    ?? unknown
3519*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3520*4882a593Smuzhiyun	2A30
3521*4882a593Smuzhiyun	bits 0:7
3522*4882a593Smuzhiyun		osd colour to change in indexed palette
3523*4882a593Smuzhiyun	---------------
3524*4882a593Smuzhiyun	2A34
3525*4882a593Smuzhiyun	bits 0:31
3526*4882a593Smuzhiyun		osd colour for indexed palette
3527*4882a593Smuzhiyun
3528*4882a593Smuzhiyun	To set the new palette, first load the index of the colour to change into
3529*4882a593Smuzhiyun	2A30, then load the new colour into 2A34. The full palette is 256 colours,
3530*4882a593Smuzhiyun	so the index range is 0x00-0xFF
3531*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3532*4882a593Smuzhiyun	2A38  --------    ?? unknown
3533*4882a593Smuzhiyun	2A3C  --------    ?? unknown
3534*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3535*4882a593Smuzhiyun	2A40
3536*4882a593Smuzhiyun	bits 0:31
3537*4882a593Smuzhiyun		osd ?? unknown
3538*4882a593Smuzhiyun
3539*4882a593Smuzhiyun	Affects overall brightness, wrapping around to black
3540*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3541*4882a593Smuzhiyun	2A44
3542*4882a593Smuzhiyun	bits 0:31
3543*4882a593Smuzhiyun		osd ?? unknown
3544*4882a593Smuzhiyun
3545*4882a593Smuzhiyun	Green tint
3546*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3547*4882a593Smuzhiyun	2A48
3548*4882a593Smuzhiyun	bits 0:31
3549*4882a593Smuzhiyun		osd ?? unknown
3550*4882a593Smuzhiyun
3551*4882a593Smuzhiyun	Red tint
3552*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3553*4882a593Smuzhiyun	2A4C
3554*4882a593Smuzhiyun	bits 0:31
3555*4882a593Smuzhiyun		osd ?? unknown
3556*4882a593Smuzhiyun
3557*4882a593Smuzhiyun	Affects overall brightness, wrapping around to black
3558*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3559*4882a593Smuzhiyun	2A50
3560*4882a593Smuzhiyun	bits 0:31
3561*4882a593Smuzhiyun		osd ?? unknown
3562*4882a593Smuzhiyun
3563*4882a593Smuzhiyun	Colour shift
3564*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3565*4882a593Smuzhiyun	2A54
3566*4882a593Smuzhiyun	bits 0:31
3567*4882a593Smuzhiyun		osd ?? unknown
3568*4882a593Smuzhiyun
3569*4882a593Smuzhiyun	Colour shift
3570*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3571*4882a593Smuzhiyun	2A58  --------    ?? unknown
3572*4882a593Smuzhiyun	|
3573*4882a593Smuzhiyun	V
3574*4882a593Smuzhiyun	2AFC  --------    ?? unknown
3575*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3576*4882a593Smuzhiyun	2B00
3577*4882a593Smuzhiyun	bit 0
3578*4882a593Smuzhiyun		osd filter control
3579*4882a593Smuzhiyun		0 = filter off
3580*4882a593Smuzhiyun		1 = filter on
3581*4882a593Smuzhiyun
3582*4882a593Smuzhiyun	bits 1:4
3583*4882a593Smuzhiyun		osd ?? unknown
3584*4882a593Smuzhiyun
3585*4882a593Smuzhiyun	--------------------------------------------------------------------------------
3586*4882a593Smuzhiyun
3587*4882a593SmuzhiyunThe cx231xx DMA engine
3588*4882a593Smuzhiyun----------------------
3589*4882a593Smuzhiyun
3590*4882a593Smuzhiyun
3591*4882a593SmuzhiyunThis page describes the structures and procedures used by the cx2341x DMA
3592*4882a593Smuzhiyunengine.
3593*4882a593Smuzhiyun
3594*4882a593SmuzhiyunIntroduction
3595*4882a593Smuzhiyun~~~~~~~~~~~~
3596*4882a593Smuzhiyun
3597*4882a593SmuzhiyunThe cx2341x PCI interface is busmaster capable. This means it has a DMA
3598*4882a593Smuzhiyunengine to efficiently transfer large volumes of data between the card and main
3599*4882a593Smuzhiyunmemory without requiring help from a CPU. Like most hardware, it must operate
3600*4882a593Smuzhiyunon contiguous physical memory. This is difficult to come by in large quantities
3601*4882a593Smuzhiyunon virtual memory machines.
3602*4882a593Smuzhiyun
3603*4882a593SmuzhiyunTherefore, it also supports a technique called "scatter-gather". The card can
3604*4882a593Smuzhiyuntransfer multiple buffers in one operation. Instead of allocating one large
3605*4882a593Smuzhiyuncontiguous buffer, the driver can allocate several smaller buffers.
3606*4882a593Smuzhiyun
3607*4882a593SmuzhiyunIn practice, I've seen the average transfer to be roughly 80K, but transfers
3608*4882a593Smuzhiyunabove 128K were not uncommon, particularly at startup. The 128K figure is
3609*4882a593Smuzhiyunimportant, because that is the largest block that the kernel can normally
3610*4882a593Smuzhiyunallocate. Even still, 128K blocks are hard to come by, so the driver writer is
3611*4882a593Smuzhiyunurged to choose a smaller block size and learn the scatter-gather technique.
3612*4882a593Smuzhiyun
3613*4882a593SmuzhiyunMailbox #10 is reserved for DMA transfer information.
3614*4882a593Smuzhiyun
3615*4882a593SmuzhiyunNote: the hardware expects little-endian data ('intel format').
3616*4882a593Smuzhiyun
3617*4882a593SmuzhiyunFlow
3618*4882a593Smuzhiyun~~~~
3619*4882a593Smuzhiyun
3620*4882a593SmuzhiyunThis section describes, in general, the order of events when handling DMA
3621*4882a593Smuzhiyuntransfers. Detailed information follows this section.
3622*4882a593Smuzhiyun
3623*4882a593Smuzhiyun- The card raises the Encoder interrupt.
3624*4882a593Smuzhiyun- The driver reads the transfer type, offset and size from Mailbox #10.
3625*4882a593Smuzhiyun- The driver constructs the scatter-gather array from enough free dma buffers
3626*4882a593Smuzhiyun  to cover the size.
3627*4882a593Smuzhiyun- The driver schedules the DMA transfer via the ScheduleDMAtoHost API call.
3628*4882a593Smuzhiyun- The card raises the DMA Complete interrupt.
3629*4882a593Smuzhiyun- The driver checks the DMA status register for any errors.
3630*4882a593Smuzhiyun- The driver post-processes the newly transferred buffers.
3631*4882a593Smuzhiyun
3632*4882a593SmuzhiyunNOTE! It is possible that the Encoder and DMA Complete interrupts get raised
3633*4882a593Smuzhiyunsimultaneously. (End of the last, start of the next, etc.)
3634*4882a593Smuzhiyun
3635*4882a593SmuzhiyunMailbox #10
3636*4882a593Smuzhiyun~~~~~~~~~~~
3637*4882a593Smuzhiyun
3638*4882a593SmuzhiyunThe Flags, Command, Return Value and Timeout fields are ignored.
3639*4882a593Smuzhiyun
3640*4882a593Smuzhiyun- Name:       Mailbox #10
3641*4882a593Smuzhiyun- Results[0]: Type: 0: MPEG.
3642*4882a593Smuzhiyun- Results[1]: Offset: The position relative to the card's memory space.
3643*4882a593Smuzhiyun- Results[2]: Size: The exact number of bytes to transfer.
3644*4882a593Smuzhiyun
3645*4882a593SmuzhiyunMy speculation is that since the StartCapture API has a capture type of "RAW"
3646*4882a593Smuzhiyunavailable, that the type field will have other values that correspond to YUV
3647*4882a593Smuzhiyunand PCM data.
3648*4882a593Smuzhiyun
3649*4882a593SmuzhiyunScatter-Gather Array
3650*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~~
3651*4882a593Smuzhiyun
3652*4882a593SmuzhiyunThe scatter-gather array is a contiguously allocated block of memory that
3653*4882a593Smuzhiyuntells the card the source and destination of each data-block to transfer.
3654*4882a593SmuzhiyunCard "addresses" are derived from the offset supplied by Mailbox #10. Host
3655*4882a593Smuzhiyunaddresses are the physical memory location of the target DMA buffer.
3656*4882a593Smuzhiyun
3657*4882a593SmuzhiyunEach S-G array element is a struct of three 32-bit words. The first word is
3658*4882a593Smuzhiyunthe source address, the second is the destination address. Both take up the
3659*4882a593Smuzhiyunentire 32 bits. The lowest 18 bits of the third word is the transfer byte
3660*4882a593Smuzhiyuncount. The high-bit of the third word is the "last" flag. The last-flag tells
3661*4882a593Smuzhiyunthe card to raise the DMA_DONE interrupt. From hard personal experience, if
3662*4882a593Smuzhiyunyou forget to set this bit, the card will still "work" but the stream will
3663*4882a593Smuzhiyunmost likely get corrupted.
3664*4882a593Smuzhiyun
3665*4882a593SmuzhiyunThe transfer count must be a multiple of 256. Therefore, the driver will need
3666*4882a593Smuzhiyunto track how much data in the target buffer is valid and deal with it
3667*4882a593Smuzhiyunaccordingly.
3668*4882a593Smuzhiyun
3669*4882a593SmuzhiyunArray Element:
3670*4882a593Smuzhiyun
3671*4882a593Smuzhiyun- 32-bit Source Address
3672*4882a593Smuzhiyun- 32-bit Destination Address
3673*4882a593Smuzhiyun- 14-bit reserved (high bit is the last flag)
3674*4882a593Smuzhiyun- 18-bit byte count
3675*4882a593Smuzhiyun
3676*4882a593SmuzhiyunDMA Transfer Status
3677*4882a593Smuzhiyun~~~~~~~~~~~~~~~~~~~
3678*4882a593Smuzhiyun
3679*4882a593SmuzhiyunRegister 0x0004 holds the DMA Transfer Status:
3680*4882a593Smuzhiyun
3681*4882a593Smuzhiyun- bit 0:   read completed
3682*4882a593Smuzhiyun- bit 1:   write completed
3683*4882a593Smuzhiyun- bit 2:   DMA read error
3684*4882a593Smuzhiyun- bit 3:   DMA write error
3685*4882a593Smuzhiyun- bit 4:   Scatter-Gather array error
3686