¿Es posible acceder al framebuffer para poner un píxel en la pantalla desde la línea de comando?

15

No estoy seguro de si es la única forma posible, pero leí que para colocar un solo píxel en la pantalla en la ubicación que elija, debe escribir algo en un lugar llamado framebuffer. Entonces sentí curiosidad, si es posible ingresar a este lugar y escribir algo en él para mostrar un solo píxel en algún lugar de la pantalla.

Abdul Al Hazred
fuente
No especificó qué sistema operativo. Linux?
Gilles 'SO- deja de ser malvado'
Sí, Linux (nombre en clave de menta rebecca)
Abdul Al Hazred
stackoverflow.com/questions/4996777/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

16

sí, fuera del servidor X, en tty, pruebe el comando:

cat /dev/urandom >/dev/fb0

Si los colores llenos de píxeles llenan la pantalla, entonces su configuración está bien, y puede intentar jugar con este pequeño script:

#!/usr/bin/env bash

fbdev=/dev/fb0 ;   width=1280 ; bpp=4
color="\x00\x00\xFF\x00" #red colored

function pixel()
{  xx=$1 ; yy=$2
   printf "$color" | dd bs=$bpp seek=$(($yy * $width + $xx)) \
                        of=$fbdev &>/dev/null
}
x=0 ; y=0 ; clear
for i in {1..500}; do
   pixel $((x++)) $((y++))
done

donde la función 'píxel' debería ser una respuesta ... escriba un píxel en la pantalla cambiando los valores de bytes (azul-verde-rojo-alfa) en el desplazamiento xy del dispositivo / dev / fbX que es el búfer de cuadros para la tarjeta de video.

o pruebe un dibujo de píxel de línea (amarillo en x: y = 200: 100, si el ancho es 1024):

printf "\x00\xFF\xFF\x00" | dd bs=4 seek=$((100 * 1024 + 200)) >/dev/fb0

ACTUALIZACIÓN: este código funciona incluso dentro del servidor X, si solo configuramos X para usar frame buffer . especificando fb0 dentro de /usr/share/X11/xorg.conf.d/99-fbdev.conf

Asain Kujovic
fuente
Aquí hay un par de cosas peligrosas: el primer ejemplo parece escribir bytes aleatorios en un disquete, por alguna razón. El seguimiento comandos usar ddque a menudo ha sido llamado "Disco Destruye" por razones específicas ... no se acerque estos comandos a menos que sepa lo que está haciendo ...
Robert
44
@robert Creo que Omar quiso decir /dev/fbXy /dev/fdfue solo un error tipográfico. Y sí, ddes peligroso, pero también lo es rm. Eso no significa que no deba usarse. Simplemente significa que debe usarse con cuidado.
terdon
ah /dev/fb0tiene más sentido! Todo el mundo sabe lo que rmsignifica, pero ddes un poco más oscuro, todavía creo que debería llevar una advertencia de salud.
robert
2
"sí, fuera del servidor X, en tty, pruebe el comando:" No entiendo si lo hice bien, así que intenté simplemente abrir el terminal y escribir "cat / dev / urandom> / dev / fd0" pero solo obtuve un mensaje de error: "cat: error de escritura: no queda espacio en el dispositivo". Realmente no sé cómo salir del servidor x.
Abdul Al Hazred
1
... lo llamé tty, pero es una consola virtual, una cosa que no es gui, una terminal sobre toda la pantalla, a la que se llega con ctrl-alt-f1,2,3 ... o "sudo chvt 1" ... ' no queda espacio 'parece que estará bien, solo que todavía estás en X-session.
Asain Kujovic
0

Acabo de publicar esto esta mañana, todavía investigando por qué solo funciona en Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Abra / dev / fb0, mmap para obtener un puntero, y es mucho más rápido. No usa X en absoluto pero felizmente ignorará X, es solo algo en la pantalla.

Oh, desde una línea de comando, puedes escribir a / dev / fb0. Pero lo que escriba en el desplazamiento 0 estará en la esquina superior izquierda, por lo que se desplazará inmediatamente fuera de la pantalla. Podrías hacer un bucle for en Bash y escribir un par de miles de veces. O use / dev / urandom. Destruir lo que hay en el screenbuffer, especialmente mientras estás en X, no es gran cosa. Tan pronto como arrastre una ventana sobre el área, X provoca un evento de exposición y lo vuelve a pintar. No necesitas matar el poder para recuperarte.

Alan Corey
fuente