Sourcecode Fortschritt
-
Rev. 425:
diese version funktionierte mit test unit ready, read capacity, read(10) (VMWare, 1GB stick)
-
Revision 426:
- settextcolor(uint8_t, uint8_t) durch textColor(uint8_t) ersetzt. ACHTUNG: Userprogramme neukompilieren, da syscalls geändert (noch nicht mit allen Mitgelieferten gemacht)
- my_stdarg.h durch types.h ersetzt im Userbereich.
- einige Tabs beseitigt, sonstige Formatierungen & Kleinigkeiten
-
Rev. 427:
- testMSD(deviceAddr) ausgelagert aus ehci.c
- alte usb-Funktionen nicht mehr gebraucht (auskommentiert, kommen demnächst weg)
-
Rev. 428:
Sicherung vor "Umbau auf qTD umhängen bei stabilen QH"
Diese Version läuft mit 1GB usb-Stick auf VMWare
bitte beachten: for(uint32_t sector=1055; sector < 1060; sector++)
das ist 0x83E00 beginnend, hat bei mir in VMWare geklappt, zumindest ab 0x84000 (zweiter gelesener Sektor)
-
oh, hab ich ausversehen sektor 1055 bis 1060 committed? Das war ja eig. nur für meinen Stick gültig, damit ich mal was sehe...
-
Macht doch nix.
Erste Versuche des Einhängens von qTDs in QH endeten leider in Host System Error.
http://www.henkessoft.de/OS_Dev/Downloads/PrettyOS_rev428umgebaut001.zip <--- bitte check, vielleicht können wir die Vorgehensweise doch noch nutzen.
-
Revision 429:
- Ring-Strukturen angelegt (für Scheduler-Umbauten voraussichtlich nötig), analog zu list
- ODA aufgelöst (in Einzelvariablen und system)
- Alle Userprogramme neu übersetzt (wegen Userlibänderung)
- Formatierungen
- Smilie-Bug gefixt.
-
Diese Revision 429 funktioniert in VMWare mit einem 1GB stick komplett wie gewünscht: http://www.henkessoft.de/OS_Dev/Bilder/rev429.PNG
Wir suchen den Weg dies zu verallgemeinern.
-
Rev. 430:
Auslagerungen und Streichungen zur Erhöhung der Lesbarkeit und Wartbarkeit wurden vorgenommen:
ehciQHqTD.h/c: Queue Head (QH) und Queue Element Transfer Descriptor (qTD)
usb2_msd.h/c: USB 2.0 Mass Storage Devices (MSD)
-
Rev. 431:
Verbesserungen im Code bei ehci/usb
-
Rev. 432:
Zwischenstand nach Vorbild tatOS
siehe: http://www.c-plusplus.net/forum/viewtopic-var-t-is-253016-and-start-is-71.htmltestMSD(): Umgebaut auf die dort verwendete Startreihenfolge.
-
Rev. 433:
In VMWare geht 1GB und 16 GB usb-stick, Test-PC zeigt noch qTD-status 0x80 (wird nicht ausgeführt)
Fehler im Bereich SCSI-Befehle wurden korrigiert (z.B. werden bei read im SCSI cmd nicht byte sondern blocks angegeben).
Bitte mit Simulationen und PC testen.
Dank an den Ersteller von tatOS. Es geht nichts über praktische Vorbilder mit vielen Kommentaren direkt im Code, sollten wir uns selbst ein Beispiel daran nehmen.
-
Ganz nützlich wär vlt. noch ein Link zu Tatos, denn Google rückt damit nur ungern raus, da es gerne nach Tattoos suchen möchte. (mit vielen "-"-Angaben schafft man es schon, aber es ist mühsam)
-
-
Rev. 434:
bei real PC hängt es im IN-Zweig von usbSendSCSIcmd
-
rev. 435: Zwischenstand
einige verbesserungen, real PC problem aber noch nicht gelöst
-
Rev. 436: da +gjm+ auf speicherprobleme tippt, hier eine korrigierte Version mit #define _USB_DIAGNOSIS_ aktiviert.
Hier der aktuelle Ablauf auf PC mit meinem 1GB stick:
dev: 3 interface: 0 endpOUT: 2 endpIN: 1
USB2: usbTransferBulkOnlyMassStorageReset, dev: 3 interface: 0#
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''> SCSI: inquiry
OUT part#
IN part transfer>0#
virtAddrBuf0 C0252000h : 00h 80h 02h 02h 1Fh 00h 00h 00h 6Dh 65h 6Dh 6Fh 72h 79h
00h 00h 55h 53h 42h 32h 2Eh 30h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 31h 2Eh
30h 30hvirtAddrBuf0 C0251000h : 55h 53h 42h 53h 12h 42h 42h 42h 00h 00h 00h 00h 00h
Command Passed ("good status")
qTD Status: 00h OK (no bit set)<-- data
qTD Status: 00h OK (no bit set)<-- statusCommand Block Status Values in "good status"
> Press key <<<
> SCSI: test unit ready
OUT part#
IN part transfer==0###################
timeout - no STS_USBINT set!
virtAddrBuf0 C0257000h : 55h 53h 42h 53h AAh AAh AAh AAh AAh AAh AAh AAh AAhqTD Status: 00h OK (no bit set)<-- data
qTD Status: 80h Active - HC transactions enabled<-- status> Press key <<<
> SCSI: request sense
OUT part#
IN part transfer>0###################
timeout - no STS_USBINT set!
virtAddrBuf0 C025D000h : 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h
00h 00h 00h 00hvirtAddrBuf0 C025C000h : 55h 53h 42h 53h AAh AAh AAh AAh AAh AAh AAh AAh AAh
qTD Status: 80h Active - HC transactions enabled<-- data
qTD Status: 80h Active - HC transactions enabled<-- status> Press key <<<
Wie man sieht, steigt der Ablauf beim ersten "test unit ready" (der zweite SCSI command nach dem ersten "inquiry") Beim IN-Endpoint mit seinem QH/qTD Essemble aus.
So sieht dort der Code aus:
printf("\nIN part"); pOpRegs->ASYNCLISTADDR = paging_get_phys_addr(kernel_pd, QH_In); // IN qTDs void* QTD_In; void* next = createQTD_Handshake(OUT); // Handshake if (TransferLength > 0) { printf(" transfer>0"); next = StatusQTD = createQTD_MSDStatus((uintptr_t)next, 1); // next, toggle // IN 13 byte QTD_In = DataQTD = createQTD_IO((uintptr_t)next, IN, 0, TransferLength); // IN/OUT DATA0, ... byte } else { printf(" transfer==0"); QTD_In = StatusQTD = createQTD_MSDStatus((uintptr_t)next, 0); // next, toggle // IN 13 byte } // IN QH createQH(QH_In, paging_get_phys_addr(kernel_pd, QH_In), QTD_In, 1, device, endpointIn, 512); // endpoint IN/OUT for MSD performAsyncScheduler(); if (TransferLength) // byte { printf("\n"); showPacket(DataQTDpage0,TransferLength); if ((TransferLength==512) && (TransferLength==36)) // data block, inquiry feedback { showPacketAlphaNumeric(DataQTDpage0,TransferLength); } } printf("\n"); showPacket(MSDStatusQTDpage0,13); if( ( (*(((uint32_t*)MSDStatusQTDpage0)+3)) & 0x000000FF ) == 0x0 ) { printf("\nCommand Passed (\"good status\") "); } if( ( (*(((uint32_t*)MSDStatusQTDpage0)+3)) & 0x000000FF ) == 0x1 ) { printf("\nCommand failed"); } if( ( (*(((uint32_t*)MSDStatusQTDpage0)+3)) & 0x000000FF ) == 0x2 ) { printf("\nPhase Error"); } // transfer diagnosis showStatusbyteQTD(DataQTD); printf("<-- data"); // In/Out Data showStatusbyteQTD(StatusQTD); printf("<-- status"); // In CSW
-
Muss man extra committen, nur um _USB_DIAGNOSIS_ zu aktivieren?
-
Das lief leider nicht fehlerfrei. Ich wollte +gjm+ nicht zumuten, die entsprechende Version zumindest lauffähig zu bekommen.
Den Ausgabe-Bug habe ich noch übersehen, bitte mit ODER-Verknüpfung anstelle UND:
if ((TransferLength==512) || (TransferLength==36)) // data block, inquiry feedback { showPacketAlphaNumeric(DataQTDpage0,TransferLength); }
-
Rev. 437:
ehci/usb:
- void performAsyncScheduler(bool stop) <--- für control transfers mit stop (sonst laufen die nicht), in usbSendSCSIcmd ohne stop (mit stop wird noch der cmd auf OUT ausgeführt, aber nicht der IN zweig)
- QHs und qTD werden analysiert
- zwei QHs (für OUT und IN) im asyncScheduler, die aufeinander zeigen
Ergebnis:
a) in VMWare perfekt
b) real PC:...
1648000h <-- QH_Out
IN part
asyncList: 01649000h <-- QH_In transfer>0#
00h 80h 02h 02h 1Fh 00h 00h 00h 6Dh 65h 6Dh 6Fh 72h 79h 00h 00h 55h 53h 42h 32h
2Eh 30h 00h 00h 00h 00h 00h 00h 00h 00h 00h 00h 31h 2Eh 30h 30h
memoryUSB2.01.0055h 53h 42h 53h 12h 42h 42h 42h 00h 00h 00h 00h 00h
Command Passed ("good status")
qTD Status: 01h Do Ping<-- command
qTD Status: 00h OK (no bit set)<-- data
qTD Status: 00h OK (no bit set)<-- statusCommand Block Status Values in "good status"
> Analyze Async List <<<
asyncList: 01649000h
USB status: 00008000h
Asynchronous Schedule Status> Press key <<<
> SCSI: test unit ready
OUT part
asyncList: 01649000h <-- QH_Out
IN part
asyncList: 0164F000h <-- QH_In transfer==0###################
timeout - no STS_USBINT set!
55h 53h 42h 53h AAh AAh AAh AAh AAh AAh AAh AAh AAhqTD Status: 80h Active - HC transactions enabled<-- command
qTD Status: 80h Active - HC transactions enabled<-- status> Analyze Async List <<<
asyncList: 01649000h
USB status: 00008000h
Asynchronous Schedule Status> Press key <<<