Forum: PC-Programmierung LibUsb unter Win7-Win10


von Dieter (Gast)


Lesenswert?

Hallo,

Ich habe ein Gerät xmega128a1u, daß ich mit dem PC unter Win7-Win10 via 
USB -CDC verbinden will. Auf dem Xmega läuft die Kommunikation als CDC. 
Auf dem PC soll eine Eigen-Software laufen, die selbstständig erkennt, 
wenn das Gerät an oder abgesteckt wird. Weiterhin möchte ich, daß der 
Benutzer nach Möglichkeit keine Treiber installieren soll.

Die USB-CDC-Kommunikation funktioniert sowohl unter Win7, als auch unter 
Win10.
Unter Win7 muss ich jedoch eine entsprechende *.inf-Datei installieren, 
was unter Win10 nicht nötig und offensichtlich auch nicht ohne weiteres 
möglich ist.
Eine Erkennung, ob ein USB-Gerät an oder abgesteckt wurde funktioniert 
auch, es wird die Windows-Message WM_DEVICECHANGE verwendet.
Was mir fehlt, ist eine direkte Abfrage der USB-Descriptoren im xmega.
Das kann ich mit Libusb erreichen, jedoch komme ich mit der 
Standard.inf-Datei nicht an die String-Descriptoren. Um das zu erreichen 
muss ich mittels dem Programm Zadig die entsprechende Umschaltung für 
die Libusb vornehmen.
Unter Win10, habe ich LibusK in Zadig eingestellt, um die 
String-Descriptoren auszulesen.
Dies möchte ich dem Benutzer jedoch nicht aufbürden.

Fragen:
- Wie kann ich am einfachsten die Treiber-Installation automatisieren ?
- Wie komme ich an eindeutige Informationen über das USB-Gerät 
(String-Descriptor) ?
- Gibt es möglichkeiten die Eindeutigkeit mittels idVendor und idProduct 
zu erreichen ? (dazu bräuchte ich nicht libusb_open() verwenden).

Danke Dieter

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Dieter schrieb:
> Auf dem PC soll eine Eigen-Software laufen, die selbstständig erkennt,
> wenn das Gerät an oder abgesteckt wird.

Dann ist CDC nicht unbedingt sinnvoll; du kannst ja über libusb direkt 
mit dem Gerät kommunizieren und brauchst den CDC-Treiber (usbser.sys) 
überhaupt nicht. Dann hast du auch allgemein mehr Kontrolle über die 
Kommunikation (Timing, Handshake usw).

Wenn dein USB-Gerät keine Standard-Klasse hat, kannst du es über 
zusätzliche Deskriptoren als WinUSB-Device markieren. Dann wird ab 
Windows 8 automatisch der WinUSB-Treiber geladen, ohne dass irgendwelche 
Treiber-Installation oder Konfiguration nötig ist. Unter Windows 7 muss 
man manuell per Zadig oder Geräte-Manager WinUSB auswählen.
Wenn dann WinUSB für dein Gerät aktiv ist, kannst du per libusb direkt 
darauf zugreifen, Deskriptoren auslesen und Daten senden/empfangen wie 
du möchtest. Das ist m.M.n sowieso die sauberere Lösung als CDC, weil so 
kein anderes Programm versehentlich auf das Device zugreift und du die 
Kommunikation direkt steuern kannst.

Siehe auch mein Tutorial:
https://www.mikrocontroller.net/articles/USB-Tutorial_mit_STM32#Eigene_Anwendung_f.C3.BCr_PC-Seite
Ist zwar für STM32, aber für die PC-Seite ist das egal.

von Jim M. (turboj)


Lesenswert?

Dieter schrieb:
> - Wie kann ich am einfachsten die Treiber-Installation automatisieren ?

Im Zadig bzw. dessen Quellcode ist ein "wdi-simple.exe" Programm dabei, 
das man als Admin bei der Installation aufrufen kann.

Die andere Alternative über WinUSB ist dort auch beschrieben: Das USB 
Device gibt (IIRC über Vendor-specific Requests) dem OS zu Verstehen das 
es WinUSB.sys als Treiber haben will. Funktioniert ab Win8 (IIRC).

Die LibUSBK verträgt AFAIK auch WinUSB als Backend.


Win10 hat aber USB CDC nativ, also ohne Treiber - ganz normal über einen 
COM Port. Das macht die Treiber-Installation aufwändiger, denn man muss 
ja den vorhanden Treiber ersetzen.

Besser wäre es den CDC Support komplett zu droppen (also Vendor Specific 
Class in den Deskriptor eintragen), wenn man mit LibUSB/WinUSB arbeiten 
will.


> Was mir fehlt, ist eine direkte Abfrage der USB-Descriptoren im xmega.

Schau Dir mal das SetupAPI Zeuchs an, IIRC kann man darüber viele Infos 
über USB Devices ran schaffen.

von Christian R. (supachris)


Lesenswert?

Niklas G. schrieb:
> Dann wird ab Windows 8 automatisch der WinUSB-Treiber geladen

Das wurde auch im Windows 7 dann mal nachgerüstet.
Ansonsten kann man den WinUSB Treiber auch so nutzen, man muss dann nix 
signieren, aber ein Inf und die wdf coinstaller DLLs haben. Kann man mit 
Wix in eine Setup Exe packen. Oder die dpinst daneben legen.

von Dieter (Gast)


Lesenswert?

Vielen Dank,

ich denke, ich habe mich der libusb ein wenig verlaufen, da ich die 
Verbindung von der Geräte-Kennung (VID/PID) zum zugewiesenen COM-Port 
unter Windows brauche. Ich habe rausgefunden, daß ich diese Infos 
mittels der Windows SetupAPI-Funktionen lesen kann. D.h. libusb ist 
erstmal aussen vor.

Jedoch haben sich andere Probleme aufgetan:
- unter Windows 10 wird für CDC einfach ein Standard-Treiber verwendet,
  das kann ich mittlerweile auch ganz gut auswerten
- wie kann ich aber unter Windows 7 die entsprechende inf-Datei zum CDC
  automatisch installieren ?

Ich habe schon Versuche mit dpinst und devcon gemacht, bin aber nicht so 
richtig zufrieden.

Meine Planung sieht wie folgt aus (für Windows 7):
- der User startet die Anwendung
- es soll geprüft werden, ob bereits ein Treiber installiert ist
- wenn ja ist gut
- wenn nein: inf-Datei installieren (z.B. devcon update ...)

Dabei ist immer zu bedenken: das USB-Gerät ist entweder eingesteckt oder 
auch nicht.

Wie kann ich vernünftig die Ergebnisse prüfen, ich lasse devcon in einer 
Batch laufen ?

Wie ist das mit dem automatischen online-Treiber-update, lässt sich dies 
programmtechnisch abschalten (nur für diesen Vorgang) ?

Darf ich devcon und co. verwenden, wenn die Software kommerziell genutzt 
wird ?

Danke Dieter

von c-hater (Gast)


Lesenswert?

Dieter schrieb:

> Eine Erkennung, ob ein USB-Gerät an oder abgesteckt wurde funktioniert
> auch, es wird die Windows-Message WM_DEVICECHANGE verwendet.
> Was mir fehlt, ist eine direkte Abfrage der USB-Descriptoren im xmega.

Die vollständigen Descriptoren kann man nicht einfach abfragen, aber 
VID/PID geht. Ein elegante RegEx auf die HardwareID des neu erkannten 
(aber "unbekannten") Gerätes anwenden.

> Fragen:
> - Wie kann ich am einfachsten die Treiber-Installation automatisieren ?

1) Setup-Api benutzen, um die HardwareID des neuen "unbekannten" Gerätes 
zu ermitteln.
2) s.o.
3) erhöhte Rechte anfordern (der Benutzer muss dann die UAE-Frage 
abnicken)
4) passende *.inf aus Programmresource holen und als Datei speichern.
5) Treiberinstallation für diese *.inf anstoßen

Allerdings: Punkt 3 wird fehlschlagen, falls der Benutzer nicht lokaler 
Admin ist. Dann wäre die letzte Ausweichmöglichkeit: Impersonation eines 
Admin-Accounts, zu dem der Benutzer die Credentials besitzt.

Hat er die nicht, hat er verloren. Und das ist GUT SO!

von Christian R. (supachris)


Lesenswert?

Eine Anwendung die einen Treiber installiert? Naja ich weiß nicht. Wieso 
kein sauberes Setup für Anwendung und Treiber? Das kannste dir ganz 
einfach in Wix zusammen stellen.
Ansonsten gibts das API was hinter dpinst steckt, ja auch zur 
Integration in eigene Software, macht Wix ja auch nicht anders: 
https://technet.microsoft.com/en-us/ff544838(v=vs.96)

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Christian R. schrieb:

> Eine Anwendung die einen Treiber installiert?

Nicht die Anwendung installiert den Treiber. Sie stößt die 
Treiberinstallation nur an.

Und das ist der absolute Normalfall. Jedenfalls unter Windows. Der 
Unterschied ist hier nur: es ist "ausnahmsweise" mal keine Anwendung, 
die Windows im Lieferumfang mitbringt...

Das "ausnahmsweise" steht aber ganz bewußt in Anführungsstrichen. Es 
gibt nämlich unzählige, durchaus verbreitete Anwendungen, die in der 
Lage und willens sind, zur Laufzeit eine Treiberinstallation anzustoßen. 
Naturgegeben natürlich besonders Anwendungen vom "portable"-Typ...

von georg (Gast)


Lesenswert?

Christian R. schrieb:
> Eine Anwendung die einen Treiber installiert?

Es gibt USB-Devices, z.B. als Development Device, die enthalten nicht 
nur Hardware, sondern in einem ROM auch die gesamte Software - nicht nur 
Treiber, sondern z.B. alles bis zum C-Compiler. Die muss man wirklich 
nur einstecken und alles abnicken.

Ich finde das Konzept aber fragwürdig, nicht nur wegen des Aufwands, 
sondern auch weil die Software niemals aktuell ist. Praktisch muss man 
nach der Installation gleich updaten, da kann man sich Treiber usw. auch 
gleich aus dem Netz holen.

Georg

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.