OHCI Fehler, System hängt sich auf



  • Hallo zusammen,

    Ich versuche meinen OHCI USB Controller zum laufen zu bringen.

    Das System ist VirtualBox.

    Gefunden wird der Controller und alle Register werden nach dem HcReset mit ihren
    Startwerten (nach eurem OS und meinem Buch) eingestellt.

    Für das HCCA Register nutze ich vorerst 0x200000h
    (hab ja Platz im Ram)

    Ich lege 16 ED's an bei denen das sKip Bit gesetzt ist.
    Der letzte ED hat im NextEd Feld den Wert 0x0 (letzter ED).
    TD's hab ich noch keine.

    Beim Schreiben des Wertes 0690h in das HcControl Register
    bleibt das Programm stehen.
    (Control List Enable, Operatinal State, Remote Wakeup und
    Remote Wakeup Enable)

    Da ich keine Fehlermeldung erhalte, kann ich nicht sagen
    woran es liegt.

    Liegt es vielleicht wieder an VirtualBox???
    Wo hab ihr euer Programm getestet?

    Ich hoffe jemand kann mir helfen.

    Gruß, Nicky


  • Mod

    Auf echter Hardware läuft bisher EHCI und xHCI bestens, denn das benötigen wir für das Laden von Programmen oder das Schreiben von Daten auf Memory Sticks mit Highspeed oder Superspeed. Bei ohci oder uhci verzeichneten wir auf echter Hardware bisher immer Probleme mit irgendwelchen Dauer-Interrupts o.ä. Auf Emulatoren liefen ohci und uhci in der Vergangenheit. Wir benötigen es momentan für nichts in PrettyOS. Sticks mit usb 1.1 sind inzwischen ausgestorben.

    Versuche bitte auch qemu:

    -usb -device piix4-usb-uhci -device pci-ohci -device pci-ohci -device usb-ehci
    

    qemu 2.0 kann auch xhci, hat bei unserem Modul aber Startprobleme:

    -device nec-usb-xhci
    


  • Auf echter Hardware läuft bisher EHCI und xHCI bestens

    Das ist eine grandiose Übertreibung... xHCI kann ich ja nicht beurteilen, aber EHCI lief/läuft eher furchtbar.

    Ich kann aber vorerst auch nur dazu raten, einfach mal andere Emulatoren oder echte Hardware auszutesten. Im Allgemeinen kann man aber davon ausgehen, dass das, was VBox da bereitstellt, schon irgendwie funktionsfähig ist. Als Ausnahme ist mir nur die PCNet-Netzwerkarte bekannt, aber wahrscheinlich liegt der Fehler wahrscheinlich doch bei PrettyOS. Davon gibts aber ja quasi keine echte Hardware, die als Referenz herhalten kann.



  • Ich werde mal etwas testen ab Montag und berichten...

    Danke und Gruß

    Nicky



  • Ich werde mal etwas testen ab Montag und berichten...

    Danke und Gruß

    Nicky


  • Mod

    EHCI lief/läuft eher furchtbar

    Diese Bemerkung bezieht sich auf die Geschwindigkeit. Daten werden korrekt übertragen.



  • Hallo zusammen,

    mein EHCI Controller wird nun richtig erkannt, ein HCReset funktioniert ebenso wie der
    PortReset tadellos.

    Auch alle Bits in den Statusregistern werden richtig gesetzt.

    Leider bekomme ich es nicht hin ein Setup Packet an das Device zu senden
    und eine Antwort zu erhalten.

    Ich möchte hier mal mein Vorgehen beschreiben und hoffe auf Hinweise,
    falls ich etwas falsch angehe.

    Im AsyncListAdress Register trage ich 0x300.000h ein. (32-Bit Adresse der Async-Liste mit Bit 0-4 auf NULL.

    Mein Frame List Size = 1024 (Command Register) und ich trage ab Adresse 0x300.000h
    1024 Frame List Link Pointer ein. Type = QH und T-Bit = gesetzt.

    An Adresse 0x800.000h lege ich meinen QH und drei TD's ab, die alle bis auf 96 Byte aufgefüllt werden (32 Byte Ausrichtung).

    Diese Adresse trage ich nun als ersten Frame List Pointer ein:

    mov esi, 300000h
    mov eax, 800002h
    mov [esi], eax
    

    Bit 1 ist gesetzt für QH und das T-Bit ist gelöscht.

    Nun setze ich das Async Schedule Enable Bit im Command Register und
    starte den HC, was er nach dem Anzeigen des Statusregisters auch tut.

    Ich bin mir sicher das mein Fehler aber in den ganzen Biteinstellungen
    des QH und der drei TD's liegt.

    Mein QH sieht in den ersten 5 DWORD so aus:

    QH
    1h
    86000h
    40000000h
    0h
    800060h
    

    Meine drei TD's so (4 DWORD):

    TD0
    8000C0h
    1h
    80E80h
    900000h
    
    TD1
    800120h
    1h
    8080D80h
    901000h
    
    TD2
    1h
    1h
    80080C80h
    0h
    

    Meine Frage ist daher, könntet ihr mir eure Werte mal zeigen?
    Programmtechnisch sollte das ja kein Problem sein.
    Die Beispiele in meinem Buch sind leider nicht gerade fehlerfrei.

    Gruß, Nicky



  • Hallo,

    Im AsyncListAdress Register trage ich 0x300.000h ein. (32-Bit Adresse der Async-Liste mit Bit 0-4 auf NULL.

    hier müssen die 0x800.000h rein (der Beginn der QH).
    Der Frame List Pointer ist nur für den interruptgetriebenen Datenverkehr.

    Mein Standard-Device-Descriptor wird nun endlich empfangen 😃

    Nicky


  • Mod

    Glückwunsch! usb und e/o/u/xhci ist leider ein wildes Gefummel. Da helfen übersichtliche Struturen und Funktionen. Mit Hex-Zahlen ist das schon wild. Der Mensch braucht das "sprechend". 😉



  • Hallo zusammen,

    stehe nun vor dem nächsten Problem.
    Es werden immer nur 8 Byte von den üblichen 18 empfangen.

    Habe meine Einstellungen von QH und den TD mehrfach kontrolliert.
    Auch der Versuch 18 TD's anzulegen und mit jedem 1 Byte zu holen scheitert ab
    dem 9. Byte. Acht gehen immer aber warum nicht der Rest?

    Habe auch schon eine Adresse vergeben aber auch hier das selbe
    Ergebnis. Es werden immer nur 8 Byte empfangen.

    Hat jemand einen Tipp wo ich suchen sollte oder welche Einstellungen ich
    ändern muss?

    Gruß, Nicky 😕



  • Es könnte mehrere Stellen geben, an denen die Länge anzugeben ist. Schau mal, ob Du wirklich überall die gewünschte Länge angibst. Außerdem kann es bei manchen Deskriptoren auch sein, dass sie kürzer oder länger sind, je nach Gerät. Wenn kürzer, dann kommt halt weniger als verlangt, wenn länger, wird abgeschnitten.



  • Hallo,

    ich habe im QH MPS =64, im Setuppacket (OUT) MPS = 8,
    und im IN Packet wieder MPS = 64.

    Dank EHCI sollten somit alle 18 Byte auf einmal empfangen werden.
    Diese Größe gibt mir das erste Byte auch zurück: 0x12h.

    Die Woche kommt mein Test-Pc von Ebay. Werde es dort mal versuchen.
    Meine Version von PrettyOS läuft leider auch nur auf VPC (ohne USB) und
    hängt sich bei VBox komplett auf wenns um USB geht.

    Danke erstmal 👍

    Nicky



  • Ich mal wieder....

    ich habe ein paar Fragen bezüglich zum deaktivieren des Legacy Supports des BIOS.

    Mein EECP aus dem HCCParams Register beträgt bei PC1 = 068h und PC2 = 0A0h
    Da beide Werte > = 40h sind, werden die wohl gültig sein.

    In meinem Buch steht das dies der Offset ist im PCI Conf-Space, zum auslesen
    ob Legacy aktiviert ist vom BIOS oder nicht.

    Auch steht geschrieben das der Offset auf eine Liste zeigt, bei der der zweite
    DWORD Eintrag das Flag beinhaltet.

    Kann ich davon ausgehen das wenn der PC von USB Floppy booted, er dann automatisch
    den Legacy Suppport aktiviert hat?

    VPC hat einen EECP Wert von 0 (keine Liste), PC1 liest 0x90004h aus und PC2 liest 0x10004h aus, was ja schonmal nicht schlecht ist, da Bit 16 bei beiden gesetzt ist.

    Ein setzen des Bit 23, zurückschreiben ins Conf Space des PCI BIOS und (5s warten) ändert nur nichts an den Werten bei beiden Rechnern.

    Auf was muss ich achten wenn ich den Support nicht deaktivieren kann? IRQ's aus?

    Für Infos bin ich wie immer dankbar 🙄

    Nicky


  • Mod

    Das schaust Du Dir am besten in der entsprechenden Funktion in PrettyOS an. Da haben wir lange gekämpft, bis das vollständig bei aller Hardware geklappt hat.



  • Hallo und Guten Abend,

    habe mal im "Archiv" gelesen

    http://www.c-plusplus.net/forum/253016-60

    Mein Request Packet hat in Byte 7 "08h" und ihr "12h".
    Das sollte es sein 👍 Byte 7+8 enthalten in der Datenphase
    die Anzahl der zu übertragenden Bytes!

    Nicky 🙂


Log in to reply