Forum: Mikrocontroller und Digitale Elektronik USB - Device


von Dave (Gast)


Lesenswert?

Hallo,

ich mache gerade folgendes Projekt:

mit einem at90usb162 steuere ich ein s65 Display an. Ich verwende es 
dazu, um titel, laufzeit, fortschritt,... usw. von winamp anzuzeigen. 
die pc - anbindung funktioniert usb. soweit funtkioniert es auch 
wunderbar.

meine display-platine ist als usb-hid device angebunden. dazu verwende 
ich den stack von atmel. zusätzlich wollte ich vom pc noch bilder an das 
display schicken. auch das funktioniert - jedoch extrem langsam. mein 1. 
aufbau war mit serieller schnittstelle und damit konten mit  38.4 kbaud 
die bilder in einer akzeptablen zeit übertragen werden. mir ist halbwegs 
klar, warum es als hid device so langsam geht - es werden ja pro request 
max. 8 byte übertragen und hid ist sowieso nicht ausgelegt, dass man 
größere daten überträgt.

was ich nun gerne hätte: eine andere "generische" device class, für die 
ich keinen treiber schreiben brauche, jedoch eine halbwegs akzeptable 
datenrate zusammenbringe. ein cdc (serielle schnittstelle) device ist 
suboptimal, da man dann von der pc-applikation den seriellen port 
auswählen müsste, was sich für ein usb-device etwas widersprechen würde.
gibt es vl. irgend einen "generischen" treiber, wo ich einen in- und 
-out endpoint habe (interrupt, bulk, isynchronous... vorerst nicht so 
wichtig) und einfach wie bei einer seriellen schnittstelle daten 
reinschicken kann, die wie bei einer seriellen schnittstelle 
nacheinander am device herauskommen ?
libusb will ich nicht unbedingt verwenden.

ich hoffe ihr könnt mein problem nachfolziehen und danke schon mal für 
die hilfe.

lg,

dave

von Mars (Gast)


Lesenswert?

>...mir ist halbwegs
>klar, warum es als hid device so langsam geht - es werden ja pro request
>max. 8 byte übertragen...

Im Fullspeed-Modus kannst du für jeden EP pro Request bis zu 64 Bytes 
übertragen und das jede Millisekunde. Vermutlich ist der Atmel Stack 
aber anders konfiguriert, da man diese Datenrate nicht braucht.

>...und hid ist sowieso nicht ausgelegt, dass man
>größere daten überträgt...

Das stimmt, man erreicht aber trotzdem recht brauchbare Datenraten.

>...was ich nun gerne hätte: eine andere "generische" device class, für die
>ich keinen treiber schreiben brauche, jedoch eine halbwegs akzeptable
>datenrate zusammenbringe...

Für Windows kenne ich bis auf HID nichts. Für alles andere würde ich 
WinUSB verwenden.

von Dave (Gast)


Lesenswert?

Mars schrieb:
> Für alles andere würde ich
> WinUSB verwenden.

danke für den hinweis, habe mir WinUSB angesehn und scheint sehr 
brauchbar für meine anforderungen

von Potter S. (potter68)


Lesenswert?

Hallo Dave (Gast),

wo siehst Du den Widerspruch bei einem virtuellen COM-Port? Es gibt doch 
nichts Einfacheres als über CreateFile(), ReadFile(), WriteFile() auf 
eine Schnittstelle zuzugreifen!

Im Übrigen brauchst Du auch bei einem HID-Gerät diese Funktionen. Hier 
kommt allerdings noch hinzu, dass Du (relativ) umständlich erst einmal 
ein Handle auf Dein Gerät erzeugen musst. Das entfällt bei der 
CDC-Klasse.

Eine (vernünftige) Alternative zu diesen beiden Optionen gibt es nicht.

Gruß Potter

von Mars (Gast)


Lesenswert?

>wo siehst Du den Widerspruch bei einem virtuellen COM-Port? Es gibt doch
>nichts Einfacheres als über CreateFile(), ReadFile(), WriteFile() auf
>eine Schnittstelle zuzugreifen!
>Im Übrigen brauchst Du auch bei einem HID-Gerät diese Funktionen. Hier
>kommt allerdings noch hinzu, dass Du (relativ) umständlich erst einmal
>ein Handle auf Dein Gerät erzeugen musst. Das entfällt bei der
>CDC-Klasse.

Eine Open, Read, Write und Close Funktion wirst du bei jedem Device, 
egal welche Schnittstelle es implementiert benötigen.
Allerdings hast du bei der CDC das zusätzliche Problem den richtigen 
COM-Port zu finden. Dem Anwender einfach einen Auswahldialog mit COM1 
bis COM99 zu präsentieren ist einfach nicht mehr zeitgemäß. Und auf das 
spielt wohl der Threadersteller an.
Bei der HID-Klasse ist es in der Tat aufwändiger das Device zu finden. 
Allerdings muss man diesen Code auch nur einmal schreiben bzw. aus dem 
Internet kopieren. Dafür ist es ein leichtes das richtige Device anhand 
der VID&PID zu finden ohne den Anwender fragen zu müssen.

von Christian R. (supachris)


Lesenswert?

Einen virtuellen COM Port anhand der VID/PID in der Registry suchen ist 
genauso wenig ein Problem.

von ARM ab (Gast)


Lesenswert?

Mars schrieb:
> Allerdings hast du bei der CDC das zusätzliche Problem den richtigen
> COM-Port zu finden. Dem Anwender einfach einen Auswahldialog mit COM1
> bis COM99 zu präsentieren ist einfach nicht mehr zeitgemäß. Und auf das
> spielt wohl der Threadersteller an.

Naja, man braucht ja nur die installierten COM Ports anzuzeigen. Ist ja 
unter Windows kein Problem.
Und über die Eigenschaften kann man die auch soweit eingrenzen, daß man 
nicht die Onboardschnittstellen anzeigt.
Ist also nur unschön, falls mehrere Atmels am Rechner hängen.
Insofern ist das schon die beste Lösung.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Ist also nur unschön, falls mehrere Atmels am Rechner hängen.

Auch kein Problem, denn USB-Geräte können eineindeutige Seriennummern 
erhalten.

von M. G. (looking)


Lesenswert?

Dave schrieb:
> Hallo,
>
> ich mache gerade folgendes Projekt:
>
> mit einem at90usb162 steuere ich ein s65 Display an. Ich verwende es
> dazu, um titel, laufzeit, fortschritt,... usw. von winamp anzuzeigen.
> die pc - anbindung funktioniert usb. soweit funtkioniert es auch
> wunderbar.


Sehr interessantes Projekt. Wärst Du bereit, weitere Infos zu posten?
- Zugriff auf Winamp-Infos
- evtl. Schaltplan und Sourcecode?
Danke.


Bzgl. "generische" device class:
Digitale Bilderrahmen melden sich oft als CD-Laufwerk und transferieren 
dann Daten über SCSI-Protokoll.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

CD-Laufwerk? Unwahrscheinlich, das ist nicht beschreibbar. Das wird ein 
"MSD" sein, ein "mass storage device", wie jeder USB-Stick auch.

von M. G. (looking)


Lesenswert?

Rufus t. Firefly schrieb:
> CD-Laufwerk? Unwahrscheinlich, das ist nicht beschreibbar. Das wird ein
> "MSD" sein, ein "mass storage device", wie jeder USB-Stick auch.

Zumindest die "kleinen" Bilderrahmen (1,5" oder 2,4" Bilddiagonale) 
melden sich oft als CD-Laufwerk. Siehe z.B. auch hier:
http://forum.ubuntuusers.de/topic/digitaler-bilderrahmen-nicht-schreibbar/

Die Bilder werden nicht als normale Dateien übertragen, sondern über 
eine spezielle PC-Software per SCSI-Befehlen. Diese Software ist meist 
auf dem digitalen Bilderrahmen gespeichert und wird per Menü vom 
Bilderrahmen aus gestartet (AutoStart-Funktion einer CD)

von dave (Gast)


Lesenswert?

Mars schrieb:
> Allerdings hast du bei der CDC das zusätzliche Problem den richtigen
> COM-Port zu finden. Dem Anwender einfach einen Auswahldialog mit COM1
> bis COM99 zu präsentieren ist einfach nicht mehr zeitgemäß.

genau das meine ich. es sieht einfach "professioneller" aus, wenn man 
keine com-ports hat. funktionieren würde es eh genauso mit cdc.

Ralf Handrich schrieb:
> Im Übrigen brauchst Du auch bei einem HID-Gerät diese Funktionen. Hier
> kommt allerdings noch hinzu, dass Du (relativ) umständlich erst einmal
> ein Handle auf Dein Gerät erzeugen musst. Das entfällt bei der
> CDC-Klasse.

für hid device gibt es von atmel quellcode für den avr und eine 
windows-dll, mit der man auf sein hid-device zugreifen kann. das ist 
relativ unkompliziert und funktioniert ja auch schon.

M. G. schrieb:
> Sehr interessantes Projekt. Wärst Du bereit, weitere Infos zu posten?
> - Zugriff auf Winamp-Infos
> - evtl. Schaltplan und Sourcecode?
> Danke.

ja, würde ich machen. vorher muss ich aber noch den code etwas 
aufräumen, da ich erst mal wert auf funktionalität und nicht schönen 
quellcode gelegt habe ;-) für den zugriff auf winamp von einem externen 
programm gibts eine schöne doku + beispiele auf http://dev.winamp.com/

von Potter S. (potter68)


Lesenswert?

Du hast davon gesprochen, das Du die LIBUSB nicht nehmen wolltest. Da 
bin ich davon ausgegangen, dass Du auf API-Funktionen zurückgreifst. 
Umso besser, wenn es schon eine fertige LIB gibt.

Dein erster Aufbau war mit serieller Schnittstelle. Da hast Du ja die 
Arbeit schon getan! Warum nicht ein kleines Protokoll einfügen, bei dem 
Du alle vorhandenen COM-Ports öffnest, zwei Bytes rausschickst und auf 
eine Antwort wartest?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Warum nicht ein kleines Protokoll einfügen, bei dem
> Du alle vorhandenen COM-Ports öffnest, zwei Bytes rausschickst und auf
> eine Antwort wartest?

Das ist Pfusch. Sollte man auf keinen Fall so machen.

von Potter S. (potter68)


Lesenswert?

Wenn Du mir einen Grund nennst, bin ich schlauer.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

a) es dauert je nach Anzahl der verfügbaren Schnittstellen eine ganze 
Weile
b) angeschlossene Geräte könnten auf die gesendeten Daten mit Störungen 
aller Art reagieren

Mechanismen, wie man die gewünschte Schnittstelle feststellen kann, ohne 
alle anderen zu befummeln, wurden bereits genannt.

von termite (Gast)


Lesenswert?

@  Christian R:

die suche in der Registry ist auch nur ein Notnagel, nur weil die suche 
über die SetupAPI von M$ kaum bis garnicht dokumentiert ist, heist das 
noch lange nicht, das man das auch so machen sollte.


Die geräte sind in einer art Baumstruktur organisiert. eignentlich so 
ähnlich wie im Gerähtemanager, nur das dort teile der äste fehlen, und 
ggf wo anders wieder auftauchen.

1. suchen des USB Device Kontens anhand VID und PID. ggf Seriennummer.
2. hocharbeiten bis zu dem punkt, wo der Name des Virtual Com Ports 
bekannt ist und auslesen.
oder, die vorhandenen Com Ports "öffnen", und dem pfad nach Unten 
folgen, bis man entweder im root landet, oder an dem unter 1 gefundenen 
USB Device Knoten.

Ich hate ein ähnliches Problem: welche Laufwerksbuchstaben gehöhren zu 
welchem USB Device. für MSD gibt es irgendwo im netz ein paar code 
schnipsel.

war glaubich auf www.codeproject.com .

Ich muss aber auch sagen, die SetupAPI ist nicht gerade einfach zu 
verstehen.

gruss termite

von Potter S. (potter68)


Lesenswert?

@rufus

zu a) eine ganze Weile ist relativ. Wenn Du da von Millisekunden 
sprichst, wäre das tragbar.
zu b) möglich, ist mir aber noch nicht vorgekommen.

Die eleganteste Lösung ist es wohl trotzdem nicht.

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.