È possibile accedere al framebuffer per inserire un pixel sullo schermo dalla riga di comando?


15

Non sono sicuro che sia l'unico modo possibile, ma ho letto che per mettere un singolo pixel sullo schermo in una posizione a tua scelta, devi scrivere qualcosa in un posto chiamato framebuffer. Quindi sono diventato curioso, se è possibile entrare in questo posto e scrivere qualcosa al fine di visualizzare un singolo pixel da qualche parte sullo schermo.


Non hai specificato quale sistema operativo. Linux?
Gilles 'SO- smetti di essere malvagio' il

Sì, Linux (nome in codice rebecca rebecca)
Abdul Al Hazred

Risposte:


16

sì, al di fuori di X-server, in tty, prova il comando:

cat /dev/urandom >/dev/fb0

se pixel colorati riempiono lo schermo, la tua configurazione è ok e puoi provare a giocare con questo piccolo 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

dove la funzione 'pixel' dovrebbe essere una risposta ... scrivere un pixel sullo schermo modificando i valori dei byte (blu-verde-rosso-alfa) sull'offset xy del dispositivo / dev / fbX che è il frame buffer per la scheda video.

oppure prova a disegnare un pixel di linea (giallo su x: y = 200: 100, se la larghezza è 1024):

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

AGGIORNAMENTO: questo codice funziona anche all'interno di X-server, se configuriamo semplicemente X per usare il frame buffer . specificando fb0 all'interno di /usr/share/X11/xorg.conf.d/99-fbdev.conf


Qui ci sono un paio di cose pericolose: il primo esempio sembra scrivere byte casuali su un floppy disk, per qualche motivo. I comandi di follow-up usano ddche è stato spesso chiamato "Disk Destroy" per motivi specifici ... non andare vicino a questi comandi se non sai cosa stai facendo ...
Robert

4
@robert Penso che Omar intendesse /dev/fbXed /dev/fdera solo un errore di battitura. E sì, ddè pericoloso ma lo è anche rm. Ciò non significa che non dovrebbe essere usato. Significa solo che dovrebbe essere usato con cura.
terdon

ah /dev/fb0ha più senso! Tutti sanno cosa rmsignifica, ma ddè un po 'più oscuro, penso ancora che dovrebbe portare un avviso di salute.
Robert

2
"sì, al di fuori di X-server, in tty, prova il comando:" Non capisco se ho capito bene, quindi ho provato ad aprire il terminale e scrivere "cat / dev / urandom> / dev / fd0" ma ho solo un messaggio di errore: "cat: errore di scrittura: nessuno spazio lasciato sul dispositivo". Davvero non so come uscire da xserver.
Abdul Al Hazred,

1
... l'ho chiamato tty, ma è console virtuale, cosa non gui, terminale su tutto lo schermo, che raggiungi con ctrl-alt-f1,2,3 ... o "sudo chvt 1" ... ' nessuno spazio lasciato "sembra che andrà bene, sei ancora in X-session.
Asain Kujovic,

0

Ho appena pubblicato questa mattina, ancora indagando sul perché funziona solo su Raspberry Pis. https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=213964&p=1428891#p1428891

Apri / dev / fb0, mmap in modo da ottenere un puntatore ed è molto più veloce. Non usa affatto X ma ignorerà felicemente X, è solo qualcosa sullo schermo.

Oh, da una riga di comando, in un certo senso, puoi scrivere in / dev / fb0. Ma qualunque cosa tu scriva all'offset 0 sarà nell'angolo in alto a sinistra, quindi scorrerà immediatamente fuori dallo schermo. Potresti fare un ciclo for in Bash e scrivere un paio di migliaia di volte. Oppure usa / dev / urandom. Distruggere ciò che è nello screenbuffer, specialmente mentre sei in X, non è un grosso problema. Non appena si trascina una finestra sull'area X provoca un evento di esposizione e lo ridisegna. Non è necessario uccidere il potere per recuperare.

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.