Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Relbmessa am 25. February 2012, 15:23
-
Hallo
Antwort zu UHCI Setup-Transfer
Eine Antwort – nicht die Antwort Setup (Control)
Erfragen Get_Deskriptor
Die von mir verwendet Frame:
Nr.05_A
001 00021000 00021010 002 00021010 00021020 003 00021020 00021030
1Fra 00021004 00021014 00021024
00021008 00021018 00021028
0002100C BUF 0002101C BUF 0002102C BUF
004 00021030 00021040 005 00021040 00021052 ZQH 006 00021050 00021090 ZTD1
00021034 00021044 QH 00021054 00000001 IRQ
00021038 00021048 00021058
0002103C BUF 0002104C BUF 0002105C BUF
007 00021060 00021070 008 00021070 0021080 009 00021080 00021090
00021064 00021074 00021084
00021068 00021078 00021088
0002106C BUF 0002107C 00120118 BUF 0002108C 00120140 BUF
010 00021090 000210A0 011 000210A0 000210B0 012 000210B0 000210C0
TD1 00021094 TD2 000210A4 TD3 000210B4
00021098 000210A8 000210B8
0002109C 00120118 BUF 000210AC 00120140 BUF 000210BC 00120168 BUF
013 000210C0 000210E2 ZQH 014 000210D0 000210E0 015 000210E0 00000001
TD4 000210C4 000210D4 QH 000210E4 00000001
000210C8 000210D8 000210E8
000210CC 00120190 BUF 000210DC BUF 000210EC BUF
;;;;;;;;;;----Vorbereitung für Control-Transfer----------------------------1.Einstellung
;-------------TD-1---------------------------------------------------------
mov dword [0x00021094] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x00021098] , 0x00E0002D ;Reg 08-0Bh Token Setup -> 2Dh
mov dword [0x0002109C] , 0x00120118 ;Buffer-Pointer TD1
;-------------TD-2---------------------------------------------------------
mov dword [0x000210A4] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x000210A8] , 0x02280069 ;Reg 08-0Bh Token DATA1 IN-> 69h
mov dword [0x000210AC] , 0x00120140 ;Buffer-Pointer TD2
;----------------------------------------------------------------------------
;-------------TD-3-----------------------------------------------------------
mov dword [0x000210B4] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x000210B8] , 0x02200069 ;Reg 08-0Bh Token DATA0 IN -> 69h ????
mov dword [0x000210BC] , 0x00120168 ;Buffer Pointer TD3
;----------------------------------------------------------------------------
;-------------TD-4-----------------------------------------------------------
mov dword [0x000210C4] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x000210C8] , 0x02280069 ;Reg 08-0Bh Token DATA1 IN-> 69h
mov dword [0x000210CC] , 0x00120190 ;Buffer-Pointer TD4
;----------------------------------------------------------------------------
;---------Speicher-Einstellung-Buffer-Bereich erst mal Null------------------
mov dword [0x00120118] , 0x01000680 ;Get_Deskriptor TD1
mov dword [0x0012011C] , 0x00120000
;--------------------------------
mov dword [0x00120140] , 0x0 ; TD2
mov dword [0x00120144] , 0x0 ;
;-------------------------------
mov dword [0x00120168] , 0x0 ; TD3
mov dword [0x0012016C] , 0x0
;-------------------------------
mov dword [0x00120190] , 0x0 ; TD4
mov dword [0x00120194] , 0x0
;-------------------------------------------------------------------------
Frame-List Pointer
Code
;--------Frame List--TD-Pointer------------------ ----------------------------------------
;----------------------------------------------------------------------------------------
mov eax , 0x00020000+4 ;+1 siehe Erster FLP /Ziel Framme List
mov ebx , 0x00023001 ;Inhalt Frame List -> Link -Pointer
mov ecx , 1024-1
Frame_List:
mov [eax] , ebx
add eax , 0x04 ;Abstand 4-Byte Frame Pointer
; add ebx , 0x10 ;Abstand Link-Pointer 16-Byte (10h)
loop Frame_List
;-------Link-Pointer-TD-1------------------------------------------------
mov eax , 0x00021000 ;Ziel TD-2 Pointer
mov ebx , 0x00021010 ;Link-Pointer
mov ecx , 1024
Link_Pointer_1:
mov [eax] , ebx
add eax , 0x10
add ebx , 0x10
loop Link_Pointer_1
;--------------Frame-List-Pointer------------------------------------------------
mov dword [0x00020000] , 0x00021000 ;Erster Frame-List-Pointer
mov dword [0x00020004] , 0x00021090 ;Zeiger 2
;---------------------------------------------------------------------------------
mov dword [0x00020008] , 0x00021090 ;Zeiger 3
Mit dieser Konfiguration melden sich die meisten Geräte
Ausnahmen bestätigen die Regel – Acer 1Giga und Cruzer 4Giga
melden sich meist nicht – keine Ahnung warum??
Mit der folgenden Konfiguration habe ich dieses Problem gelöst
;;;;;;;;;;----Vorbereitung für Control-Transfer----------------------------
;-------------TD-1---------------------------------------------------------
mov dword [0x00021094] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x00021098] , 0x00E0002D ;Reg 08-0Bh Token Setup -> 2Dh
mov dword [0x0002109C] , 0x00120118 ;Buffer-Pointer TD1
;-------------TD-2---------------------------------------------------------
mov dword [0x000210A4] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x000210A8] , 0x02200069 ;Reg 08-0Bh Token DATA0 IN-> 69h
mov dword [0x000210AC] , 0x00120140 ;Buffer-Pointer TD2
;----------------------------------------------------------------------------
;-------------TD-3-----------------------------------------------------------
mov dword [0x000210B4] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x000210B8] , 0x02280069 ;Reg 08-0Bh Token DATA1 IN -> 69h ????
mov dword [0x000210BC] , 0x00120168 ;Buffer Pointer TD3
;----------------------------------------------------------------------------
;-------------TD-4-----------------------------------------------------------
mov dword [0x000210C4] , 0x18800000 ;Reg 04-07h Control and Status
mov dword [0x000210C8] , 0x02200069 ;Reg 08-0Bh Token DATA0 IN-> 69h
mov dword [0x000210CC] , 0x00120190 ;Buffer-Pointer TD4
;----------------------------------------------------------------------------
;---------Speicher-Einstellung-Buffer-Bereich erst mal Null------------------
mov dword [0x00120118] , 0x01000680 ;Get_Deskriptor TD1
mov dword [0x0012011C] , 0x00120000
;--------------------------------
mov dword [0x00120140] , 0x0 ; TD2
mov dword [0x00120144] , 0x0 ;
;-------------------------------
mov dword [0x00120168] , 0x0 ; TD3
mov dword [0x0012016C] , 0x0
;-------------------------------
mov dword [0x00120190] , 0x0 ; TD4
mov dword [0x00120194] , 0x0
;-------------------------------------------------------------------------
Diskussion erwünscht , aber nicht Bedingung
Viel Spaß und Erfolg beim Programmieren
Relbmessa
PS
Wollte ein wenig Farbe in die Gestaltung bringen.
Wie Funktioniert das?-> ist aber nicht wichtig!!
-
Welche Devices hast du denn derzeit probiert?
Ich bezweifel, dass sich die meisten Devices so melden.
Normalerweise läuft das Init mit den Devices so ab,
dass die Devices gefragt werden und dann angeben was sie können.
z.B. Fragt das OS als erstes was es für ein Device ist, wie viele EPs das Device hat, etc.
Anhand der ersten Antwort kannst du schon erkennen, was für ein Device es ist.
Es muss angeben, ob es Vendor- oder Class-Specific ist.
Anhand dessen lässt sich schon viel ermitteln.
Kann auch nicht direkt dein Problem erkennen.
Grüße,
rizor
-
Hallo rizor
Alle meine Geräte haben sich gemeldet.
zB
Philips USB DVD 058F:6387
8Giga Transcend 058F:6387
1Giga dt.
4Giga Kingston 0951:1625
Lexar 05DC:A400
ACER 0204:6025
Cruzer 0781:5406
Lexar Media 128MB 05DC:0080
USB Webcam 046D:08DA
USB-Floppy 057B:0000
Siemens USB Wlan 129B:1667
BrotherUSB Drucker 04F9:0037
und noch zwei usb Festplatten
Ergebnisse habe ich mit Linux abgeglichen.
Jetzt geht es zum zweiten Schritt der Enumeration
Gruss
Relbmessa
-
Was meinst du mit gemeldet?
Naja, die Device-Enumeration findest du ja über den Device-Descriptor raus.
Da wird dir ja sogar mitgeteilt, was für einen Treiber du verwenden musst.
Also, ob es ein Class-Driver sein kann oder ob du alle geladenen Treiber fragen musst.
Grüße,
rizor
-
Hallo
Mit gemeldet meine ich, dass mit der oben verwendeten Frame
der Geräte Deskriptor ausgelesen wird.(Erster Schritt der Enumeration)
Ich bin dabei für mein OS USB-Driver zu programieren.
Gruss
Relbmessa
-
Und manche Devices melden sich nicht?
Dann fragst du sie nicht.
USB ist immer Ping-Pong, wobei der Traffic immer vom OS (Host-Controller) ausgeht.
Oder du fragst sie falsch und sie können nichts mit dem Request anfangen.
Ansonsten ist die Device-Enumeration ja nicht so schwer.
-
Hallo
vielleicht habe ich mich falsch ausgedrückt?
Melden tun sich alle Geräte -> nur Acer und Cruzer muss ich anders befragen. (siehe Anfang)
Darüber wundere ich mich-> den ich dachte die erste Anfrage ist immer gleich ??
Gruß
Relbmessa
-
Ich habe mir deinen Frame jetzt nicht genau angeschaut, aber ich vermute mal, dass darin ein Fehler ist.
Du wirst mit den anderen Devices nur glück haben.
-
Hallo
danke für die Vermutung.
Ich bin noch auf der suche nach dem Fehler.
Wie gesagt , es ist der erste Entwurf.
Gruß
Relbmessa
PS
Habe den Fehler beim Auslesen der ersten 8 Byte Get_Deskriptor gefunden.
Ohne Status Phase geht es halt nicht.
TD -> Setup DATA0
TD -> IN DATA1
TD-> Out DATA1
so geht es!