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


24

Así que tengo un modelo Palm Pre (P100EWW original) en el que habilité el modo de desarrollador e instalé un chroot Debian Squeeze. Funciona genial. Tengo planes de usar esto para CUALQUIER COSA (bittorrent peer, servidor web) pero un teléfono.

Me di cuenta de que si lo hago cat /dev/urandom > /dev/fb0, escribe píxeles aleatorios en la pantalla hasta que No space left on devicese genera un error. Impresionante, ahora puedo usar la pantalla.

Entonces, ¿qué tipo de utilidades hay? A) me permitirá usar / dev / fb0 como consola a la que puedo enviar texto o B) renderizar texto en / dev / fb0 desde la línea de comandos.

Todavía no sé cómo volver a compilar el kernel para esto (me encantaría despojar a WebOS por completo y convertirlo en un servidor ARM mínimo) para que las herramientas de espacio de usuario si existen es lo que estoy preguntando. También preferiría renderizar directamente a / dev / fb0 y no usar X.


Las consolas virtuales de Linux deberían funcionar sobre un controlador de framebuffer. Las consolas virtuales son una herramienta poderosa; desde Linux 2.6 permiten establecer diferentes fuentes para cada consola. Pero se controlan (desde el espacio de usuario) a través de / dev / vcs  ny / dev / vcsa  n , no / dev / fb0.
Incnis Mrsi

Respuestas:


11

Para usar el framebuffer como consola, necesita el fbdevmódulo. Puede que tenga que recompilar su núcleo.

También te puede interesar el proyecto DirectFB, que es una biblioteca que facilita el uso del framebuffer. También hay aplicaciones y entornos GUI escritos para ello.


1
Parece que cuando instalé Directfb ( webos-internals.org/wiki/Directfb ), venía con una utilidad llamada dfbgque me permite poner una imagen allí (y no la elimina al finalizar, como fbi). Sé que es probable que pueda encontrar una utilidad para crear un .png o similar de un bloque de texto por lo que este podría funcionar ...
LawrenceC

24

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

  • zhcon ( Debian ): un terminal virtual de espacio de usuario orientado a manejar E / S CJK mucho mejor que el subsistema del núcleo. Su fuerza particular está en el manejo de codificaciones ISO 2022 no UTF; Su particular debilidad son las codificaciones UTF.
  • fbterm ( Debian ): un terminal virtual de espacio de usuario que ha generado varios tenedores, incluido jfbterm . Tiene un montón de complementos de método de entrada CJK.
  • bogl-bterm ( Debian ): un terminal virtual de espacio de usuario que ha generado bifurcaciones como niterm .
  • El fbpad de Ali Gholami Rudi : un terminal virtual de espacio de usuario minimalista que no depende de las bibliotecas X.
  • The console-terminal-emulatorand console-fb-realizertools in nosh : un terminal virtual de espacio de usuario destinado a replicar terminales virtuales de kernel 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 logindservidor en systemd y sus nociones de "asientos".

Ali Gholami Rudi en particular ha producido más que un simple emulador de terminal para el trabajo de framebuffer. También escribió un visor de PDF directo a framebuffer, visor de VNC, reproductor de medios y 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 de espacio de usuario utilizan bibliotecas X para el manejo de fuentes, mapeo de teclado, métodos de entrada CJK, etc. No son clientes X, pero tienen dependencias de las bibliotecas X. fbpady las herramientas nosh por diseño no hacen uso de 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 las fuentes BDF a fuentes BOGL con la bdftoboglherramienta; y uno convierte TTF a las fuentes "tinyfont" que fbpad usa con la herramienta ft2tf ( Arch ).
    • La console-fb-realizerherramienta nosh usa las mismas fuentes "vt" que el nuevo subsistema de terminal virtual del núcleo FreeBSD 10.1 y, por lo tanto, comparte la herramienta de manipulación de fuentes FreeBSD vtfontcvtpara convertir las fuentes BDF.
  • Los programas que usan bibliotecas X usan la 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 completo compatible con ISO 9995-3 con el grupo "común" ISO 2. Uno convierte archivos BSD kbdmap a este formato con la console-convert-kbdmapherramienta. Una vez más, estos archivos kbdmap son los que se usan con el subsistema FreeBSD / PC-BSD vt .
    • fbpad no hace su propia asignación de teclado, y se basa en la presencia del subsistema de terminal virtual del núcleo y su mecanismo de asignación de teclado para eso.
  • Hay alguna variación en la invocación y los privilegios requeridos:
    • 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 fueron diseñadas para integrarse con un sistema existente /etc/ttys(BSD), /etc/inittab(sistema Linux 5 init) u otro sistema, al que dejan el trabajo de generar getty / login / shell. console-fb-realizersolo necesita suficientes privilegios para abrir el framebuffer y los dispositivos de eventos de entrada, que no necesitan ser privilegios de superusuario, y para acceder a los FIFO y los archivos ordinarios que mantiene console-terminal-emulator, lo 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 el texto en el framebuffer más directamente, tiene algunas opciones:

  • bogl-bterm se basa, por supuesto, en la biblioteca de gráficos propios de Ben Pfaff, una biblioteca de E / S 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 lo usen directamente.
  • Para un punto intermedio entre escribir un programa que hace uso de una biblioteca framebuffer para hacer su propio renderizado y un programa que escupe secuencias de escape a lo que cree que es un terminal: el terminal virtual de espacio de usuario nosh es modular y se divide en piezas componentes Uno simplemente no puede usar console-terminal-emulator.

    console-fb-realizerusa un archivo de visualización con una matriz de celdas de caracteres, como /dev/vcsa*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. Por lo tanto, uno puede ejecutarlo y simplemente escribir carácter + atributo + color directamente en el archivo de matriz de celdas de caracteres, dejando console-fb-realizerque la representación de fuentes en el buffer de cuadros.

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


1
Esta es una respuesta asombrosa. Las bibliotecas de Enlightenment reclaman el soporte de framebuffer en un linux fbcon, dependiendo de las opciones de tiempo de compilación . Esto también es cierto para su emulador de terminal dependiente Terminología : funciona directamente en el framebuffer de Linux (fbcon) . Aparte terminology, la segunda me kmscon (y otros trabajos de David Herrmann) recomendación a mí mismo .
mikeserv

1
¡Rudi es un maestro del framebuffer! Algún día también abandonaré X11.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

10

Si puede capturar /dev/urandom > /dev/fb0y obtener 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, deberá imprimir los píxeles de los caracteres usted mismo. Afortunadamente, alguien ha hecho el trabajo duro, por lo que solo tenemos que combinarlo.

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

En mi aspecto incrustado 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 480 y la altura 272 píxeles.

Como mencionó, puede completar la pantalla con cat /dev/urandom > /dev/fb0

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

Luego de limpiar su pantalla, debemos asegurarnos de que obtenga las dimensiones correctamente.

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

Corregir si me equivoco, pero parece que fb0acepta 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. Vamos a intentarlo:

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 tenga espacio después de los 0 ... Esta tarea puede ser un poco tediosa ... es mejor que use un editor de texto que lo ayude. En vim, puede copiar las dos primeras líneas, ir al modo de comando (esc), que escribir los siguientes caracteres:

of(esc)479a 0(esc)yy271p

Por supuesto, estoy usando mis dimensiones, deberías usar las tuyas. Cat a este archivo /dev/fb0, debería verse así: Pantalla de línea vertical

Ok, estoy haciendo trampa ... no es solo una línea allí ... son aproximadamente 8 ... pero cuando no funciona (tenemos dimensiones incorrectas o tenemos espacio al final, tener una sola 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 personaje.

Con un pequeño ajuste, expanda su programa simple para imprimir en flugar de Xy en 0lugar 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 obtienes un carácter como entrada, sino una línea. Cat un archivo, canalice a su programa y salida a /dev/fb0y obtendrá una salida de texto:

Ejemplo de salida de texto

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


2

Para el lado de la consola, puede hacer eco de cosas /dev/consoleo puede usar syslog, y dependiendo de varias otras configuraciones, puede aparecer en la consola.

Para las imágenes, ¡acabo de intentar capturar un archivo bmp en fb0 y realmente funcionó! (tipo de - copias múltiples, tamaño más pequeño)

Encontré un programa de bmp a framebuffer aquí . Ese debería ser un ejemplo perfecto del formato que espera fb0. También hay fbiun programa para escribir directamente en el búfer de trama.


fbime permite poner una imagen en la pantalla, lo cual es útil, pero borra el framebuffer una vez que sale.
LawrenceC

0

Es una publicación antigua, pero entiendo que normalmente necesitas la consola framebuffer (fbcon) para ejecutar la consola en framebuffer. Está en la configuración. (controladores de dispositivo / gráficos / pantalla de consola ..)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.