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