3 581
contributi
m (ha spostato ACPI e DSDT a Old:ACPI e DSDT) |
|||
(12 versioni intermedie di 5 utenti non mostrate) | |||
Riga 1: | Riga 1: | ||
==Introduzione== | {{Old}} | ||
== Introduzione == | |||
ACPI ('''Advanced Configuration and Power Interface''') è uno standard industriale aperto che definisce l'interfaccia tra S.O. e BIOS per l'amministrazione e la configurazione delle risorse di un PC. ACPI prevede che le informazioni a basso livello sul sistema (batteria, luminosità LCD, pulsanti Fn, ecc.) siano contenute nella DSDT ('''Differentiated System Description Table'''). | ACPI ('''Advanced Configuration and Power Interface''') è uno standard industriale aperto che definisce l'interfaccia tra S.O. e BIOS per l'amministrazione e la configurazione delle risorse di un PC. ACPI prevede che le informazioni a basso livello sul sistema (batteria, luminosità LCD, pulsanti Fn, ecc.) siano contenute nella DSDT ('''Differentiated System Description Table'''). | ||
Riga 7: | Riga 8: | ||
Per questo motivo, per utilizzare appieno le possibilità offerte da alcuni PC, soprattutto laptop, è necessario correggere la DSDT e istruire il kernel affinché nel processo di boot carichi la tabella fornita da noi invece di quella fornita dal BIOS. | Per questo motivo, per utilizzare appieno le possibilità offerte da alcuni PC, soprattutto laptop, è necessario correggere la DSDT e istruire il kernel affinché nel processo di boot carichi la tabella fornita da noi invece di quella fornita dal BIOS. | ||
==Aggiornamento del BIOS== | == Aggiornamento del BIOS == | ||
Per cominciare è indispensabile aggiornare il BIOS con l’ultima versione disponibile, sperando che la nuova versione contenga una tabella DSDT con meno errori della precedente :P. | Per cominciare è indispensabile aggiornare il BIOS con l’ultima versione disponibile, sperando che la nuova versione contenga una tabella DSDT con meno errori della precedente :P. | ||
==Installazione nel kernel del supporto ACPI== | == Installazione nel kernel del supporto ACPI == | ||
Per poter utilizzare ACPI è necessario disporre di un kernel in cui sia stato abilitato il supporto ACPI. Praticamente tutte le distribuzioni forniscono kernel precompilati con il supporto ACPI attivato. Nel caso, però, vi trovaste a dover (o voler) compilare autonomamente un kernel con il supporto ACPI, le voci necessarie sono le seguenti: | Per poter utilizzare ACPI è necessario disporre di un kernel in cui sia stato abilitato il supporto ACPI. Praticamente tutte le distribuzioni forniscono kernel precompilati con il supporto ACPI attivato. Nel caso, però, vi trovaste a dover (o voler) compilare autonomamente un kernel con il supporto ACPI, le voci necessarie sono le seguenti: | ||
Riga 22: | Riga 23: | ||
<*> Processor</pre> | <*> Processor</pre> | ||
==Strumenti per lavorare con le DSDT== | == Strumenti per lavorare con le DSDT == | ||
Per poter leggere e compilare una DSDT è necessario il compilatore ASL di Intel, che in Debian esiste già precompilato a partire da Etch; altrimenti è liberamente disponibile per il download a [http://developer.intel.com/technology/iapc/acpi/downloads.htm questo] indirizzo. | Per poter leggere e compilare una DSDT è necessario il compilatore ASL di Intel, che in Debian esiste già precompilato a partire da Etch; altrimenti è liberamente disponibile per il download a [http://developer.intel.com/technology/iapc/acpi/downloads.htm questo] indirizzo. | ||
Riga 30: | Riga 31: | ||
* il secondo inserisce la nuova DSDT all'interno dell'initrd, e quindi non necessita la ricompilazione del kernel, a patto che nel vostro kernel sia stata inclusa una [http://gaugusch.at/kernel.shtml patch apposita]. Al momento la patch menzionata è inclusa nei kernel delle maggiori distribuzioni (sicuramente in Debian, Ubuntu, Suse, e Mandriva). | * il secondo inserisce la nuova DSDT all'interno dell'initrd, e quindi non necessita la ricompilazione del kernel, a patto che nel vostro kernel sia stata inclusa una [http://gaugusch.at/kernel.shtml patch apposita]. Al momento la patch menzionata è inclusa nei kernel delle maggiori distribuzioni (sicuramente in Debian, Ubuntu, Suse, e Mandriva). | ||
===Installare il compilatore ASL=== | === Installare il compilatore ASL === | ||
Uno dei motivi per cui le DSDT sono spesso difettose è che vengono compilate con il compilatore fornito da Microsoft, invece che con quello fornito da Intel. Curiosamente i sistemi Microsoft riescono ad evitare gli errori commessi dal compilatore della stessa società, mentre, come si può immaginare, la stessa cosa non succede per Linux. | Uno dei motivi per cui le DSDT sono spesso difettose è che vengono compilate con il compilatore fornito da Microsoft, invece che con quello fornito da Intel. Curiosamente i sistemi Microsoft riescono ad evitare gli errori commessi dal compilatore della stessa società, mentre, come si può immaginare, la stessa cosa non succede per Linux. | ||
Per installare il compilatore Intel è sufficiente avere nel < | Per installare il compilatore Intel è sufficiente avere nel <code>sources.list</code> un repository per Etch, ed impartire, da root, il comando | ||
<pre> | <pre> | ||
# aptitude install iasl | # aptitude install iasl | ||
Riga 44: | Riga 45: | ||
$ make</pre> | $ make</pre> | ||
===Ottenere una DSDT=== | === Ottenere una DSDT === | ||
È possibile ottenere la DSDT attualmente installata per poi correggere gli eventuali errori e problemi, copiandola da un file reso appositamente disponibile dal filesystem virtuale <code>/ | È possibile ottenere la DSDT attualmente installata per poi correggere gli eventuali errori e problemi, copiandola da un file reso appositamente disponibile dal filesystem virtuale <code>/sys</code>: | ||
<pre># cat / | <pre># cat /sys/firmware/acpi/tables/DSDT > dsdt.dat</pre> | ||
Ciò creerà un file '''dsdt.dat''' che contiene la DSDT compilata. | Ciò creerà un file '''dsdt.dat''' che contiene la DSDT compilata. | ||
Riga 72: | Riga 73: | ||
{{ Warningbox | È possibile scaricare una custom DSDT già pronta e corretta da Internet per molti portatili in commercio: http://acpi.sourceforge.net/dsdt/tables }} | {{ Warningbox | È possibile scaricare una custom DSDT già pronta e corretta da Internet per molti portatili in commercio: http://acpi.sourceforge.net/dsdt/tables }} | ||
===Un esempio: la mia DSDT=== | ==== Un esempio: la mia DSDT ==== | ||
Nel mio sistema (PC desktop, scheda madre Chaintech) ho da qualche tempo un problema con l'inizializzazione delle porte USB, tale che circa nel 40% dei casi (ma mai due volte di seguito) il PC si blocca durante il boot, e devo riavviare forzatamente. | Nel mio sistema (PC desktop, scheda madre Chaintech) ho da qualche tempo un problema con l'inizializzazione delle porte USB, tale che circa nel 40% dei casi (ma mai due volte di seguito) il PC si blocca durante il boot, e devo riavviare forzatamente. | ||
Riga 102: | Riga 103: | ||
</pre> | </pre> | ||
in sostanza, c'è un errore ripetuto identico tre volte (< | in sostanza, c'è un errore ripetuto identico tre volte (<code>Error 1048</code>), oltre ad un warning. Andiamo a vedere le sezioni incriminate. La prima è: | ||
<pre> | <pre> | ||
Scope (\_SI) | Scope (\_SI) | ||
Riga 116: | Riga 117: | ||
} | } | ||
</pre> | </pre> | ||
Come si vede viene utilizzata due volte la variabile < | Come si vede viene utilizzata due volte la variabile <code>Local0</code>, ma non viene mai dichiarata. | ||
Vediamo di capire almeno un minimo il significato di questo pezzo di codice. | Vediamo di capire almeno un minimo il significato di questo pezzo di codice. | ||
La funzione < | La funzione <code>Store</code> è una funzione di assegnazione verso destra: alla variabile a destra viene assegnato il valore (o il valore della variabile) che si trova a sinistra. | ||
In questo caso, però, è evidente che questa assegnazione è del tutto inutile, perché viene assegnato alla variabile < | In questo caso, però, è evidente che questa assegnazione è del tutto inutile, perché viene assegnato alla variabile <code>Local0</code> il valore che ha già, quindi per correggere l'errore non faccio altro che cancellare l'istruzione commentandola: | ||
<pre> | <pre> | ||
Scope (\_SI) | Scope (\_SI) | ||
Riga 164: | Riga 165: | ||
Le ultime righe mi danno la prova che l'errore ha a che fare con le porte USB, come avevo già notato. | Le ultime righe mi danno la prova che l'errore ha a che fare con le porte USB, come avevo già notato. | ||
Cercando in rete scopro che il metodo < | Cercando in rete scopro che il metodo <code>\_WAK</code>, che è una funzione utilizzata al risveglio da uno stato di risparmio energetico (o di spegnimento), deve restituire un valore, che indichi se l'operazione di risveglio è riuscita o meno. | ||
Una possibile diagnosi del mio problema, a questo punto, è che in certi casi durante il boot viene richiamato questo metodo, e il sistema si blocca in attesa di un risultato, che però non viene mai restituito. (N.d.A.: la diagnosi è evidentemente sbagliata, perché il problema persiste :() | Una possibile diagnosi del mio problema, a questo punto, è che in certi casi durante il boot viene richiamato questo metodo, e il sistema si blocca in attesa di un risultato, che però non viene mai restituito. (N.d.A.: la diagnosi è evidentemente sbagliata, perché il problema persiste :() | ||
Riga 200: | Riga 201: | ||
} | } | ||
</pre> | </pre> | ||
Anche senza conoscere il linguaggio, il codice è facilmente interpretabile: "se il Sistema Operativo si chiama 'Microsoft Windows' assegna il valore (esadecimale) < | Anche senza conoscere il linguaggio, il codice è facilmente interpretabile: "se il Sistema Operativo si chiama 'Microsoft Windows' assegna il valore (esadecimale) <code>0x56</code> alla variabile <code>SMIP</code>, se invece si chiama 'Microsoft Windows NT' assegna <code>0x58</code> alla variabile <code>SMIP</code> e zero alle variabili <code>OSFX</code> e <code>OSFL</code>; se il S.O. è diverso da quelli elencati assegna alle tre variabili, rispettivamente, <code>0x57</code>, <code>0x02</code> e <code>0x02</code>". | ||
Per qualche motivo a me ignoto chi ha impostato questa DSDT ha fatto in modo di cambiare le funzionalità del sottosistema ACPI a seconda del S.O. che si usa. Poiché questo non mi rende particolarmente felice, ho modificato il codice in questo modo, eliminando di fatto il controllo: | Per qualche motivo a me ignoto chi ha impostato questa DSDT ha fatto in modo di cambiare le funzionalità del sottosistema ACPI a seconda del S.O. che si usa. Poiché questo non mi rende particolarmente felice, ho modificato il codice in questo modo, eliminando di fatto il controllo: | ||
Riga 229: | Riga 230: | ||
Ora il mio sistema funziona un pochino meglio :-) | Ora il mio sistema funziona un pochino meglio :-) | ||
Aggiornamento: ricontrollando il codice ho notato che le tre variabili < | Aggiornamento: ricontrollando il codice ho notato che le tre variabili <code>SMIP</code>, <code>OSFX</code> e <code>OSFL</code> vengono inizializzate altrove, e quindi, in sostanza, il presente codice è inutile (se non dannoso ;-)), quindi l'ho semplicemente eliminato. | ||
Riga 236: | Riga 237: | ||
Purtroppo la correzione <b>vera</b> di questi errori è al di là delle nostre possibilità, perché richiede, oltre alla conoscenza del linguaggio di programmazione, una conoscenza approfondita di come si comporta il nostro hardware, e nella grande maggioranza dei casi queste informazioni sono tenute segrete. | Purtroppo la correzione <b>vera</b> di questi errori è al di là delle nostre possibilità, perché richiede, oltre alla conoscenza del linguaggio di programmazione, una conoscenza approfondita di come si comporta il nostro hardware, e nella grande maggioranza dei casi queste informazioni sono tenute segrete. | ||
==Aggiornare il Kernel== | == Aggiornare il Kernel == | ||
Come abbiamo già detto, è possibile inserire la tabella DSDT generata in modo statico nel kernel, oppure renderla disponibili tramite initrd. | Come abbiamo già detto, è possibile inserire la tabella DSDT generata in modo statico nel kernel, oppure renderla disponibili tramite initrd. | ||
Riga 247: | Riga 248: | ||
Il metodo initrd è probabilmente preferibile, soprattutto se dovete fare diversi cambiamenti alla vostra DSDT, perché non richiede la ricompilazione del kernel per ogni nuova DSDT generata. | Il metodo initrd è probabilmente preferibile, soprattutto se dovete fare diversi cambiamenti alla vostra DSDT, perché non richiede la ricompilazione del kernel per ogni nuova DSDT generata. | ||
===Installazione Metodo statico=== | === Installazione Metodo statico === | ||
È necessario applicare una patch al kernel per far sì che sia in grado di leggere la nuova DSDT. | È necessario applicare una patch al kernel per far sì che sia in grado di leggere la nuova DSDT. | ||
Riga 265: | Riga 266: | ||
Infine ricompiliamo il kernel. Se non ci sono errori al prossimo avvio del PC il supporto ACPI è caricato correttamente senza alcun problema. | Infine ricompiliamo il kernel. Se non ci sono errori al prossimo avvio del PC il supporto ACPI è caricato correttamente senza alcun problema. | ||
===Installazione Metodo initrd=== | === Installazione Metodo initrd === | ||
Se usate un kernel standard Debian non è necessario ricompilare il kernel: è sufficiente posizionare la tabella DSDT nel posto giusto e ricreare l'initrd o l'initramfs. | Se usate un kernel standard Debian non è necessario ricompilare il kernel: è sufficiente posizionare la tabella DSDT nel posto giusto e ricreare l'initrd o l'initramfs. | ||
Per fare questo dovete prima verificare se il vostro kernel usa l'initrd o l'initramfs. | Per fare questo dovete prima verificare se il vostro kernel usa l'initrd o l'initramfs. | ||
I kernel Debian standard usano l'initramfs a partire dalla versione 2.6.14 compresa, ma per essere sicuri è sufficiente usare il comando < | I kernel Debian standard usano l'initramfs a partire dalla versione 2.6.14 compresa, ma per essere sicuri è sufficiente usare il comando <code>file</code>. | ||
Per esempio nel mio sistema ho: | Per esempio nel mio sistema ho: | ||
<pre> | <pre> | ||
Riga 283: | Riga 284: | ||
che invece è un initramfs. | che invece è un initramfs. | ||
Distro diverse da Debian non usano il cramfs, e può darsi che a questa prima analisi si trovi comunque un file compresso con < | Distro diverse da Debian non usano il cramfs, e può darsi che a questa prima analisi si trovi comunque un file compresso con <code>gzip</code>: per indagare oltre è sufficiente decomprimere una copia del file (notate l'aggiunta del suffisso .gz, senza il quale <code>gunzip</code> rifiuta di decomprimere il file): l'initramfs è un archivio <code>cpio</code>. | ||
<pre> | <pre> | ||
Riga 297: | Riga 298: | ||
# mkinitrd -o initrd-<versione> <versione> | # mkinitrd -o initrd-<versione> <versione> | ||
</pre> | </pre> | ||
in cui < | in cui <code><versione></code> è il nome della directory che contiene i moduli, e che trovate in <code>/lib/modules/</code>. | ||
Se usate l'initramfs (sempre da root): | Se usate l'initramfs (sempre da root): | ||
Riga 339: | Riga 340: | ||
Riavviare e controllare se il supporto ACPI funziona. Ricordarsi di aggiornare i bootloader! | Riavviare e controllare se il supporto ACPI funziona. Ricordarsi di aggiornare i bootloader! | ||
==Siti ufficiali dei progetti== | == Siti ufficiali dei progetti == | ||
* http://acpi.sourceforge.net | * http://acpi.sourceforge.net | ||
* http://www.acpi.info/ | * http://www.acpi.info/ | ||
contributi