Forum: PC-Programmierung usb device treiber embedded Linux


von Joachim J. (felidae)


Lesenswert?

Ich habe eine Mikroprozessor Boart (imx6) auf dem ich das Linux Derivat 
Yokto installiert habe. Das Boart besitzt einen USB OTG Anschluss. Ich 
kann jetzt verschiedene Module Laden.

g_mass_storage Flash Speicher
g_serial       serielle Schnittstelle
g_ether        Netzwerkkarte

Ich habe vor ein Messinstrument zu realisieren, welches seine Messdaten 
an Labview sendet wo diese ausgewertet werden. Aber auch an andere 
Programme Plattform unabhängig. Das Messinstrument selber ermittelt 
seine Daten aus Video Aufnahmen (CMOS Sensor). Sowohl die Bilddaten(rund 
1MB/s) als auch die aus den Bilddaten ermittelten Messwerte(1KB/s) 
möchte ich via USB als Live Stream übertragen. Erstmal nur an Labview. 
Die Bedienung muss dabei DAU freundlich sein. plug&play.

Mir fehlt da die richtige Idee. Flash Speicher und serielle 
Schnittstelle kommen nicht in frage. Mit dem Flash Speicher ist kein 
Stream zu realisieren und die serielle Schnittstelle kann wohl nur mit 
115200Baud Daten übertragen.

Die Netzwerkkarte ist da schon besser. Aber der User muss dann immer ein 
Netzwerk mir 2 IP's aufbauen und aufpassen, dass es da zu keinen 
Konflikten mit bereits vorhandenen Netzwerken kommt. viel zu viele 
mögliche Fehlerquelle. damit kommt ein DAU nicht klar.

Ich habe daher google befragt und herausgefunden das Herstelle von 
Messinstrument mit USB Anschluss sich ihre Treiber selber Programmieren 
und dabei oft einen Standard verwenden. USB-TMC (Universal Serial Bus
Test and Measurement Class) Labview unterstützt diesen Standard.

Ich glaube das beste wehre, wenn ich das genauso machen könnte.
Nur wo fange ich da an? Ich habe noch nie einen Treiber für USB 
Programmiert und weiß auch nicht wie da das Protokoll aus sieht.

Kann mir da jemand einen tipp geben, wie ich am besten an die Sache ran 
gehe?
Kennt jemand ein Buch oder ein Tutorial, welches mir weiterhelfen 
könnte?
Hat jemand vielleicht eine bessere Idee?

von Jim M. (turboj)


Lesenswert?

Joachim J. schrieb:
> serielle Schnittstelle kann wohl nur mit
> 115200Baud Daten übertragen

USB CDC ist die Datengeschwindigkeit egal. Da gehen bei Full Speed auch 
1MByte/sec durch - wenn die Programmierung sowohl auf dem µC als auch 
auf dem PC stimmt.

Aber schau Dir mal WinUSB an. Damit entfällt die lästige Entwicklung von 
USB Treibern.

von Jay (Gast)


Lesenswert?

USB-TMC ist nicht so das Problem. Es müsste einen Linux Gadget-Treiber 
dafür geben. Wenn nicht, das Protokoll ist einfach.

Problematisch sind eher:

- USB-UVC für den Video-Stream. Das zu implementieren ist schon eine 
ganz andere Nummer. Und zwar so, dass der Windows USB-UVC Treiber damit 
zurecht kommt.

- Ein USB-Port auf dem Linux-Board, zwei Geräte (Video, Messwerte) = 
Zwei USB-Interfaces = USB Composite Device Auch hier wieder so 
implementiert, dass der entsprechende Windows Composite Device (Mini?) 
Treiber damit zurecht kommt. Keine Ahnung ob es für Linux einen 
Composite Device Gadget Treiber gibt.

- Video-Stream in LabView reinbekommen... M.w. kostet das Video-Modul 
für LabView nur rund 400 Euro. Schnäppchen! Das kann dann vom gammeligen 
DirectShow API in Windows lesen. DirectShow wiederum kann vom USB-UVC 
Treiber in Windows lesen. Zumindest auf dem Papier.

Ich würde sagen, na dann mal viel Spaß.

von PittyJ (Gast)


Lesenswert?

Ich nehme für so etwas immer libusb. Die stellt eine Api bereit, mit der 
man beliebige USB-Geräte ansprechen kann.
Damit habe ich schon USB-MassStorage, USB Kameras und Arduinos direkt 
angesteuert.

Wie genau das Protokoll darüber aussieht, dass muss sie dein 
Messgeräte-Hersteller beantworten.

Mit neueren Versionen von Wireshark kann man auch USB mitschneiden, und 
so evtl das Protokoll beobachten und 'Reverse Engineeren'.
Dazu ist aber Erfahrung nötig.

von Joachim J. (felidae)


Lesenswert?

Das mit dem Video Stream ist weniger aufwendig als es klingt. Ich 
verwende einen Monochromen(Grau Stufen) Cmos Sensor. das heißt pro Pixel 
ein Byte.
160 Pixel pro Zeile und 120 Zeilen pro Frame. der Video Stream soll dann 
in Row Datenformat(seriell Pixel für Pixel) übertragen werden. Ist ein 
Frame fertig übertragen werden die restlichen Messdaten hinten ran 
gehängt. Das ganze dann mit 50fps.

: Bearbeitet durch User
von Jay (Gast)


Lesenswert?

Joachim J. schrieb:
> Das mit dem Video Stream ist weniger aufwendig als es klingt.

Ja dann mach. Was hängst du hier noch im Forum rum?

von Joachim J. (felidae)


Lesenswert?

Jay schrieb:
> Joachim J. schrieb:
>> Das mit dem Video Stream ist weniger aufwendig als es klingt.
>
> Ja dann mach. Was hängst du hier noch im Forum rum?

das Problem ist nicht die Formatierung der Daten sonder das Protokoll 
mit dem ich mich nicht auskenne und wo ich nicht weiß wie man das 
umsetzt.
Plug in, plug out, USB Identifikation, senden, empfangen und was da 
sonst noch so alles giebt.

ich werde am besten mal etwas in Detail gehen.

im Kernel des Boarts läuft ein Treiber(V4l Modul) welcher die Bilddaten 
vom CMOS Sensor entgegen nimmt und im Speicher ablegt. über eine Device 
Datei(/dev/video0) nehme ich die Daten im Userspace entgegen. Ein C++ 
Programm empfängt den Byte Strom und wertet diesen aus. Jetzt möchte ich 
den Datenstrom + Auswertung so wie er ist via USB weiter senden und z.B. 
in labview empfangen. Dort möchte ich die Daten anzeigen und weiter 
auswerten. Von labview aus möchte ich Einstellungen vornehmen können. 
Also einfache Steuerbefehle. z.B. Messung starten, 50/30/20 fps ...

Alles was ich bis her auf Basis von USB umgesetzt habe lief über UART 
und einem FTDI.

wie stelle ich aus c++ heraus auf meinem Device eine Verbindung via USB 
zu labview auf meinem PC her und wie funktioniert der Daten Austausch?

: Bearbeitet durch User
von Arc N. (arc)


Lesenswert?

Im Kernel sind die entsprechenden Device-Treiber (dort Gadget genannt) 
vorhanden
https://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git/tree/drivers/usb/gadget/function?id=refs/tags/v4.6.2
dazu ConfigFS und libusbg
https://github.com/libusbg/libusbg

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.