SPONSORED LINKS

Aureal Vortex Sound Board Chipset Technical description.


This VERY preliminary and buggy. Don't rely on this document. There is ABOSULUTELY NO WARRANTY about the content of this document. Any corrections, addition however are gladly welcome.


Preamble


This a mix of several separate pieces of documents, most of them part of the Sourceforge and Savannah disassembling project efforts. The goal of this paper is to order and combine all of the available information regarding this superb and historical important audio chipset. I would like to thank anyone involved at the Sourceforge Aureal and the Savannah OpenVortex projects.


General description


The vortex architecture consists of a variety of modules that are connected by programmable routes. Various routes are made between the these modules to produce the desired results. For example, a route can be made between a DMA controller and output codec, or from a DMA controller to a sample rate converter and then to the output codec. They can be strung together in a variety of ways.



























Dotted lines are possibly routeable audio data path. The existence and internals of the EQ and A3D module are very uncertain, and probably we will not be able to be used :-(










There are several i/o ports mapped to a MMIO area of different size, depending on the particular model, which are used to control and monitor the behavior of the chipset.

There are some mayor family of ports, which will be described along this document in sequence






General Configuration Register


This is a general configuration port, which contains the following global configuration flags.



AU8810

AU8820 (0x1280c)

AU8830

Enable glob. IRQ


0x00004000

0x0004000

Enable MPU401


0xffffff9f


0x330 - 0x331


0x00000600


0x3xx - 0x3xx


0x00000400


0x3xx - 0x3xx


0x00000200


(disabled?)


0x00000000


Enable Joystick


0xfffff1ff




(PORT << 9)




Interrupt Control and Status Registers



Here is a table of the names (suggestions?) of the interrupt related registers for each of the Aureal chipset family.


Chipset

IRQ_GLOB

IRQ_SOURCE

IRQ_CTRL

IRQ_STAT

AU8810





AU8820

0x1280c

0x12800

0x12804

0x1199c

AU8830








This port allows to enable or disable individual sources of interrupts, for example the MIDI port, Timer or whatever. The flags for each Interrupt source are the same as the IRQ_SOURCE flags.

Information regarding this port is not 100% tested.


IRQ_CTRL

AU8810

AU8820

AU8830

IRQ_FATAL


0x00000001


IRQ_PARITY


0x00000002


IRQ_PCMOUT


0x00000020


IRQ_TIMER


0x00001000


IRQ_MIDI


0x00002000





There are several sources which can cause an interrupts. The IRQ_SOURCE port allows to demultiplex the different sources of interrupts; in other words, to know who produced the interrupts and needs servicing.



IRQ_SOURCE

AU8810

AU8820

AU8830

IRQ_FATAL


0x00000001


IRQ_PARITY


0x00000002


IRQ_PCMOUT


0x00000020


IRQ_TIMER


0x00001000


IRQ_MIDI


0x00002000




The chipset has a programmable Timer, which can be programmed to generate periodic interrupts for example to update DMA buffers. The associated port has a different function for reading and writing. When read it acknowledges the current interrupt (?) and when written one can set the Timer period in 1/48000 second units. A typical value is 0x60 which equals to about 500 interrupts per second.



AC97 Codec I/O



Chipset

CODEC_CTRL

CODEC_EN

CODEC_CHN

CODEC_IO


AU8810






AU8820

0x11984

0x11990

0x11880

0x11988


AU8830

0x29184

0x29190

0x29080

0x29188




CODEC_CTRL


A static write sequence to this port initializes the CODEC with a 5ms delay in between. This sequence are:


For AU8810: FIXME

For AU8820: 0x00a8, 0x80a8, 0x80e8, 0x80a8, 0x00a8, 0x00e8

For AU8830: 0x8068, 0x00e8


CODEC_IO


This port is used to communicate directly to the codec. To differentiate between address and command, write or read, etc, the following masks, and shift constants are used:



Write Flag: 0x800000



ADDRSHIFT: 16

ADDRMASK: 0x007f0000



DATSHIFT: 0

DATMASK: 0x0000ffff


CODEC_EN


This register purpose is to enable/disable the different channels of the codec. Each channel has a flag associated to it. There are only two interesting flags, for channel 0 and 1.


Channel0: 0x00000100

Channel0: 0x00000200


CODEC_CHN


The only known thing about this register is that its the base of a series of register which are initialized once and never touched again.


AU8810:

FIXME!


AU8830 and AU8820: 32 writes, following this pattern:


CODEC_CHN + 0x0 = 0x00000000

CODEC_CHN + 0x4 = 0xffffffff

CODEC_CHN + 0x8 = 0xfffffffe

CODEC_CHN + 0xc = 0xfffffffd

...


The complete initialization sequence is:



ADB DMA Engine


The Audio Data Bus interconnects each of the Aureal chipset components. The ADB_CTRL and ADB_STATUS access the same internal register, but one is read only and the other is write only, providing complete write read access with the corresponding MMIO ports.



Chipset

ADB_SMPR

ADB_CTRL

ADB_STATUS

ADB_S0

ADB_S1

AU8810






AU8820

0x10a00

0x10580

0x105c0

0x10608

0x1060c

AU8830

0x28400

0x27a00

0x27e00




ADB_SMPR:


The lower word of the DMA_SMPR register controls sample rate enable/disable. Each channel is assigned 2 bits. The lower bit is for enabling the mono sample rate and the upper bit for stereo sample rate.


--Example--

xxxx xxxx xxxx xxxx | 0000 0000 0000 0000 = sample rate disabled

xxxx xxxx xxxx xxxx | 0000 0000 0000 0001 = mono sample rate on first channel

xxxx xxxx xxxx xxxx | 0000 0000 0000 0010 = stereo sample rate on first channel




ADB_CTRL(w)

AU8810

AU8820

AU8830

DMA position


0x00000fff


DMA cur. subbuffer


0x00003000


FIFO


0x0003c000


interrupt


0x00001000








ADB_STATUS(r)

AU8810

AU8820

AU8830

DMA position


0xfffff000


DMA cur. subbuffer


0x00003000


FIFO Control


0x0003c000


stop


0x00000000


start


0x00020000


init


0x00010000


















WT DMA Engine


The WT DMA Engine is another audio data path presumably used for the WaveTable engine. The WT_CTRL and WT_STATUS, same as the similar ADB registers, access the same internal register, but one is read only and the other is write only, providing complete read write access with the corresponding MMIO ports. In the particular case of the AU8820, these MMIO addresses are the same.



Chipset

WT_SMPR ?

WT_STATUS

WT_CTRL

WT_S0

WT_S1

AU8810






AU8820

0x10500

0x10500

0x10600

0x10604

AU8830


0x27d00

0x27900




WT_SMPR:


The lower word of the DMA_SMPR register controls sample rate enable/disable. Each channel is assigned 2 bits. The lower bit is for enabling the mono sample rate and the upper bit for stereo sample rate.


--Example--

xxxx xxxx xxxx xxxx | 0000 0000 0000 0000 = sample rate disabled

xxxx xxxx xxxx xxxx | 0000 0000 0000 0001 = mono sample rate on first channel

xxxx xxxx xxxx xxxx | 0000 0000 0000 0010 = stereo sample rate on first channel




WT_STATUS

AU8810

AU8820

AU8830

DMA position


0x00000fff


DMA cur. Sub buffer


0x00600000

0x00003000

FIFO ?


0x0003c000

-

FIFO enabled?



0x00200000







WT_CTRL

AU8810

AU8820

AU8830

?


0x0000f000


Arg 1 & 5 (int)


0x00001000


Enforced high


0x00002000


FIFO ?


0x0003c000


FIFO enabled?


0x00020000

0x00200000












FIFO



Chipset

ADB_FIFO_CTRL

ADB_FIFO_DATA

WT_FIFO_CTRL

WT_FIFO_DATA

AU8810





AU8820

0xf800

0xe000

0xf840

0xe800

AU8830

0x16100

0x14000

0x16000

0x10000



The FIFO_CTRL registers are a set of FIFO control register, which control the behavior and status of the FIFO data. There is a set of those for the ADB and another for the WT engine.



FIFO_CTRL

AU8810

AU8820

AU8830

set this reg. readonly


0x00000001

0x00000001

can do CTRL


0x00000002

0x00000002

Valid


0x00000010

0x00000010

Empty


0x00000020

0x00000020

?


0x00010000



The FIFO data registers are the actual data registers of the FIFO. There is one FIFO for each audio data path, the ADB FIFO and the WT FIFO.



AU8830:


StartFIFO

0x27a00 = 0x22000


Enable/DisableFIFO

set the 22 bit of 0x27e00


Init

0x16100 + num*4 |= 0x41000, 42000


AU8820:


StartFIFO

0x10580 |= 0x22000


Enable Disable


Init

0xf800 + num*4 |= 0x10000






Chipset

SAMPLE_TIMER

TIMER_UNK1

AU8810



AU8820

0x11998

0x1199c

AU8830






SAMPLE_TIMER


This register holds the sample time. This register is read only.


TIMER_UNK1


This register when read clears the Timer interrupt. When written to allows to set the timer timeout value (period). It looks like there are some flags mapped to this register, but their use is unknown.


AU8820: upper limit appears to be 0x3ffff

masks: 0x800000, 0xffffff, 0xff000000



ROUTING