Come promesso, ecco un piccolo `riferimento` per il fixaggio di alcuni dei problemi più comuni che possono verificarsi dopo l'installazione di linux, su tutti quei notebook che hanno il DSDT (Differentiated System Description Table) compilato con il compilatore Microsoft. Su questo punto vorrei fare una precisazione:
leggasi NON come: la Microsoft è il male, ma più semplicemente, considerato che la maggior parte dei notebook hanno Windows preinstallato a bordo, è più che normale trovare un DSDT compilato con il loro prodotto.
N.B.: Prima di procedere con la lettura, ricordatevi che durante queste fasi potrebbero sempre nascere problemi diversi, kernel panic all'avvio, etc.. Confido nel vostro buon senso per non ritenere il sottoscritto responsabile
Fatta questa piccola ma doverosa precisazione, iniziamo a capire innanzitutto se questa guida può esserci utile:
1)Ma alla fine, a che serve questo DSDT?
Senza entrare in dettagli strettamente tecnici (se volete aprite un topic in proposito), il DSDT fornisce tutte le informazioni di configurazione del sistema di base e viene inserito (sempre) nella fase di boot nel `namespace` dell'ACPI.
2)Come faccio a capire se il mio DSDT può aver bisogno di essere fixato?
aprite un terminale e digitate:
Codice:
dmesg | grep DSDT
//otterrete una stringa simile a questa:
ACPI: DSDT (v001 COMPAL ELW80 0x06040000 MSFT 0x0100000e) @ 0x00000000
La parte evidenziata, indica che appunto è stato utilizzato il compilatore della Microsoft. Ora, non sempre questo significa che il nostro notebook possa avere dei problemi, ma per esserne sicuri dovremo procedere nell'analisi del DSDT.
Uno dei problemi più comuni che può capitare, è che non si disponga di nessuna gestione della batteria del notebook, o che addirittura non venga nemmeno riconosciuta.
3)Cosa mi serve per effettuare questi test?
3a)Avere il supporto dell'acpi correttamente compilato nel vostro kernel
3b)Il compilatore (asl) della Intel che potrete prelevare da qui:
http://developer.intel.com/technolog.../downloads.htm
(e al quale dovremmo mettere un secondo mano ai sorgenti per sistemare una `piccola` cosa prima di installarlo).
3c)Una patch da applicare al vostro kernel che potrete prelevare qui:
http://gaugusch.at/kernel.shtml
4)Qualche piccola informazione aggiuntiva su cosa faccia il compilatore intel:
Ci permetterà di analizzare il nostro DSDT, e, mediante un linguaggio chiamato ASL (ACPI Source Language) ci darà la possibilità di apportare delle modifiche dove possibile e/o dove necessario.
Bene, iniziamo.... :
la prima operazione da effettuare è di scaricare il compilatore della intel per l'asl, e scompattarlo in una directory a vostra scelta con il solito metodo:
Codice:
tar -xvzf acpica-unix-20051216.tar.gz
Questo comando darà luogo ad una nuova directory nella quale entreremo con il comando `cd`:
cd acpica-unix-20051216
In questa directory, come potrete vedere mediante un semplice `ls` troverete numerose altre directory; quella che è di nostro interesse è la directory `compiler`:
cd compiler
una volta entrati in questa directory, passiamo alla compilazione tramite il semplice comando `make` (non occorre essere root)
Se al termine NON avrete ottenuto nessun tipo di messaggio di errore, possiamo procedere, altrimenti, dovremo fare una piccola modifica ad uno dei sorgenti del compilatore:
In caso di errore durante il `make` il messaggio che avrete sarà:
Codice:
aslcompiler.l: In function 'comment':
aslcompiler.l:847: error: 'yytext_ptr' undeclared (first use in this function)
aslcompiler.l:847: error: (Each undeclared identifier is reported only once
aslcompiler.l:847: error: for each function it appears in.)
make: *** [aslcompilerlex.o] Error 1
Per correggerlo, dovremo editare il file `aslcompilerlex.c`:
Con il vostro editor preferito (nel mio caso è vim) aprite il suddetto file e posizionatevi alla riga 4031 (quattromilatrentuno):
leggerete:
Limitatevi a commentarla in questo modo:
Codice:
// #undef yytext_ptr
oppure anche:
/* #undef yytext_ptr */
Salvate il file appena modificato e ridigitate il comando `make`. Questa volta la compilazione DOVREBBE andare a buon fine.
Adesso, senza uscire dalla directory corrente (che vi ricordo essere: /compiler) digitate:
Codice:
cat /proc/acpi/dsdt > dsdt.dat
//in caso di `permission denied`, fatelo da root
questo comando ci ha creato il file dsdt.dat che contiene il nostro DSDT GIA' COMPILATO. Dobbiamo dissassemblarlo utilizzando il compilatore intel:
Codice:
./iasl -d dsdt.dat
Si verrà a creare quindi un file:
dsdt.dsl.
E adesso passiamo alla prima vera prova:
senza toccare nulla, proviamo semplicemente a compilare il file appena creato con:
Codice:
./iasl -tc dsdt.dsl
Ora, se il nostro file non presenta nessun tipo di problema, si verranno a creare due file:
1)
dsdt.hex
2)
DSDT.aml
Ma....in genere 99 volte su 100, ciò non avviene :P, anzi, otterrete messaggi di questo tipo:
Codice:
Intel ACPI Component Architecture
ASL Optimizing Compiler version 20051216 [Jan 10 2006]
Copyright (C) 2000 - 2005 Intel Corporation
Supports ACPI Specification Revision 3.0
dsdt.dsl 125: Method (_WAK, 1, NotSerialized)
Warning 2078 - ^ Reserved method must return a value (_WAK)
dsdt.dsl 1711: Field (ERAM, AnyAcc, Lock, Preserve)
Error 1073 - ^ Host Operation Region require ByteAcc access
Ovviamente questi errori non sono uguali per tutti, ma sono generalmente i più comuni (e non sono mai così pochi!). Ci limiteremo a correggere questi, mentre invece per altri eventuali casi, potrete sempre mandarmi un pm o aprire un topic e man mano che li correggeremo, li metteremo in questa guida.
Ad ogni modo, una lista dettagliata anche per chi volesse comprendere _anche_
gli aspetti tecnici delle correzioni, dovrebbe visitare:
http://www.cpqlinux.com/acpi-howto.html#fix_broken_dsdt
http://www.acpi.info/spec.htm
http://acpi.sourceforge.net/
N.B.: Ho postato `solo` due cose: un `warning` ed un `error`, ovviamente
possono essercene molti di più dello stesso tipo e che hanno la stessa identica risoluzione.
Iniziamo a correggere questi problemi:
il primo non è un errore vero è proprio, ma è un `warning` o, per usare un termine molto `semplicistico` un `avvertimento`. Per capire bene come agire, dobbiamo necessariamente comprendere _cosa_ e _dove_ il compilatore ci suggerisce di analizzare:
Codice:
/*Tutti i messaggi che il compilatore ci restituisce
sono divisi in questo modo:*/
dsdt.dsl 125: Method (_WAK, 1, NotSerialized)
/*In questa prima riga, abbiamo il nome del file (dsdt.dsl)
il numero di riga al quale corrisponde (125)
e il nome del metodo a cui si riferisce*/
Warning 2078 - ^ Reserved method must return a value (_WAK)
/*La seconda riga ci indica il tipo di errore (se è un errore
avremo Error se è un Warning avremo Warning) seguito dal codice
che lo distingue (ad es.: 2078, 1061, etc..). e da un suggerimento su
come dovrebbe essere gestito. */
La soluzione per il `Warning 2078` è di aggiungere nel nostro file dsdt.dsl, questa istruzione:
Codice:
Return(Package(0x02){0x00, 0x00})
Bene...si...ma dove?!? Allora, analizzando il messaggio di prima, come suggerito dobbiamo andare alla riga 125(riga indicata nell'esempio...ovviamente dovrete leggere
il vostro numero di riga)
NOTA BENE: I numeri di riga NON sono presenti nel codice sorgente!
Sono visualizzati solo per comodità. NON INSERITELI
Codice:
125 Method (_WAK, 1, NotSerialized)
126 {
127 If (LEqual (Arg0, 0x04))
128 {
129 Notify (\_SB.PWRB, 0x02)
130 }
131
132 If (LEqual (\_SB.OSTB, 0x04))
133 {
134 Store (0x00, \_SB.PCI0.LPC0.LPOL)
135 }
136
137 If (LEqual (And (HTTX, 0x01), 0x01))
138 {
139 Store (0xA0, \_SB.PCI0.LPC0.BCMD)
140 Store (Zero, \_SB.PCI0.LPC0.SMIC)
141 }
142 }
l'istruzione riportata prima, dev'essere
collocata (sempre per il `Warning 2078`)
prima che il `metodo` termini:
Codice:
125 Method (_WAK, 1, NotSerialized)
126 {
127 If (LEqual (Arg0, 0x04))
128 {
129 Notify (\_SB.PWRB, 0x02)
130 }
131
132 If (LEqual (\_SB.OSTB, 0x04))
133 {
134 Store (0x00, \_SB.PCI0.LPC0.LPOL)
135 }
136
137 If (LEqual (And (HTTX, 0x01), 0x01))
138 {
139 Store (0xA0, \_SB.PCI0.LPC0.BCMD)
140 Store (Zero, \_SB.PCI0.LPC0.SMIC)
141 }
142 Return(Package(0x02){0x00, 0x00})
143 }
Questa operazione, andrà ripetuta per quante volte il nostro compilatore ci avvertirà della presenza di questo tipo di Warning.
Passiamo al secondo caso più comune:
dsdt.dsl 1711: Field (ERAM, AnyAcc, Lock, Preserve)
Error 1073 - ^ Host Operation Region require ByteAcc access
Anche qui il messaggio del compilatore è molto indicativo;
Ci dice che alla riga 1711 del nostro file dsdt.dsl, c'è un errore (che ha codice 1073).
In questo caso, la soluzione è di sostituire `AnyAcc` con `ByteAcc`:
Codice:
1711 Field (ERAM, AnyAcc, Lock, Preserve)
//Deve diventare:
1711 Field (ERAM, ByteAcc, Lock, Preserve)
Bene, siamo partiti dal presupposto che il nostro file avesse `solo` due problemi;
Corretti nel modo indicato, ora possiamo procedere con la compilazione del file:
Codice:
./iasl -tc dsdt.dsl
Se tutto è ok, il compilatore ci darà un messaggio simile a:
Codice:
Intel ACPI Component Architecture
ASL Optimizing Compiler version 20051216 [Jan 10 2006]
Copyright (C) 2000 - 2005 Intel Corporation
Supports ACPI Specification Revision 3.0
ASL Input: dsdt.dsl - 3352 lines, 126451 bytes, 1404 keywords
AML Output: DSDT.aml - 12789 bytes 459 named objects 945 executable opcodes
Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 467 Optimizations
E avrete i due tanto agognati file:
dsdt.hex
DSDT.aml
Adesso inizia la seconda fase, che consiste nel far capire al nostro sistema da dove leggere le informazioni sul dsdt.
Dobbiamo quindi patchare il kernel con la patch prelevata in precedenza (per i più `distratti` se non l'avete
prelevata prima, il link è:
http://gaugusch.at/kernel.shtml)
Codice:
cd /usr/src/linux
patch -p1 < /percorso_dove_avete_scaricato_la_patch/nome_patch
Patchato il kernel dobbiamo ovviamente compilarlo ed aggiungere tutto ciò che serve al nostro scopo:
sempre dalla directory dove sono presenti i sorgenti del kernel digitiamo:
Portiamoci nella seguente sezione ed abilitiamo le seguenti opzioni:
N.B.: Non compilatele come moduli ma inseriteli come statici.
Codice:
Device Drivers --->
Block Devices --->
<*> RAM disk support
[*] Initial RAM disk (initrd) support
Assicuriamoci poi di selezionare quest'ulteriore opzione nella sezione ACPI:
Codice:
Power management options (ACPI, APM) --->
ACPI (Advanced Configuration and Power Interface) Support --->
[*] Read DSDT from initrd
Fatto questo, possiamo ricompilare il kernel (si presuppone che sappiate già come fare

)
Finita la compilazione del kernel dobbiamo dare al nostro bootloader alcune informazioni aggiuntive:
N.B.: Nel mio caso, utilizzo grub senza nessun bootsplash
copiamo il file DSDT.aml in /boot
Codice:
cp /percorso_di_DSDT.aml /boot
editiamo il nostro file di configurazione di grub:
Codice:
title Debian GNU/Linux, kernel 2.6.13.2
root (hd0,2)
kernel /boot/vmlinuz-2.6.13.2 root=/dev/hda3 ro vga=771
#aggiungiamo questa riga:
initrd=/boot/DSDT.aml
Ora, tutto è stato completato. Non ci resta che riavviare il sistema.
In caso di kernel panic all'avvio, non preoccupatevi, ricordatevi sempre che potrete ripartire dalla vostra
vecchia configurazione.
A breve aggiungerò anche altre due piccole `sottosezioni` che riguardano l'utilizzo con lilo e con grub ed il bootsplash.
P.S.: Non ringraziate particolarmente il sottoscritto. La maggior parte del materiale è reperibile presso i siti linkati in precedenza. Mi sono limitato a renderli quanto più esplicativi possibile aggiungendovi le mie personali esperienze.