GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie man /dev/fb0 als Konsole aus dem Userspace verwendet oder Text darauf ausgibt

Mehrere Leute haben die Teile Ihrer Frage beantwortet, die sich mit dem Kernel und dem Einfügen von Bildern befassen (anstelle von Text) auf den Framebuffer, aber bisher bleibt der Rest unadressiert. Ja, Sie können das virtuelle Terminal-Subsystem des Kernels verwenden, um eine sogenannte Framebuffer-Konsole zu erstellen . Aber es gibt mehrere Tools, mit denen Sie das Framebuffer-Gerät verwenden können, um virtuelle Terminals im Benutzerraum zu erstellen . Dazu gehören:

  • zhcon (Debian) – ein virtuelles Userspace-Terminal, das darauf ausgerichtet ist, CJK-E/A weitaus besser zu handhaben als das Kernel-Subsystem. Seine besondere Stärke liegt im Umgang mit ISO-2022-Nicht-UTF-Kodierungen; seine besondere Schwäche sind UTF-Kodierungen.
  • fbterm (Debian) – ein virtuelles Userspace-Terminal, das mehrere Forks hervorgebracht hat, darunter jfbterm. Es hat eine Reihe von Plug-Ins für CJK-Eingabemethoden.
  • bogl-bterm (Debian) – ein virtuelles Userspace-Terminal, das Forks wie niterm hervorgebracht hat.
  • Ali Gholami Rudis fbpad – ein minimalistisches virtuelles Userspace-Terminal, das keine Abhängigkeiten von X-Bibliotheken hat.
  • Der console-terminal-emulator und console-fb-realizer tools in nosh – ein virtuelles Userspace-Terminal, das darauf abzielt, virtuelle Linux- und FreeBSD/PC-BSD-Kernel-Terminals zu replizieren. Es hat auch keine Abhängigkeiten von X-Bibliotheken.
  • kmscon – ein virtuelles Userspace-Terminal, das eng mit logind verbunden ist server in systemd und seine Vorstellungen von "Sitzen".

Insbesondere Ali Gholami Rudi hat mehr als nur einen Terminal-Emulator für Framebuffer-Arbeiten produziert. Er schrieb auch einen Direct-to-Framebuffer-PDF-Viewer, einen VNC-Viewer, einen Mediaplayer und einen Koran-Reader.

Ein vollständiger direkter Vergleich würde den Rahmen dieser Antwort sprengen; aber hier sind einige Punkte, die für die Frage relevant sind:

  • Wie bereits erwähnt, verwenden mehrere der virtuellen Terminalprogramme des Benutzerraums X-Bibliotheken für die Handhabung von Schriftarten, die Tastaturzuordnung, CJK-Eingabemethoden und so weiter. Sie sind keine X-Clients, aber sie haben Abhängigkeiten von X-Bibliotheken. fbpad und die Nosh-Tools verwenden absichtlich keine X-Bibliotheken.
  • Die Programme, die X-Bibliotheken zur Handhabung von Schriftarten verwenden, verwenden natürlich auch X-Schriftarten. Die anderen treffen andere Vorkehrungen.
    • bogl-bterm und fbpad haben beide ihre eigenen idiosynkratischen Schriftformate. Mit dem bdftobogl wandelt man BDF-Fonts in BOGL-Fonts um Werkzeug; und man wandelt TTF mit dem ft2tf (Arch)-Tool in die "tinyfont"-Schriftarten um, die von fbpad verwendet werden.
    • Der nosh console-fb-realizer tool verwendet dieselben "vt"-Schriftarten wie das neue FreeBSD 10.1-Kernel-Subsystem für virtuelle Terminals und teilt sich daher das FreeBSD-Werkzeug zum Bearbeiten von Schriftarten vtfontcvt zum Konvertieren von BDF-Fonts.
  • Die Programme, die X-Bibliotheken verwenden, verwenden die X-Tastaturzuordnung. Was die anderen betrifft:
    • Die Nosh-Tools haben ihr eigenes eigenwilliges Keyboard-Map-Format, das dazu gedacht ist, eine vollständige ISO 9995-3-fähige Tastatur mit der ISO "common"-Gruppe 2 bereitzustellen. Man konvertiert BSD-kbdmap-Dateien in dieses Format mit dem console-convert-kbdmap Werkzeug. Auch hier sind diese kbdmap-Dateien diejenigen, die mit dem FreeBSD/PC-BSD vt-Subsystem verwendet werden.
    • fbpad führt überhaupt keine eigene Tastaturzuordnung durch und verlässt sich dafür auf das Vorhandensein des virtuellen Terminal-Subsystems des Kernels und seines Tastaturzuordnungsmechanismus.
  • Es gibt einige Abweichungen beim Aufruf und den erforderlichen Privilegien:
    • zhcon, fbterm, bogl-bterm, fbpad und kmscon arbeiten auf der Grundlage, dass der Terminal-Emulator das Shell-/Login-Programm direkt als untergeordneten Prozess auf dem Terminal erzeugt. Sie benötigen Superuser-Privilegien, um login zu spawnen .
    • Die Nosh-Tools wurden entwickelt, um sich in einen bestehenden /etc/ttys zu integrieren (BSD), /etc/inittab (Linux-System 5 init ) oder einem anderen System, dem sie das Spawnen von getty/login/shell überlassen. console-fb-realizer braucht nur genügend Privilegien, um den Framebuffer zu öffnen und Ereignisgeräte einzugeben, die keine Superuser-Privilegien sein müssen, und um auf die FIFOs und gewöhnlichen Dateien zuzugreifen, die von console-terminal-emulator verwaltet werden , die wiederum überhaupt keine besonderen Rechte benötigt.

All dies sind Terminal-Emulatoren Natürlich. Wenn Sie die Terminalemulation herausnehmen und Text direkter in den Framebuffer schreiben möchten, haben Sie einige Möglichkeiten:

  • bogl-bterm basiert natürlich auf Ben Pfaffs Ben's Own Graphics Library eine Framebuffer-E / A-Bibliothek, die für die Verwendung in Systemeinrichtungs- / Rettungsumgebungen (und "für GUIs in PDAs") entwickelt wurde. Sie können natürlich Programme schreiben, die das direkt verwenden.
  • Für einen Mittelweg zwischen dem Schreiben eines Programms, das eine Framebuffer-Bibliothek verwendet, um sein eigenes Rendering durchzuführen, und einem Programm, das Escape-Sequenzen an etwas ausspuckt, das es für ein Terminal hält:Das virtuelle Terminal Nosh User-Space ist modular und zerfällt in Einzelteile. Man kann console-terminal-emulator einfach nicht verwenden .

    console-fb-realizer verwendet eine Anzeigedatei mit einem Zeichenzellenarray, wie /dev/vcsa* aber eine gewöhnliche Datei (keine spezielle Zeichengerätedatei) und mit Unicode-Codepunkten, ECMA-48-Attributen und 24-Bit-RGB-Farbe. Man kann es also ausführen und einfach Zeichen+Attribut+Farbe direkt in die Zeichenzellen-Array-Datei schreiben, wobei console-fb-realizer bleibt die Schriftart in den Framebuffer übertragen.

    Nebenbei:Beachten Sie, dass dies das Gegenteil der Integration mit BRLTTY ist, die console-terminal-emulator verwendet aber führt console-fb-realizer nicht aus .


Um den Framebuffer als Konsole zu verwenden, benötigen Sie den fbdev Modul. Möglicherweise müssen Sie Ihren Kernel neu kompilieren.

Sie könnten auch am DirectFB-Projekt interessiert sein, einer Bibliothek, die die Verwendung des Framebuffers vereinfacht. Es gibt auch bereits Anwendungen und GUI-Umgebungen, die dafür geschrieben wurden.


Wenn Sie /dev/urandom > /dev/fb0 kategorisieren können und zufällige Pixel auf dem Bildschirm erhalten, haben Sie alles, was Sie brauchen.

In meinem Fall musste ich einige Textinformationen ausgeben. Ich habe dies in busybox und raspi getestet, also könnte es für Sie funktionieren. Die Antwort könnte ein bisschen lang sein, denn wenn Sie keine Konsole verwenden, müssen Sie die Pixel von Zeichen selbst. Zum Glück hat jemand die harte Arbeit erledigt, also müssen wir es nur kombinieren.

In der busybox oder in deinem Raspi solltest du einen fbset haben Binary. Dies könnte Ihnen helfen, Ihre Einstellungen als Bildschirmabmessungen herauszufinden.

In meinem eingebetteten sieht so aus:

# fbset

mode "480x272-1"
    # D: 0.104 MHz, H: 0.207 kHz, V: 0.657 Hz
    geometry 480 272 480 272 16
    timings 9600000 3 3 0 32 17 11
    accel false
    rgba 5/0,6/5,5/11,0/0
endmode

Der wichtige Teil hier ist die Breite 480 und die Höhe 272 Pixel.

Wie Sie bereits erwähnt haben, können Sie den Bildschirm mit cat /dev/urandom > /dev/fb0 erfüllen

und Sie können es mit cat /dev/zeros > /dev/fb0 löschen

Wenn Sie Ihren Bildschirm löschen, müssen wir sicherstellen, dass Sie die Abmessungen richtig erhalten.

Zufällig hatte meine busybox eine fbsplash-Binärdatei, die als Eingabe eine .ppm-Datei erhält.

Korrigieren Sie, wenn ich falsch liege, aber es scheint, dass fb0 akzeptiert dieses Format. Werfen Sie einen Blick auf Portable Anymap auf Wikipedia, dort gibt es mehrere "Unterformate" ... fbsplash verwendet ein schickes Format mit Farbe und so weiter ... aber wir möchten in der Lage sein, einfach etwas Lesbares zu drucken. Nehmen wir der Einfachheit halber das in ASCII kodierte P1. Wenn wir eine vertikale Linie drucken könnten, wüssten wir, dass unsere Abmessungen korrekt sind. Versuchen wir es:

Eine vertikale Linie in einem ppm-Typ P1 sollte so aussehen:

P1
480 272
f 0 0 0 0 ... 0 
f 0 0 0 0 ... 0
... 
f 0 0 0 0 ... 0

Also gibt es 272 Zeilen, 959 Zeichen breit. Die Dokumentation sagt, es sollte 1 statt f sein ... auf busybox und raspi f war heller.

Es ist wichtig, dass Sie nach den Nullen kein Leerzeichen haben ... Diese Aufgabe kann etwas mühsam sein ... Verwenden Sie besser einen Texteditor, der Ihnen hilft. In vim können Sie die ersten beiden Zeilen kopieren, in den Befehlsmodus wechseln ( esc), dann geben Sie die folgenden Zeichen ein:

of(esc)479a 0(esc)yy271p

Natürlich verwende ich meine Abmessungen, Sie sollten Ihre verwenden. Versehen Sie diese Datei mit /dev/fb0 , sollte es so aussehen:

Ok, ich schummele ... es ist nicht nur eine Zeile da ... es sind ungefähr 8 ... aber wenn es nicht funktioniert (wir haben falsche Abmessungen oder Platz am Ende, ist es viel, nur eine Zeile zu haben einfacher).

Wenn Sie so weit gekommen sind, müssen wir nur die richtigen Pixel drucken, um sie als Zeichen zu sehen. Dank Marcel Sondaar und seinem Repo auf GitHub müssen wir nicht jedes Zeichen zeichnen.

Mit einem kleinen Tweak erweitert man sein einfaches Programm um f zu drucken statt X und 0 Anstelle von Leerzeichen fügen Sie Leerzeichen zwischen jedem Zeichen ein, fügen die Kopfzeile hinzu und wir haben eine .ppm-Datei mit dem Buchstaben, der seinem Zeichencode entspricht.

Ein kleiner Schritt weiter und Sie erhalten kein Zeichen als Eingabe, sondern eine Zeile. Cat eine Datei, Pipe an Ihr Programm und Ausgabe an /dev/fb0 und Sie erhalten eine Textausgabe:

Ich teste diese Lösung auch auf einem Himbeer-Pi und es hat funktioniert. Das System sagt mir, dass ich nicht den Ruf habe, mehr als 2 Links zu posten. Bis ich das bekomme, müssen Sie sich auf mein Wort verlassen :D


Linux
  1. Wie behandelt Linux mehrere aufeinanderfolgende Pfadtrennzeichen (/home////username///file)?

  2. Wie portabel sind /dev/stdin, /dev/stdout und /dev/stderr?

  3. Wann sollte /dev/random vs. /dev/urandom verwendet werden?

  4. So ordnen Sie /dev/sdX- und /dev/mapper/mpathY-Geräte vom /dev/dm-Z-Gerät zu

  5. Linux:Unterschied zwischen /dev/console , /dev/tty und /dev/tty0

So ersetzen Sie eine ausgefallene Festplatte in einem Linux-Software-RAID

So leiten Sie die Ausgabe unter Linux nach /dev/null um

DD von /dev/zero nach /dev/null ... was eigentlich passiert

Wie Linux /dev/tty und /dev/tty0 verwendet

echo oder print /dev/stdin /dev/stdout /dev/stderr

Warum sind < oder > erforderlich, um /dev/tcp