Come usare / dev / fb0 come console dallo spazio utente o come output del testo


24

Quindi ho un modello Palm Pre (P100EWW originale) su cui ho attivato la modalità sviluppatore e installato un chroot Debian Squeeze. Funziona alla grande. Ho in programma di usarlo per QUALCOSA (peerorrent peer, web server) ma un telefono.

Ho notato che se lo faccio cat /dev/urandom > /dev/fb0in realtà scrive pixel casuali sullo schermo fino a quando non No space left on deviceviene generato un errore. Fantastico, ora posso usare il display.

Quindi, che tipo di utilities ci sono che A) mi permetta di usare / dev / fb0 come console in cui posso generare testo o B) renderizzare il testo su / dev / fb0 dalla riga di comando.

Non so ancora di ricompilare il kernel per questo (mi piacerebbe alla fine rimuovere completamente WebOS e trasformarlo in un server ARM minimo) quindi gli strumenti per lo spazio utente se esistono è ciò di cui sto chiedendo. Inoltre preferirei eseguire il rendering direttamente su / dev / fb0 e non usare X.


Le console virtuali Linux dovrebbero funzionare su un driver framebuffer. Le console virtuali sono uno strumento potente; da Linux 2.6 consentono di impostare caratteri diversi per ogni console. Ma sono controllati (dallo spazio utente) tramite / dev / vcs  n e / dev / vcsa  n , non / dev / fb0.
Incnis Mrsi,

Risposte:


11

Per utilizzare il framebuffer come console è necessario il fbdevmodulo. Potrebbe essere necessario ricompilare il kernel.

Potresti anche essere interessato al progetto DirectFB, che è una libreria che semplifica l'utilizzo del framebuffer. Ci sono anche applicazioni e ambienti GUI già scritti per questo.


1
Sembra che quando ho installato Directfb ( webos-internals.org/wiki/Directfb ), è arrivato con un'utilità chiamata dfbgche mi permette di mettere un'immagine lì (e non la rimuove al completamento come fbi). So che probabilmente posso trovare un'utilità per creare un .png o simile da un blocco di testo, quindi potrebbe funzionare ...
LawrenceC

24

Diverse persone hanno risposto alle parti della tua domanda occupandosi del kernel e inserendo immagini (anziché testo) nel framebuffer, ma finora il resto rimane senza indirizzo. Sì, è possibile utilizzare il sottosistema del terminale virtuale del kernel per creare una cosiddetta console framebuffer . Esistono diversi strumenti che consentono di utilizzare il dispositivo framebuffer per creare terminali virtuali nello spazio utente . Questi includono:

  • zhcon ( Debian ) - un terminale virtuale di spazio utente orientato alla gestione dell'I / O CJK molto meglio del sottosistema kernel. Il suo punto di forza è la gestione delle codifiche ISO 2022 non UTF; la sua particolare debolezza sono le codifiche UTF.
  • fbterm ( Debian ) - un terminale virtuale dello spazio utente che ha generato diverse forcelle tra cui jfbterm . Ha un sacco di plug-in del metodo di input CJK.
  • bogl-bterm ( Debian ) - un terminale virtuale dello spazio utente che ha generato forcelle come niterm .
  • Il fbpad di Ali Gholami Rudi - un terminale virtuale minimalista per lo spazio utente che non ha dipendenze dalle librerie X.
  • The console-terminal-emulatore console-fb-realizertools in nosh - un terminale virtuale di spazio utente finalizzato alla replica di terminali virtuali del kernel Linux e FreeBSD / PC-BSD. Anche questo non ha dipendenze dalle librerie X.
  • kmscon - un terminale virtuale dello spazio utente strettamente collegato al logindserver in systemd e alle sue nozioni di "posti".

Ali Gholami Rudi in particolare ha prodotto più di un semplice emulatore di terminale per il lavoro di framebuffer. Ha anche scritto un visualizzatore di PDF diretto al framebuffer, un visualizzatore VNC, un lettore multimediale e un lettore di Corano.

Un confronto completo fianco a fianco è al di fuori dell'ambito di questa risposta; ma qui ci sono alcuni punti che sono rilevanti per la domanda:

  • Come notato, molti dei programmi di terminale virtuale dello spazio utente fanno uso di librerie X per la gestione dei caratteri, la mappatura della tastiera, i metodi di input CJK e così via. Non sono client X, ma hanno dipendenze dalle librerie X. fbpade gli strumenti nosh di progettazione non fanno uso di alcuna libreria X.
  • I programmi che usano le librerie X per la gestione dei caratteri usano ovviamente i caratteri X. Gli altri prendono altri accordi.
    • bogl-bterm e fbpad hanno entrambi i loro formati di font idiosincratici. Uno converte i caratteri BDF in caratteri BOGL con lo bdftoboglstrumento; e uno converte TTF nei caratteri "tinyfont" utilizzati da fbpad con lo strumento ft2tf ( Arch ).
    • Lo console-fb-realizerstrumento nosh usa gli stessi caratteri "vt" del nuovo sottosistema di terminale virtuale del kernel FreeBSD 10.1 e quindi condivide lo strumento di manipolazione dei caratteri di FreeBSD vtfontcvtper convertire i caratteri BDF.
  • I programmi che utilizzano le librerie X utilizzano la mappatura della tastiera X. Per quanto riguarda gli altri:
    • Gli strumenti nosh hanno il loro formato di mappa tastiera idiosincratico, destinato a fornire una tastiera completa ISO 9995-3 con il gruppo ISO "comune" 2. Uno converte i file kbdmap BSD in questo formato con lo console-convert-kbdmapstrumento. Ancora una volta, questi file kbdmap sono quelli usati con il sottosistema vt di FreeBSD / PC-BSD .
    • fbpad non esegue affatto la propria mappatura della tastiera e per questo si basa sulla presenza del sottosistema di terminale virtuale del kernel e sul suo meccanismo di mappatura della tastiera.
  • C'è una certa varianza nell'invocazione e nei privilegi richiesti:
    • zhcon, fbterm, bogl-bterm, fbpad e kmscon funzionano sulla base del fatto che l'emulatore di terminale genera direttamente il programma shell / login sul terminale come processo figlio. Hanno bisogno dei privilegi di superutente per spawnare login.
    • Gli strumenti di nosh sono stati progettati per integrarsi con un sistema esistente /etc/ttys(BSD), /etc/inittab(sistema Linux 5 init) o un altro sistema, a cui lasciano il lavoro di generazione di getty / login / shell. console-fb-realizernecessita solo di privilegi sufficienti per aprire il framebuffer e inserire i dispositivi degli eventi, che non devono essere privilegi di superutente, e per accedere ai file FIFO e ai file ordinari gestiti da console-terminal-emulator, che a loro volta non richiedono alcun privilegio speciale.

Tutti questi sono naturalmente emulatori terminali . Se si desidera eliminare l'emulazione del terminale e inserire il testo sul framebuffer in modo più diretto, è possibile scegliere tra:

  • bogl-bterm si basa ovviamente sulla libreria grafica Ben di Ben Pfaff, una libreria I / O framebuffer progettata per l'uso in ambienti di installazione / ripristino del sistema (e "per le GUI nei PDA" ). Ovviamente puoi scrivere programmi che lo usano direttamente.
  • Per una via di mezzo tra la scrittura di un programma che utilizza una libreria framebuffer per eseguire il proprio rendering e un programma che sputa sequenze di escape verso ciò che pensa sia un terminale: il terminale virtuale nosh dello spazio utente è modulare e si divide in pezzi componenti. Non si può semplicemente usare console-terminal-emulator.

    console-fb-realizerusa un file di visualizzazione con una matrice di celle di caratteri, come /dev/vcsa*un normale file (non un file di dispositivo speciale per caratteri) e con punti di codice Unicode, attributi ECMA-48 e colore RGB a 24 bit. Quindi è possibile eseguirlo e scrivere character + attributo + colore direttamente nel file dell'array di celle di caratteri, lasciando console-fb-realizereseguire il rendering del carattere nel framebuffer.

    A parte: osserva che questo è l'opposto dell'integrazione con BRLTTY , che utilizza console-terminal-emulatorma non funziona console-fb-realizer.


1
Questa è una risposta straordinaria. Le librerie di Enlightenment richiedono il supporto di framebuffer su un Linux fbcon, a seconda delle opzioni di compilazione . Ciò vale anche per la terminologia dell'emulatore di terminale dipendente : funziona direttamente nel framebuffer di Linux (fbcon) . Altro che terminology, io secondo la kmscon (e altri lavori di David Herrmann) raccomandazione me stesso .
Mikeserv,

1
Rudi è un maestro del framebuffer! Un giorno abbandonerò anche X11.
Ciro Santilli 28 改造 中心 法轮功 六四 事件

10

Se riesci a cat /dev/urandom > /dev/fb0e ottenere pixel casuali sullo schermo, hai tutto ciò di cui hai bisogno.

Nel mio caso ho dovuto scaricare alcune informazioni di testo. L'ho provato su busybox e raspi, quindi potrebbe funzionare per te. La risposta potrebbe essere un po 'lunga, poiché se non usi una console dovrai stampare tu stesso i pixel dei caratteri. Fortunatamente qualcuno ha fatto il duro lavoro, quindi dobbiamo solo combinarlo.

In busybox o nel tuo raspi dovresti avere un fbsetbinario. Questo potrebbe aiutarti a scoprire le tue impostazioni come dimensioni dello schermo.

Nel mio incorporato appare così:

# 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

La parte importante qui è la larghezza 480 e l'altezza 272 pixel.

Come hai già detto, puoi completare lo schermo con cat /dev/urandom > /dev/fb0

e puoi cancellarlo con cat /dev/zeros > /dev/fb0

Quindi cancella lo schermo, dobbiamo assicurarti di ottenere le dimensioni correttamente.

Per caso il mio busybox aveva un binario fbsplash che riceveva come input un file .ppm.

Corretto se sbaglio, ma sembra che fb0accetta questo formato. Dando un'occhiata a Portable Anymap su Wikipedia , ci sono diversi "subformati" ... fbsplash ne usa uno di fantasia con colori, e così via ... ma vogliamo essere in grado di stampare solo qualcosa di leggibile. Usiamo il P1 codificato in ASCII per motivi di semplicità. Se potessimo stampare una linea verticale, sapremmo che le nostre dimensioni sono corrette. Proviamolo:

Una linea verticale in un tipo di ppm P1 dovrebbe apparire così:

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

Quindi, ci saranno 272 linee, larghe 959 caratteri. La documentazione dice che dovrebbe essere 1 invece di f ... su busybox e raspi f era più luminoso.

È importante non avere spazio dopo gli 0 ... Questa attività può essere un po 'noiosa ... è meglio usare un editor di testo che ti aiuti. In vim, puoi copiare le prime due righe, vai in modalità comando (esc), quindi digita i seguenti caratteri:

of(esc)479a 0(esc)yy271p

Certo, sto usando le mie dimensioni, dovresti usare le tue. Cat questo file su/dev/fb0 , dovrebbe apparire come: Schermo linea verticale

Ok, sto barando ... non è solo una riga lì ... sono circa 8 ... ma quando non funziona (abbiamo dimensioni sbagliate o abbiamo spazio alla fine, avere solo una riga è molto Più facile).

Se sei arrivato così lontano, dobbiamo solo stampare i pixel giusti per vederli come caratteri. Grazie a Marcel Sondaar e al suo repository su GitHub non avremo bisogno di disegnare ogni personaggio.

Con una piccola modifica, espandi il suo semplice programma per stampare finvece di Xe0 invece di spazi, inserisci spazi tra ogni carattere, aggiungi l'intestazione e abbiamo un file .ppm con la lettera corrispondente al suo codice.

Un piccolo passo avanti e non si ottiene un carattere come input, ma una riga. Cat un file, pipe al tuo programma e l'output a /dev/fb0e ottieni un output di testo:

Esempio di output del testo

Ho testato questa soluzione anche su un lampone pi e ha funzionato. Il sistema mi dice che non ho la reputazione di pubblicare più di 2 link. Fino a quando ho capito, devi fare affidamento sulla mia parola: D


2

Per quanto riguarda la console, puoi fare eco a roba /dev/consoleo puoi usare syslog e, a seconda di varie altre impostazioni, potrebbe comparire sulla console.

Per le immagini, ho appena provato a catturare un file bmp su fb0 e ha funzionato davvero! (sortof - più copie, formato più piccolo)

Ho trovato un programma da bmp a framebuffer qui . Questo dovrebbe essere un perfetto esempio del formato che fb0 si aspetta. Esiste anche fbiun programma per scrivere direttamente nel frame buffer.


fbimi permette di mettere un'immagine sullo schermo, il che è utile, ma cancella il framebuffer una volta uscito.
LawrenceC,

0

È un vecchio post ma capisco normalmente che hai bisogno della console framebuffer (fbcon) per eseguire la console su framebuffer. È nella configurazione. (driver di dispositivo / grafica / display della console ..)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.