fw-memory.txt 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. This document describes the cx2341x memory map and documents some of the register
  2. space.
  3. Warning! This information was figured out from searching through the memory and
  4. registers, this information may not be correct and is certainly not complete, and
  5. was not derived from anything more than searching through the memory space with
  6. commands like:
  7. ivtvctl -O min=0x02000000,max=0x020000ff
  8. So take this as is, I'm always searching for more stuff, it's a large
  9. register space :-).
  10. Memory Map
  11. ==========
  12. The cx2341x exposes its entire 64M memory space to the PCI host via the PCI BAR0
  13. (Base Address Register 0). The addresses here are offsets relative to the
  14. address held in BAR0.
  15. 0x00000000-0x00ffffff Encoder memory space
  16. 0x00000000-0x0003ffff Encode.rom
  17. ???-??? MPEG buffer(s)
  18. ???-??? Raw video capture buffer(s)
  19. ???-??? Raw audio capture buffer(s)
  20. ???-??? Display buffers (6 or 9)
  21. 0x01000000-0x01ffffff Decoder memory space
  22. 0x01000000-0x0103ffff Decode.rom
  23. ???-??? MPEG buffers(s)
  24. 0x0114b000-0x0115afff Audio.rom (deprecated?)
  25. 0x02000000-0x0200ffff Register Space
  26. Registers
  27. =========
  28. The registers occupy the 64k space starting at the 0x02000000 offset from BAR0.
  29. All of these registers are 32 bits wide.
  30. DMA Registers 0x000-0xff:
  31. 0x00 - Control:
  32. 0=reset/cancel, 1=read, 2=write, 4=stop
  33. 0x04 - DMA status:
  34. 1=read busy, 2=write busy, 4=read error, 8=write error, 16=link list error
  35. 0x08 - pci DMA pointer for read link list
  36. 0x0c - pci DMA pointer for write link list
  37. 0x10 - read/write DMA enable:
  38. 1=read enable, 2=write enable
  39. 0x14 - always 0xffffffff, if set any lower instability occurs, 0x00 crashes
  40. 0x18 - ??
  41. 0x1c - always 0x20 or 32, smaller values slow down DMA transactions
  42. 0x20 - always value of 0x780a010a
  43. 0x24-0x3c - usually just random values???
  44. 0x40 - Interrupt status
  45. 0x44 - Write a bit here and shows up in Interrupt status 0x40
  46. 0x48 - Interrupt Mask
  47. 0x4C - always value of 0xfffdffff,
  48. if changed to 0xffffffff DMA write interrupts break.
  49. 0x50 - always 0xffffffff
  50. 0x54 - always 0xffffffff (0x4c, 0x50, 0x54 seem like interrupt masks, are
  51. 3 processors on chip, Java ones, VPU, SPU, APU, maybe these are the
  52. interrupt masks???).
  53. 0x60-0x7C - random values
  54. 0x80 - first write linked list reg, for Encoder Memory addr
  55. 0x84 - first write linked list reg, for pci memory addr
  56. 0x88 - first write linked list reg, for length of buffer in memory addr
  57. (|0x80000000 or this for last link)
  58. 0x8c-0xcc - rest of write linked list reg, 8 sets of 3 total, DMA goes here
  59. from linked list addr in reg 0x0c, firmware must push through or
  60. something.
  61. 0xe0 - first (and only) read linked list reg, for pci memory addr
  62. 0xe4 - first (and only) read linked list reg, for Decoder memory addr
  63. 0xe8 - first (and only) read linked list reg, for length of buffer
  64. 0xec-0xff - Nothing seems to be in these registers, 0xec-f4 are 0x00000000.
  65. Memory locations for Encoder Buffers 0x700-0x7ff:
  66. These registers show offsets of memory locations pertaining to each
  67. buffer area used for encoding, have to shift them by <<1 first.
  68. 0x07F8: Encoder SDRAM refresh
  69. 0x07FC: Encoder SDRAM pre-charge
  70. Memory locations for Decoder Buffers 0x800-0x8ff:
  71. These registers show offsets of memory locations pertaining to each
  72. buffer area used for decoding, have to shift them by <<1 first.
  73. 0x08F8: Decoder SDRAM refresh
  74. 0x08FC: Decoder SDRAM pre-charge
  75. Other memory locations:
  76. 0x2800: Video Display Module control
  77. 0x2D00: AO (audio output?) control
  78. 0x2D24: Bytes Flushed
  79. 0x7000: LSB I2C write clock bit (inverted)
  80. 0x7004: LSB I2C write data bit (inverted)
  81. 0x7008: LSB I2C read clock bit
  82. 0x700c: LSB I2C read data bit
  83. 0x9008: GPIO get input state
  84. 0x900c: GPIO set output state
  85. 0x9020: GPIO direction (Bit7 (GPIO 0..7) - 0:input, 1:output)
  86. 0x9050: SPU control
  87. 0x9054: Reset HW blocks
  88. 0x9058: VPU control
  89. 0xA018: Bit6: interrupt pending?
  90. 0xA064: APU command
  91. Interrupt Status Register
  92. =========================
  93. The definition of the bits in the interrupt status register 0x0040, and the
  94. interrupt mask 0x0048. If a bit is cleared in the mask, then we want our ISR to
  95. execute.
  96. Bit
  97. 31 Encoder Start Capture
  98. 30 Encoder EOS
  99. 29 Encoder VBI capture
  100. 28 Encoder Video Input Module reset event
  101. 27 Encoder DMA complete
  102. 26
  103. 25 Decoder copy protect detection event
  104. 24 Decoder audio mode change detection event
  105. 23
  106. 22 Decoder data request
  107. 21 Decoder I-Frame? done
  108. 20 Decoder DMA complete
  109. 19 Decoder VBI re-insertion
  110. 18 Decoder DMA err (linked-list bad)
  111. Missing
  112. Encoder API call completed
  113. Decoder API call completed
  114. Encoder API post(?)
  115. Decoder API post(?)
  116. Decoder VTRACE event