Zugriff auf einen seriellen port von einem linux-kernel-Modul
Hallo Linux-Kernel-Treiber-Gurus!
Schreibe ich einen v4l2-Treiber für eine Kamera verwendet, die eine serielle Schnittstelle für die Konfiguration. Ich würde gerne die Treiber für die Konfiguration der Kamera, da hält der client-code konsistent Kamera-Modelle. Die Frage ist: was ist der beste Weg, um Zugriff auf die Kamera mit der seriellen Schnittstelle aus dem Treiber-Modul?
Aus, was ich höre, Zugriff auf Dateien von einem kernel-Treiber ist eine große no-no, aber es kann getan werden. Als solche bin ich derzeit mit dem folgenden code-snippet, aber es fühlt sich an wie ein hack.
oldfs = get_fs();
set_fs(KERNEL_DS);
fd->f_pos=0;
fd->f_op->write(fd, data, data_len, &fd->f_pos);
set_fs(oldfs);
Meine Frage ist wirklich: was ist der richtige Weg, dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vermute ich, dass da ein serieller port beteiligt ist, dies muss irgendeine Art von embedded Systems. Nach allem, nicht viele PCs haben serielle ports. Ausserdem gehe ich davon aus, dass der serielle port kann als eine permanente Verbindung, zumindest aus der Perspektive des Benutzers. Wenn das alles stimmt, dann ist Sie nicht wirklich wollen, ein TTY-Gerät. Sie wollen Zugriff auf das Gerät als privater UART.
Wenn Sie einen Blick auf die Wolfson-audio-codecs (sound/soc/wm*.c) sehen Sie ein Beispiel für Geräte, die in Erster Linie die Kommunikation über I2S haben aber einen aux-I2C-Schnittstelle für die Konfiguration. Dies ist konzeptionell, was Sie wollen, glaube ich. Der Treiber stellt eine einheitliche Schnittstelle zu software und Fragen, Befehle an beliebige hardware geeignet ist. Das ist natürlich viel sauberer, als das zu entlarven hardware-Implementierung details zu userspace.
Konnte ich nicht finden, ein gutes Beispiel für eine UART-Treiber in den kernel, das funktioniert auf diese Weise, aber hoffentlich habe ich beschrieben, worauf zu achten ist. Von einem praktischen und nicht als technische Reinheit Sicht, es könnte nur sein, besser zu tun, Datei-I/O aus dem kernel.
Ersten würde ich Ihnen raten, einen Weg zu finden, um dies zu tun aus dem userspace-wenn möglich: das, was Sie versuchen zu erreichen, hier ist wirklich userspace-code im kernel-code.
Aber wenn Sie nicht einen Weg finden, es zu tun, diese Artikel zeigt Ihnen, wie Sie userspace-Aufrufe in den Kernel.
Da will man den Zugriff auf eine serielle Schnittstelle haben, sollten Sie fordert, dass die tty-orientiert, zum Beispiel für open: