Ziel: USB-Treiber
-
Hier die Ergebnisse meines Tests:
makefilexxx: Gefunden, korrekt gelesen. Fat32-Bugfix funktioniert also. Gute Arbeit
makefile: Nicht gefunden. Er vergleicht Zeichen, korrekt bei den ersten 8. Dann glaubt er jedoch ein O oder eine 0 (nicht genau erkennbar) aus der FAT gelesen zu haben. Laut HxD steht dort Space, also 0x20. Vermutetes Problem: ToLower verunstaltet Space.EDIT: Nein, weitere Tests haben ergeben: ToLower ist unschuldig. Der Wert des kreisförmigen Zeichen ist 0x42. Dieser Wert steht bereits in foDest->name[i], ist m.E. falsch und er entsteht nicht erst bei der folgenden Umwandlung.
-
0x42 entspricht in ASCII dem Zeichen 'B'. Ich werde versuchen, diesen Eintrag von Anfang an auf 11 Spaces zu setzen.
-
ein B?
Warum zeigt er dann ein kreisförmiges Zeichen (0, O) an?
-
ich habe noch nicht heraus gefunden, wo dieses 'B' im Code herrührt.
-
Falls jemand mit in ehci/usb/usb_msd/fat einsteigen will, stelle ich hier den Ablauf, der devices betrifft (Stand: Rev. 475), im Funktionenablauf dar:
PrettyOS startet nach dem Bootloader stage 1 und 2 in ckernel.c mit dem eigentlichen kernel:
Dort startet Strang 1, der die Floppy-Disk und den EHCI (und daran direkt anhängende devices) aktiviert: EHCI_flag // first EHCI found? floppy // floppy installieren pci // EHCI (für usb2-highspeed-Geräte, RTL8139 installieren, ...) RAM disk // shell starten; weitere files, die man dort einspielen kann, sind bisher ungenutzt kernel idle loop // handleEvents() als Drehscheibe für ehci_init, ehci_portcheck, mt_screenshot (momentan screenshot auf Floppy schreiben) ehci_install --> addEvent(&EHCI_INIT) --> analyzeEHCI ehci_init (thread) --> startEHCI --> initEHCIHostController --> startHostController --> resetHostController --> DeactivateLegacySupport --> enablePorts --> resetPort --> setupUSBDevice(portnumber)
Strang 2 startet durch Einstecken eines Highspeed usb-Device an einem direkten usb-Port (also nicht Hub): Interrupt durch Port Change (STS_PORT_CHANGE) --> ehci_handler --> addEvent(&EHCI_PORTCHECK) --> ehci_portcheck (thread) --> portCheck --> showPORTC --> resetPort --> checkPortLineStatus --> setupUSBDevice(portnumber) s.u.
In setupUSBDevice(portnumber) werden folgende Abläufe angestoßen: --> usbTransferEnumerate (liefert devAddr) --> usbTransferDevice(devAddr) --> usbTransferConfig(devAddr) (interfaces, endpoints) --> usbTransferString(devAddr) (language) --> usbTransferStringUnicode(devAddr,k) (vendor, product,revision) --> usbTransferSetConfiguration(devAddr,1) --> usbTransferGetConfiguration(devAddr) --> testMSD(devAddr,config)
-
Ab und zu gibt es sogar Anerkennung von dritter Seite:
"i downloaded your OS and had a look through your code. Good Work!"
Quelle: http://forum.osdev.org/viewtopic.php?f=1&t=22095
Hier zahlt es sich auch aus, dass wir die Kommentare konsequent in englischer Sprache verfassen.
-
Hier eine Übersicht über die Strukuren bezüglich usb-devices, usb-msd und device manager in ehci/usb-Modulen:
ehci.c:
port_t port[17]; // device manager // usb devices list extern usb2_Device_t usbDevices[17]; // ports 1-16 // 0 not used // Device Manager disk_t usbDev[17]; partition_t usbDevVolume[17];
usb2.c:
usb2_Device_t usbDevices[17]; // ports 1-16 // 0 not used
usb2_msd.c:
extern usb2_Device_t usbDevices[17]; // ports 1-16 // 0 not used
usb2.h:
typedef struct usb2_Device { uint16_t usbSpec; uint8_t usbClass; uint8_t usbSubclass; uint8_t usbProtocol; uint8_t maxPacketSize; uint16_t vendor; uint16_t product; uint16_t releaseNumber; uint8_t manufacturerStringID; uint8_t productStringID; uint8_t serNumberStringID; uint8_t numConfigurations; uint8_t maxLUN; // MSD specific char productName[16]; char serialNumber[13]; uint8_t numInterfaceMSD; uint8_t InterfaceClass; uint8_t InterfaceSubclass; uint8_t numEndpointInMSD; uint8_t numEndpointOutMSD; bool ToggleEndpointInMSD; bool ToggleEndpointOutMSD; } usb2_Device_t;
-------------------------------------------------------
Kritik von MrX (im IRC):
a) Es liegt auf dem Stack
b) Es unterstützt nur 1 Partition pro Stick
c) Zusammenhängende Daten werden auseinandergerissenVorschlag zur Veränderung (MrX):
struct usb2msd_t
{
/*usb-spezifische Member*/
disk_t disk; //disk.data = this;
Partitionen liegen ja in disk.
Port sollte bei EHCI bleiben, das ist klar
letztlich hast Du dann statt der derzeit 4? Arrays nur noch 2, eines für ports und eines von usb2msd_t
-
usbWrite ist im EHCI/USB-Transferbereich noch nicht "hübsch" implementiert, aber es funktioniert.
(siehe Rev. 547)
-
Bin neulich auf folgende interessante Liste gestossen: http://www2.one-eyed-alien.net/~mdharm/linux-usb/target_offenses.txt
Nur zur Info
-
Tobiking hat im irc-chat an folgendes thema erinnert: http://www.lvr.com/forum/index.php?topic=48.0 Vielleicht hat jemand eine idee, wie man da weiter kommen könnte