Forum: Mikrocontroller und Digitale Elektronik MIPI Kamera Treiber unter Linux - embedded system


von Bench (Gast)


Lesenswert?

Hallo zusammen,

ich bin auf der Suche nach einer variablen Plattform - variabel im Sinne 
des zu verwendenden Kamera Moduls.

Es gibt ja prinzipiell zwei verschiedene Ansätze:
- Hardwarelösungen mittels FPGA/SOC
- Software lastige Lösungen mit fertigen embedded Plattformen

Die FPGA Lösungen habe ich entsprechend analysiert und bewertet und 
möchte mich nun etwas in der Softwarelastigen Lösung vertiefen.

Viele Plattformen (RPI, NV Jetson TX1/2, Qualcomm) bieten ja eine 
fertige MIPI Implementierung an. Man kann also nativ MIPI Module 
anschließen, aber dann beginnt die Arbeit am Treiber.

Bis auf ein paar Grundkenntnisse in Linux und Python habe ich keine 
tiefgreifende Erfahrung auf dem Gebiet Linux/V4L/Treiber und möchte nun 
den Aufwand abschätzen, ob es lohnt sich damit auseinanderzusetzen.

Nehmen wir den RPI als Basis mit seinen zwei MIPI Lanes.
Dort gibt es ja fertige Linux Images incl. Treiber für die 
unterschiedlichsten Module.

Wie kompliziert ist es, auf Basis dieser existierenden Treiber, einen 
neuen Sensor einzubinden?

Das bedeutet ja die Konfiguration des Sensors mittels I2C und dann die 
Implementierung der Sensor Funktionen (Integration, usw.) und das 
Handling der Bilddaten die reinkommen, so dass sie von einem externen PC 
Interface zugänglich sind. Der RPI dient dann nur als "Kamera-Hardware" 
und die Bilddaten werden via USB oder LAN zum PC gesendet. Auch hier 
gibt es zahlreiche Applikationen, auf denen man aufsetzen könnte.
Die Daten zum LAN/USB zu bekommen ist hoffe ich machbar, wenn man die 
V4L Schnittstelle verwendet und ein fertiges Modul hernimmt?!

Nvidia Jetson TX1/2 incl. J100 Carrier Board stelle ich mir dann analog 
zum RPI vor. Wenn man also den RPI mit frischen Sensoren behandeln kann, 
sollte das auf Jetson auch machbar sein - nur dann mit zwei Kameras und 
wesentlich performanter.

Könnte man grob vorab die Arbeitspakete umreißen, was genau zu tun ist, 
so dass ich dann mit diesen Stichworten weiter recherchieren kann, um 
die Aufwände abzuschätzen?
Braucht man wirklich jahrelange C/C++ Erfahrung, um einen Treiber zu 
schreiben, oder gibt es alles im Netz und die Kunst ist nur es korrekt 
zusammenzukopieren und anzupassen?

Vielen Dank!

von K. L. (Gast)


Lesenswert?

Das hängt sehr von den Anforderungen ab. Wenn du einen bekannten Sensor 
mit üblichem Format hast, ein vordefiniertes Protokoll verwenden kannst 
und einen Treiber hast, dann ist das wirklich rasch zusammengefügt. Die 
Datentransportierung durchs Linux in die Applikationsebene ist mehr oder 
weniger gelöst. Oft muss da überhaupt nichts gemacht werden.

Hat der Sensor oder die Quelle ein spezielles Format oder Timing, muss 
ein Treiber her. Also Treiber klauen, modifizieren und im Linux bekannt 
machen. Schwierig wird es bei erhöhten Bandbreiten. Da kommt schnell die 
Frage auf, ob eine embedded Linux oder eine abgespeckte und angepasste 
Desktopversion läuft. Bei einer Ubuntu, wie wir das machen, auf der noch 
einiges anderes läuft, muss gfs der Kernel angepasst werden.

Spätestens bei Sonderanforderungen, wie Codierungen oder Markierungen im 
Bild oder eigenen Kompressionsformaten lässt sich nicht alles im Treiber 
oder der Anwendungsebene machen.

Kritisch wird es bei Anpassungen an die eigene Hardware. Da gibt es eine 
Reihe von Einstell-optionen, in denen man sich verlieren kann, um den 
JETSON in die eigene Umgebung anzupassen.

von Fitzebutze (Gast)


Lesenswert?

Bench schrieb:
> Braucht man wirklich jahrelange C/C++ Erfahrung, um einen Treiber zu
> schreiben, oder gibt es alles im Netz und die Kunst ist nur es korrekt
> zusammenzukopieren und anzupassen?

Nein, eigentlich brauchst du nur Erfahrung oder Intuition beim Debuggen 
der Probleme, die typischerweise auftauchen.
Wenn du die i2c-R/W-Transaktionen erst mal im User-Space prototypen 
kannst (d.h. das board-supply-package die Kommunikationsschicht und 
device tree hergibt), ist das nur noch Fleissarbeit, um einen Treiber 
fuer v4l2 (Video for Linux 2) zu portieren. Um eine Kamera zu bauen, ist 
das aber nicht zwingend noetig, da viele v4l2-ioctl()-Parameter nur 
bedingt umsetzbar sind.
Die eigentliche Bilderfassung sollte typischerweise ueber den 
MIPI-CSI-Teil des v4l2-Treibers abgehakt sein. Sollte. Da gibt es eine 
Menge Parameter, die die MIPI-Timings betreffen, und da kann bei manchen 
Sensoren auch viel schiefgehen, die Pakete kommen stotternd rein und der 
CSI versteht sie nicht richtig, oder das highspeed-lowspeed-Umschalten 
tut nicht sauber.

Wenn du also einen neuen Sensor implementieren willst: Schau, dass du 
eine funktionierende Referenz hast (Parameter, oder bereits 
existierender Code).

Die Crux an den MIPI-Kram ist die typischerweise fehlende bis nicht 
verfuegbare Dokumentation, auch mit NDA kriegt man teils nicht alles.
Und MIPI ist elektrisch sehr schwer zu debuggen, d.h. das 
Reverse-Engineering aufwendiger als beim Parallel-Video.

Streaming per LAN ist dann im user space per gstreamer abgehakt, bei USB 
wird es kniffliger, USB unter Linux im Slave-Betrieb ist teils recht 
zeitkritisch und ein groesserer Softwareaufwand als ein einfaches System 
mit FPGA und/oder USB-Soc wie FX3.

von Daniel (Gast)


Lesenswert?

Der ganze Userspace-Kram ist einfach. Da nimmt man FFmpeg oder GStreamer 
und stellt sich eine Kommandozeile zusammen, die das Video ins Netzwerk 
pustet.

Das schwierige ist einen Treiber für den Sensor zu schreiben, wenn es, 
wie du gesagt hast, ein neuer Sensor ist. Um zu entscheiden wie schwer 
das ist, schau dir am besten existierende Treiber an, z.B. 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/i2c/imx214.c 
oder 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/media/i2c/ov5647.c
Das ausführliche Datenblatt des Sensors mit der Beschreibung der 
Register zu haben, ist dafür Voraussetzung.

Beim RasPi wirst du den bcm2835-unicam Treiber brauchen, der hier 
diskutiert wird: 
https://www.mail-archive.com/linux-media@vger.kernel.org/msg119399.html
Mit dem anderen CSI-Treiber, der den Großteil der Arbeit dem VC4 
überlässt, kann man keine Kameras einbinden, die die VC4-Firmware nicht 
schon kennt.

von Tobias B. (Firma: www.elpra.de) (ttobsen) Benutzerseite


Lesenswert?

Daniel schrieb:
> Das schwierige ist einen Treiber für den Sensor zu schreiben, wenn es,
> wie du gesagt hast, ein neuer Sensor ist.

Das ist eigentlich nicht die Kunst, da immer das gleiche. Sensor via I2C 
initialisieren, MIPI Daten buffern, Bilddaten verarbeiten. Da 
unterscheidet sich der neue Treiber nur minimal von existierenden 
Implementierungen. Die Hauptarbeit uebernimmt da der MIPI PHY im MCU, da 
kommt man mit MIPI und den damit verbunden "Eigenheiten" in der Regel 
garnicht mit in Beruehrung.

Das groesste Problem ist immer an die Startup Sequenz des Sensors zu 
kommen. Da ruecken die Herstelle nur das noetigste an Informationen 
heraus und entsprechend bekommt man auch keine Datenblaetter wenn man 
nicht wirklich Stueckzahlen hat.

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.