mikrocontroller.net

Forum: PC-Programmierung USB unter Windows - LibUSB


Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Ich versuche eine Hardware anzusteuern, die am USB hängt.
Die hardware hat 2 Interfaces. Das erste ist ein MassStorageDevice und 
das zweite hat keine (Standard)Spezifikation. Man kann einfach Daten 
senden.
Das MSD ist mit Enpoint 1 und 2 verbunden.
Das andere Interace nutzt Endpoint 3 und 4.

Ich möchte nun mit meiner Applikation mit EP3 und 4 kommunizieren.
Mit LibUSB hab ich das schon hinbekommen, jedoch hab ich große probleme 
mit der Stabilität. Wie mit google verraten hat, ist LibUSB nicht 
multithreading Safe, noch werden konkurrierende Prozesse unterstützt.

Wie ist sowas hinzubekommen? Man müsste Windows XP irgendwie sagen, dass 
USB jetzt ganz alleine mir gehört und das gewartet werden soll.

Hat mit soetwas jemand Erfahrung?

MFG

: Verschoben durch Admin
Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>google verraten hat, ist LibUSB nicht
>multithreading Safe

Was meinst Du damit genau?

Unter Linux hatte ich mit libusb keine Probleme mit meiner Platine zu 
kommunizieren und gleichzeitig USB-Mouse, Keyboard und Drucker zu 
nutzen. Das sollte ja auch wohl selbstverständlich sein. Wobei es seit 
damals wohl mindestens eine neue Version von LibUSB gibt, aber es sollte 
ja nicht schlechter geworden sein...

Oder beziehst Du dich nur auf Windows7?

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Windows XP irgendwie sagen,

Da habe ich nicht aufgepasst...
Aber ich verstehe es nicht, dann wäre libusb für Windows ja praktisch 
nutzlos. Kannst Du angeben, was Du mit Google gefunden hast?

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur windows.
Und: bei dir waren Mouse und Tastatur sicher getrennte Devices. Damit 
hätte ich auch keine Probleme.
Hier ist es EIN Gerät mit 2 Interfaces, das von 2 Programmen 
gleichzeitig benutzt wird. Dabei scheint es zu gegenseitigen 
Blockierungen oder Kollisionen zu kommen.
Kollision natürlich nicht auf dem Bus, sondern auf Treiberebene.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja, jetzt verstehe ich Dein Problem. Das ist wohl echt kompliziert.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, und nun brauch ich noch ne Lösung dazu :-P

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich frage mich aber gerade warum das ganze überhaupt probleme macht :-/
Auch eine kollision von treiberzugriffen dürfte doch das USB protokoll 
auffangen, denn die Anfragen gehen an verschiedene Endpoints.

Liegt es vielleicht an etwas anderem?

Symptome: Zugriff auf die KOmmunikationsendpoints funktoinieren nur 
zufällig. Sobald es einmal nicht funktoineirt, muss ich komplett neu 
connecten damit mein gerät wieder ansprechbar ist.

MFG

Autor: Martin Freund (martinf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würd mal nen USB Monitor dazwischen schalten und nen 
funktionierenden Zyklus mit einem der nicht funktioniert vergleichen. 
Möglicherweise gibts ne race condition am control endpoint.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, guter ansatz erstmal:
Das 2. Interface das ich eingerichtet habe um einfach nur auf die 2 
zusätzlichen Endpoints zuzugreifen.. Muss ich da am Control-Endpoint 
irgendwas beachten? Auf was muss der reagieren... bis jetzt hab ich 
wirklich nur die beiden zusätzlichen Endpoints konfiguriert und reagiere 
auf einkommende Pakete. Der Rest ist von Atmels 
MassStorageDevice-Beispiel (wo nicht 2 Interfaces zum einsatz kommen)

Ich frage in die Richtung, da die Kommunikation per LibUSB immer meint 
"Cant read DeviceDescriptor" und danach kann das gerät bis zu einen 
reconnect nicht mehr enumeriert werden.

Was muss ich am ControlEndpoint beachten?

Autor: Martin Freund (martinf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DerAlbi schrieb:
> Was muss ich am ControlEndpoint beachten?
Timing

Aber ob ein HID-Vendor-Hybrid (composite device) überhaupt mit 
LibUSB-Win32 funktioniert ...

Zumindest sollte das composite device als zwei geräte im device manager 
auftauchen.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, und wie erreicht man das?
Da müsste der Host bei der Enumeration den EP0 ja mehrmals die 
Fragestellen wer er ist. Tut er das, Wenn JA, wann und wie bekomm ich 
das raus?

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein weiteres Problem: ich will eigentlich gar nicht, dass man für das 
gerät irgendwelche Treiber installieren muss oder das Windows danach 
fragt. Ich will wirklich NUR die 2 zusätzlichen Endpoints haben für mein 
Debug-Programm.

MFG

Autor: Martin Freund (martinf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DerAlbi schrieb:
> ich will eigentlich gar nicht, dass man für das
> gerät irgendwelche Treiber installieren muss oder das Windows danach
> fragt.

Dann brauchst du dafür auch n HID interface.

Und die enumeration der 2 Geräte erfolgt per composite device in einem 
Rutsch.

Such dir da lieber mal gute Literatur; hab das Gefühl als ob das derzeit 
eher nach copy-paste-modify abläuft.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst also ich soll das Gerät sozusagen als Maus anmelden?

Du hast recht. USB ist komplex. Das dauert ewig. Ich bin schon froh, 
dass ich die MSD-Software auf meinen Ap7000 portieren konnte. Deswegen 
ist was wirklich nur angepasste Software.
Was Literatur angeht: ich hab mich bemüht, aber entweder man ließt alles 
und versteht nix, oder man schneidet ein wenig etwas mit, wenn man die 
Zusammenfassungen ließt.

PRoblem am HID wird doch sein, dass auch das einem bestimmten Protokoll 
folgt oder?
Zu viel aufwand. Ich habe mein Eigenes Protokoll das einfach nur 
zwischen meinem Gerät und meinem PC-Programm laufen soll.
Das kann doch nicht sooo schwer zu erreichen sein :-/

Autor: Martin Freund (martinf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DerAlbi schrieb:
> Ich will wirklich NUR die 2 zusätzlichen Endpoints haben für mein
> Debug-Programm.

Wenns eh nur ums Debugging geht, dann reicht doch RS232?
Ein USB CDC COM Port mit Mass Storage Device wär da schon einfacher zu 
realisieren, da es zu beidem Beispielcode von Atmel gibt. Außerdem 
kommst du dann ohne LibUSB aus.

Der Weg über ne HID Maus wird nicht funktionieren, dann würden ja die 
Debugmeldungen als Mausbewegungen interpretiert :P
Bei den HID usage pages könnte ab 0x0B was dabei sein, hatte aber mit 
denen noch nix zu tun.

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem bei dem ganzen ist, dass ich richtig hohge Datenraten (gut & 
gerne 10MB/s) habe und das ganze per dma steuerbar sein muss. Wenn ich 
mich da wirklich an irgendein protokoll halte blockiert mir das zu viele 
freiheiten.

Ich denke wirklich, dass ich gaaaanz einfach nur die Enumeration des 
Conpositdevices ghinbekommen muss.

Ich habe ja wie gesagt meinen DeviceDescriptor schon angepasst.. und 
wenn ich die Enumeration des MSD verbugge, sagt mir der Gerätemanager 
auch schon dass da ein verbundgerät dran hängt. Wird das MSD enumeriert, 
gibt es aber kein weiteres unbeakanntes gerät.

Ich habe bisher noch keine wirklich hilfreichen Dokumente gefunden die 
mir genauer beschreiben wie die Enumeration funktioniert. Irgendwo muss 
ja am ControllEndpoint der InterfaceIndex mitgeliefert werden, der 
gerade enumeriert werden soll.
den habe ich bisher noch nicht gefunden bzw hätte er sinnlose werte.

MFG

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was soll man nun ohne Code dazu sagen? Richtig... nichts.

Autor: Der Albi (der-albi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe mich jetzt doch nocheinmal mit EasyUSB hingesetzt und die 
Inkmpatibilitäten zum Borland Compiler geflickt.
Mein Programm läuft jetzt auch als CompositeDevice perfekt stabil!

Aaaaber: easyUSB ist ja sooooo laaahhhhm.
Mit LibUSb hatte ich locker 12Mb/s.. EasyUSBconnect schrumpft das auf 
1.2MB/s zusammen.

Ich bin jetzt ein wenig gefrustet. Jetzt hab ich stabilität gegen 
Bandbreite getauscht. Problem dabei: ich brauch die Bandbreite dringend. 
(muss bitmaps übertragen)
Die Bandbreite dafür ist jetzt schon eng.

Hat jemand erfahrung mit easyUSBconnect??
Ist die Begrenzung typisch für diesen Treiber? Kann eventuell der 
EndpointTyp etwas ändern? Vielleicht ist der Bulk-transport schuld?

Beschränkt EasyUSB vielleicht auf Fullspeed?? Wie könnte man das ändern?

Meinungen! (bitte)

MFG

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit LibUSb hatte ich locker 12Mb/s..
> EasyUSBconnect schrumpft das auf 1.2MB/s zusammen.

Wenn Du dich jetzt an die Konvention gehalten hast, mit "b" Bit und mit 
"B" Byte zu meinen, dann ist das mit dem "schrumpfen" ironisch gemeint, 
oder wie jetzt?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.