Zugriff auf Floppy (USB FDD) mittels UHCI - (k)ein Weiterkommen



  • Hallo zusammen,

    ich bin wiedermal am UHCI Controller und seiner Programmierung dran...

    Was bis jetzt geschieht:

    1. PCI Bus wird nach allen Geräten durchlaufen
    2. UHCI Controller suchen
    3. UHCI Controller Global Reset
    4. UHCI mit Standardwerten initialisieren
    5. Port Reset durchführen
    6. Device Descriptor holen
    7. Adresse setzen(1)
    8. Stringdescriptor 1 und 2 holen und anzeigen
    9. Konfiguration setzen (1)

    bis hier läuft alles fehlerfrei.

    Nun gehts aber los:

    Mein Configuration Descriptor zeigt mir folgende Werte an:
    http://www.directupload.net/file/d/3793/pam24yo8_jpg.htm

    Die ersten beiden Zeilen sind mein Devicedescriptor (roter Rand).

    Die letzen drei sind der Config-Descriptor mit einem kleinen "Fehler".
    Hier befinden sich die 5 Descriptoren (Configuration, Interface, 3x Endpoint)

    Die Endpoint Descr. beginnen alle mit 0x7 : 0x5 was eine Länge von 7 Byte
    bedeutet und die 0x5 sagt aus das dies ein EP Descr. ist.

    Das dritte Byte ist die Adresse des EP.
    Bit 7 (80h) sagt aus ob es ein IN oder ein OUT EP ist. Die letzten vier Bit
    geben die Nummer des EP an.

    Beim ersten habe ich einen IN EP mit Nummer 2 (Bulk), beim zweiten einen OUT EP
    mit Nummer 2? (Bulk) und beim dritten einen IN EP mit Nummer 1 (Interrupt).

    Ist das richtig das IN und OUT die selbe Nummer haben?

    Nun zu den UFI SCSI Befehlen.

    Den einzigsten Befehl den ich fehlerfrei senden kann ist der Inquiry 12h.
    UFI benutzt das CBI (Control, Bulk, Interrupt) Protokoll.
    Das heißt, der Befehl wird mittels Command Request gesendet.

    Da jeder Befehl 12 Byte lang ist und man pro Control-EP nur 8 Byte senden kann
    verläuft das ganze wie folgt.

    Setup Packet
    Control-out Packet (8 Byte)
    Control-out Packet (4 Byte)
    Handshake Packet

    Interrupt EP abfragen bis zwei Byte eingetroffen sind. (0x0000 = kein Fehler)
    und dann noch über den Bulk EP die Daten abholen.

    Auch das läuft fehlerfrei.

    Leider kann ich aber keinen anderen Befehl senden, da schon beim Senden
    ein Fehler 0x2906 angezeigt wird.

    POWER ON RESET OR BUS DEVICE RESET OCCURRED

    Wenn man in der Fehlermeldung OCCURRED durch required ersetzt, macht es
    mehr Sinn! 🙄

    Das Handshake Packet nach dem Senden des Befehls liefert mir nur ein "Stalled"
    was wohl nur angehalten bedeutet.

    Das mit der falschen IN EP Nummer hab ich im Code selbst auf 3 umgestellt.

    Hat jemand eine Ahnung wieso er zweimal die falsche EP Nummer vergibt?

    Aus der gestrigen Mail des Autors habe ich erfahren das manche Geräte
    für den IN und OUT Endpoint nur eine Nummer vergeben. Die Richtung wird
    wohl dann über den PID Code 0x69 und 0xE1 vorgegeben. Ein Hinweis im Buch
    wäre toll gewesen.

    Was muss ich tun damit auch andere Befehle angenommen/bearbeitet werden?
    (Fehlt ein Reset, Init, Sense....???)

    Auch ist es mir nicht möglich zweimal den Inquiry Befehl zu senden.
    Beim zweiten mal bricht er komplett ab und reagiert erst wenn ich das Floppy
    vom USB Port getrennt habe.

    Auch hier hab ich aus der Mail erfahren das nach einem Fehler der Request Sense
    Befehl gesendet werden sollte. Obwohl dieser für UFI (CBI Protokoll) nicht verwendet werden sollte.

    Wie schon weiter oben geschrieben sollte man wohl nach jedem Befehl auf dem Port
    einen Reset ausführen. Der Sinn dahinter ist mir noch unklar.
    Jedenfalls kann man somit schonmal die Kapazität oder Bereitschaft des Floppy prüfen. Auch wird somit der Lesebefehl Read10 fehlerfrei gesendet und das
    Gerät fängt an zu brummen. Jedoch hört das erst auf wenn man das Kabel kappt 🙄 Daten kommen noch keine an.

    Ich bin echt am verzweifeln hier 😕

    Nicky


  • Mod

    Hilft Dir diese Stelle vlt. weiter? http://forum.osdev.org/viewtopic.php?f=1&t=22789



  • Hallo Erhard,

    habe dem Autor mein Problem geschildert und er konnte
    mir sofort sagen das es am Toggle-Bit lag.

    Dieses darf nur nach dem Controllerreset auf Null
    gesetzt werden.

    Habe nun dafür eine globale Variable eingerichtet,
    (war vorher im Stack untergebracht).

    Das USB Floppy läuft nun mit UHCI und OHCI.
    Der USB Stick noch nicht ganz. Werde hier mal mit
    EHCI weiter machen.

    Nicky 😃


  • Mod

    Freut mich, dass Dir der Link weiter geholfen hat. Es gibt nicht viele, die bei USB-Floppy helfen können. Zum Glück ist das Toggle bei xHCI kein Thema mehr. Bezüglich usb-Stick und EHCI bzw. xHCI kannst Du bei PrettyOS und uns Hilfe suchen, wenn Du länger fest hängst.


  • Mod

    Dein usb-Floppy / UFI Wissen könne wir gut brauchen. Wir haben nun auch Kontakt via usb mit usb-Floppy. 😉



  • na dann sehen wir uns im Chat 😃


  • Mod

    UFI und CBI spec habe ich schon besorgt. Es klappt inzwischen halbwegs.


  • Mod

    Inzwischen sogar bestens. Einrichtung/Lesen/Schreiben klappt.


Log in to reply