Digital Audio Broadcasting
G. Acher &
D. Fliegl |
Informationen zu den DAB-Projekten
Stand 8.4.2003
Inhalt (in Klammern die damit zusammenhängenden Projekte)
-
DAB-PCI-Karte (P2)
-
DAB-USB-Module (P1)
-
AN2131-Tools und Hinweise (P1)
-
Aufbau von MPEG-Frames/Paketdaten (P2)
-
DFIRE-1 (P1, P2)
-
Digital-Analog-Wandler DAC3550A (P1)
-
Der I2C-Bus (P1)
DAB-PCI-Karte (P2)
Die DAB-PCI-Karte von Bosch/Technotrend basiert auf dem DFIRE1-Modul von
Bosch.
Für den Betrieb unter Linux ist bereits ein Treiber (dabcore) vorhanden,
der den RDI-Rohdatenstrom
(384KB/s) unter /dev/rdi zum Lesen zur Verfügung stellt.
Über dieses Device erfolgt ebenfalls die DCSR-Kommunikation mittels
ioctl()-Aufrufen:
-
IOCTL_DAB_WRITE_DPR
Schreibt an Adresse x im DPR den Wert y.
Benutzung:
ioctl(fd, IOCTL_DAB_WRITE_DPR, (y<<16)|x)
-
IOCTL_DAB_READ_DPR
Liest von DPR-Adress x ein Byte
Benutzung:
byte=ioctl(fd, IOCTL_DAB_READ_DPR, x)
Der mit den DFIRE mögliche Interrupt zur Signalisierung neuer Daten
vom DFIRE wird hier
nicht benutzt.
Die Include-Datei mit der ioctl()-Definition ist in
/usr/local/include/dabcore.h zu finden.
Um bereits an der RDI Dekodierung arbeiten zu können, solange DCSR
noch nicht funktioniert,
steht das Programm dab zur Verfügung, das mit dab -t 12d
folgende DFIRE-Einstellungen vornimmt:
-
Tuning auf das Bayern Ensemble 12D (229.072MHz)
-
RDI auf Extended Capacity
-
Ausgabe aller vorhandenen Subchannels (1-7 und 11) auf RDI
Nach dem Aufruf von dab, Warten auf die Meldung "Server running" und dem
Abbruch mit CTRL-C kann der RDI-Strom z.B. mit cat /dev/rdi gelesen
und analysiert
werden.
dab kann auch zum Testen und für Inspirationen benutzt werden, da
es bereits einen HTTP-Server beinhaltet, den Sourcecode gibt's natürlich
nicht...
DAB-USB-Modul (P1)
Das DAB-USB-Modul benutzt für Projekt 1 USB nur zum Laden des Programms
für den
Mikrocontroller AN2131, d.h. es muss nichts für USB programmiert
werden...
Zur leichteren Einarbeitung steht ein Programmgerüst zur Verfügung,
was den AN2131 und
das zur Funktion unbedingt nötige FPGA initialisiert und einge
Leuchtdioden blinken lässt.
Dieses Gerüst soll dann erweitert werden.
Weitere auf dem DAB-USB-Modul vorhandene Komponenten (neben dem DFIRE-1):
-
LCD 2*16 Zeichen, HD44780-kompatibel, jedoch keine Lesemöglichkeit
vom LCD
-
Digital-Analog-Wandler (DAC3550A) mit I2S (Audiodaten) und I2C (Steuerung)
-
2*2 Tasten-Matrix
-
32KByte EEPROM (an I2C angeschlossen), davon (wenn gewünscht) 4K nutzbar als Stationsspeicher
- 2 LEDs
Die Hardware ist über folgenden Adressen/Ports
ansprechbar: DFIRE-DPR: External Memory, 0x8400-0x87FF, R/W
LCD:
External Memory, 0x8802 (RS=0), 0x8803 (RS=1), nur W
Tasten-Matrix:
AN2131-Port B, Pins B0-B3, je eine Taste zwischen B0-B1, B1-B2, B2-B3 und
B3-B0.
DAC3550A Control: I2C-Adresse 0x9A/0x9B
EEPROM Control:
I2C-Adresse 0xA2/0xA3
LEDs: AN2131-Port A, Pins A6-A7
Für das LCD
werden in io.c einige Funktionen bereitgestellt, die rudimentäre
Ausgabefunktionen beinhalten.
Diese können (müssen aber nicht)
erweitert werden.
Vorhandene LCD-Funktionen:
clear_lcd()
putc(char c)
poscursor(char x, char y)
puts(char *s)
AN2131 Tools und Hinweise (P1)
Der 8051-C-Compiler/Assembler ist
SDCC, dieser produziert aber recht ineffizienten Code und auch tw. einige
Fehler, sodass evtl. bei entsprechener Programmgrösse auch in Assembler
programmiert werden muss. Wir raten von C-Programmierung (ausser für erste
Tests) ab!
Der 8051-Linker erzeugt ein Intel-Hex-Format, die Endung des Binaries
ist. ihx.
Debugging über LCD möglich...
Mit "ezload <binary.ihx> "wird der Code in den AN2131 geladen und
ein
Reset ausgeführt. Damit wird das Programm an Adresse 0 gestartet.
Alle im AN2131 beschriebenen Register sind in regezusb.h (für
C) bzw. in
regezusb.asm (für Assembler) definiert.
Werden im Assemblercode externe C-Symbole verwendet, so müssen
diese mit
einem Unterstrich (_) benutzt werden!
Aufbau von MPEG-Frames und Paketdaten (P2)
Zum Extrahieren der Programm-Associated-Data (PAD) ist genaue Kenntnis
der MPEG-Struktur
notwendig. Diese ist in der DAB-Spezifikation detailiert beschrieben. Die
MPEG-Daten, die
über obige Webaddressen geholt werden, sind ohne weitere Zusatzinformationen.
Die Paketdaten aus obiger Datenquelle werden (zur einfacheren Synchronisation
auf den Paketanfang)
am Anfang mit den zusätzlichen Bytes 0xFF 0xFE 0xFD 0xFC (in dieser
Reihenfolge)) übertragen.
Allerdings beginnen nicht alle Pakete mit diesem Synchronisationswort,
sondern nur einige.
DFIRE-1 (P1, P2)
Das DFIRE1-Modul empfängt und dekodiert DAB soweit, dass der entstehende
Datenstrom
leicht auf dem PC weiterverarbeitet werden.
Das Modul hat drei wichtige Schnittstellen:
-
RDI (Receiver Data Interface)
DAB-Transportdatenstrom mit 384kByte/s (brutto) bzw. ca. 288kByte/s
(netto).
Dieser Datenstrom enthält in codierter Form FIGs und MSC. Da als
Ausgabeweg
ursprünglich das SPDIF-Format benutzt wurde (Digital Out bei CD
etc.) werden
darüber 24Bit übertragen, wovon i.A. 22Bit "echte" DAB-Daten
sind, das RDI
wird also im "Extendec Capacity Mode" betrieben. Die verbleibenden
2Bit zeigen
den Typ der übertragenen Daten an (MSC, FIG etc.). Der MSC wird
in RDI nach
den einzelnen Subchannels sortiert übertragen. Jeder Sucbchannel
muss einzeln
"abonniert" werden, um im RDI zu erscheinen. "Frisch" eingestellt,
werden nur
die Daten aus den FIC übertragen.
Hinweis: Genaueres steht in der RDI-Spec. Einfach mal (nach dab_tune)
den Datenstrom
aufnehmen und knobeln, wie das mit der Spec zusammenhängt...
-
DCSR (Digital Commandset for Receivers)
Über DCSR erfolgt die Steuerung des Moduls. Dazu werden Nachrichten
bidirektional
zw. PC und Modul ausgetauscht. Die Kommunikation erfolgt dabei über
ein
Dual Ported RAM (DPR) mit 1Kbyte Speicher, auf das PC wie DFIRE zugreifen
können.
Für beide Richtungen (PC->DFIRE, DFIRE->PC) gibt es definierte
Bereiche im DPR.
Die Kommunikation erfolgt dabei über Ringpufferstrukturen und
Signalisierungsflags.
Die wichtigsten Kommandos:
-
Tunen
-
Abfrage des Empfangsstatus (Qualität)
-
Selektion der Subchannels (RDI/I2S)
-
Grundinformationen zum empfangenen Ensemble (wichtig für P1)
-
Sammeln von FIG-Daten (wichtig für P1)
-
I2S (Audioausgang)
DFIRE kann bereits einen MPEG2-Datenstrom dekodieren und im sog. I2S-Format
ausgeben. Daran ist (sowohl auf der DAB-PCI-Karte als auch beim DAB-USB)
ein
Digital-Analogwandler (DAC) angebunden. An dessen Ausgang können
Kopfhörer
etc. angeschlossen werden.
Welcher Kanal ausgeben werden soll, kann mit einem DCSR-Kommando bestimmt
werden.
Weitere Informationen: Siehe DAC3550A
Wichtig für Projekt 2: RDI und DCSR
Wichtig für Projekt 1: DCSR und I2S
Digital-Analog-Wandler DAC3550A (P1)
Dieser Baustein sorgt für die Hörbarmachung eines selektieren
Audiokanals und besitzt auch einen
Kopfhörerverstärker und eine Lautstärkeregelung. Die
Steuerung des Chips erfolgt über den I2C-Bus
(siehe dort). Wichtig sind Grundinitalisierung und Einstellung der
Lautstärke. (siehe Datenblatt DAC3550A).
Der I2C-Bus (P1)
Der I2C-Bus besteht aus nur zwei Leitungen (ist also seriell) und wird
sehr häufig zur Steuerung
von Bausteinen im Audio/TV-Bereich eingesetzt. Für das Projekt
reicht es aus, zu wissen, dass j
eder Chip eine individuelle I2C-Adresse hat (möglich alle geraden
Zahlen zw. 0 und 254, der
DAC3550A hat 0x9A), über die er angesprochen werden kann. Der
Ablauf beim Schreiben ist
dabei folgender:
Startbedingung setzen.
Addresse ausgeben (1 Byte)
Warten, bis der angesprochene Baustein das bestätigt (acknowledge)
Daten (soviel Bytes wie nötig) mit warten auf acknowledge
Stopbedingung setzen
fertig...
Das genaue Timing erledigt der AN2131 über die zwei Register
I2CS und I2DAT, der Ablauf ist
sehr schön im AN2131-Datenblatt beschrieben.