ImageSfatando 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 

        5.1 Suspend e Hibernate

Specifiche

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)

Processore

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)

Make.conf

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"
CHOST="i686-pc-linux-gnu"
CXXFLAGS="${CFLAGS}"
MAKEOPTS="-j3"

.....

INPUT_DEVICES="evdev keyboard mouse synaptics"
VIDEO_CARDS="nvidia vesa i810"
ALSA_CARDS="hda-intel" 

Trovate il mio file make.conf completo qui

Hard-disk e drive ottico

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
Serial Number:    *********
Firmware Version: 3.14
User Capacity:    80,026,361,856 bytes
Device is:        Not in smartctl database [for details use: -P showall]
ATA Version is:   7
ATA Standard is:  Exact ATA specification draft version not indicated
Local Time is:    Tue Jul 18 16:24:45 2006 CEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

....... 

 Una guida dettagliata sugli hard-disk Sata è reperibile su http://gentoo-wiki.com/HARDWARE_SATA.

Audio

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 ....

Video

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.

Intel GMA950

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

Nvidia Geforce Go 7400

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.

Usb

Nulla da aggiungere a quanto trovate sul Wiki di Gentoo al link http://gentoo-wiki.com/HARDWARE_Intel_945G#USB 

Ethernet

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) 

Wireless

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

Lettori di schede di memoria

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.

Power management

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 e Hibernate

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
# make menuconfig

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:

...
image=/boot/KERNEL
  label=Gentoo
  read-only
  root=/dev/ROOT
  append="resume=/dev/SWAP acpi_sleep=s3_bios"
...

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

 

Sensori hardware

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).

Frame buffer console

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.

Tasti funzione Fn

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.

Extra

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").

Conclusioni

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.

Google News
Le notizie e le recensioni di Notebook Italia sono anche su Google News. Seguici cliccando sulla stellina

Commenti