GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar /dev/fb0 como una consola desde el espacio de usuario, o enviarle texto

Varias personas han respondido las partes de su pregunta relacionadas con el kernel y colocando imágenes (en lugar de texto) en el framebuffer, pero hasta ahora el resto permanece sin resolver. Sí, puede usar el subsistema de terminal virtual del kernel para crear una llamada consola de framebuffer . Pero hay varias herramientas que le permiten usar el dispositivo framebuffer para hacer terminales virtuales de espacio de usuario . Estos incluyen:

  • zhcon (Debian):un terminal virtual de espacio de usuario diseñado para manejar la E/S de CJK mucho mejor que el subsistema del kernel. Su fortaleza particular está en el manejo de codificaciones no UTF ISO 2022; su debilidad particular son las codificaciones UTF.
  • fbterm (Debian):una terminal virtual de espacio de usuario que ha generado varias bifurcaciones, incluida jfbterm. Tiene un montón de complementos de métodos de entrada CJK.
  • bogl-bterm (Debian):un terminal virtual de espacio de usuario que ha generado bifurcaciones como niterm.
  • fbpad de Ali Gholami Rudi:un terminal virtual de espacio de usuario minimalista que no depende de las bibliotecas X.
  • El console-terminal-emulator y console-fb-realizer tools in nosh:un terminal virtual de espacio de usuario destinado a replicar terminales virtuales de kernel de Linux y FreeBSD/PC-BSD. Tampoco tiene dependencias en las bibliotecas X.
  • kmscon:un terminal virtual de espacio de usuario que está estrechamente relacionado con el logind servidor en systemd y sus nociones de "asientos".

Ali Gholami Rudi, en particular, ha producido algo más que un simple emulador de terminal para el trabajo de framebuffer. También escribió un visor de PDF directo a framebuffer, un visor VNC, un reproductor multimedia y un lector de Corán.

Una comparación completa lado a lado está fuera del alcance de esta respuesta; pero aquí hay algunos puntos que son relevantes para la pregunta:

  • Como se señaló, varios de los programas de terminal virtual del espacio del usuario utilizan bibliotecas X para el manejo de fuentes, asignación de teclado, métodos de entrada CJK, etc. No son clientes X, pero tienen dependencias de bibliotecas X. fbpad y las herramientas nosh por diseño no utilizan ninguna biblioteca X.
  • Los programas que usan bibliotecas X para el manejo de fuentes, por supuesto, usan fuentes X. Los otros hacen otros arreglos.
    • bogl-bterm y fbpad tienen sus propios formatos de fuente idiosincrásicos. Uno convierte fuentes BDF a fuentes BOGL con el bdftobogl herramienta; y uno convierte TTF a las fuentes "tinyfont" que usa fbpad con la herramienta ft2tf (Arch).
    • La comida console-fb-realizer utiliza las mismas fuentes "vt" que el nuevo subsistema de terminal virtual del kernel de FreeBSD 10.1 y, por lo tanto, comparte la herramienta de manipulación de fuentes de FreeBSD vtfontcvt para convertir fuentes BDF.
  • Los programas que usan bibliotecas X usan asignación de teclado X. En cuanto a los demás:
    • Las herramientas nosh tienen su propio formato de mapa de teclado idiosincrásico, destinado a proporcionar un teclado totalmente compatible con ISO 9995-3 con el grupo 2 "común" de ISO. Uno convierte archivos BSD kbdmap a este formato con el console-convert-kbdmap herramienta. Una vez más, estos archivos kbdmap son los que se utilizan con el subsistema FreeBSD/PC-BSD vt.
    • fbpad no hace su propio mapeo de teclado en absoluto, y depende de la presencia del subsistema de terminal virtual del kernel y su mecanismo de mapeo de teclado para eso.
  • Hay algunas variaciones en la invocación y los privilegios necesarios:
    • zhcon, fbterm, bogl-bterm, fbpad y kmscon funcionan sobre la base de que el emulador de terminal genera el programa shell/login en el terminal, directamente, como un proceso secundario. Necesitan privilegios de superusuario para generar login .
    • Las herramientas nosh se diseñaron para integrarse con un /etc/ttys existente (BSD), /etc/inittab (Sistema Linux 5 init ), u otro sistema, al que dejan el trabajo de generar getty/login/shell. console-fb-realizer solo necesita privilegios suficientes para abrir el búfer de fotogramas y los dispositivos de eventos de entrada, que no necesitan privilegios de superusuario, y para acceder a los archivos FIFO y ordinarios mantenidos por console-terminal-emulator , que a su vez no necesita ningún privilegio especial.

Todos estos son emuladores de terminal por supuesto. Si desea eliminar la emulación de terminal y colocar texto en el búfer de fotogramas de manera más directa, tiene algunas opciones:

  • bogl-bterm se basa, por supuesto, en la Biblioteca de gráficos propios de Ben de Ben Pfaff. una biblioteca de E/S de framebuffer diseñada para su uso en entornos de configuración/rescate del sistema (y "para GUI en PDA"). Por supuesto, puede escribir programas que usen eso directamente.
  • Para una casa intermedia entre escribir un programa que utiliza una biblioteca de búfer de cuadros para hacer su propio renderizado y un programa que escupe secuencias de escape a lo que cree que es una terminal:la terminal virtual del espacio de usuario nosh es modular y se divide en piezas componentes. Uno simplemente no puede usar console-terminal-emulator .

    console-fb-realizer utiliza un archivo de visualización con una matriz de celdas de caracteres, como /dev/vcsa* pero un archivo ordinario (no un archivo de dispositivo especial de caracteres) y con puntos de código Unicode, atributos ECMA-48 y color RGB de 24 bits. Entonces uno puede ejecutarlo y simplemente escribir carácter+atributo+color directamente en el archivo de matriz de celdas de caracteres, dejando console-fb-realizer haz la renderización de la fuente en el framebuffer.

    Como comentario aparte:observe que esto es lo opuesto a la integración con BRLTTY, que usa console-terminal-emulator pero no ejecuta console-fb-realizer .


Para usar el framebuffer como consola necesitas el fbdev módulo. Puede que tenga que volver a compilar su kernel.

También puede estar interesado en el proyecto DirectFB, que es una biblioteca que facilita el uso del framebuffer. También hay aplicaciones y entornos GUI escritos para él.


Si puedes gato /dev/urandom > /dev/fb0 y obtenga píxeles aleatorios en la pantalla, tiene todo lo que necesita.

En mi caso, necesitaba volcar información de texto. Probé esto en busybox y raspi, por lo que podría funcionar para usted. La respuesta puede ser un poco larga, ya que si no usa alguna consola necesitará imprimir el píxeles de caracteres usted mismo. Afortunadamente, alguien ha hecho el trabajo difícil, así que solo tenemos que combinarlo.

En busybox o en tu raspi deberías tener un fbset binario. Esto podría ayudarlo a encontrar su configuración como dimensiones de la pantalla.

En mi incrustado se ve así:

# 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 aquí es el ancho de 480 y la altura de 272 píxeles.

Como mencionaste, puedes completar la pantalla con cat /dev/urandom > /dev/fb0

y puedes borrarlo con cat /dev/zeros > /dev/fb0

Después de borrar la pantalla, debemos asegurarnos de que obtenga las dimensiones correctamente.

Por casualidad, mi busybox tenía un binario fbsplash que obtiene como entrada un archivo .ppm.

Correcto si me equivoco, pero parece que fb0 acepta este formato. Echando un vistazo a Portable Anymap en Wikipedia, hay varios "subformatos"... fbsplash usa uno elegante con color, y así sucesivamente... pero queremos poder imprimir algo legible. Usemos el P1 codificado en ASCII por simplicidad. Si pudiéramos imprimir una línea vertical, sabríamos que nuestras dimensiones son correctas. Intentémoslo:

Una línea vertical en un ppm tipo P1 debería verse así:

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

Entonces, habrá 272 líneas, 959 caracteres de ancho. La documentación dice que debería ser 1 en lugar de f... en busybox y raspi f era más brillante.

Es importante que no tengas espacio después de los 0... Esta tarea puede ser un poco tediosa... es mejor que uses un editor de texto que te ayude. En vim, puedes copiar las dos primeras líneas, ve al modo comando ( esc), luego escriba los siguientes caracteres:

of(esc)479a 0(esc)yy271p

Por supuesto, estoy usando mis dimensiones, deberías usar las tuyas. Asigna este archivo a /dev/fb0 , debería verse como:

Ok, estoy haciendo trampa... no es solo una línea ahí... son como 8... pero cuando no funciona (tenemos dimensiones incorrectas o tenemos espacio al final, tener solo una línea es mucho más fácil).

Si llegaste tan lejos, solo tenemos que imprimir los píxeles correctos para verlos como caracteres. Gracias a Marcel Sondaar y su repositorio en GitHub, no necesitaremos dibujar cada carácter.

Con un pequeño ajuste, expanda su programa simple para imprimir f en lugar de X y 0 en lugar de espacios, inserte espacios entre cada carácter, agregue el encabezado y tenemos un archivo .ppm con la letra correspondiente a su código de carácter.

Un pequeño paso más y no obtendrá un carácter como entrada, sino una línea. Cat un archivo, canalícelo a su programa y envíelo a /dev/fb0 y obtienes una salida de texto:

Probé esta solución también en una raspberry pi y funcionó. El sistema me dice que no tengo reputación para publicar más de 2 enlaces. Hasta que consiga esto, debes confiar en mi palabra :D


Linux
  1. ¿Cómo maneja Linux múltiples separadores de rutas consecutivas (/home////username///file)?

  2. Linux:¿cómo usar /dev/fb0 como una consola desde el espacio de usuario o enviarle texto?

  3. ¿Qué tan portátiles son /dev/stdin, /dev/stdout y /dev/stderr?

  4. Cómo mapear dispositivos /dev/sdX y /dev/mapper/mpathY desde el dispositivo /dev/dm-Z

  5. ¿Cómo envío texto en color a una terminal Linux?

Cómo redirigir la salida a /dev/null en Linux

¿Cómo codificar en base64 /dev/random o /dev/urandom?

¿Cómo se intercambia /dev/sda con /dev/sdb?

¿Cuándo debo usar /dev/shm/ y cuándo debo usar /tmp/?

Cómo usa Linux /dev/tty y /dev/tty0

Crear un dispositivo de bloque virtual que escriba en /dev/null