Kampis Elektroecke

Anmeldung beim Host – Teil 2

Im vorherigen Teil habe ich damit begonnen den Mikrocontroller in die Lage zu versetzen sich beim Host erfolgreich als USB-Gerät anzumelden. Dazu wurde eine entsprechende Poll-Funktion geschrieben und der erste von drei benötigten Standardrequests ausgewertet. 

Sobald der Host den Gerätedeskriptor empfangen und ausgewertet hat, legt er eine Adresse für das USB-Gerät fest und übermittelt diese mit einem SET_ADDRESS-Request. Bei diesem Request das Bitmuster für das Feld bmRequestType 000000002, bzw.

  • Transferrichtung: Host to Device
  • Art des Request: Standard
  • Empfänger: Device

Über das Feld wValue sendet der Host die zugewiesene Geräteadresse an das angeschlossene Gerät. Alle anderen Felder sind mit Null gefüllt bzw. nicht vorhanden. Die übermittelte Adresse muss von der CPU ausgelesen und in das UADD-Register kopiert werden. Dies erfolgt in folgenden Schritten:

  1. Adresse aus dem SETUP-Paket auslesen
  2. Die Adresse in das UADD-Register kopieren, aber das ADDEN-Bit gelöscht lassen
  3. Ein IN-Paket mit einer Datenlänge von 0 Byte senden
  4. ADDEN-Bit setzen

Aus dem Ablauf ergibt sich der folgende Programmcode:

Die Funktion Endpoint_HandleSTATUS übernimmt die STATUS-Stage der Kommunikation, indem sie entweder ein IN-Paket mit einer Datenlänge von 0 Byte sendet (wenn es ein OUT Request war) oder indem sie auf ein OUT-Paket wartet und dieses einließt (wenn es sich um einen IN Request handelt):

Damit der USB-Controller, im Falle einer Trennung vom Bus, nicht permanent in der Schleife festhängt, wird zusätzlich noch der Zustand des Automaten überprüft und ggf. die Schleife verlassen. Abschließend wird der Zustand des Automaten auf USB_STATE_ADDRESSED gesetzt, womit auch dieser Request erfolgreich abgearbeitet ist.

Der letzte notwendige Request ist der SET_CONFIGURATION-Request, bei dem der Host eine Gerätekonfiguration auswählt und die ausgewählte Konfiguration im USB-Gerät aktiviert. Hier lautet das Bitmuster für das Feld bmRequestType 000000002, bzw.

  • Transferrichtung: Host to Device (also ein OUT-Transfer)
  • Art des Request: Standard
  • Empfänger: Device

Wie auch beim SET_ADDRESS-Request besitzt dieser Request lediglich das Feld wValue als Informationsträger, welches mit dem Index, der vom Host ausgewählten Konfiguration, gefüllt ist.


Achtung:

Der Host adressiert die Konfiguration anhand des Feldes bConfigurationValue des Konfigurationsdeskriptors. Dieses Feld darf nicht Null sein, da das Gerät dann, der Spezifikation entsprechend, zurück in den Zustand nach der Adressierung wechseln muss.


Sobald der Konfigurationsindex empfangen wurde, soll die CPU zusätzlich überprüfen ob eine entsprechende Konfiguration vorhanden ist. Dazu wird mit Hilfe der USB_GetDescriptor-Funktion der entsprechende Konfigurationsdeskriptor ausgelesen und geprüft ob dieser vorhanden ist.

Wenn die Konfiguration erfolgreich abgeschlossen wurde, ist das Gerät einsatzbereit. Um das zu signalisieren wird das ConfigurationChanged-Event ausgeführt. Dieses Event kann von der Applikation genutzt werden, um z. B. zusätzliche Endpunkte zu konfigurieren.

Damit wären die drei wichtigsten Requests implementiert. Die vollständige Funktion USBDevice_ControlRequest sieht nun folgendermaßen aus:

Nun wird das Programm auf den Mikrocontroller kopiert und das Board über den USB mit dem Computer verbunden. Sobald das Programm gestartet wurde, meldet sich das Gerät am Computer an. Über einen Blick in den Geräte-Manager kann man nachschauen, ob die Anmeldung erfolgreich verlaufen ist.

Auf einem Windows-PC kann das Programm USBView dazu genutzt werden sämtliche Informationen, wie die Gerätekonfiguration, die USB-Adresse, etc. anzuzeigen. Dies ist besonders praktisch um Fehler bei der Enumeration zu suchen und zu erkennen.

Der Host hat somit schon mal erfolgreich ein neues Gerät erkannt und sämtliche Deskriptoren abgefragt, sowie eine Busadresse vergeben. Aktuell wird noch ein Fehler ausgegeben, da der Host keinen passenden Treiber gefunden hat. Dem entsprechend wurde auch noch keine Pipe zum Device hergestellt, wodurch noch keine Kommunikation möglich ist. Dieses Problem wird dann im nächsten Teil des Tutorials behoben.

Das komplette Projekt könnt ihr bei GitLab downloaden.

Zurück

Last Updated on

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.