Autor Thema: Soundkartentreiber ES1370  (Gelesen 5075 mal)

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« am: 14. July 2010, 16:14 »
Hallo,

erstmal tolles Forum. Bisher bin ich sehr weit damit gekommen. Auch das Wiki ist wirklich Klasse.
Dennoch steh ich auf dem Schlauch. Ich versuche gerade für ein Project ein Treiber für den ES1370 zu schrieben.

Leider finde ich darüber keine Tuts oder andere Informationen.
Könnt ihr mir weiterhelfen? Vlt. ein paar Ansätze?!
Es handelt sich hierbei um ein Java basiertes OS.
Danke im voraus.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 14. July 2010, 17:00 »
Noch nie was damit gemacht, insofern kann ich nur versuchen, dir Quellen zu nennen, von denen ausgehend du dich selber schlau machen kannst. Zum einen wäre da http://alsa.cybermirror.org/manuals/ensoniq/es1370.ps.gz (Google-Suche nach "es1370 spec"), das dir schonmal eine Beschreibung der Register liefert. Das ist vermutlich das, woran du dich hauptsächlich halten solltest. Ansonsten könnte es sich evtl. auch noch lohnen, die es1370-Emulation im qemu-Quellcode anzuschauen.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 14. July 2010, 22:57 »
Danke erstmal für deine Antwort. Die Spec hatte ich bereits, aber mir ist dennoch die Vorgehensweise nicht klar.
Im Wiki habt ihr ein super AC97 Tut und ich bin auf der Suche nach dem gleichen aber für den ES1370.

Soweit ich das verstanden habe, muss ich erstmal im Controll-Register die Bits für DMA setzen.
Aber wie geht es nun weiter???

Nebenbei hab ich versucht den AC97 nachzuschreiben. Aber leider funktioniert das nicht :-(
Hab die Karte initialisiert aber erhalte keine Ausgabe. Gibt es eine einfachere Möglichkeit die Sample an die Soundkarte zu geben? Also ohne Buffer Descriptor Tablle?

Oder besser: Wie ein Sample aussieht.
« Letzte Änderung: 14. July 2010, 23:03 von GrandAgent »

Programm Noob

  • Gast
Gespeichert
« Antwort #3 am: 14. July 2010, 23:28 »
Moin

Guck dir doch einfach das Tut und die AC97 Spec an und dann versuche wenn du nebenbei von der ES1370 die Spec öffnest, was du anpassen musst. Es gibt nicht zu allem ein Tut. Versuch es mal so wie ich es vorgeschlagen habe uind wenn du noch fragen hast kannst du gerne in den IRC-Channel #Lost @ irc.euirc.net klären.

Falls du jetzt diesen Beitrag als zu angreifend so empfindet, dann schreib es, dann werde ich den Beitrag einfach löschen.

Programm Noob

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #4 am: 15. July 2010, 00:05 »
Nebenbei hab ich versucht den AC97 nachzuschreiben. Aber leider funktioniert das nicht :-(
Das steht ja da, ich habe es nur auf qemu und VBox zum Laufen bekommen. :-D

Gibt es eine einfachere Möglichkeit die Sample an die Soundkarte zu geben? Also ohne Buffer Descriptor Tablle?
Ich weiß von keiner. Wenn es einfacher ginge, hätte ich es bestimmt auch einfach gemacht. :wink:

Oder besser: Wie ein Sample aussieht.
Na ja, ein Sample ist im Fall von AC97 eben ein Wert von -32768 bis 32767 (so viel, wie in int16_t reinpasst). Zwei Samples hintereinander bilden einen Frame (afair), ein Sample für Links, eins für Rechts. Pro Sekunde werden 44 100 Frames abgespielt. Zum Testen dürfte es am einfachsten sein, einfach beide Samples in einem Frame auf den gleichen Wert zu setzen und die Werte alle zwei Frames von -32768 zu 32767 zu ändern. Weiß nicht, ob das funktioniert, aber es müsste so einen 10-kHz-Ton ausgeben.

Der Speicher sähe dann so aus:
0xFFFF 0xFFFF 0xFFFF 0xFFFF 0x7FFF 0x7FFF 0x7FFF 0x7FFF 0xFFFF 0xFFFF 0xFFFF 0xFFFF 0x7FFF 0x7FFF 0x7FFF 0x7FFF …0xFFFF müsste -32768 und 0x7FFF 32767 sein.

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 15. July 2010, 11:57 »
Hab gestern Nacht noch ein wenig herumprobiert, aber da geht nix :-(

package kernel;

public class ac97 {
static int commandStatusBegin;
static int NAMBar;
static int NABMBar;
static int volume;

        // Die benoetigten Port-Konstanten

static int PORT_NAM_RESET=0x0000;
static int PORT_NAM_MASTER_VOLUME=0x0002;
static int PORT_NAM_MONO_VOLUME=0x0006;
static int PORT_NAM_PC_BEEP=0x000A;
static int PORT_NAM_PCM_VOLUME=0x0018;
static int PORT_NAM_EXT_AUDIO_ID=0x0028;
static int PORT_NAM_EXT_AUDIO_STC=0x002A;
static int PORT_NAM_FRONT_SPLRATE=0x002C;
static int PORT_NAM_LR_SPLRATE=0x0032;
static int PORT_NABM_POBDBAR=0x0010;
static int PORT_NABM_POLVI=0x0015;
static int PORT_NABM_POCONTROL=0x001B;
static int  PORT_NABM_GLB_CTRL_STAT=0x0060;

public static void initAc97(){
ScreenOperations.print("initialsiere Soundkarte");
// Auslesen des Comand-Registers und setzen der Flags:
// 0: I/O Raum vom Gerät verwenden
// 2: Bus-Master
commandStatusBegin=pciBus.readPCI(0, 4, 0, 1)|5;

// ScreenOperations.printHex(commandStatusBegin);

// Neuer Comand schreiben

pciBus.writePCI(0, 4, 0, 1, commandStatusBegin);

//Bus-Master gestartet
//Gerät resetten,
//die Lautstärke und die Samplerrate eingestellen

MAGIC.wIOs16(NAMBar+PORT_NAM_RESET, (short) 42);
MAGIC.wIOs8(NABMBar+PORT_NABM_GLB_CTRL_STAT, (byte)0x02);
int temp1=Interrupts.flag+40;
int temp=0;

// Warten, wird noch schicker gemacht

ScreenOperations.print("Hallo");
while(Interrupts.flag!=temp1){
temp=0;
}
ScreenOperations.print("Ende");

// Lautstaerke setzen
volume=0;
MAGIC.wIOs16(NAMBar+PORT_NAM_MASTER_VOLUME, (short) (volume<<8|volume));
MAGIC.wIOs16(NAMBar+PORT_NAM_MONO_VOLUME,(short) volume);
MAGIC.wIOs16(NAMBar+PORT_NAM_PCM_VOLUME, (short) (volume<<8|volume));

//wieder warten
ScreenOperations.print("Hallo");
int temp2=Interrupts.flag+40;
while(Interrupts.flag!=temp2){
temp=0;
}
ScreenOperations.print("Ende");

//Allgemeine Samplerate
//Stereo Samplerate

MAGIC.wIOs16(NAMBar+PORT_NAM_FRONT_SPLRATE,(short) 44100);
MAGIC.wIOs16(NAMBar+PORT_NAM_LR_SPLRATE, (short)44100);
// und wieder warten...
int temp3=Interrupts.flag+40;
while(Interrupts.flag!=temp3){
temp=0;
}
ScreenOperations.print("Ende");


}



public static void createSpaceSound(){

// Speichern des aktuellen Zeigers ab wann Speicher frei
// danach folgt Speicherbelegung von 4MB
// Zeiger zeigt somit auf den ersten Sample

int beginOfTable=MemoryOperations.First_free_position;
MemoryOperations.alloc(0x400000);

//Zeiger fuer Buffer Descriptor Tabelle
// Hab nur einen Zeiger, 4 Byte der auf den ersten Sample Zeigt
// und die Einstellungen dass es nur diesen Buffer gibt

int beginOfDescriptor=MemoryOperations.First_free_position;
MemoryOperations.alloc(8);
MAGIC.wMem32(beginOfDescriptor, beginOfTable);
MAGIC.wMem16(beginOfDescriptor+4, (short)0xFFFD);

// Schreibe Sample
MAGIC.wMem16(beginOfTable, (short)0xFFFF);
MAGIC.wMem16(beginOfTable+2, (short)0xFFFF);
MAGIC.wMem16(beginOfTable+4, (short)0xFFFF);
MAGIC.wMem16(beginOfTable+6, (short)0xFFFF);

MAGIC.wMem16(beginOfTable+8, (short)0x7FFF);
MAGIC.wMem16(beginOfTable+10, (short)0x7FFF);
MAGIC.wMem16(beginOfTable+12, (short)0x7FFF);
MAGIC.wMem16(beginOfTable+14, (short)0x7FFF);

MAGIC.wMem16(beginOfTable+16, (short)0xAFFE);
MAGIC.wMem16(beginOfTable+18, (short)0xAFFE);
MAGIC.wMem16(beginOfTable+20, (short)0x1234);
MAGIC.wMem16(beginOfTable+22, (short)0x1234);


ScreenOperations.print("Sounds erzeugt");

MAGIC.wIOs32(NABMBar+PORT_NABM_POBDBAR, beginOfDescriptor);
MAGIC.wIOs8(NABMBar+PORT_NABM_POLVI, (byte)1);
MAGIC.wIOs8(NABMBar+PORT_NABM_POCONTROL,(byte)0x15);


}

}


Benutze ebenfalls Qemu. Ich kann in der Spec keine Infos über den Port 0x10 (POBDBAR), 0x15(POLVI) und 0x1B(POCONTROL) finden.

Mir würde zu Beginn erreichen, wenn ein nur ein Piepsen bekomme. Normalerweise wird bei PORT-NABM_POCONTROL mit 0x15 ein Interrupt ausgelöst, das brauche ich ebenfalls nicht, aber ich finde diesen in der Spec nicht :-(

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #6 am: 15. July 2010, 12:16 »
Also, das erste, was mir so auffällt, ist, dass du (zumindest in diesem Code) NAMBar und NABMBar nicht initialisierst…

EDIT: Ah, das hab ich ja auch gar nicht ins Wiki geschrieben. Ich hatte wohl darauf vertraut, dass man mitbekommt, dass sich die Variablen nicht aus eigenem Antrieb oder unter Zuhilfename schwarzer Magie mit den korrekten Werten füllen, vor allem, da der Compiler da meckern sollte. Und zusammen mit dem Satz „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).“ könnte man auch rausfinden, wie nambar und nabmbar zu setzen sind (habs jetzt mal eindeutiger hingeschrieben). :-D

EDIT2: Hab jetzt auch die Register in der Spec gefunden (im Artikel als „Intels Programmierspezifikation (ICH6)“ verlinkt): POBDBAR ist Abschnitt 2.2.1 (x_BDBAR), POLVI ist 2.2.3 (x_LVI) und POCONTROL ist 2.2.7 (x_CR).
« Letzte Änderung: 15. July 2010, 12:28 von XanClic »

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 15. July 2010, 12:32 »
Also, das erste, was mir so auffällt, ist, dass du (zumindest in diesem Code) NAMBar und NABMBar nicht initialisierst…

Vielen dank XanClic für deine Zeit und Mühe.
Natürlich hast du recht, aber dennoch ein Problem für mich:
Das Gerät habe ich gefunden. Danach lese ich das Command-Register aus, "odere" es mit fünf und schreib es zurück. Wie komm ich nun an NAMBar und NABMBar? Also an welcher Adresse?

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #8 am: 15. July 2010, 12:34 »
Dafür brauchst du dann eben einen PCI-Treiber. :wink:

PS: Das Tut weist auch darauf hin. :wink:

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 15. July 2010, 13:51 »
Also, für das NAMBAR lese ich das Register 4. Dort steht 0xC401.
Laut der Spec sind die Bits 8-15 die Base-Address. Ist das auch die Adresse des NAMBAR?

EDIT:

int NAMBar=pciBus.readPCI(0, 4, 0, 4)>>8;
int NABMBar=pciBus.readPCI(0, 4, 0, 5)>>6;
« Letzte Änderung: 15. July 2010, 14:08 von GrandAgent »

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #10 am: 15. July 2010, 15:50 »
Laut PCI-Artikel sind für I/O-Port-BARs die Bits 2 bis 31 interessant,also: 0xC401 & 0xFFFFFFFC = 0xC400

(Manche haben sich Mühe gemacht, den Artikel zu schreiben, da kann man ihn auch lesen: PCI – BAR für I/O-Ressourcen  :wink:)

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. July 2010, 14:12 »
Jupi, höre etwas. :-)
Aber egal was für Werte  ich für die Sample nehme, es hört sich immer nach einem Klopfen und nicht nach einem Ton an.Bei 7FFF lauter bei FFFF etwas leiser.
« Letzte Änderung: 18. July 2010, 22:41 von GrandAgent »

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #12 am: 19. July 2010, 00:12 »
Zitat von: GrandAgent
Bei 7FFF lauter bei FFFF etwas leiser.
Hm, so, wie ich das beschrieben hab, wechseln die sich jede zehntausendstel Sekunde (10 kHz) ab. Das kannst du unterscheiden? :-D

Programm Noob

  • Gast
Gespeichert
« Antwort #13 am: 19. July 2010, 00:29 »
Moin

GrandAgent könntest du wenn der Treiber funktioniert das vieleicht im Wiki dokumentieren und wenn der Sourcecode nich closed source ist vieleicht irgendwo für alle zugänglich machen.
Vielen Dank im vorraus.

Programm Noob

GrandAgent

  • Beiträge: 7
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 19. July 2010, 12:04 »
Habe versch. Samples versucht. Von 0 hochwärts und zurück.
Kann ich aus einer MP3 Datei ein Stück extrahieren?

Wäre mir eine Ehre das Wiki zu erweitern, aber bis jetzt bin ich noch am Ac97 dran.
Sobald der fertig ist, werde ich mich an den ES1730 ranmachen. Aber davor sind noch ein paar Basics zu klären ;)

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #15 am: 19. July 2010, 13:20 »
Kann ich aus einer MP3 Datei ein Stück extrahieren?
Du kannst es versuchen, aber genauso kannst du deinen Kernel in den Puffer laden. :wink:
MP3 ist komprimiert und solange du das nicht decodierst, kann die Soundkarte nichts damit anfangen. WAV im 16-Bit-Stereo-Format sollte wesentlich besser sein (oder am besten als RAW mit Audacity oder so exportieren (16-Bit-signed-Integer, Stereo)).

 

Einloggen