Usare un display SpotPear 3.5" come framebuffer secondario (no X)
Un bel display da 3.5" 640x480 con touchscreen resistivo stackabile. Peccato che la configurazione non sia proprio banale, per questo ho voluto "registrarla" qui, caso mai servisse in futuro a me o ad altri.
Il produttore fornisce un'immagine, ma ovviamente è piuttosto "preistorica" ed eseguendo gli aggiornamenti il display smette di funzionare non appena si cambia kernel. Fortunatamente, essendo un display piuttosto diffuso è supportato, ma le informazioni su come configurarlo sono frammentarie e spesso mescolate con quelle per altri modelli.
N.B.: questo display NON è adatto per immagini che cambiano radicalmente: la scansione di redraw è ben visibile (circa 0.3" per cancellare/ridisegnare completamente lo schermo)! Si può mitigare con redraw parziali, ma un video non sarà visibile! E non c'è possibilità di fare double buffering.
Io sono partito con l'installazione di una MiniBian per non avere nulla di "precotto": praticamente è una Debian (molto) minimale con server ssh attivo (purtroppo con utente root). Dopo i soliti aggiornamenti d'obbligo sono partito con la configurazione del display.
Intanto ho aggiunto a /etc/modules le righe:
spi-bcm2835 # Display LCD on SPI bus flexfb fbtft_device
Poi la configurazione specifica dei moduli, in /etc/modprobe.d/fbtft.conf (occhio alla prima riga, molto lunga):
options flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3 options fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24
(prese dal post di fergie4000 del 6 gennaio 2015 su GitHub).
Poi, perchè venga attivato in generale il controller SPI, va aggiunta in /boot/config.txt la riga:
dtparam=spi=on
(e magari anche gpu_mem=1
se non si intende fare grafica sull'uscita video normale).
Infine va aggiunta in /boot/cmdline.txt la mappatura del framebuffer per fare in modo che non venga usato automaticamente (da mettere prima di rootwait
):
fbcon=map:0
A questo punto un bel riavvio ed il display è funzionante. Ma ovviamente ancora non ci compare nulla (si spera, visto che con map:0 ho detto al kernel di mantenere i suoi terminali fuori dalle scatole, collegati al framebuffer 0 ).
ls -l /dev/fb*
deve riportare due device, altrimenti vanno ripercorsi i vari passi, verificando bene che non ci siano errori.
A questo punto rimane da configurare il touchscreen. "Fortunatamente" la calibrazione si appoggia proprio al framebuffer, quindi si potranno testare entrambe le configurazioni in un colpo solo.
Si installano quindi i pacchetti evtest tslib libts-bin
e relative dipendenze.
Dovrebbe comparire il file /dev/input/event0
oltre a /dev/input/mouse0
.
Si procede con la calibrazione del touch (sempre necessaria per i touch resistivi) assicurandosi di usare un pennino per maggiore precisione:
TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_calibrate
È sufficiente seguire la procedura che compare sul display (confermando quindi che è a posto!).
Al termine, i dati di calibrazione vengono automaticamente salvati in /etc/pointercal
.
Ora ci si può divertire col test:
TSLIB_FBDEVICE=/dev/fb1 TSLIB_TSDEVICE=/dev/input/event0 ts_test
Se non pare sufficientemente preciso, va ripetuto lo step di calibrazione.
Se invece è a posto, si possono sviluppare i propri programmi che interagiscono col display (breve tutorial sull'uso del framebuffer in C) e col nuovo "mouse".
Non mi sono ancora preso la briga di verificare se ci sono librerie utili (sicuramente si! Basta cercarle).
Happy coding!