Avanti Indietro Indice

5. Utilizzare i device framebuffer sulle piattaforme Intel

5.1 Cos'è vesafb?

Vesafb è un driver framebuffer per l'architettura Intel funzionante con schede grafiche compatibili VESA 2.0, in stretta relazione coi device driver del kernel per il framebuffer.

Vesafb è un driver per schermi che attiva l'utilizzo delle modalità grafiche sulla tua piattaforma Intel per console testuali bitmapped. Può inoltre visualizzare un logo, che è probabilmente la principale ragione per cui vorresti usare il vesafb :o)

Sfortunatamente, non puoi utilizzare con successo il vesafb con schede VESA 1.2. Questo perché queste schede 1.2 non utilizzano un frame buffering lineare. Frame buffering lineare significa semplicemente che la CPU del sistema è in grado di accedere ogni bit dello schermo. Storicamente, vecchi adattatori grafici permettevano alla CPU di accedere solo a 64K per volta, di qui le limitazioni delle spaventose modalità grafiche CGA/EGA! Può darsi che qualcuno scriva un device driver vesafb12 per queste schede, ma ciò consumerà preziosa memoria del kernel e comporterà uno smanettamento osceno.

Potenzialmente, esiste comunque una soluzione per aggiungere alla tua scheda "legacy" VESA 1.2 le estensioni VESA 2.0. Dovresti scaricare un programma per caratteri TSR che eseguirai da DOS che, usato assieme a loadlin, può aiutare a configurare la scheda per l'appropriata modalità grafica su console. Da notare che questo non sempre funziona, per esempio alcune schede Cirrus Logic come le serie VLB 54xx sono associate ad un intervallo di indirizzi di memoria (ad esempio, nell'intervallo 15MB-16MB) per il frame buffering che preclude a questo d'essere utilizzato con successo con sistemi con più di 32MB di memoria. C'è un modo per far funzionare il tutto, cioè, se hai un'opzione nel BIOS per lasciare un memory hole nell'intervallo 15MB-16MB, potrebbe funzionare, ma Linux non supporta l'utilizzo dei memory hole. Comunque penso ci siano patch per questa opzione [Chi le ha e dove le si possono trovare?]. Se vuoi sperimentare quest'opzione, son disponibili in abbondanza programmi di stile TSR, un primo esempio è UNIVBE, che può essere trovato su Internet.

Alternativamente, dovresti scaricare patch del kernel per permettere alla tua scheda VESA 1.2 di funzionare con i driver per il framebuffer VESA. Per esempio, ci sono patch per l'uso con vecchie schede S3 (come l'S3 Trio o l'S3 Virge) che supportano il VESA 1.2. Per queste schede, poi prelevare le patch da

ftp://ccssu.crimea.ua/pub/linux/kernel/v2.2/unofficial/s3new.diff.gz

5.2 Come attivo i driver vesafb?

Assumendo che tu stia usando menuconfig, avrai bisogno di fare i seguenti passi:

Se il tuo processore (su piattaforme Intel) supporta i MTRR, attivali. Ciò velocizzerà le copie della memoria tra il processore e la scheda grafica, ma non è strettamente necessario. Puoi naturalmente far questo dopo aver fatto funzionare il dispositivo console.

IMPORTANTE: Per i kernel 2.1.x, vai nel menu Code Maturity Level ed attiva il prompt per develpoment andor incomplete drivers. Questo non è più necessario per il kernel 2.2.x.

Vai nel menu Console Drivers, ed attiva i seguenti:

VGA Chipset Support (text only) - vgafb - è solitamente parte della lista precedente, ma è stato rimosso in quanto è ora sconsigliato e non più supportato. Verrà presto rimosso. Usa invece VGA Text Console (fbcon). VGA Character/Attributes è usato solo con il VGA Chipset Support e non ha bisogno d'essere selezionato.

Assicurati che Mac variable bpp packed pixel support non sia attivato. Il kernel di Linux release 2.1.111 (e 112) sembra attivare quest'opzione automaticamente se si seleziona Advanced Low Level Drivers per la prima volta. Questo non succede più col 2.1.113.

C'è inoltre l'opzione di compilare i caratteri nella memoria, ma questo non è realmente necessario e puoi sempre usare l'utility setfont di kbd-0.99 (vedere la sezione sui caratteri) per modificare i caratteri caricandone nel device console.

Assicurati che questi non diventino moduli. [Non son sicuro che sia comunque possibile crearli come moduli - per favore correggetemi su questo punto]

Dovrai creare il device framebuffer in /dev. Ne hai bisogno di uno per ogni device ramebuffer, quindi tutto quel che dovrai fare sarà di scrivere mknod /dev/fd0 c 29 0 per il primo. I successivi saranno in multipli di 32, quindi, ad esempio, per creare /dev/fb1 dovrai scrivere mknod /dev/fb1 c 29 32 e così via fino all'ottavo device framebuffer (mknod /dev/fb7 c 29 224).

Quindi ricompila il kernel, modifica /etc/lilo.conf per includere il parametro VGA=ASK, ed esegui lilo, il che è richiesto per permetterti di selezionare la modalità che preferisci usare.

Questo è un esempio di configurazione LILO (presa dalla mia macchina)

# File di configurazione del LILO
boot = /dev/hda3
delay = 30 
prompt
vga = ASK # Permette all'utente di entrare nelle modalità desiderate
image = /vmlinuz
  root = /dev/hda3
  label = Linux
  read-only # I filesystem Non-UMSDOS filesystems devono essere 
            # montati in sola lettura per il controllo

Riavvia la macchina e, come primo test, prova ad inserire 0301 al prompt VGA (questo ti darà 640x480 @ 256) e dovresti essere in grado di vedere un piccolo logo molto carino col Pinguino.

Da notare che al prompt VGA ti sarà richiesto di scrivere il numero nel formato di "0" più la cifra di 3 numeri, tralasciando la 'x'. Questo non è necessario se stai usando LILO.

Una volta che hai visto che tutto funziona correttamente, potrai esplorare le varie modalità VESA (vedi oltre) e decidere quale di queste tu preferisci ed includerla nel parametro "VGA=x" in lilo.conf. Quand'hai deciso quale preferisci, controlla l'equivalente numero esadecimale nella tabella sottostante ed usalo (cioè, per 1280x1024 @ 256, userai esattamente "VGA=0x307"), e riesegui lilo. Questo è tutto quel che c'è da fare. Per ulteriori indicazioni, leggere gli HOWTO LoadLin/LILO.

NOTA! il vesafb non attiva lo scorrimento all'indietro nel buffer come predefinito. Dovrai passare al kernel l'opzione per attivarlo. Usa video=vesa:ypan oppure video=vesa:ywrap per farlo. Ambedue fanno la stessa cosa, ma in modi differenti. ywrap è molto più veloce di ypan ma potrebbe non funzionare su schede grafiche VESA 2.0 lievemente scorrette. ypan è più lento di ywrap, ma è molto più compatibile. Questa opzione è presente solo nei kernel 2.1.116 e successivi. I kernel precedenti non erano in grado di permettere lo scorrimento all'indietro nel buffer in vesafb.

5.3 Che modalità VESA sono disponibili?

Questo dipende effettivamente dal tipo di scheda grafica compatibile VESA 2.0 che hai nel tuo sistema e dall'ammontare di memoria video disponibile. Quindi è solo questione di provare quali modalità funzionano meglio con la tua scheda grafica.

La tabella seguente mostra i numeri di modalità che puoi immettere al prompt VGA o da usare col programma LILO. (Effettivamente questi numeri sono addizionati con 0x200 per rendere più semplice il riferirsi alla tabella)

Colori   640x400 640x480 800x600 1024x768 1152x864 1280x1024 1600x1200
-------+--------------------------------------------------------------
 4 bit |    ?       ?     0x302      ?        ?        ?         ?
 8 bit |  0x300   0x301   0x303    0x305    0x161    0x307     0x31C
15 bit |    ?     0x310   0x313    0x316    0x162    0x319     0x31D
16 bit |    ?     0x311   0x314    0x317    0x163    0x31A     0x31E
24 bit |    ?     0x312   0x315    0x318      ?      0x31B     0x31F
32 bit |    ?       ?       ?        ?      0x164      ?

Spiegazione: 8 bit = 256 colori, 15 bit = 32.768 colori, 16 bit = 65.536 colori, 24 bit = 16,8 milioni di colori, 32 bit - lo stesso di 24 bit, ma con ulteriori 8 bit che possono essere usati per altre cose, e combacia perfettamente con i bus a 32 bit PCI/VLB/EISA.

Ci sono modalità addizionali a discrezione del fabbricante poichè il documento VESA 2.0 definisce solamente modalità fino a 0x31F. Potrai aver bisogno di giocherellare un po' per scovare queste ulteriori modalità.

5.4 Hai una scheda Matrox?

Se hai una scheda grafica Matrox, non hai realmente bisogno del vesafb, ma invece del driver matroxfb. Questo incrementa notevolmente le possibilità della tua scheda. Matroxfb funzionerà con le Matrox Mystique, Millennium I & II, G100 e G200. Inoltre supporta sistemi "multi-headed" (ossia, se hai due schede Matrox nella tua macchina, puoi usare due schermi sulla stessa macchina!). Per configurare per la Matrox, dovrai fare quanto segue:

Penso che dovresti aggiornare il BIOS della Matrox, puoi scaricare l'aggiornamento del BIOS da

http://www.matrox.com/mgaweb/drivers/ftp_bios.htm
. Attenzione che per far questo hai bisogno del DOS.

Vai nel menu Code Maturity Level ed attiva il prompt for development and/or incomplete drivers [da notare che questo potrebbe cambiare per kernel futuri - quando questo accadrà, quest'HOWTO verrà rivisto]

Vai nel menu Console Drivers ed attiva i seguenti:

Ricompila il tuo kernel, Quindi dovrai modificare il tuo file lilo.conf per attivare il device Matroxfb. Il modo più rapido e semplice è di riutilizzare il mio.

# File di configurazione del LILO
boot = /dev/hda3
delay = 30 
prompt
vga = 792    # Ne hai bisogno affinché parta in una modalità sicura
# Inizio delle partizioni Linux avviabili
image = /vmlinuz
  append = "video=matrox:vesa:440" # Quindi passa a Matroxfb
  root = /dev/hda3
  label = Linux
  read-only # I filesystem Non-UMSDOS filesystems devono essere 
            # montati in sola lettura per il controllo

Alla fine, dovrai creare il device framebuffer in /dev. Te ne serve uno per device framebuffer, cioè tutto ciò che dovrai fare sarà di scrivere mknod /dev/fb0 c 29 0 per il primo. I successivi saranno in multipli di 32, cioè per esempio per creare /dev/fb1 dovrai scrivere mknod /dev/fb1 c 29 32 e così via fino all'ottavo device framebuffer (mknod /dev/fb7 c 29 224).

E questo è quanto! [NOTA: Se qualcuno usa questo supporto per più uscite video, per favore mi contatti ASAP - Ho bisogno di parlare con lui a proposito di questo per documentarlo!

5.5 Hai una scheda Permedia?

Le schede Permedia non possono essere utilizzate con il driver vesafb, ma fortunatamente c'è il driver framebuffer per Permedia da utilizzare. Assumendo che tu stia usando menuconfig, fai quanto segue:

Vai nel menu Code Maturity Level ed attiva il prompt for development and/or incomplete drivers [da notare che questo potrebbe cambiare per kernel futuri - quando questo accadrà, questo HOWTO sarà rivisto]

Vai nel menu Console Drivers e seleziona quanto segue:

Ricompila il kernel. Quindi dovrai modificare il tuo file lilo.conf per attivare il device pm2fb. Il modo più rapido e semplice è di riutilizzare il seguente

# File di configurazione per LILO
boot = /dev/hda3
delay = 30 
prompt
vga = 792    # Ne hai bisogno affinché parta in una modalità sicura
# Inizio delle partizioni Linux avviabili
image = /vmlinuz
  append = "video=pm2fb:mode:1024x768-75,font:SUN12x22,ypan" # Quindi passa a pm2fb
  root = /dev/hda3
  label = Linux
  read-only # I filesystem Non-UMSDOS filesystems devono essere
            # montati in sola lettura per il controllo

La riga "pm2fb:mode:1024x768-75,font:SUN12x22,ypan" indica che stai selezionando una modalità a 1024x768 e 75Hz, con il carattere SUN12x22 selezionato (se l'avevi selezionato), includendo ypan per il supporto dello scorrimento all'indietro. Puoi selezionare altre modalità se desideri.

Alla fine, dovrai creare il device framebuffer in /dev. Te ne serve uno per device framebuffer, cioè tutto ciò che dovrai fare sarà di scrivere mknod /dev/fb0 c 29 0 per il primo. I successivi saranno in multipli di 32, cioè per esempio per creare /dev/fb1 dovrai scrivere mknod /dev/fb1 c 29 32 e così via fino all'ottavo device framebuffer (mknod /dev/fb7 c 29 224).

Per informazioni aggiuntive sulle altre caratteristiche del driver per framebuffer Permedia, punta il tuo browser su:

http://www.cs.unibo.it/~nardinoc/pm2fb/index.html

video=pm2fb:[opzione[,opzione[,opzione...]]]

dove l'opzione è una delle seguenti

5.6 Hai una scheda ATI?

[Nota: Quest'informazione è, nel migliore dei casi, solo di seconda o terza mano in quanto non possiedo una scheda ATI su cui testarla. Sentiti libero di correggermi se mi son sbagliato o massacrami! ] 8)

Le schede ATI possono essere utilizzate con il driver vesafb, ma potresti, come no, avere problemi, a seconda di quanto orrendamente scorretta sia la scheda. Fortunatamente, esiste il driver per framebuffer atyfb disponibile per essere usato. Assumendo che tu stia usando menuconfig, fai quanto segue:

Vai nel menu Code Maturity Level ed attiva il prompt for development and/or incomplete drivers [da notare che questo potrebbe cambiare per kernel futuri - quando questo accadrà, questo HOWTO sarà rivisto]

Via nel menu Console Drivers e seleziona quanto segue:

Ricompila il kernel. Quindi dovrai modificare il tuo file lilo.conf per attivare il device atyfb. Il modo più rapido e semplice è di riutilizzare il seguente

# File di configurazione del LILO
boot = /dev/hda3
delay = 30
prompt
vga = 792    # Ne hai bisogno affinché parta in una modalità sicura
# Inizio delle partizioni Linux avviabili
image = /vmlinuz
  append = "video=atyfb:mode:1024x768,font:SUN12x22"
  root = /dev/hda3
  label = Linux
  read-only # I filesystem Non-UMSDOS filesystems devono essere
            # montati in sola lettura per il controllo

La riga "atyfb:mode:1024x768,font:SUN12x22" indica che stai usando la modalità a 1024x768.

Alla fine, dovrai creare il device framebuffer in /dev. Te ne serve uno per device framebuffer, cioè tutto ciò che dovrai fare sarà di scrivere mknod /dev/fb0 c 29 0 per il primo. I successivi saranno in multipli di 32, cioè per esempio per creare /dev/fb1 dovrai scrivere mknod /dev/fb1 c 29 32 e così via fino all'ottavo device framebuffer (mknod /dev/fb7 c 29 224).

video=atyfb:[opzione[,opzione[,opzione...]]]

dove l'opzione è una delle seguenti

5.7 Che schede grafiche sono compatibili VESA 2.0?

Questa lista include tutte le schede grafiche di cui sia certo il funzionamento con il device vesafb:

Questa lista è composta da chipset integrati sulle schede madri dei sistemi:

La lista successiva mette nella "lista nera" le schede grafiche che non funzionano col device vesafb:

5.8 Posso creare il vesafb come modulo?

Da quel che ne so, il vesafb non può essere modularizzato, a meno che in un qualche momento gli sviluppatori non decidano di modificare le sorgenti per la modularizzazione. Da notare che qualora la modularizzazione fosse possibile, al momento dell'avvio non si sarà in grado di vedere alcunché fin quando il vesafb non venga modprobato. Probabilmente è quindi ben più saggio lasciarlo nel kernel per i casi in cui ci fossero problemi all'avvio.

5.9 Come modifico il cursore?

[Preso da VGA-softcursor.txt - grazie Martin Mares!]

Linux ha ora alcune capacità per manipolare l'apparenza del cursore. Normalmente, puoi impostare le dimensioni del cursore hardware (e pure aggirare alcuni bug terrificanti in quelle miserrime schede Trident -- vedi #define TRIDENT_GLITCH in drivers/char/vga.c). Qualora tu attivassi "Software generated cursor" nella configurazione del sistema, potrai provare un po' di nuovi trucchi: puoi rendere il tuo cursore somigliante ad un blocco rosso non lampeggiante, renderlo sfondo invertito rispetto al carattere su cui è posizionato oppure di evidenziare tal carattere e pure scegliere quando l'originale cursore hardware debba rimanere visibile o meno. Ci possono essere anche altre possibilità che non ho mai nemmeno immaginato.

Le apparenze del cursore sono controllate da una sequenza d'escape

<ESC>[?1;2;3c
dove 1, 2 e 3 sono parametri descritti in seguito. Se ne ometti uno qualsiasi, verranno impostati a zero.

Il parametro 1 specifica la dimensione del cursore (0=predefinita, 1=invisibile, 2=sottolineato, ..., 8=blocco pieno) + 16 se vuoi che il cursore software venga applicato + 32 se vuoi cambiare sempre il colore di sfondo + 64 se non ti piace avere lo sfondo come il primo piano. Le evidenziazioni sono ignorate per le due ultime flag.

Il secondo parametro seleziona i bit degli attributi del carattere che vuoi cambiare (semplicemente XORrandoli con il valore di questo parametro). Su VGA standard, i quattro bit alti specificano lo sfondo ed i quattro bassi il primo piano. In ambo i gruppi, tre bit bassi specificano il colore (come nei normali codici colore usati dalla console) e quello più significativo attiva l'evidenziazione (oppure, qualche volta, il lampeggiamento -- dipende dalla configurazione della tua VGA).

Il terzo parametro consiste nei bit degli attributi dei carattere che vuoi impostare. L'impostazione dei bit ha luogo prima del cambio di stato dei bit, per cui puoi semplicemente svuotare un bit includendolo sia nella toggle mask che in quella delle impostazioni .

Per avere normale sottolineatura lampeggiante: echo -e '\033[?2c' Per avere un blocco lampeggiante: echo -e '\033[?6c' Per avere un blocco rosso non lampeggiante: echo -e '\033[?17;0;64c'


Avanti Indietro Indice