Hallo, ich beschäftige mich grade mit einer USB-Bootloader-Implementierung für den F303CC. HID läuft soweit und kann auch per python angesprochen werden. Dabei ist die Latenz aber recht hoch (~2s zwischen write und update im read bei Echo Implementierung) und die Datenrate eher gering. Da ich den USB-Code evtl. auch für andere Projektte nutzen will, habe ich über das USB-Tutorial USB-Tutorial mit STM32 WinUSB entdeckt. Die Implementierung war soweit nicht schwierig. EP1 ist als Bulk-Endpoint konfiguriert und spiegelt die empfangenen Daten 1:1 zurück. Windows erkennt das Gerät und wählt auch den richtigen Treiber aus. Konfigurations-ID ist: winusb.inf:USB\MS_COMP_WINUSB,WINUSB.NT Aber wenn ich alle winusb-Geräte mir auflisten lasse, wird der F303 nicht angezeigt. (Zum Anzeigen nehme ich die Lib Device.Net, Code entspricht dem hier gezeigten: https://github.com/MelbourneDeveloper/Device.Net/wiki/Enumerating-Connected-Devices) Der ST-Link wird erkannt und aufgelistet. Nur mein Gerät nicht. Unter Zadig wird das Gerät erkannt und als Treiber WINUSB v10.0.19041.1 angezeigt (siehe Screenshot). Für den ST-Link WinUSB V2.1.0.0. Hat die Groß/Kleinschreibung eine Bedeutung oder ist der Treiber identisch (mit neuerer Version). Muss ich auf der PC-Seite noch was machen, damit ich auf das Gerät zugreifen kann? Oder brauche ich auch bei WinUSB noch eine Treiberdefinition auf Windowsseite? Gruß Kevin
Kevin schrieb: > Unter Zadig wird das Gerät erkannt und als Treiber WINUSB v10.0.19041.1 > angezeigt (siehe Screenshot). Für den ST-Link WinUSB V2.1.0.0. Ich gehe davon aus dass du W10 benutzt. Hast du dein WinUsb Device zufällig mit Zadig zugewiesen? Mach das wieder rückgängig und implementieren die OS aware Deskriptoren damit Windows das Gerät automatisch erkennt. Damit wird dein Device automatisch der WinUsb Class zugeordnet. Ist dann so ähnlich wie ein HID Class Device oder jedes andere Device was von einem Classtreiber unterstützt wird. Allerdings kann WinUsb nur auf Device Ebene und nicht auf Interface Ebene benutzt werden das geht nur mit richtigen class Treibern. Der Treiber den Zadig anzeigt ist der Original WinUsb Treiber der mit Windows kommt. Der Stlink Treiber vermutlich ein Treiber der ST kommt. Ansonsten vermute ich den Bug eher in deiner Bibliothek zum Listen der Devices.
Thomas Z. schrieb: > Ansonsten vermute ich den Bug eher in deiner Bibliothek zum Listen der > Devices. Das vermute ich auch. Zadig braucht man eigentlich überhaupt nicht. Bei korrekt implementiertem WinUSB-Gerät erscheint das Gerät sofort im Geräte-Manager und ist einsatzbereit. Versuche es mal über libusb oder direkt das WinUSB-API. Dort sollte das Gerät erscheinen. Es ist dann natürlich kein HID-Gerät mehr und erscheint auch so nicht mehr.
Hi, das hätte ich eventuell dazuschreiben sollen: Ich habe mit Zadiag keine Treiber zugewiesen. Nur zum Anzeigen der Treiber. die Deskriptoren sehen bei mir so aus:
1 | const uint8_t USB_DriverDescriptor[USB_COMPAT_ID_DESCRIPTOR_SIZE] __ALIGNED(4) = { |
2 | USB_COMPAT_ID_DESCRIPTOR_SIZE, // dwLength, Length of descriptor (4 bytes) |
3 | 0x0u, |
4 | 0x0u, |
5 | 0x0u, |
6 | 0x0u, 0x1u, // bcdVersion (2 bytes) |
7 | 0x4u, 0x0u, //wIndex, Index of os descriptor? (2 bytes) |
8 | 0x01u, //bCount, number of custom property sections |
9 | 0, 0, 0, 0, 0, 0, 0, //Reserved, 7 bytes |
10 | 0x0u, // bFirstInterfaceNumber |
11 | 0, //Reserved |
12 | 'W', 'I', 'N', 'U', 'S', 'B', 0, 0, // compatibleID, WINUSB, 2 trailing 0s |
13 | 0, 0, 0, 0, 0, 0, 0, 0, //subCompatibleID 8 bytes |
14 | 0, 0, 0, 0, 0, 0, //Reserved, 6 bytes |
15 | };
|
16 | const uint8_t USB_MSStringDescriptor[] __ALIGNED(4) = { |
17 | 0x12, USB_DESC_TYPE_STRING, 'M', 0, 'S', 0, 'F', 0, 'T', 0, '1', 0, '0', 0, '0', 0, USB_MS_VENDOR_CODE, 0}; |
USB_MS_VENDOR_CODE = 0xAB, USB_DESC_TYPE_STRING = 3, USB_COMPAT_ID_DESCRIPTOR_SIZE = 0x28 Im Verglecich zu https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-device-specific-registry-settings fehlt aber die DeviceInterfaceGUID. Die gibt es bei mir nicht.
Servus, kurze Rückmeldung von mir: Das Problem lag wohl nicht an der uC-Implementierung, sondern in der C# Bibliothek. Ich nutze jetzt LibUsbDotNet mit der libusb-1.0.dll. Damit kann ich problemlos auf das Gerät zugreifen und Lesen/Schreiben. Falls es wen interessiert: Geschwindigkeit Out (PC --> uC RAM): ~ 280kB/s (Ausbaufähig, jedes 64 byte Paket wird 2x kopiert) Geschwindigkeit In (uC RAM --> PC): ~ 660kB/s Das ganze ohne HAL/MBed etc. Gruß Kevin
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.