Sfatando un diffuso luogo comune, installare Linux sul portatile non è difficile anche se richiede un pò d'impegno. Questa guida descrive, passo per passo, la configurazione della distribuzione Gentoo su un notebook Sony SZ in modo tale da avere un sistema stabile ed adatto anche all'uso mobile.
Scopo di questo articolo è fare il punto della situazione sulla configurazione della Gentoo sul mio Sony Vaio SZ1M/B: non è un documento definitivo ma, più che altro, una raccolta di appunti che cercherò di aggiornare di volta in volta. Non dò conto della prima installazione della Gentoo sul notebook perché non ha presentato nessuna problematica particolare rispetto a quanto chiaramente spiegato sul Gentoo Handbook.
Per informazioni, aggiornamenti e correzioni, il mio indirizzo e-mail è Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo..
4.1 Audio
4.2 Video
4.3 USB
4.4 Ethernet
4.5 Wireless
4.6 Card reader
A livello hardware, il notebook si basa sulla piattaforma Napa di Intel che comprende i seguenti componenti:
- Processore Core Duo
- Intel Express i945GM chipset (integra la sottosezione grafica GMA950)
- South Bridge ICH7M (integra il chip audio Intel HDA)
- Intel Pro Wireless 3945 ABG
Questo è l'output di lspci (per maggiori informazioni sul riconoscimento dell'hardware si può consultare questa guida):
# lspci |
00:00.0 Host bridge: Intel Corporation Mobile 945GM/PM/GMS/940GML and 945GT Express Memory Controller Hub (rev 03) 00:1b.0 Audio device: Intel Corporation 82801G (ICH7 Family) High Definition Audio Controller (rev 02) 00:1c.0 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 1 (rev 02) 00:1c.1 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 2 (rev 02) 00:1c.2 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 3 (rev 02) 00:1c.3 PCI bridge: Intel Corporation 82801G (ICH7 Family) PCI Express Port 4 (rev 02) 00:1d.0 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #1 (rev 02) 00:1d.1 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #2 (rev 02) 00:1d.2 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #3 (rev 02) 00:1d.3 USB Controller: Intel Corporation 82801G (ICH7 Family) USB UHCI #4 (rev 02) 00:1d.7 USB Controller: Intel Corporation 82801G (ICH7 Family) USB2 EHCI Controller (rev 02) 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev e2) 00:1f.0 ISA bridge: Intel Corporation 82801GBM (ICH7-M) LPC Interface Bridge (rev 02) 00:1f.1 IDE interface: Intel Corporation 82801G (ICH7 Family) IDE Controller (rev 02) 00:1f.2 IDE interface: Intel Corporation 82801GBM/GHM (ICH7 Family) Serial ATA Storage Controller IDE (rev 02) 00:1f.3 SMBus: Intel Corporation 82801G (ICH7 Family) SMBus Controller (rev 02) 06:00.0 Network controller: Intel Corporation PRO/Wireless 3945ABG Network Connection (rev 02) 07:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8036 PCI-E Fast Ethernet Controller (rev 15) 09:04.0 CardBus bridge: Texas Instruments PCIxx12 Cardbus Controller 09:04.1 FireWire (IEEE 1394): Texas Instruments PCIxx12 OHCI Compliant IEEE 1394 Host Controller 09:04.2 Mass storage controller: Texas Instruments 5-in-1 Multimedia Card Reader (SD/MMC/MS/MS PRO/xD) |
Ai quali si aggiungono, se è stata selezionata la modalità "Stamina"
00:02.0 VGA compatible controller: Intel Corporation Mobile 945GM/GMS/940GML Express Integrated Graphics Controller (rev 03) 00:02.1 Display controller: Intel Corporation Mobile 945GM/GMS/940GML Express Integrated Graphics Controller (rev 03) |
o se è stata selezionata la modalità "Speed"
00:01.0 PCI bridge: Intel Corporation Mobile 945GM/PM/GMS/940GML and 945GT Express PCI Express Root Port (rev 03) 01:00.0 VGA compatible controller: nVidia Corporation GeForce Go 7400 (rev a1) |
La serie SZ di Sony monta processori Intel Core Duo, nella fattispecie il sony SZ1m/b è equipaggiato con un T2300 a 1,67 GHz.
I due core del processore vengono riconosciuti correttamente.
# cat /proc/cpuinfo |
processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 14 model name : Genuine Intel(R) CPU T2300 @ 1.66GHz stepping : 8 cpu MHz : 1000.000 cache size : 2048 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx constant_tsc pni monitor vmx est tm2 xtpr bogomips : 3339.43 processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 14 model name : Genuine Intel(R) CPU T2300 @ 1.66GHz stepping : 8 cpu MHz : 1667.000 cache size : 2048 KB physical id : 0 siblings : 2 core id : 1 cpu cores : 2 fdiv_bug : no hlt_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 10 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx constant_tsc pni monitor vmx est tm2 xtpr bogomips : 3333.82 |
Assicuriamoci di avere abilitato il supporto a SMT nel kernel
Processor type and features ---> Subarchitecture Type (PC-compatible) ---> Processor family (Pentium M) ---> [*] Symmetric multi-processing support (2) Maximum number of CPUs (2-255) [*] SMT (Hyperthreading) scheduler support [*] Multi-core scheduler support Preemption Model (Voluntary Kernel Preemption (Desktop)) ---> High Memory Support (4GB) ---> [*] MTRR (Memory Type Range Register) support [*] kexec system call (EXPERIMENTAL) |
Per configurare /etc/make.conf mi sono riferito a quanto suggerito da Gentoo-wiki nell'howto sulle Safe Flags .
La variabile MAKEOPTS specifica quante compilazioni in parallelo sono consentite ed abitualmente le viene assegnato un valore pari al numero delle cpu più uno. Nel nostro caso, quindi, la variabile dovrebbe assumere il valore "-j3".
Usando questo valore ho notato che, durante la compilazione, la cpu raggiunge spesso un carico vicino al 100%, mentre con valore "-j2" difficilmente supera il 60% di carico. Finora non ho avuto nessun problema usando MAKEOPTS="-j3" ma, se preferite non stressare troppo il processore, allora potreste adottare il valore "-j2".Le variabili VIDEO_CARDS e INPUT_DEVICES sono necessarie se si ha intenzione di usare Xorg modulare, invece ALSA_CARDS è utile se si ha intenzione di utilizzare alsa-driver.
/etc/make.conf |
CFLAGS="-march=prescott -O2 -pipe -fomit-frame-pointer" ..... INPUT_DEVICES="evdev keyboard mouse synaptics" |
Trovate il mio file make.conf completo qui.
L'HDD (un Seagate Momentus SATA a 5400 rpm) e l'unità ottica (un masterizzatore DVD Matshita UJ842-D) non hanno avuto bisogno di nessuna configurazione particolare.
Questa è la mia configurazione del kernel:
SCSI device support ---> SCSI disk support SCSI CDROM support SCSI generic support SCSI low-level drivers ---> Serial ATA (SATA) support AHCI SATA support Intel PIIX/ICH SATA support |
Per ottenere informazioni sullo stato e la temperatura dell'HDD potete interrogare il chip S.M.A.R.T attraverso smartctl, una utility contenuta nel pacchetto smartmontools.
# emerge -av smartmontools |
# smartctl -a -d ata /dev/sda |
Device Model: ST98823AS ....... |
Una guida dettagliata sugli hard-disk Sata è reperibile su http://gentoo-wiki.com/HARDWARE_SATA.
Per configurare il chip audio ho scelto di utilizzare alsa-driver e pertanto ho disabilitato il supporto integrato nel kernel:
Device Drivers ---> Sound ---> Sound card support Advanced Linux Sound Architecture ---> Advanced Linux Sound Architecture Open Sound System ---> |
L'audio in uscita funziona correttamente mentre non sono riuscito a far funzionare l'audio in ingresso (detto in parole povere non c'è stato verso di far funzionare il microfono, quindi niente telefonate su Skype per ora..). Si tratta di un problema noto che dovrebbe essere risolto a partire dalla versione 1.0.12rc1 di alsa-driver, secondo quanto riportato su http://www.alsa-project.org/changes/v1-0-11--v1-0-12rc1.txt .
Per avere una migliore resa sonora potete provare ad aggiungere la seguente riga a /etc/modules.d/alsa:
# echo "options snd-hda-intel position_fix=1" >> /etc/modules.d/alsa |
# modules-update |
Update 25/7/2006: La versione 1.0.12rc1 di alsa-driver è disponibile su portage ma è masked, bisogna quindi togliere il masking prima di poterla installare:
# echo "=media-sound/alsa-driver-1.0.12_rc1-r1" >> /etc/portage/package.unmask |
# echo "=media-sound/alsa-headers-1.0.12_rc1" >> /etc/portage/package.unmask |
# emerge -av alsa-driver |
Ora funziona anche il line-in.....vai col VoIP ....
Il Sony SZ ha a disposizione due chip grafici: l'Intel GMA950 integrato nel chipset i945 e il chip dedicato Nvidia Geforce Go 7400. Non è possibile passare da un chip all'altro "a caldo" ma solo riavviando.
Per configurare questa funzione anche su Linux, ho modificato uno script messo a disposizione da http://www.arielo.net/vaiosz.html trasformandolo in uno script di init. Questo è il mio script /etc/init.d/xorg_conf:
!/sbin/runscript depend() { before xdm } start() { VIDEO=`/usr/sbin/lspci |grep -c nVidia` NVIDIA=`/usr/bin/eselect opengl show |grep -c nvidia` if [ "$VIDEO" = 1 ]; then cp -f /etc/X11/xorg.conf.speed /etc/X11/xorg.conf if [ "$NVIDIA" = 0 ]; then eselect opengl set nvidia fi else cp -f /etc/X11/xorg.conf.stamina /etc/X11/xorg.conf if [ "$NVIDIA" = 1 ]; then eselect opengl set xorg-x11 fi fi } |
Lo script va reso eseguibile e va aggiunto al boot:
# chmod +x xorg_conf |
# rc-update add xorg_conf boot |
Il funzionamento è abbastanza semplice: si creano due file di configurazione di xorg differenti, /etc/X11/xorg.conf.speed per la modalità "speed" (chip Nvidia) e /etc/X11/xorg.conf.stamina per la modalità "stamina" (chip integrato), lo script copia in /etc/X11/xorg.conf il file di configurazione corretto a seconda della scheda grafica che si sta utilizzando. Ovviamente, lo script, per funzionare correttamente, dovrà essere lanciato prima che venga caricato X. Questi sono i link ai miei due file di configurazione: xorg.conf.stamina e xorg.conf.speed.
Update 02/10/2006: lo script si occupa anche di configurare opengl correttamente a seconda della scheda grafica che sista usando.
Potete configurare questa gpu come vesa generica oppure come i915. Nel primo caso dovrete identificare in xorg.conf la scheda grafica come "vesa",nel secondo caso come "i810".
Ho optato per quest'ultima soluzione perché consente di avere supporto 3D e di utilizzare la risoluzione nativa dello schermo di 1280x800 senza bisogno di installare 855resolution. Sarà quindi necessario installare il pacchetto xf86-video-i810 e caricare i moduli intel-agp e i915. Purtoppo con la versione 1.4.1.3 di xf86-video-i810 ricevo un errore "I810: no matching device section...." quindi dovete emergere la versione 1.6.0 che richiede una versione di xorg-server successiva alla 1.0.2-r7.
Device Drivers ---> Character devices ---> /dev/agpgart ( AGP Support ) Intel 440LX/BX/GX, I8xx and E7x05 chipset support Intel 830M, 845G, 852GM, 855GM, 865G i915 drive |
# emerge -av xf86-video-i810 |
# modprobe intel-agp i915 |
Il supporto al 3D funziona correttamente e sono riuscito a far girare AIXGL anche se non in maniera del tutto fluida. Con glxgears ottengo circa 950 FPS.
$ glxinfo | grep rendering |
direct rendering: Yes |
Le versioni di xorg-server successive alla 1.0.2-r7 (richieste come dipendenza dal driver xf86-video-i810 della GMA950) bloccano il driver nvidia-glx. Sul perché di questo blocco potete trovare documentazione online. Per installare contemporaneamente i driver i810 e nvidia-glx dovrete, quindi, fare ricorso ad un piccolo espediente:
# emerge -av nvidia-glx --nodeps |
Significa che il driver nvidia viene installato ignorando le dipendenze. Ovviamente si tratta di una soluzione provvisoria in attesa che la situazione cambi anche se finora ha funzionato abbastanza bene per me. Per un approfondimento e per risolvere eventuali problemi rinvio alla documentazione sul sito di gentoo http://www.gentoo.org/doc/en/nvidia-guide.xml.
Ricordate di caricare i moduli nvidia e agpgart e di eseguire "eselect opengl set nvidia".
# modprobe agpgart nvidia |
# eselect opengl set nvidia |
Sono riuscito ad ottenere circa 2700 FPS a glxgears.
Emergendo nvidia-settings avrete a disposizione una comoda interfaccia grafica di configurazione che consente dicontrollare agevolmente vari parametri relativi a questa GPU.
# emerge nvidia-settings |
Update 28/8/2006: Nvidia ha rilasciato la versione 1.0.8774 dei suoi driver per linux. La principale novità è il supporto per X.org7.1 e quindi risolve i problemi che avevo incontrato precedentemente con la configurazione della nvidia.Effettivamente, dopo aver installato i driver aggiornati sembra funzionare tutto per il meglio.
Bisogna prima rimuovere i pacchetti nvidia-glx e nvidia-kernel (se nonliavevate installati precedentemente passate direttamente all'installazione dei driver aggiornati) e poi emergere nvidia-drivers:
# emerge --unmerge nvidia-kernel nvidia-glx |
# emerge nvidia-drivers |
Non sto notando piu' artefatti sul testo e anche in questo caso glxgears mi segna uno score di circa 2700 FPS.
Nulla da aggiungere a quanto trovate sul Wiki di Gentoo al link http://gentoo-wiki.com/HARDWARE_Intel_945G#USB
Lspci ci informa che il chip di rete e' un Marvell 88E8036. Il modulo del kernel relativo e' lo sky2: è ancora sperimentale e non è abilitato di default nel kernel, dovrete quindi ricompilare il kernel con questa configurazione:
Device Drivers ---> Network device support ---> Ethernet (1000 Mbit) ---> SysKonnect Yukon2 support (EXPERIMENTAL) |
La scheda di rete PRO/Wireless 3945ABG è abbastanza recente ma è ormai pienamente supportata.
Al momento,però, bisogna reinstallare il sottosistema IEEE802.11 e successivamente emergere il driver e il demone ipw3945.
Innanzitutto bisogna rimuovere dal kernel il supporto ad IEEE802.11 integrato:
Device Drivers ---> Wireless LAN (non-hamradio) ---> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) Networking ---> Generic IEEE 802.11 Networking Stack |
Adesso possiamo emergere i pacchetti che ci occorrono:
# emerge ieee80211 |
# emerge ipw3945 ipw3945-ucode ipw3945d |
Resta solo da caricare i moduli:
# modprobe iee80211 ipw3945 |
Per configurare la connessione wi-fi suggerisco il solito howto su Gentoo-wiki http://gentoo-wiki.com/HOWTO_Wireless_Configuration_and_Startup .
Il Sony SZ ha un lettore di Memory Stick integrato che non ho ancora avuto modo di testare. Per gli altri formati è compreso nella dotazione un adattatore che viene riconosciuto automaticamente da Linux e non necessita di nessuna configurazione.
Firewire, Modem e VGA
Da testare.
Spuntiamo le voci che ciinteressano nella sezione "Power management options" del kernel:
Power management options (ACPI, APM) ---> --- Power Management support [*] Legacy Power Management API [ ] Power Management Debug Support ACPI (Advanced Configuration and Power Interface) Support ---> [*] ACPI Support AC Adapter Battery Button Video Generic Hotkey (EXPERIMENTAL) Fan Processor Thermal Zone APM (Advanced Power Management) BIOS Support ---> CPU Frequency scaling ---> [*] CPU Frequency scaling [ ] Enable CPUfreq debugging CPU frequency translation statistics [ ] CPU frequency translation statistics details Default CPUFreq governor (userspace) ---> 'performance' governor 'powersave' governor --- 'userspace' governor for userspace frequency scaling 'ondemand' cpufreq policy governor 'conservative' cpufreq governor --- CPUFreq processor drivers ACPI Processor P-States driver Intel Enhanced SpeedStep [*] Use ACPI tables to decode valid frequency/voltage pairs [ ] Built-in tables for Banias CPUs Intel Speedstep on ICH-M chipsets (ioport interface) Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface) |
Possiamo ottenere informazioni sulle frequenze supportate dalla nostra cpu:
# emerge cpufrequtils |
# cpufreq-info |
cpufrequtils 001: cpufreq-info (C) Dominik Brodowski 2004-2006 Per favore, comunicare errori e malfunzionamenti a Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.. analisi della CPU 0: modulo centrino CPU per le quali e` necessario cambiare la frequenza contemporaneamente: 0 limiti hardware: 1000 MHz - 1.67 GHz frequenze disponibili: 1.67 GHz, 1.33 GHz, 1000 MHz gestori disponibili: conservative, ondemand, powersave, userspace, performance gestore corrente: la frequenza deve mantenersi tra 1000 MHz e 1.67 GHz. Il gestore "userspace" puo` decidere quale velocita` usare in questo intervallo. la frequenza attuale della CPU e` 1.67 GHz (ottenuta da una chiamata diretta all'hardware). analisi della CPU 1: modulo centrino CPU per le quali e` necessario cambiare la frequenza contemporaneamente: 1 limiti hardware: 1000 MHz - 1.67 GHz frequenze disponibili: 1.67 GHz, 1.33 GHz, 1000 MHz gestori disponibili: conservative, ondemand, powersave, userspace, performance gestore corrente: la frequenza deve mantenersi tra 1000 MHz e 1.67 GHz. Il gestore "userspace" puo` decidere quale velocita` usare in questo intervallo. la frequenza attuale della CPU e` 1.67 GHz (ottenuta da una chiamata diretta all'hardware). |
Potete gestire lo scaling delle frequenze con il demone che preferite: io ho optato per powernowd perché ha una configurazione semplificata ma sufficiente per le mie esigenze.
# emerge acpi acpid powernowd |
Per approfondimenti sull'argomento rinvio a http://www.gentoo.org/doc/en/power-management-guide.xml.
Suspend (suspend to ram) e hibernate (suspend to disk) possono essere molto utili se si utilizza un notebook, sia per limitare i consumi sia per accelerare i tempi di boot. Il supporto per la sospensione può essere ottenuto essenzialmente in due modi: attraverso swsusp oppure attraverso suspend2. Il primo è stato inserito nel kernel a partire dalla versione 2.6.x, il secondo necessita di una apposita patch (o dei sorgenti del kernel suspend2-sources già patchati). Per una comparazione fra i due metodi http://www.suspend2.net/features
Al momento ho provato con successo swsusp e a questo metodo mi riferirò di seguito. Ho avuto qualche problema a far funzionare correttamente la sospensione con genkernel, quindi consiglio di compilare il kernel manualmente:
# cd /usr/src/linux |
Processor type and features ---> [*] Support for hot-pluggable CPUs (EXPERIMENTAL) Power management options (ACPI, APM) ---> [*] Software Suspend (/dev/SWAP) Default resume partition ACPI (Advanced Configuration and Power Interface) Support ---> [*] Software Suspend (/dev/SWAP) Default resume partition ACPI (Advanced Configuration and Power Interface) Support ---> [*] Sleep States Device Drivers ---> SCSI low-level drivers ---> Serial ATA (SATA) support Intel PIIX/ICH SATA support |
È importantissimo abilitare il supporto per ata_piix direttamente nel kernel, in caso contrario il sistema non sarà in grado di rinvenire correttamente dalla sospensione o dalla ibernazione. Modificate /dev/SWAP con la vostra partizione di swap!
# make clean && make && make modules_install # make install |
Infine bisogna riconfigurare lilo e reinstallarlo nel MBR. Questa ad esempio è la voce relativa nel mio file /etc/lilo.conf, ovviamente modificatela secondole vostre esigenze:
... |
Ultima annotazione: la sospensione potrebbe non riuscire a fermare alcuni processi che ,quindi,dovranno essere fermati manualmente. È il caso di sonypid
# /etc/init.d/sonypid stop # echo mem > /sys/power/state oppure # echo disk > /sys/power/state |
Ho seguito pedissequamente l'howto sul Wiki di Gentoo all'indirizzo http://gentoo-wiki.com/HARDWARE_Sensors ma senza successo. Sensors mi restituisce un messaggio di errore:
# sensors -s |
Can't access procfs/sysfs file Unable to find i2c bus information; For 2.6 kernels, make sure you have mounted sysfs and libsensors was compiled with sysfs support! For older kernels, make sure you have done 'modprobe i2c-proc'! |
Si tratta di un problema noto che dovrebbe dipendere da un ancora scarso supporto dell'interfaccia I2C del chipset: si veda http://gentoo-wiki.com/HARDWARE_Intel_945G#Hardware_Sensors e http://forums.gentoo.org/viewtopic-t-468277-highlight-i2ci801.html.
Riesco comunque a monitorare le temperature della CPU (attraverso ACPI), dell'HDD (attraverso il chip S.M.A.R.T.) e della GPU Nvidia (con nvidia-settings).
Per il chip GMA950 sono riuscito ad ottenere una console a tutto schermo con questa configurazione del kernel:
Device Drivers ---> Graphics support ---> Support for frame buffer devices [*] Enable firmware EDID VESA VGA graphics support VESA driver type (vesafb-tng) ---> (1280x800@75) VESA default mode |
Non ho ancora trovatouna soluzione soddisfacente per il chip Nvidia.
Configurare i tasti funzioni su questo come su altri Sony può rivelarsi un pò ostico: gli strumenti abitualmente utilizzati con i notebook Sony, sonypid e spicctrl, non funzionano col Sony SZ o necessitano di essere adattati. A questo scopo ho modificato del codice relativo al Sony FS pubblicato su questa discussione http://forums.gentoo.org/viewtopic-t-335267-highlight-sonyacpi.html.
Bisogna innanzitutto accertarsi che sia abilitato nel kernel il seguente modulo:
Device Drivers ---> Character devices ---> Sony Vaio Programmable I/O Control Device support (EXPERIMENTAL) |
Ora possiamo caricare il modulo sonypi che ci consentirà di intercettare la pressione dei tasti funzione:
# modprobe sonypi |
Per gestire la luminosità dello schermo abbiamo bisogno di installare sony_acpi (spicctrl risulta inefficace sul Sony SZ). Potete trovare i sorgenti di sony_acpi a questo link. Dopo aver scaricato il file scompattatelo, spostatevi nella cartella sony_acpi e compilate il modulo:
# make |
A questo punto bisogna copiare il modulo e caricarlo:
# cp sony_acpi.ko /lib/modules/`uname -r`/kernel/drivers/acpi |
# depmod -a |
# modprobe sony_acpi |
Se è andato tutto bene ora troveremo in /proc/acpi/sony il file brightess.
# ls /proc/acpi/sony |
brightness brightness_default |
Per testare se il modulo sony_acpi funziona correttamente potete provare a modificare manualmente la luminosita' dello schermo inserendo un numero da 1 ad 8 nel file brightness. ad es:
# echo "5" >> /proc/acpi/sony/brightness |
Ora abbiamo tutti gli strumenti per configurare i nostri tasti funzione. Possiamo seguire due metodi differenti a seconda che si usi acpid o sonypid opportunamente modificato.
Update 29/09/2006: Il metodo descritto consente di gestire la luminosità dello schermo unicamente usando il chip video integrato, se si usa la Nvidia sarà necessario installare smartdimmer, una piccola utility che potete scaricare a questo link .
Metodo A) Configurazione dei tasti funzione attraverso acpid
Ogni qualvolta premiamo un tasto funzione acpid registra un evento al quale possiamo associare una particolare azione.
Ad es. vediamo cosa ci dice il log di acpid alla pressione della combinazione Fn+F2 (funzione mute/unmute):
# tail -0f /var/logs/acpid |
[Fri Jul 21 13:11:23 2006] received event "sony/hotkey SPIC 00000001 0000000d" ...... ...... |
Si tratta ora di associare una azione a questo evento. Acpid scorre i file contenuti nella cartella /etc/acpi/events alla ricerca di script che associno a ciascun evento una particolare azione. Ciascuno script deve avere la sintassi indicata nel file di esempio /etc/acpi/events/default. Non mi dilungherò sul funzionamento di acpid, consultate il man di acpid per maggiori informazioni.
Tornando al nostro esempio, se volessimo associare un'azione all'evento Fn+F2 potremmo inserire nella cartella /etc/acpi/events un file (potete chiamarlo come preferite, è indifferente) col seguente contenuto:
event=sony/hotkey SPIC 00000001 0000000d action=/usr/bin/fnsz fn_f2 |
Il funzionamento è molto semplice: quando acpid intercetta l'evento corrispondente alla pressione dei tasti Fn+F2 lancia il programma /usr/bin/fnsz passandogli come parametro "fn_f2".
Possiamo fare la stessa cosa per tutti gli altri tasti funzione.
Ora ci serve un programma, fnsz, che si occupi di aumentare/diminuire il volume,aumentare/diminuire la luminosità ed in generale di gestire qualsiasi azione associata ai nostri tasti funzione. Eccovi il sorgente del programma, fnsz.c:
#include #include #include #include #include #include #include #include // sound stuff #include #include #include #include // config hard coded :p #define MIXER_DEV "/dev/mixer" #define MAX_BRIGHT 8 #define MIN_BRIGHT 1 int printosd(char *input, int percent, int style, int time) { //Create the OSD display //xosd *osd1; static xosd *osd1 = '\0'; osd1 = xosd_create(2); if(osd1 == NULL){ // perror("Could not create \"osd\""); return (1); } //Set OSD settings xosd_set_font(osd1,"-adobe-helvetica-bold-r-normal-*-*-360-*-*-p-*-*"); //Set some shadow under text xosd_set_shadow_offset(osd1,1); //Set position of Text to print xosd_set_pos (osd1, XOSD_middle); xosd_set_align (osd1, XOSD_center); //xosd_set_font(osd1,"-adobe-*-bold-r-*-*-*-*-*-*-*-300-*-*"); xosd_set_colour(osd1,"Blue"); //Set the time received by variable "time" xosd_set_timeout(osd1,time); //xosd_set_outline_offset(osd1, 1); //xosd_set_outline_colour(osd1, "white"); //Set the length of the percentage bar xosd_set_bar_length(osd1, 20); if (style==0){ xosd_hide(osd1); //Display only the text xosd_display(osd1, 0, XOSD_string,input); } else if (style==1){ xosd_hide(osd1); //Display the text xosd_display(osd1, 0, XOSD_string,input); //Display the percentage xosd_display(osd1, 1, XOSD_percentage,percent); } usleep(2000000); xosd_destroy(osd1); return 0; } // SOUND HANDLER int get_volume(int *value) { int mixer = open(MIXER_DEV, O_RDONLY); if (mixer) { ioctl(mixer, SOUND_MIXER_READ_VOLUME, value); close(mixer); return 0; } else return 1; } int set_volume(int *value) { int mixer = open(MIXER_DEV, O_RDWR); if (mixer) { ioctl(mixer, SOUND_MIXER_WRITE_VOLUME, value); close(mixer); return 0; } else return 1; } int volume_up() { int value = 0; get_volume(&value); if (value < 0x5a5a) value += 0x0a0a; else value = 0x6464; set_volume(&value); printosd("Volume",(value/250),1,2); return 0; } int volume_down() { int value = 0; get_volume(&value); if (value > 0x0a0a) value -= 0x0a0a; else value = 0; set_volume(&value); printosd("Volume",(value/250),1,2); return 0; } int oldvalue; int mute() { int value; get_volume(&value); if (value) { oldvalue=value; value=0; set_volume(&value); printosd("Volume MUTED",0,0,1); } else { if (!oldvalue) { volume_up(); } else { set_volume(&oldvalue); } } return 0; } // END OF SOUND /* Return current brightness of the screen */ int getBrightness() { FILE* handle; int ret; if ((handle=fopen("/proc/acpi/sony/brightness","rb"))==NULL) { perror("Error opening /proc/acpi/sony/brightness"); exit(-1); } if (fscanf(handle,"%d",&ret)!=1) { perror("Error reading /proc/acpi/sony/brightness"); exit(-1); } fclose(handle); return ret; } /* Set the current brightness of the screen */ void setBrightness(int b) { FILE* handle; // validate values if (b > MAX_BRIGHT) { b = MAX_BRIGHT; } else if (b < MIN_BRIGHT) { b = MIN_BRIGHT; } if ((handle=fopen("/proc/acpi/sony/brightness","wb"))==NULL) { perror("Error opening /proc/acpi/sony/brightness"); exit(-1); } if (fprintf(handle,"%d",b)!=1) { perror("Error writing /proc/acpi/sony/brightness"); exit(-1); } fclose(handle); printosd("LCD Bright",floor(b*12.5),1,2); } // Pool the fnkey status // No loop, fn combo is intercepted by acpid and passed as argument int main (int argc, char *argv[]) { if (argc>1 && strcmp(argv[1],"fn_f5")==0) { // lower brightness setBrightness(getBrightness()-1); } if (argc>1 && strcmp(argv[1],"fn_f6")==0) { // higher brightness setBrightness(getBrightness()+1); } if (argc>1 && strcmp(argv[1],"fn_f2")==0) { mute(); } if (argc>1 && strcmp(argv[1],"fn_f3")==0) { volume_down(); } if (argc>1 && strcmp(argv[1],"fn_f4")==0) { volume_up(); } return 0; } |
Compilate il programma e copiatelo in /usr/bin
# gcc -Wall -o fnsz fnsz.c -L/usr/X11R6/lib -lX11 -lXtst -lxosd -lm |
# cp fnsz /usr/bin |
Al momento il programma accetta 5 parametri:
- fn_f2 Volume mute/unmute
- fn_f3 Volume down
- fn_f4 Volume up
- fn_f5 Brightness down
- fn_f6 Brightness up
Testate il programma per vedere se va tutto ok
# fnsz fn_f5 |
Ricordate che per usare fnsz in combinazione con acpid dovete configurare correttamente gli script in /etc/acpi/events/
Il programmino è solo abbozzato ed avrebbe bisogno di essere perfezionato, ho aggiunto una funzione che dovrebbe stampare a schermo dei messaggi di riepilogo sfruttando XOSD ma non funziona correttamente quando il programma viene lanciato da acpid.
Questo sistema può sembrare troppo complesso ma ha il vantaggio di sfruttare il demone acpi (che presumibilmente avrete già attivo sul notebook) e di non aggiungere un altro demone in background.
Metodo B) Configurazione dei tasti funzione mediante sonypid
Questo metodo, rispetto a quello precedente, ha il vantaggio di essere molto più semplice ma richiede l'esecuzione di un altro demone in backgorund. Potete emergere sonypid dalle repository ma per funzionare dovrete configurarlo a dovere oppure potete scaricare sonypid gia' modificato per funzionare col Sony SZ da questo link.
Scompattate il file, spostatevi nella directory sonypid-mod e compilate:
# make |
# cp sonypid /usr/bin |
Potete testare sonypid prima di aggiungerlo ad rc-update
# sonypid & |
Anche a sonypid è stata aggiunta una funzione per mostrare a schermo dei messaggi di riepilogo tramite XOSD ma anche in questo caso dev'essere perfezionata e corretta.
Abituato al mio vecchio notebook Asus avrei preferito che anche il Sony SZ avesse uno shortcut da tastiera per spegnere lo schermo. Per ovviare a questa mancanza ho configurato acpid per spegnere lo schermo quando viene premuta la combinazione di tasti Fn+F8. Mi sono basato su questo howto .
Bisogna innanzitutto aggiungere un file in /etc/acpi/events/ contenente le seguenti due righe:
event=sony/hotkey SPIC 00000001 00000013 action=XAUTHORITY=`ls /etc/X11/xdm/authdir/authfiles/*:0*` /usr/bin/xset -display :0.0 dpms force off |
Purtroppo non è sufficiente perché acpid non ha permessi sul display dell'utente. Io ho risolto il problema creando uno script fn_f8.sh contenente questa unica riga:
xhost +local:root > /dev/null |
Ricordatevi di rendere lo script eseguibile e caricatelo all'inizio della sessione dell'utente (da Gnome aprite il menù Desktop > Preferenze > Sessioni ed aggiungete lo script ad "Avvio programmi").
La Gentoo gira in maniera soddisfacente anche su un notebook recente come il Sony SZ: ci sono ancora parecchi dettagli da sistemare ma nel complesso il notebook va benissimo per il mio uso giornaliero.
Una nota di merito va sicuramente alla ricchissima documentazione offerta sul Sito e sul Wiki di Gentoo così come alla comunità degli utenti che offre il suo indispensabile contributo sul Forum.