Difference between revisions of "DSP"
(Provide some DMA examples and more documentation (wip)) |
(Finish work on DMA examples) |
||
Line 100: | Line 100: | ||
** 1 = ? | ** 1 = ? | ||
− | * Sample format (Bit-offset 10; 3-bits). | + | * Sample format (Bit-offset 10; 3-bits).{{FIXME|reason=Some of these need tests with signed datatypes}} |
** 0x0 = 8 bit (1 DSP word / 1 byte); ''sample-count must be multiple of 4, or transfer is skipped; rounded; byte MSB is flipped'' | ** 0x0 = 8 bit (1 DSP word / 1 byte); ''sample-count must be multiple of 4, or transfer is skipped; rounded; byte MSB is flipped'' | ||
− | *** Buffer to DSP: bytes 0x12,0x34,0x56,0x78 | + | *** Buffer to DSP: bytes: <code>0x12,0x34,0x56,0x78</code> → words: <code>0x920000, 0xB40000, 0xD60000, 0xF80000</code> |
− | *** Buffer to DSP: bytes 0x92,0xB4,0xD6,0xF8 | + | *** Buffer to DSP: bytes: <code>0x92,0xB4,0xD6,0xF8</code> → words: <code>0x120000, 0x340000, 0x560000, 0x780000</code> |
− | *** DSP to buffer: words 0x927FFF, 0xB47FFF, 0xD67FFF, 0xF87FFF | + | *** DSP to buffer: words: <code>0x927FFF, 0xB47FFF, 0xD67FFF, 0xF87FFF</code> → bytes: <code>0x12,0x34,0x56,0x78</code> ''(Rounded down)'' |
− | *** DSP to buffer: words 0x928000, 0xB48000, 0xD68000, 0xF88000 | + | *** DSP to buffer: words: <code>0x928000, 0xB48000, 0xD68000, 0xF88000</code> → bytes: <code>0x13,0x35,0x57,0x79</code> ''(Rounded up)'' |
** 0x1 = 16 bit (1 DSP word / 2 bytes) ''sample-count must be multiple of 2, or transfer is skipped; truncated'' | ** 0x1 = 16 bit (1 DSP word / 2 bytes) ''sample-count must be multiple of 2, or transfer is skipped; truncated'' | ||
− | *** Buffer to DSP: bytes 0x34,0x12 | + | *** Buffer to DSP: bytes: <code>0x34,0x12</code> → word: <code>0x123400</code> |
− | *** DSP to buffer: | + | *** DSP to buffer: word: <code>0x1234FF</code> → bytes: <code>0x34,0x12</code> ''(Truncated)'' |
− | *** DSP to buffer: | + | *** DSP to buffer: word: <code>0x123400</code> → bytes: <code>0x34,0x12</code> ''(Truncated)'' |
− | ** 0x2 = 24 bit in MSB (1 DSP word / 4 bytes) | + | ** 0x2 = 24 bit in MSB (1 DSP word / 4 bytes); ''padded'' |
− | *** Buffer to DSP: bytes 0x00,0x56,0x34,0x12 | + | *** Buffer to DSP: bytes: <code>0x00,0x56,0x34,0x12</code> → word: <code>0x123456</code> ''(Padding ignored)'' |
− | *** DSP to buffer: word 0x123456 | + | *** Buffer to DSP: bytes: <code>0xFF,0x56,0x34,0x12</code> → word: <code>0x123456</code> ''(Padding ignored)'' |
− | ** 0x3 = 32 bit (2 DSP words / 4 bytes) | + | *** DSP to buffer: word: <code>0x123456</code> → bytes: <code>0x00,0x56,0x34,0x12</code> ''(Zero padding)'' |
− | *** Buffer to DSP: bytes 0x12,0xBC,0x9A,0x78 | + | ** 0x3 = 32 bit (2 DSP words / 4 bytes); ''trunacted'' |
− | *** DSP to buffer: words | + | *** Buffer to DSP: bytes: <code>0x12,0xBC,0x9A,0x78</code> → words: <code>0x120000, 0x789ABC</code> |
+ | *** DSP to buffer: words: <code>0x12FFFF, 0x789ABC</code> → bytes: <code>0x12,0xBC,0x9A,0x78</code> ''(Truncated)'' | ||
+ | *** DSP to buffer: words: <code>0x120000, 0x789ABC</code> → bytes: <code>0x12,0xBC,0x9A,0x78</code> ''(Truncated)'' | ||
** 0x4 = ''Transfer skipped'' | ** 0x4 = ''Transfer skipped'' | ||
** 0x5 = ''Transfer skipped'' | ** 0x5 = ''Transfer skipped'' | ||
− | ** 0x6 = 24 bit in LSB (1 DSP word / 4 bytes) | + | ** 0x6 = 24 bit in LSB (1 DSP word / 4 bytes); ''padded'' |
− | *** Buffer to DSP: bytes 0x56,0x34,0x12,0x00 | + | *** Buffer to DSP: bytes: <code>0x56,0x34,0x12,0x00</code> → word: <code>0x123456</code> ''(Padding ignored)'' |
− | *** DSP to buffer: word 0x123456 | + | *** Buffer to DSP: bytes: <code>0x56,0x34,0x12,0xFF</code> → word: <code>0x123456</code> ''(Padding ignored)'' |
+ | *** DSP to buffer: word: <code>0x123456</code> → bytes: <code>0x56,0x34,0x12,0x00</code> ''(Zero padding)'' | ||
** 0x7 = ''Transfer skipped'' | ** 0x7 = ''Transfer skipped'' | ||
Revision as of 06:49, 27 December 2018
The DSPs in the APU are probably "Parthus MediaStream" DSP core (DSP24210/DSP2420?).
Those are similar to Motorola DSP56362 (DSP56300 Family). If so, the datasheet can be found at http://www.nxp.com/docs/en/data-sheet/DSP56362.pdf (Also see "Documentation" section in said datasheet for the related documentation)
Memory Size
Program RAM Size | X Data RAM Size | Y Data RAM Size | MIXBUF Size | |
---|---|---|---|---|
GP | 4096 x 24-bit | 4096 x 24-bit | 2048 x 24-bit | 992[FIXME] x 24-bit |
EP | 4096 x 24-bit | 3072 x 24-bit | 256 x 24-bit | n/a |
MIXBUF is accessible at X:$001400 in the GP.
Other datasheets for similar DSPs suggest that the memory sizes might be different if instruction cache or switch mode are toggled. It is currently unknown if the DSPs in the Xbox APU support a similar feature[FIXME].
DMA
This section is very incomplete and not much was tested on hardware either
DMA is controlled using peripheral registers:
- 0xFFFFD4: Memory address of next command block
- 0xFFFFD5: DMA_START_BLOCK[FIXME]
- 0xFFFFD6: DMA_CONTROL[FIXME]
- 0xFFFFD7: DMA_CONFIGURATION[FIXME]
Additionally, bit 7 in the interrupt register at 0xFFFFC5 is set if a DMA End-Of-List has been encountered.
Command blocks
DSP command blocks are loaded from X-Memory.
Word | Meaning | Notes |
---|---|---|
0 | Next command block address | Memory address of next command block.
Bit 14 is used as End-Of-List marker. |
1 | Transfer control word | Controls the DMA transfer:
|
2 | Transfer sample count | The number of samples to transfer. |
3 | DSP address | This is the address in the DSP:
|
4 | Buffer offset | This is the address within the buffer where the first sample is accessed. |
5 | Buffer base | Only used for circular buffers, ignored otherwise.[FIXME]
The start of the buffer. |
6 | Buffer size | Only used for circular buffers, ignored otherwise.[FIXME]
Size of buffer minus 1. For a buffer with 0x1000 bytes, this has to be 0xFFF. |