USB Weiterentwicklung in PrettyOS mit EHCI / UHCI / OHCI


  • Mod

    Inzwischen wurden die Grundlagen gelegt für UHCI (Intel, VIA) und OHCI (Rest). Nun wurde mit Rev. 1258 auch ein Mechnismus zum Wechsel des Besitzes eines Ports ("Port Routing") zwischen EHCI und Companion HC (UHCI oder OHCI) eingerichtet:

    Beim Start:

    // OpRegs->CONFIGFLAG  =  0; // Write a 0 to CONFIGFLAG register to default-route only to cHC (no high-speed!)
        OpRegs->CONFIGFLAG  = CF; // Write a 1 to CONFIGFLAG register to default-route all ports to the EHCI  
                                  // The EHCI can temporarily release control of the port to a cHC 
                                  // by setting the PortOwner bit in the PORTSC register to a one
    //...
    

    Beim Attach und Erkennen der Geschwindikeit (bits 11:10):

    if (((OpRegs->PORTSC[j]>>10)&3) == 1) // K-state, release ownership of port
        {
            OpRegs->PORTSC[j] |= PSTS_COMPANION_HC_OWNED; // release it to the cHC
        }
    

    Beim Deattach:

    OpRegs->PORTSC[j] &= ~PSTS_COMPANION_HC_OWNED; // port is given back to the EHCI
    

    Ergänzung: Eine Fullspeed-Maus wird als J-State erkannt. Daher werden nun ab Rev. 1159 K- und J-State abgegeben. Dies ist in der EHCI Spezifikation m.E. falsch beschrieben.

    static void ehci_checkPortLineStatus(uint8_t j)
    {    
      #ifdef _EHCI_DIAGNOSIS_
        textColor(LIGHT_CYAN);
        printf("\nport %u: %xh, line: %yh ",j+1,OpRegs->PORTSC[j],(OpRegs->PORTSC[j]>>10)&3);
      #endif
    
        switch ((OpRegs->PORTSC[j]>>10)&3)
        {
            case 0: // SE0
            {
                writeInfo(0, "Port: %u, hi-speed device attached", j+1);
    
                if ((OpRegs->PORTSC[j] & PSTS_POWERON) && (OpRegs->PORTSC[j] & PSTS_ENABLED) && (OpRegs->PORTSC[j] & ~PSTS_COMPANION_HC_OWNED))
                {
                  #ifdef _EHCI_DIAGNOSIS_
                    textColor(IMPORTANT); printf(", power on, enabled, EHCI owned"); textColor(TEXT);
                  #endif
                    if (USBtransferFlag && enabledPortFlag && (OpRegs->PORTSC[j] & (PSTS_POWERON | PSTS_ENABLED | PSTS_CONNECTED)))
                    {
                        setupUSBDevice(j);
                    }
                }
                break;
            }
    
            case 1: // K-state, release ownership of port (in EHCI spec 1.0 this is recommended) 
            case 2: // J-state, release ownership of port (in EHCI spec 1.0 this is not recommended) <--- keine gute Idee, wie sich später heraus stellt ;)
                OpRegs->PORTSC[j] |= PSTS_COMPANION_HC_OWNED; // release it to the cHC
                break;       
    
            case 3: // undefined
            {
                textColor(ERROR);
                printf("\nline state: undefined");
                textColor(TEXT);
                break;
            }
        }// switch
    }
    

  • Mod

    Als Aufgaben stehen nun die Schaffung einer ehci_t Struktur an, damit die globalen/statischen Variablen weitgehend verschwinden können (erledigt).

    Ansonsten muss wohl die enge Verzahnung zwischen usb-Modul und ehci-QH/qTD Strukturen durch eine Zwischenschicht getrennt werden, um auch uhci/ohci integrieren zu können. Vielleicht kann man das jetzt vorhandene usb-Modul als Zwischenschicht verwenden und darüber ein von dem jeweiligen HC abstrahiertes Modul schaffen.

    Auf user-Seite (und auch für das zu schaffende abstrakte Modul) könnte wohl die libusb http://libusb.org/browser/libusb/libusb/libusb.h als Leitlinie verwendet werden.


  • Mod

    Auf der Ebene der HCs und Ports ist die Abstraktion schon weitgehend gewonnen (thx to MrX für sein Transfer-/Transaktions-Modell). OHCI wurde nun versuchsweise in USB eingekoppelt, was auch funktioniert. Es sieht so aus, dass man ein gemeinsames Modul für USB 1 und USB 2 verwenden kann.


  • Mod

    ohci, uhci und ehci hängen nun über die gleiche schnittstelle an usb. Mittels des Emulators Oracle VM VirtualBox soll nun im nächsten Schritt das ohci-Innenleben für usb-transfers (usb 1.1) mit ohci aufgebaut und getestet werden. 🙂


  • Mod

    Nun ist der erste erfolgreiche ohci-Transfer (getDevice) gelungen. 🙂
    Allerdings ist der Gesamtzustand noch unbrauchbar (PC läuft nicht).


  • Mod

    Meilenstein: Die USB 1.1 control-Transfers (mit ohci) laufen auf VBox!


  • Mod

    Die bulk-Transfers mit ohci ebenso. Ist kein großer Unterschied.


  • Mod

    Ich halte USB und Netzwerk von Anfang an für zukunftsweisend. Daher werden diese Module mit Priorität weiter entwickelt. Die Spezifikation für xHCI (Superspeed) liegt nun ebenfalls vor.

    Der EHCI-Treiber wurde deutlich beschleunigt durch Beobachtung des active Bit im qTD, allerdings gibt es mit wenigen Sticks in Kombination mit PCs nun Probleme. Der OHCI-Treiber ist stabil (zumindest auf VBox). Der UHCI-Treiber wird gerade ausgebaut und an das abstrakte usb-Modul angedockt. Damit wird PrettyOS bald alle bisherigen HC für usb mass storage devices (MSD) bedienen können, ein wohl eher ungewöhnliches Feature für ein Hobby-OS.


  • Mod

    Das Toggle-System wurde überarbeitet und das Toggle-Switchen an die inzwischen richtige Stelle, nämlich in die Transaction, verlagert. Damit können nun auch von 512 Byte mps abweichende Datentransfers wie sie bei full speed bzw. low speed üblich sind (8, 16, 32, 64 Byte) beherrscht werden, ohne dass sich die Toggles "verhaken" (vorher Datenverlust oder NAK). 🙂


Log in to reply