AC97 — Änderungen 11329 → 11330

Zeile 3: Zeile 3:
 
Ich gehe in diesem (mehr oder weniger) Tutorial davon aus, dass ihr einen einigermaßen funktionierenden [[PCI]]-Treiber habt, von dem ihr von einem Gerät mit einer bestimmten Hersteller- und Geräte-ID die BARs (in diesem Fall I/O-Räume) herausfinden könnt. Außerdem solltet ihr euch einigermaßen mit dem Aufbau von Sounddateien (WAV, also unkomprimiert) und somit auch mit Begriffen wie PCM oder Samplerate auskennen.
 
Ich gehe in diesem (mehr oder weniger) Tutorial davon aus, dass ihr einen einigermaßen funktionierenden [[PCI]]-Treiber habt, von dem ihr von einem Gerät mit einer bestimmten Hersteller- und Geräte-ID die BARs (in diesem Fall I/O-Räume) herausfinden könnt. Außerdem solltet ihr euch einigermaßen mit dem Aufbau von Sounddateien (WAV, also unkomprimiert) und somit auch mit Begriffen wie PCM oder Samplerate auskennen.
  
−
== Initialisierung ==
+
== Kompatible Geräte==
  
 
AC'97-kompatible Geräte erscheinen als [[PCI]]-Geräte mit dem Basisklassencode 04h (Multimediacontroller) und dem Subklassencode 01h (Audio). Doch das sind nur Soundkarten und entsprechende Chips im Allgemeinen, es kann sich bei solchen Geräten also auch um HD-Audio-Soundkarten oder andere inkompatible Audiogeräte handeln. Daher hier eine unvollständige Liste von AC'97-Geräten:
 
AC'97-kompatible Geräte erscheinen als [[PCI]]-Geräte mit dem Basisklassencode 04h (Multimediacontroller) und dem Subklassencode 01h (Audio). Doch das sind nur Soundkarten und entsprechende Chips im Allgemeinen, es kann sich bei solchen Geräten also auch um HD-Audio-Soundkarten oder andere inkompatible Audiogeräte handeln. Daher hier eine unvollständige Liste von AC'97-Geräten:
−
 
 
{| {{Prettytable}}
 
{| {{Prettytable}}
 
! Hersteller || Gerät
 
! Hersteller || Gerät
Zeile 15: Zeile 14:
 
|-
 
|-
 
| 0x8086 (Intel) || 0x2445 (82801BA - Intel ICH2)
 
| 0x8086 (Intel) || 0x2445 (82801BA - Intel ICH2)
 +
|-
 +
| 0x1106 (VIA)  || 0x3058 (vmtl. auf allen VIA-Mainboards verbauter AC'97-Chip)
 
|-
 
|-
 
|}
 
|}
  
 +
Leider sind die Schnittstellen zur Ansteuerung der Karten von Hersteller zu Hersteller unterschiedlich, sodass in separaten Abschnitten darauf eingegangen wird.
 +
 +
== Intel-Soundkarten ==
 
[[QEMU]] (0.10.0) und [[VirtualBox]] (2.1.4) nutzen ICH. Die in diesem Tutorial vorgestellten Codes funktionieren leider anscheinend auch nur dort.
 
[[QEMU]] (0.10.0) und [[VirtualBox]] (2.1.4) nutzen ICH. Die in diesem Tutorial vorgestellten Codes funktionieren leider anscheinend auch nur dort.
 +
 +
=== Initialisierung ===
  
 
Die Geräte besitzen zwei I/O-Räume, der erste heißt NAM-BAR (Native Audio Mixer BAR) und der zweite NABM-BAR (Native Audio Bus Master BAR). Mit den Registern in NAM-BAR wird der Mixer gesteuert (also Lautstärke, Samplerate, ...), mit denen in NABM-BAR wird das Abspielen gesteuert (Play/Pause, Soundbuffer, ...). Um diese I/O-Räume zu aktivieren und den Bus Master zu starten, muss der Wert des Registers „COMMAND“ im [[PCI]]-Konfigurationsraum mit 0x05 „ge-Or-t“ werden. Ein Beispiel:
 
Die Geräte besitzen zwei I/O-Räume, der erste heißt NAM-BAR (Native Audio Mixer BAR) und der zweite NABM-BAR (Native Audio Bus Master BAR). Mit den Registern in NAM-BAR wird der Mixer gesteuert (also Lautstärke, Samplerate, ...), mit denen in NABM-BAR wird das Abspielen gesteuert (Play/Pause, Soundbuffer, ...). Um diese I/O-Räume zu aktivieren und den Bus Master zu starten, muss der Wert des Registers „COMMAND“ im [[PCI]]-Konfigurationsraum mit 0x05 „ge-Or-t“ werden. Ein Beispiel:
Zeile 66: Zeile 72:
 
Danach sollte das Gerät arbeiten und Töne abspielen können.
 
Danach sollte das Gerät arbeiten und Töne abspielen können.
  
−
== Töne (etc.) ausgeben ==
+
=== Töne (etc.) ausgeben ===
  
 
Sollen Töne (oder irgendwelche anderen Dinge in dieser Richtung) abgespielt werden, so müssen diese in Einzelstücke zu je maximal 65536 Samples zerlegt werden. Diese müssen wie folgt im Speicher stehen:
 
Sollen Töne (oder irgendwelche anderen Dinge in dieser Richtung) abgespielt werden, so müssen diese in Einzelstücke zu je maximal 65536 Samples zerlegt werden. Diese müssen wie folgt im Speicher stehen:
Zeile 145: Zeile 151:
 
Funktioniert unter [[QEMU]] 0.10.0 und [[VirtualBox]] 2.1.4... Im Speicher müssen, wie oben gesagt, 16-Bit-Stereosamples mit einer Samplerate von 44,1 kHz (oder was ihr auch immer eingestellt habt), stehen.
 
Funktioniert unter [[QEMU]] 0.10.0 und [[VirtualBox]] 2.1.4... Im Speicher müssen, wie oben gesagt, 16-Bit-Stereosamples mit einer Samplerate von 44,1 kHz (oder was ihr auch immer eingestellt habt), stehen.
  
−
== Anhang ==
+
=== Anhang ===
  
 
Nötige Konstanten:
 
Nötige Konstanten:
Zeile 161: Zeile 167:
 
#define PORT_NABM_POCONTROL    0x001B
 
#define PORT_NABM_POCONTROL    0x001B
 
#define PORT_NABM_GLB_CTRL_STAT 0x0060</c>
 
#define PORT_NABM_GLB_CTRL_STAT 0x0060</c>
 +
 +
== VIA-Soundkarten ==
 +
 +
{{TODO|Testen und erweitern}}
 +
=== Initialisierung ===
 +
 +
VIAs AC'97-Soundkarte ist Funktion 5 der Southbridge, die sich ihre IO-Adressräume mit dem integrierten Modem (MC97) in Funktion 6 teilt. Wir behandeln im Folgenden nur AC'97. Der für uns relevante IO-Raum für DMA residiert im ersten PCI-BAR.
 +
 +
Die Karte bezieht Sounddaten aus aus mehreren Puffern, die in der SGD-Tabelle ("Scatter/Gather DMA Table") durch Deskriptoren folgenden Formats beschrieben werden. Die Basisadresse der Tabelle ist in das 32-bit-Register an Offset 0x4 zu schreiben und an 2-Byte-Grenzen auszurichten:
 +
<c>typedef struct
 +
{
 +
uint32_t buf;
 +
uint32_t len      : 24;
 +
uint32_t reserved :  5;
 +
uint32_t stop    :  1; // Transfer am Ende des Blocks unterbrechen. Um fortzufahren, setze Bit 2 in Register 0 (Audio SGD Read Channel Status)
 +
uint32_t flag    :  1; // Transfer am Ende des Blocks unterbrechen. Löst einen FLAG-Interrupt aus.
 +
uint32_t eol      :  1; // Letzter Eintrag. Löst einen EOL-Interrupt aus.
 +
} __attribute__((packed)) ac97Via_SGDEntry_t;</c>
  
 
== Weblinks ==
 
== Weblinks ==
  
 
* [http://www.intel.de/content/dam/doc/datasheet/io-controller-hub-6-datasheet.pdf Intels Programmierspezifikation (ICH6)]
 
* [http://www.intel.de/content/dam/doc/datasheet/io-controller-hub-6-datasheet.pdf Intels Programmierspezifikation (ICH6)]
 +
* [ftp://ftp.alsa-project.org/pub/manuals/via/VT82C686A%20SB%20datasheet%20rev%201.8.pdf VIA VT82C686A Datenblatt 1.82]
 
* [http://download.intel.com/support/motherboards/desktop/sb/ac97_r23.pdf Spezifikationen der Register (Abschnitt “Baseline Audio Register Set”), eher Hardwarespezifikationen]
 
* [http://download.intel.com/support/motherboards/desktop/sb/ac97_r23.pdf Spezifikationen der Register (Abschnitt “Baseline Audio Register Set”), eher Hardwarespezifikationen]