Verwendung von / dev / fb0 als Konsole aus dem Benutzerbereich oder Ausgabe von Text darauf


24

Ich habe also ein Palm Pre-Modell (Original P100EWW), auf dem ich den Entwicklermodus aktiviert und eine Debian Squeeze-Chroot installiert habe. Funktioniert super. Ich habe vor, dies für ALLES (Bittorrent Peer, Webserver), aber ein Telefon zu verwenden.

Mir ist aufgefallen, dass beim Ausführen von a cat /dev/urandom > /dev/fb0zufällige Pixel auf den Bildschirm geschrieben werden, bis ein No space left on deviceFehler generiert wird. Super, jetzt kann ich das Display benutzen.

Welche Utilities gibt es also, mit denen ich entweder A) / dev / fb0 als Konsole verwenden kann, an die ich Text ausgeben kann, oder B) Text in / dev / fb0 über die Befehlszeile rendern kann?

Ich weiß noch nicht, wie ich den Kernel dafür neu kompilieren soll (ich würde gerne WebOS irgendwann komplett entfernen und in einen minimalen ARM-Server verwandeln), also frage ich nach Userspace-Tools, wenn sie existieren. Außerdem würde es vorziehen, direkt in / dev / fb0 zu rendern und nicht X zu verwenden.


Virtuelle Linux-Konsolen sollten über einen Framebuffer-Treiber funktionieren. Virtuelle Konsolen sind ein mächtiges Werkzeug. Seit Linux 2.6 können unterschiedliche Schriften für jede Konsole eingestellt werden. Sie werden jedoch (vom Benutzerbereich aus) über / dev / vcs  n und / dev / vcsa n gesteuert  , nicht über / dev / fb0.
Incnis Mrsi

Antworten:


11

Um den Framebuffer als Konsole nutzen zu können, benötigen Sie das fbdevModul. Möglicherweise müssen Sie Ihren Kernel neu kompilieren.

Möglicherweise interessiert Sie auch das DirectFB-Projekt, eine Bibliothek, die die Verwendung des Framebuffers erleichtert. Es gibt auch Anwendungen und GUI-Umgebungen, die bereits dafür geschrieben wurden.


1
Sieht so aus, als ich Directfb ( webos-internals.org/wiki/Directfb ) installiert habe , wurde es mit einem Hilfsprogramm namens geliefert , mit dfbgdem ich ein Bild dort ablegen kann (und es nach Abschluss nicht wie folgt entfernt fbi). Ich weiß , dass ich wahrscheinlich ein Dienstprogramm finde ein .png oder ähnliches aus einem Block Text so könnte dies nur Arbeit ... zu schaffen
LawrenceC

24

Mehrere Personen haben die Teile Ihrer Frage beantwortet, die sich mit dem Kernel befassen und Bilder (anstatt Text) in den Framebuffer einfügen. Der Rest bleibt jedoch unberücksichtigt. Ja, Sie können das Kernel-Subsystem für virtuelle Terminals verwenden, um eine sogenannte Framebuffer-Konsole zu erstellen . Es gibt jedoch mehrere Tools, mit denen Sie das Framebuffer-Gerät verwenden können, um virtuelle Terminals im Benutzerbereich zu erstellen . Diese schließen ein:

  • zhcon ( Debian ) - ein virtuelles User-Space- 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-Codierungen. seine besondere Schwäche sind UTF-Codierungen.
  • fbterm ( Debian ) - ein virtuelles Benutzerraum- Terminal, das mehrere Forks hervorgebracht hat, einschließlich jfbterm . Es enthält eine Reihe von Plug-Ins für CJK-Eingabemethoden.
  • bogl-bterm ( Debian ) - ein virtuelles Benutzerraum- Terminal, das Gabeln wie Niterm hervorgebracht hat .
  • Ali Gholami Rudis fbpad - ein minimalistisches virtuelles User- Space- Terminal, das keine Abhängigkeiten von X-Bibliotheken aufweist.
  • Das console-terminal-emulatorund die console-fb-realizerTools in nosh - ein virtuelles User-Space- Terminal zur Replikation von virtuellen Linux- und FreeBSD / PC-BSD-Kernel-Terminals. Es hat auch keine Abhängigkeiten von X-Bibliotheken.
  • kmscon - ein virtuelles Benutzerraum- Terminal, das eng mit dem logindServer in systemd und dessen Begriffen von "Sitzen" verbunden ist.

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

Ein vollständiger Vergleich von Seite zu Seite ist nicht Gegenstand dieser Antwort. Aber hier sind einige Punkte, die für die Frage relevant sind:

  • Wie bereits erwähnt, verwenden einige der Programme für virtuelle Terminals im Benutzerbereich X-Bibliotheken für die Schriftartverarbeitung, die Tastaturzuordnung, CJK-Eingabemethoden usw. Sie sind keine X-Clients, haben jedoch Abhängigkeiten von X-Bibliotheken. fbpadund die nosh-Tools von Entwurf verwenden keine X-Bibliotheken.
  • Die Programme, die X-Bibliotheken für die Schriftbehandlung verwenden, verwenden natürlich X-Schriften. Die anderen treffen andere Vorkehrungen.
    • bogl-bterm und fbpad haben ihre eigenen eigenwilligen Schriftformate. Mit dem bdftoboglTool konvertiert man BDF-Schriften in BOGL-Schriften . und man konvertiert TTF in die "tinyfont" -Schriften, die von fbpad mit dem ft2tf ( Arch ) -Tool verwendet werden.
    • Das nosh- console-fb-realizerTool verwendet dieselben "vt" -Schriften wie das neue FreeBSD 10.1-Kernel-Subsystem für virtuelle Terminals und teilt sich daher das FreeBSD-Werkzeug vtfontcvtzur Schriftmanipulation zum Konvertieren von BDF-Schriften.
  • Die Programme, die X-Bibliotheken verwenden, verwenden die X-Tastaturzuordnung. Wie für die anderen:
    • Die nosh-Tools verfügen über ein eigenes eigenwilliges Tastaturzuordnungsformat, das eine vollständige ISO 9995-3-fähige Tastatur mit der ISO-Common-Gruppe 2 bereitstellen soll. Mit dem console-convert-kbdmapTool werden BSD-kbdmap-Dateien in dieses Format konvertiert . Auch diese kbdmap-Dateien werden mit dem FreeBSD / PC-BSD vt-Subsystem verwendet .
    • fbpad führt keine eigene Tastaturzuordnung durch und verlässt sich dafür auf das Kernel-Subsystem für virtuelle Terminals und dessen Tastaturzuordnungsmechanismus.
  • Es gibt einige Unterschiede beim Aufruf und den erforderlichen Berechtigungen:
    • zhcon, fbterm, bogl-bterm, fbpad und kmscon basieren darauf, dass der Terminalemulator das Shell- / Anmeldeprogramm direkt als untergeordneten Prozess auf dem Terminal erzeugt. Sie benötigen Superuser-Rechte, um zu spawnen login.
    • Die nosh-Tools wurden für die Integration in ein vorhandenes /etc/ttys(BSD), /etc/inittab(Linux-System 5 init) oder ein anderes System entwickelt, auf das sie das Spawnen von getty / login / shell übertragen. console-fb-realizerBenötigt nur genügend Berechtigungen zum Öffnen des Framebuffers und der Eingabeereignisgeräte, bei denen es sich nicht um Superuser-Berechtigungen handeln muss, und zum Zugriff auf die von verwalteten FIFOs und gewöhnlichen Dateien console-terminal-emulator, für die wiederum überhaupt keine besonderen Berechtigungen erforderlich sind.

All dies sind natürlich Terminal-Emulatoren . Wenn Sie die Terminal-Emulation entfernen und Text direkter in den Framebuffer einfügen möchten, haben Sie einige Möglichkeiten:

  • bogl-bterm basiert natürlich auf der Ben Own Graphics Library von Ben Pfaff, einer Framebuffer-E / A-Bibliothek, die für die Verwendung in System-Setup- / Rettungsumgebungen (und "für GUIs in PDAs" ) entwickelt wurde. Sie können natürlich Programme schreiben, die das direkt verwenden.
  • Für ein Zwischenstopp zwischen dem Schreiben eines Programms, das eine Framebuffer-Bibliothek verwendet, um sein eigenes Rendering durchzuführen, und einem Programm, das Escape-Sequenzen auf ein Terminal ausgibt, das seiner Meinung nach ein Terminal ist: Das virtuelle Terminal im Nosh-User-Space ist modular und unterteilt sich in zwei Teile Einzelteile. Man kann es einfach nicht benutzen console-terminal-emulator.

    console-fb-realizerVerwendet eine Anzeigedatei mit einem Zeichenzellenarray wie /dev/vcsa*eine normale Datei (keine Zeichenspezialgerätedatei) und mit Unicode-Codepunkten, ECMA-48-Attributen und 24-Bit-RGB-Farbe. Man kann es also starten und einfach Zeichen + Attribut + Farbe direkt in die Zeichenzellen-Array-Datei schreiben, wobei console-fb-realizerdie Schriftart im Framebuffer gerendert wird.

    Nebenbei bemerkt : Beachten Sie, dass dies das Gegenteil von der Integration in BRLTTY ist , das verwendet console-terminal-emulator, aber nicht ausgeführt wird console-fb-realizer.


1
Das ist eine erstaunliche Antwort. Die Enlightenment-Bibliotheken beanspruchen Framebuffer-Unterstützung unter Linux fbcon- abhängig von den Kompilierungsoptionen . Dies gilt auch für den abhängigen Terminalemulator. Terminologie : Funktioniert direkt im Linux-Framebuffer (fbcon) . Abgesehen davon, stimme terminologyich der kmscon (und anderen Arbeit von David Herrmann) Empfehlung selbst zu .
mikeserv

1
Rudi ist ein Meister des Framebuffers! Eines Tages werde ich auch X11 fallen lassen.
Ciro Santilli

10

Wenn du /dev/urandom > /dev/fb0zufällige Pixel auf dem Bildschirm sehen und sehen kannst, hast du alles, was du brauchst.

In meinem Fall musste ich einige Textinformationen ausgeben. Ich habe dies in busybox und raspi getestet, damit es bei Ihnen funktioniert. Die Antwort könnte etwas lang sein, da Sie, wenn Sie keine Konsole verwenden, die Pixel der Zeichen selbst drucken müssen. Zum Glück hat jemand die harte Arbeit geleistet, also müssen wir es einfach kombinieren.

In busybox oder in deinem raspi solltest du ein fbsetbinär haben. Dies kann Ihnen helfen, Ihre Einstellungen als Bildschirmabmessungen zu ermitteln.

In meinem Embedded sieht das 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 Höhe 272 Pixel.

Wie du erwähnt hast, kannst du den Bildschirm mit erfüllen cat /dev/urandom > /dev/fb0

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

Dann müssen wir sicherstellen, dass Sie die richtigen Abmessungen haben.

Zufällig hatte meine Busybox eine fbsplash-Binärdatei, die als Eingabe eine .ppm-Datei erhielt.

Richtig, wenn ich falsch liege, aber es scheint, dass fb0dieses Format akzeptiert wird. Wenn man sich Portable Anymap auf Wikipedia ansieht , gibt es mehrere "Unterformate" ... fbsplash verwendet ein ausgefallenes Format mit Farbe und so weiter ... aber wir möchten in der Lage sein, einfach etwas Lesbares zu drucken. Verwenden wir der Einfachheit halber das in ASCII codierte P1. Wenn wir eine vertikale Linie drucken könnten, würden wir wissen, dass unsere Abmessungen korrekt sind. Lass es uns versuchen:

Eine vertikale Linie in einem ppm-Typ P1 sollte folgendermaßen aussehen:

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

Es wird also 272 Zeilen mit einer Breite von 959 Zeichen geben. Die Dokumentation sagt, es sollte 1 anstelle von f sein ... auf busybox und raspi f war heller.

Es ist wichtig, dass nach den Nullen kein Leerzeichen steht. Diese Aufgabe kann etwas langwierig sein. Verwenden Sie besser einen Texteditor, der Ihnen hilft. In vim können Sie die ersten beiden Zeilen kopieren, in den Befehlsmodus (esc) wechseln und die folgenden Zeichen eingeben:

of(esc)479a 0(esc)yy271p

Natürlich verwende ich meine Dimensionen, du solltest deine verwenden. Um diese Datei zu verschieben /dev/fb0, sollte es so aussehen: Vertikale Bildschirmlinie

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

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

Mit einem kleinen Kniff erweitert man sein einfaches Programm, um fanstelle von Xund 0anstelle von Leerzeichen Leerzeichen zwischen die einzelnen Zeichen einzufügen, den Header hinzuzufügen und eine PPM-Datei mit dem Buchstaben zu erstellen, der dem Zeichencode entspricht.

Ein kleiner Schritt weiter und Sie erhalten kein Zeichen als Eingabe, sondern eine Zeile. Rufe eine Datei auf, rufe dein Programm auf und gib sie aus /dev/fb0und du bekommst eine Textausgabe:

Beispiel für eine Textausgabe

Ich teste diese Lösung auch auf einem Himbeer-Pi und es hat funktioniert. Das System teilt mir mit, dass ich keinen Ruf habe, mehr als 2 Links zu posten. Bis ich das bekomme, musst du dich auf mein Wort verlassen: D


2

Auf der Konsolenseite können Sie Echo-Meldungen an /dev/consoleoder Syslog verwenden. Abhängig von verschiedenen anderen Einstellungen wird dies möglicherweise auf der Konsole angezeigt.

Für Bilder habe ich gerade versucht, eine BMP-Datei in fb0 zu catting und es hat tatsächlich funktioniert! (sortof - mehrere Kopien, kleinere Größe)

Ich habe hier ein BMP-to-Framebuffer-Programm gefunden . Das sollte ein perfektes Beispiel für das Format sein, das die fb0 erwartet. Es gibt auch fbiein Programm zum direkten Schreiben in den Bildspeicher.


fbiErmöglicht es mir, ein Bild auf den Bildschirm zu bringen, was nützlich ist, aber es löscht den Framebuffer, sobald er beendet wird.
LawrenceC

0

Es ist ein alter Beitrag, aber ich verstehe, dass Sie normalerweise eine Framebuffer-Konsole (fbcon) benötigen, um die Konsole auf dem Framebuffer laufen zu lassen. Es ist in der Konfiguration. (Gerätetreiber / Grafik / Konsolenanzeige ..)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.