Forum: Mikrocontroller und Digitale Elektronik WinUSB Treiberinstallation notwendig?


von Kevin (Gast)


Angehängte Dateien:

Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Kevin (Gast)


Lesenswert?

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.

von Kevin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.