Hi! Hab jetzt die Software für den PDIUSBD11 fast fertig. Ich verwende LEDs zum Debuggen und merke, dass er zwar die Deskriptoren abfragen (Strings und Device), aber beim PC rührt sich nicht. Er Fragt die Deskriptoren ständig ab, was mich etwas verwundert. Ich bin mir auch nicht sicher, ob die Deskriptoren korrekt übertragen werden. Kann man das vielleicht irgendwie überprüfen? Hat jemand von euch vielleicht eine Idee, wo das Problem liegen könnte? mfg Weinga-Unity
Hallo, was meinst du mit, beim PC rührt sich nichts? Hat er gar kein USB Gerät erkannt? Dann sollte er auch keine Descriptoren abfragen. Hat er bei mir zumindest nicht gemacht (Windows 2000). Wenn ich mich recht entsinne, hat er bei mir erst den Device und dann den Interface Descriptor abgefragt. String kam erst viel später. Überprüfe mal, ob nicht regelmäßig ein Bus-Reset ausgeführt wird, war bei mir der Fall, als das Übertragungsprotokoll noch nicht ganz fehlerfrei wahr. Gruß, Axel P.S. Tut mir leid, habe im Moment wenig Zeit, sonst würde ich das nochmal an meiner eigenen Hardware testen.
Hier mal eine Liste was bei der Enumerierung unter Win (alle Versionen) so passiert. - GetDescriptor (Device) mit wLength 0x0040 - BusReset - SetAdress() - GetDescriptor (Device) mit wLength(0x0012) - GetDescriptor (Config) je nach länge mehrmals falls bis dahin alles korrekt läuft siehst du zumindest das Device Achtung der Host leitet unabhängig von der Antwort auf den ersten Request die Status Stage ein. Ein vereinfachtes Beispiel für den DeviceDescirptor: - Host: Setup Packet GetDescriptor - Device kopiert die ersten 8 Bytes - Host: In - Device kopiert die nächsten 8 Bytes - Host: In - Device: kopiert die letzen 2 Bytes - Host: Out = Status Stage Der Host kann jederzeit die Übertragung abbrechen indem er einen Out Request für den Status schickt. (das steht so in der Spec) Thomas Wie sehen denn deine Descriptoren aus ?
Ich hab das Programm mal debugged:
Es kommt bis dort hin, wo er die Deskriptoren senden sollte (aufteilung
in 8er Paketen). Ich hab aber so das gefühlt, dass nichts gesendet wird.
Vielleicht wisst ihr, wo in diesem Bereich die Standardfehler sind.
Meine Deskriptoren
DeviceDescriptor:
DB 18 ;Größe des Deskriptors in Bytes
DB 01H ;die Konstante DEVICE (01H)
DW 0110H ;USB-Spezifikation
DB 00H ;Klassencode
DB 00H ;Unterklassencode
DB 00H ;Protokollcode
DB 08H ;Maximale Paketgröße für den Endpunkt 0
DW 0FFFFH ;Anbieter ID
DW 000CH ;Produkt ID
DW 0110H ;Release-Nummer des Geräts
DB 01H ;Index des String-Deskriptors für den Hersteller
DB 02H ;Index des String-Deskriptors für das Produkt
DB 03H ;Index des String-Deskriptors mit der Seriennummer
DB 01H ;Anzahl möglicher Konfigurationen
ConfigurationDescriptor:
DB 09H ;Größe des Deskriptors in Bytes
DB 02H ;Die Konstate KONFIGURATION (02H)
DB CONF_L ;Größe aller für diese Konfiguration zurückgegebenen
Daten in Bytes
DB 00H ;HighBit von Länge
DB 01H ;Anzahl der Schnittstellen, die die Konfiguration
unterstützt
DB 01H ;Identifizierer für Set_Configuration- und
Get_Configuration-Requests
DB 00H ;Index des String-Deskriptors für die Konfiguration
DB 40H ;Eigenstrom/Busstrom- und Remote-Wakeup-Einstellungen
DB 50 ;Erforderlicher Busstrom (mA/2)
InterfaceDescriptor:
DB 09H ;Größe des Deskriptors in Bytes
DB 04H ;Die Konstante INTERFACE (04H)
DB 00H ;Eine Nummer zur Identifizierung dieser Schnittstelle
DB 00H ;Eine Nummer zur Auswahl einer alternativen Einstellung
verwendeter Werte
DB 01H ;Die Anzahl der unterstützten Endpunkte mit Ausnahme
des EP0
DB 03H ;Klassen-Code
DB 01H ;Unterklassen-Code
DB 01H ;Protokoll-Code
DB 00H ;Index des String-Deskriptors für die Schnittstelle
HIDDescriptor: DB 09H ;Deskriptorgröße in Byte
DB 21H ;21H zeigt die HID-Klasse an
DW 0001H ;Versionsnummer der HID-Spezifikation
DB 21H ;Numerischer Ausdruck, der für das Land der
lokalisierten Hardware steht
DB 01H ;Anzahl der unterstützten untergeordneten
Klassendeskriptoren
DB 22H ;Der Typ des Klassendeskriptors
DB 50,0 ;Gesamtlänge des Berichtsdeskriptors
Endpoint1Descriptor: DB 07H ;Größe des Deskriptors in Bytes
DB 05H ;die Konstante ENDPOINT (05H)
DB 81H ;Endpunktnummer und -richtung
DB 03H ;unterstützter Transfer-Typ
DW 0800H ;maximal unterstützte Paketgröße
DB 0AH ;Abfrageintervall in Millisekunden
ConfigurationEnd:
CONF_L EQU ConfigurationEnd-ConfigurationDescriptor
ReportDescriptor:
DB 005H,001H ;USAGE_PAGE (Generic Desktop)
DB 009H,002H ;USAGE (Mouse)
DB 0A1H,001H ;COLLECTION (Application)
DB 009H,001H ;USAGE (Pointer)
DB 0A1H,000H ;COLLECTION (Physical)
DB 005H,009H ;USAGE_PAGE (Button)
DB 019H,001H ;USAGE_MINIMUM (Button 1)
DB 029H,003H ;USAGE_MAXIMUM (Button 3)
DB 015H,000H ;LOGICAL_MINIMUM (0)
DB 025H,001H ;LOGICAL_MAXIMUM (1)
DB 095H,003H ;REPORT_COUNT (3)
DB 075H,001H ;REPORT_SIZE (1)
DB 081H,002H ;INPUT (Data,Var,Abs)
DB 095H,001H ;REPORT_COUNT (1)
DB 075H,005H ;REPORT_SIZE (5)
DB 081H,003H ;INPUT (Cnst,Var,Abs)
DB 005H,001H ;USAGE_PAGE (Generic Desktop)
DB 009H,030H ;USAGE (X)
DB 009H,031H ;USAGE (Y)
DB 015H,081H ;LOGICAL_MINIMUM (-127)
DB 025H,07FH ;LOGICAL_MAXIMUM (127)
DB 075H,008H ;REPORT_SIZE (8)
DB 095H,002H ;REPORT_COUNT (2)
DB 081H,006H ;INPUT (Data,Var,Rel)
DB 0C0H ;END_COLLECTION
DB 0C0H ;END_COLLECTION
LangIDDescriptor: DB 04H
DB 03H
DW 0009H
Achtung mit den DW das wird nicht so funktionieren wie du dir das denkst.... Ich würde das folgendermasen machen: DB LOW(DeviceId),HIGH(DeviceID) BTW DeviceId 0xFFFF soltest du nicht nehmen genauso wie 0x0000.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.