Old:ACPI e DSDT: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
(iasl è già in etch)
m (ha spostato ACPI e DSDT a Old:ACPI e DSDT)
 
(30 versioni intermedie di 9 utenti non mostrate)
Riga 1: Riga 1:
Questo Wiki vuole essere prima di tutto un punto di raccolta ideale per le conoscenze acquisite dai singoli durante l' uso di Debian GNU/Linux in ambito casalingo e/o lavorativo, in modo che il sapere di uno diventi quello di tutti.
{{Old}}
== Introduzione ==


Le guide ritenute meglio scritte e pi� approfondite, dopo un processo di controllo e revisione a cui tutti siete liberi di partecipare, vengono classificate [[:Categoria:Debianized|Debianized]] e contrassegnate dalla [[Debian Swirl]] http://guide.debianizzati.org/images/swirl.png.
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''').  


Potete trovare un elenco completo delle guide Debianized [http://guide.debianizzati.org/index.php/Categoria:Debianized qui]
Il problema principale del supporto ad ACPI in Linux risiede nella presenza di errori (ma anche di controlli espliciti su alcune caratteristiche peculiari del S.O. soprastante) nella tabella DSDT: purtroppo, molti fornitori di hardware non sono in grado, o non vogliono fornire tabelle DSDT completamente funzionali secondo gli standard ACPI.
Questa � la lista delle guide attualmente presenti:


== Mondo Debian ==
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.
=== Introduzione a Debian ===
* [[L' Universo Debian]]
* [[La struttura della Distribuzione]]


=== Installazione ===
== Aggiornamento del BIOS ==
* http://guide.debianizzati.org/images/swirl.png [[Guida a Grub]]
* [[Jigdo | '''Jigdo''': Scaricare e Aggiornare le iso di Debian]]
* [[Note sull'installazione di Debian]]


=== Gestione dei Pacchetti ===
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.
* [[Introduzione all' Apt System]]
* [[I repository ed il loro utilizzo]]
* http://guide.debianizzati.org/images/swirl.png [[Pulire Debian]]
* [[Apt-cdrom | '''Apt-cdrom''': aggiunta di cd/dvd nella lista dei repository]]
* [[Apt-file: ricerca all'interno dei pacchetti | '''Apt-file''': ricerca all'interno dei pacchetti]]
* [[Apt-listbugs: come monitorare i bug | '''Apt-listbugs''': come monitorare i bug]]
* [[Apt-zip: aggiornamenti senza una connessione veloce | '''Apt-zip''': aggiornamenti senza una connessione veloce]]
* [[Apt-spy: trovare i mirror pi� veloci | '''Apt-spy''': trovare i mirror pi� veloci]]
* [[APT uso avanzato: mixare releases diverse]]
* http://guide.debianizzati.org/images/swirl.png [[Impedire l' aggiornamento di un pacchetto]]
* [[Aptitude | '''Aptitude''': come amministrare i pacchetti]]


=== Creazione e modifica dei pacchetti ===
== Installazione nel kernel del supporto ACPI ==
* http://guide.debianizzati.org/images/swirl.png [[Make-jpkg: Pacchettiziamo Java Sun| '''Make-jpkg''': Pacchettiziamo Java Sun]]
* [[Pacchetti binari e sorgenti]]
* [[Applicare una patch ad un pacchetto Debian]]
* [[Apt-build: ottimizzazione dei pacchetti | '''Apt-build''': ottimizzazione dei pacchetti]]
* [[Dpkg-sig: Firma dei packages .deb |  '''Dpkg-sig''': Firma dei packages .deb]]
* [[Pacchetizzare un tema per Bootsplash]]
* [[Backport da unstable in testing]]


=== Gestione dei pacchetti Lato Server ===
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:
* [[Apt-Proxy: un proxy per i pacchetti Debian| '''Apt-Proxy''': un proxy per i pacchetti Debian]]
* [[Debmirror: creiamo un mirror Debian |'''Debmirror''': creiamo un mirror Debian]]
* [[Creare un Repository Debian]]
* [[Gestione di un repository con debarchiver]]
* [[Usare apt-cacher per creare una cache dei pacchetti usabile in una LAN]]
* [[Dupload per l'upload dei pacchetti Debian]]


==Configurazione Sistema==
<pre>ACPI (Advanced Configuration and Power Interface) Support --->
===Kernel===
    ACPI Support --->
* http://guide.debianizzati.org/images/swirl.png [[Debian Kernel Howto]]
        <*> AC Adapter
* [[Esempio configurazione kernel]]
        <*> Battery
* [[Kernel2.6.10 - Framebuffer - Gensplash Patch]]
        <*> Button
* [[Kernel 2.6 su Debian Woody]]
        <*> Processor</pre>
* [[Compilazione Kernel 2.6.11 con Bootsplash]]
* [[Pagina di manuale di module-assistant|Pagina di manuale di '''<tt>module-assistant</tt>''']]
* [[Low-latency 2.6 kernel per applicazioni audio realtime]]
* [[Script: Confronto Configurazioni Kernel]]


===Sistema===
== Strumenti per lavorare con le DSDT ==
* [[SysV | Il sistema SysV per la gestione dei Runlevel]]
* [[Udev e Debian]]
* [[Configurare il server X in Debian GNU/Linux]]
* [[Linux Admin Quick Reference]]
* [[Debian: accelerare GTK con Cairo e Glitz]]


===Applicazioni Esterne===
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.
* [[Pacchettizzare ed installare Xorg su Debian Sid]]
* [[Installazione Qemu con supporto accelerazione Kqemu]]
* [[ePSXe Emulatore Playstation]]
* [[Installare OpenOffice2 su Debian Etch]]
* [[DVD Backup: xDVDShrink per Debian]]


===Altro===
Per utilizzare la DSDT corretta sono disponibili due metodi:
* [[Dual Boot Debian-Altra distribuzione Linux]]
* il primo prevede l'applicazione di una [ftp://ftp.kernel.org/pub/linux/kernel/people/lenb/acpi/patches/release/ patch per il kernel] e l'inserimento della nuova DSDT direttamente nel kernel, che quindi  sarà da ricompilare ogni volta che si fanno cambiamenti alla DSDT;
* [[Dual Boot Linux-Windows|Dual Boot Linux-Windows: usare il bootloader di windows]]
* 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).
* [[Logging su MySQL]]
* [[Password sicure: la base della sicurezza informatica]]
* [[Script Bash per Avvio e Visualizzazione dati Seti@home]]


===Tips and Tricks===
=== Installare il compilatore ASL ===
====Bash====
* [[Bash tips]]: un elenco di trucchetti sull'uso interattivo e sullo scripting Bash
* [[Colorare bash]]
* [[Come abilitare il completamento automatico 'avanzato']]
* [[Un logout con schermo pulito]]
* [[Bash Script: Cambiare i permessi ricorsivamente]]
* [[Due simpatici login: welcome2l e linuxlogo]]


====Firefox====
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.
* [[Firefox: Disattivare la ricerca con il tasto centrale]]
* [[Velocizzare Firefox per la banda larga]]
* [[Il vostro motore di ricerca da Firefox]]
* [[Aggiungere un motore di ricerca al quicksearch di Firefox]]


====Altro====
Per installare il compilatore Intel è sufficiente avere nel <code>sources.list</code> un repository per Etch, ed impartire, da root, il comando
* [[Convertire immagini .nrg in immagini .iso]]
<pre>
* [[Nautilus: navigare con una sola finestra]]
# aptitude install iasl
* [[Associare a thunderbird il browser preferito]]
</pre>
* [[Antispam in Evolution con Bogofilter]]
* [[Impostare la lingua italiana per Gnome]]
* [[Impostare  e modificare data e ora]]
* [[Impostare e modificare il layout della tastiera]]
* [[Abilitare_Xinerama | Multi monitor con Xinerama]]
* [[Abilitare ESound con ALSA in Gnome]]
* [[Cambiare il Tema dei Cursori per il Mouse]]
* [[XFCE e shutdown da utente]]
* [[Personalizzare il comportamento delle finestre con Devil's Pie]]


==Networking==
Se invece avete scaricato i sorgenti, per avere il compilatore ASL funzionante è necessario compilarlo:
===Debian Server===
<pre>$ tar -zxvf acpica-unix-20050624.tar.gz
====Condivisione risorse====
$ cd acpica-unix-20050624/compiler
* [[Directory shared tra macchine linux (nfs)]]
$ make</pre>
* [[Condivisione risorse con Samba]]


====Mailing====
=== Ottenere una DSDT ===
* [[Mail Server Sicuro con Postfix]]


====Http====
È 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>:
* [[Server Web Casalingo]]
<pre># cat /sys/firmware/acpi/tables/DSDT > dsdt.dat</pre>
* [[LAMP: Linux, Apache, MySQL e PHP]]
* [[XAMPP: Linux, Apache, MySQL e PHP facili]]
* [[Debian MapServer/MapScript]]


===Amministrazione===
Ciò creerà un file '''dsdt.dat''' che contiene la DSDT compilata.
====Gestione Remota/Locale====
Per poterne leggere il contenuto è necessario decompilarla con il compilatore ASL appena installato:
* [[Wake On Lan | '''Wake On Lan''' per accendere i propri PC a distanza tramite la LAN]]
<pre>$ iasl -d dsdt.dat</pre>
* [[Debian e il controllo di servizi e demoni]]
* [[Gestione della banda in Apache]]
* [[Ssh e autenticazione tramite chiavi]]
* [[Inetd e i servizi di rete]]


====Connettivita'====
Verrà generato un file di testo denominato '''dsdt.dsl''', che contiene la DSDT. Questo file può essere aperto con un normale editor di testi e modificato a seconda delle esigenze e dei problemi riscontrati.
* [[Condividere la connessione a internet]]


===Sicurezza===
Per vedere quali sono i problemi spesso è sufficiente ricompilare il file ottenuto: il compilatore ASL fornirà una serie di warning sulle ottimizzazioni che è possibile fare (e le farà automaticamente) ed, eventualmente, segnalerà degli errori, la cui soluzione può essere, ad esempio, ricercata su Internet.
====Firewalling====
* [[Debian e iptables]]
* [[Firewall Builder]]
* [[Parametri a run-time per Netfilter]]


====Monitoraggio & Scanning====
Ad ogni modo una lettura del codice della DSDT può essere istruttiva. Il linguaggio è abbastanza simile al C e con qualche minima conoscenza è possibile comprendere i principali costrutti logici.
* [[Monitoriamo il Sistema]]
* [[Mrtg: monitoriamo la banda]]
* [[Cacti | Cacti: monitor di rete, per pi� computer]]
* [[Munin]]


====Proxy====
Nel codice di alcune DSDT è stato trovato un controllo (if .. then) sulla lunghezza del nome del S.O. soprastante (17 lettere, proprio come "Microsoft Windows") come requisito per l'attivazione di alcune funzioni dell'ACPI.
* [[Privoxy: navigazione sicura a prova di spam]]


====Tunneling====
Una volta corretti gli errori ricompilare il file '''dsdt.dsl'''.
* [[Openvpn]]
       
<pre>$ iasl -tc dsdt.dsl</pre>


== Hardware ==
Verranno generati due file dalla compilazione:
=== Fotocamere digitali e dispositivi di memorizzazione di massa removibili ===
*: dsdt.hex
* [[Usare Fotocamere Digitali|Usare Fotocamere Digitali (libgphoto2)]]
* [[Usare Fotocamere Digitali (usb-storage)]]
* [[UsbMount: Gestione automatizzata delle periferiche usb di memorizzazione]]
* [[Debian e iPod]]


=== Modem e periferiche di rete ===
*: DSDT.aml


* [[Debian e i Modem ADSL]]
{{ Warningbox | È possibile scaricare una custom DSDT già pronta e corretta da Internet per molti portatili in commercio: http://acpi.sourceforge.net/dsdt/tables }}


==== Modem USB ADSL ====
==== Un esempio: la mia DSDT ====
* [[Installare i driver conexant accessrunner]]
* [[Installare i driver eagle-adsl]]
* [[Installare i driver eci-adsl]] ''(stub)''
* [[Installare i driver unicorn (BeWAN)]] ''(stub)''
* [[Modem adsl Telindus ND220]]
* [[Modem adsl Aethra Starmodem]]
* [[Modem adsl Fastrate 100 USB]]


==== Modem Ethernet ====
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.
* ''Inserire qui eventuali guide su modem ethernet''


==== Modem dial-up 56K ====
Per cercare di risolvere la cosa ho analizzato la mia tabella DSDT.
* ''Inserire qui eventuali guide su modem a 56K''
L'ho estratta, e quando ho provato a ricompilarla ho avuto il seguente output:
<pre>
$ iasl -tc dsdt.dsl


==== Schede di rete Wireless ====
Intel ACPI Component Architecture
* [[Wireless Support | Informazioni sul supporto alle periferiche Wireless]]
ASL Optimizing Compiler version 20060113 [Jan 22 2006]
* [[Script Bash abilitazione scheda wireless]]
Copyright (C) 2000 - 2006 Intel Corporation
* [[Intel PRO/Wireless 2200BG]]
Supports ACPI Specification Revision 3.0a
* [[NdisWrapper | NdisWrapper: Usiamo i driver di Windows per il WLan con GNU/Linux]]


=== Schede Video ===
dsdt.dsl  290:    Method (\_WAK, 1, NotSerialized)
* [[Installazione Driver ATI per schede ATI RADEON MOBILITY 9700 SE]]
Warning  2078 -                ^ Reserved method must return a value (_WAK)


=== Stampanti ===
dsdt.dsl  318:            Store (Local0, Local0)
==== Stampanti USB ====
Error    1048 -                        ^ Method local variable is not initialized (Local0)
* ''Inserire eventuali guide su come far funzionare stampanti con porta USB''


==== Stampanti con porta parallela ====
dsdt.dsl  323:            Store (Local0, Local0)
* [[Introduzione all'installazione di stampanti con porta parallela]]
Error    1048 -                        ^ Method local variable is not initialized (Local0)


==== Stampanti bluetooth ====
dsdt.dsl  2368:            Store (Local0, Local0)
* [[Introduzione all'installazione di stampanti bluetooth]]
Error    1048 -                        ^ Method local variable is not initialized (Local0)


=== Scanner ===
ASL Input:  dsdt.dsl - 4804 lines, 160190 bytes, 1781 keywords
* [[Epson Perfection 2480 photo - usb scanner]]
Compilation complete. 3 Errors, 1 Warnings, 0 Remarks, 465 Optimizations
* ''Inserire qui eventuali altre guide su come far funzionare scanner con Debian''
</pre>


=== Palmari e cellulari ===
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 è:
* [[Debian e Nokia 7210: uso di gnokii e gestione degli sms]]
<pre>
* [[UMTS/GPRS PCMCIA card (3g)]]
Scope (\_SI)
* [[Usare lcd4linux con un Palm]]
{
    Method (_MSG, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
}
</pre>
Come si vede viene utilizzata due volte la variabile <code>Local0</code>, ma non viene mai dichiarata.


=== Altro hardware ===
Vediamo di capire almeno un minimo il significato di questo pezzo di codice.
* [[I2c e lm-sensors|'''I2c e lm-sensors''': usare i sensori della scheda madre]]
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.


==Portatili==
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:
===Laptop Debianizzati===
<pre>
Troverete di seguito i resoconti d'installazione di Debian su dei portatili:
Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
}
</pre>
Come si vede i commenti sono marcati come in C.


* [[Debian on an HP nx8220 | Debian on an HP nx8220]]
Facendo questa correzione anche nelle altre posizioni segnalate vengono eliminati tutti gli errori, quindi passiamo al warning. Il codice è questo:
* [[Debian on a presario 2141EU | Compaq Presario 2100 (2141EU)]]
<pre>
* [[Debian on a compaq Presario 2154EA | Compaq Presario 2100 (2154EA)]]
Method (\_WAK, 1, NotSerialized)
* [[Debian on a Toshiba Satellite M30X-113| Toshiba M30x-113]] ''(stub)''
{
* [[Debian on a HP Compaq NX6110| HP Compaq NX6110]]
    Store (0xFF, DBG1)
* [[Debian on an HP pavilion zv5422EA| HP pavilion zv5000 (zv5422EA)]]
    SALD (0x00)
    SFAN (0xFF)
    Notify (\_SB.PCI0.PX40.UAR1, 0x00)
    If (OSFL)
    {
        Notify (\_SB.PWRB, 0x02)
    }
    Else
    {
        If (LEqual (RTCW, 0x00))
        {
            Notify (\_SB.PWRB, 0x02)
        }
    }
    Notify (\_SB.PCI0.USB0, 0x00)
    Notify (\_SB.PCI0.USB1, 0x00)
    Notify (\_SB.PCI0.USB2, 0x00)
    Notify (\_SB.PCI0.USB3, 0x00)
}
</pre>
Le ultime righe mi danno la prova che l'errore ha a che fare con le porte USB, come avevo già notato.


===Altro===
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.
* [[Powernowd: CpuScaling per AMD]]
* [[Cpufreqd: Cpuscaling per Intel Pentium M]]
* [[ACPI e DSDT]]
* Inserire qui anche link a risorse in italiano sui portatili


==Debian Live==
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 :()
* [[Rimasterizzare una knoppix]]
* [[Damn Small Linux su chiavetta usb]]


==Crittografia==
Io non ho idea di come reperire, nel codice, l'informazione sull'esito dell'inizializzazione delle porte USB, quindi non mi è possibile correggere il codice in modo che assolva alla funzione per cui è stato scritto, ma posso usare un workaround, e fare in modo che restituisca comunque un esito positivo.
* [[Crittografia e Steganografia - L'Arte di nascondere le informazioni]]
* [[Chiavi simmetriche e chiavi pubbliche]]


==Varie==
Per fare questo si trova (in rete), senza entrare nei dettagli, che è sufficiente aggiungere alla fine del metodo, subito prima dell'ultima parentesi graffa, la riga
* [[Debian Fun]]
<pre>
Return(Package(0x02){0x00, 0x00})
</pre>
Dopo le correzioni il codice viene ricompilato senza errori né warning :D
 
Ora però mi viene una curiosità, e mi metto a cercare nel codice la scritta "Microsoft". Questo è quello che ne viene fuori:
<pre>
Method (\_SB.PCI0._INI, 0, NotSerialized)
{
    If (STRC (\_OS, "Microsoft Windows"))
    {
        Store (0x56, SMIP)
    }
    Else
    {
        If (STRC (\_OS, "Microsoft Windows NT"))
    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
    }
    Else
    {
    Store (0x57, SMIP)
    Store (0x02, OSFX)
    Store (0x02, OSFL)
    }
}
</pre>
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:
<pre>
Method (\_SB.PCI0._INI, 0, NotSerialized)
{
//    If (STRC (\_OS, "Microsoft Windows"))
//    {
//        Store (0x56, SMIP)
//    }
//    Else
//    {
//        If (STRC (\_OS, "Microsoft Windows NT"))
//    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
//    }
//    Else
//    {
//    Store (0x57, SMIP)
//    Store (0x02, OSFX)
//    Store (0x02, OSFL)
//    }
}
</pre>
 
Ora il mio sistema funziona un pochino meglio :-)
 
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.
 
 
Vorrei far notare che le correzioni che sono state fatte <b>non sono</b> delle <b>vere</b> correzioni, ma dei workaround: non ci si assicura che il codice faccia quel che deve fare, ma solo che non ci siano errori formali.
 
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 ==
 
Come abbiamo già detto, è possibile inserire la tabella DSDT generata in modo statico nel kernel, oppure renderla disponibili tramite initrd.
 
*:Il primo metodo prevede di includere la DSDT nel kernel. Questo comporta la ricompilazione del kernel al termine della procedura. Se usate questo metodo avete bisogno del file '''dsdt.hex'''.
 
*:Il secondo metodo prevede di passare la DSDT al kernel durante il caricamento nella fase di boot tramite initrd. Se usate questo metodo avete bisogno del file '''DSDT.aml'''.
 
 
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 ===
 
È necessario applicare una patch al kernel per far sì che sia in grado di leggere la nuova DSDT.
Per fare questo ci spostiamo nella directory dove sono presenti i sorgenti:
<pre>
$ cd /usr/src/linux-2.6.8
$ patch -p1 < /percorso_dove_avete_salvato_la_patch
</pre>
 
Se non appaiono errori, significa che la patch è stata applicata correttamente.
 
Copiamo il file dsdt.hex, rinominandolo in dsdt_table.h, nella directory dei sorgenti del kernel:
<pre>
$ cp dsdt.hex /usr/src/linux-2.6.8/include/acpi/dsdt_table.h
</pre>
 
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 ===
 
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.
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:
<pre>
$ file /boot/initrd.img-2.6.12-1-686-smp
/boot/initrd.img-2.6.12-1-686-smp: Linux Compressed ROM File System data, little endian \
size 5046272 version #2 sorted_dirs CRC 0x5c015a8f, edition 0, 2920 blocks, 338 files
</pre>
che è un tipico initrd Debian e usa il cramfs, e anche
<pre>
$ file /boot/initrd.img-2.6.15-1-686-smp
/boot/initrd.img-2.6.15-1-686-smp: gzip compressed data, from Unix, max compression
</pre>
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 <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>
$ cp /boot/initrd.img-2.6.15-1-686-smp initramfs.gz
$ gunzip initramfs.gz
$ file initramfs
initramfs: ASCII cpio archive (SVR4 with no CRC)
</pre>
 
Se usate l'initrd (da root):
<pre>
# cp DSDT.aml /etc/mkinitrd/DSDT
# mkinitrd -o initrd-<versione>  <versione>
</pre>
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):
<pre>
# cp DSDT.aml /etc/mkinitramfs/DSDT.aml
# mkinitramfs -o initrd-<versione>  <versione>
</pre>
con le stesse avvertenze di prima.
 
Se il vostro kernel non comprende la patch che gli permette di leggere la DSDT nell'initrd, dovete ricompilarlo. Prima però applicate la patch, spostandovi nella directory dove sono presenti i sorgenti:
<pre>$ cd /usr/src/linux-2.6.8
$ patch -p1 < / percorso_dove_avete_salvato_la_patch</pre>
 
Al momento in cui si scrive, se usate l'initramfs vi serve anche una seconda patch che trovate allo stesso indirizzo della prima (in futuro verranno probabilmente unificate).
 
Prima di compilare è necessario assicurarsi che i seguenti moduli (ramdisk e initrd) siano compilati staticamente nel kernel:
<pre>
Device Drivers --->
    Block Devices --->
        <*> RAM disk support
        [*] Initial RAM disk (initrd) support
</pre>
 
Inoltre è necessario controllare che l’opzione '''Read DSDT from initrd''' sia selezionata nel menu delle opzioni ACPI:
<pre>
Power management options (ACPI, APM) --->
    ACPI (Advanced Configuration and Power Interface) Support --->
        [*] Read DSDT from initrd
</pre>
 
Se queste opzioni non sono abilitate, abilitarle e ricompilare il kernel. Se sono già abilitate non è necessario ricompilare il kernel ;-).
 
Ora il kernel è pronto ad accettare la DSDT con initrd.
Se non avete a disposizione i tool mkinitrd e/o mkinitramfs che Debian mette a disposizione è necessario modificare l'initrd che avete, ma prima di farlo è fortemente consigliato di farne una copia di backup:
<pre>
# cp /boot/initrd-kernel-2.6.8.img /boot/initrd-kernel-2.6.8.img.bak
# echo -n "INITRDDSDT123DSDT123" >> /boot/initrd-kernel-2.6.8.img
# cat DSDT.aml >> /boot/initrd-kernel-2.6.8.img
</pre>
 
Riavviare e controllare se il supporto ACPI funziona. Ricordarsi di aggiornare i bootloader!
 
== Siti ufficiali dei progetti ==
 
* http://acpi.sourceforge.net
* http://www.acpi.info/

Versione attuale delle 09:43, 8 mag 2016

Emblem-important.png Attenzione. Questa guida è obsoleta. Viene mantenuta sul Wiki solo per motivi di natura storica e didattica.


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

Il problema principale del supporto ad ACPI in Linux risiede nella presenza di errori (ma anche di controlli espliciti su alcune caratteristiche peculiari del S.O. soprastante) nella tabella DSDT: purtroppo, molti fornitori di hardware non sono in grado, o non vogliono fornire tabelle DSDT completamente funzionali secondo gli standard ACPI.

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

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

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:

ACPI (Advanced Configuration and Power Interface) Support ---> 
    ACPI Support ---> 
        <*> AC Adapter
        <*> Battery
        <*> Button
        <*> Processor

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

Per utilizzare la DSDT corretta sono disponibili due metodi:

  • il primo prevede l'applicazione di una patch per il kernel e l'inserimento della nuova DSDT direttamente nel kernel, che quindi sarà da ricompilare ogni volta che si fanno cambiamenti alla DSDT;
  • 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 patch apposita. Al momento la patch menzionata è inclusa nei kernel delle maggiori distribuzioni (sicuramente in Debian, Ubuntu, Suse, e Mandriva).

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.

Per installare il compilatore Intel è sufficiente avere nel sources.list un repository per Etch, ed impartire, da root, il comando

# aptitude install iasl

Se invece avete scaricato i sorgenti, per avere il compilatore ASL funzionante è necessario compilarlo:

$ tar -zxvf acpica-unix-20050624.tar.gz
$ cd acpica-unix-20050624/compiler
$ make

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 /sys:

# cat /sys/firmware/acpi/tables/DSDT > dsdt.dat

Ciò creerà un file dsdt.dat che contiene la DSDT compilata. Per poterne leggere il contenuto è necessario decompilarla con il compilatore ASL appena installato:

$ iasl -d dsdt.dat

Verrà generato un file di testo denominato dsdt.dsl, che contiene la DSDT. Questo file può essere aperto con un normale editor di testi e modificato a seconda delle esigenze e dei problemi riscontrati.

Per vedere quali sono i problemi spesso è sufficiente ricompilare il file ottenuto: il compilatore ASL fornirà una serie di warning sulle ottimizzazioni che è possibile fare (e le farà automaticamente) ed, eventualmente, segnalerà degli errori, la cui soluzione può essere, ad esempio, ricercata su Internet.

Ad ogni modo una lettura del codice della DSDT può essere istruttiva. Il linguaggio è abbastanza simile al C e con qualche minima conoscenza è possibile comprendere i principali costrutti logici.

Nel codice di alcune DSDT è stato trovato un controllo (if .. then) sulla lunghezza del nome del S.O. soprastante (17 lettere, proprio come "Microsoft Windows") come requisito per l'attivazione di alcune funzioni dell'ACPI.

Una volta corretti gli errori ricompilare il file dsdt.dsl.

$ iasl -tc dsdt.dsl

Verranno generati due file dalla compilazione:

  • dsdt.hex
  • DSDT.aml
Warning.png ATTENZIONE
È 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

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.

Per cercare di risolvere la cosa ho analizzato la mia tabella DSDT. L'ho estratta, e quando ho provato a ricompilarla ho avuto il seguente output:

$ iasl -tc dsdt.dsl

Intel ACPI Component Architecture
ASL Optimizing Compiler version 20060113 [Jan 22 2006]
Copyright (C) 2000 - 2006 Intel Corporation
Supports ACPI Specification Revision 3.0a

dsdt.dsl   290:     Method (\_WAK, 1, NotSerialized)
Warning  2078 -                 ^ Reserved method must return a value (_WAK)

dsdt.dsl   318:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)

dsdt.dsl   323:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)

dsdt.dsl  2368:             Store (Local0, Local0)
Error    1048 -                         ^ Method local variable is not initialized (Local0)

ASL Input:  dsdt.dsl - 4804 lines, 160190 bytes, 1781 keywords
Compilation complete. 3 Errors, 1 Warnings, 0 Remarks, 465 Optimizations

in sostanza, c'è un errore ripetuto identico tre volte (Error 1048), oltre ad un warning. Andiamo a vedere le sezioni incriminate. La prima è:

Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
        Store (Local0, Local0)
    }
}

Come si vede viene utilizzata due volte la variabile Local0, ma non viene mai dichiarata.

Vediamo di capire almeno un minimo il significato di questo pezzo di codice. La funzione Store è 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 Local0 il valore che ha già, quindi per correggere l'errore non faccio altro che cancellare l'istruzione commentandola:

Scope (\_SI)
{
    Method (_MSG, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
    Method (_SST, 1, NotSerialized)
    {
//        Store (Local0, Local0)
    }
}

Come si vede i commenti sono marcati come in C.

Facendo questa correzione anche nelle altre posizioni segnalate vengono eliminati tutti gli errori, quindi passiamo al warning. Il codice è questo:

Method (\_WAK, 1, NotSerialized)
{
    Store (0xFF, DBG1)
    SALD (0x00)
    SFAN (0xFF)
    Notify (\_SB.PCI0.PX40.UAR1, 0x00)
    If (OSFL)
    {
        Notify (\_SB.PWRB, 0x02)
    }
    Else
    {
        If (LEqual (RTCW, 0x00))
        {
            Notify (\_SB.PWRB, 0x02)
        }
    }
    Notify (\_SB.PCI0.USB0, 0x00)
    Notify (\_SB.PCI0.USB1, 0x00)
    Notify (\_SB.PCI0.USB2, 0x00)
    Notify (\_SB.PCI0.USB3, 0x00)
}

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 \_WAK, 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 :()

Io non ho idea di come reperire, nel codice, l'informazione sull'esito dell'inizializzazione delle porte USB, quindi non mi è possibile correggere il codice in modo che assolva alla funzione per cui è stato scritto, ma posso usare un workaround, e fare in modo che restituisca comunque un esito positivo.

Per fare questo si trova (in rete), senza entrare nei dettagli, che è sufficiente aggiungere alla fine del metodo, subito prima dell'ultima parentesi graffa, la riga

Return(Package(0x02){0x00, 0x00})

Dopo le correzioni il codice viene ricompilato senza errori né warning :D

Ora però mi viene una curiosità, e mi metto a cercare nel codice la scritta "Microsoft". Questo è quello che ne viene fuori:

Method (\_SB.PCI0._INI, 0, NotSerialized)
{
    If (STRC (\_OS, "Microsoft Windows"))
    {
        Store (0x56, SMIP)
    }
    Else
    {
        If (STRC (\_OS, "Microsoft Windows NT"))
    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
    }
    Else
    {
    Store (0x57, SMIP)
    Store (0x02, OSFX)
    Store (0x02, OSFL)
    }
}

Anche senza conoscere il linguaggio, il codice è facilmente interpretabile: "se il Sistema Operativo si chiama 'Microsoft Windows' assegna il valore (esadecimale) 0x56 alla variabile SMIP, se invece si chiama 'Microsoft Windows NT' assegna 0x58 alla variabile SMIP e zero alle variabili OSFX e OSFL; se il S.O. è diverso da quelli elencati assegna alle tre variabili, rispettivamente, 0x57, 0x02 e 0x02".

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:

Method (\_SB.PCI0._INI, 0, NotSerialized)
{
//    If (STRC (\_OS, "Microsoft Windows"))
//    {
//        Store (0x56, SMIP)
//    }
//    Else
//    {
//        If (STRC (\_OS, "Microsoft Windows NT"))
//    {
        Store (0x58, SMIP)
        Store (0x00, OSFX)
        Store (0x00, OSFL)
//    }
//    Else
//    {
//    Store (0x57, SMIP)
//    Store (0x02, OSFX)
//    Store (0x02, OSFL)
//    }
}

Ora il mio sistema funziona un pochino meglio :-)

Aggiornamento: ricontrollando il codice ho notato che le tre variabili SMIP, OSFX e OSFL vengono inizializzate altrove, e quindi, in sostanza, il presente codice è inutile (se non dannoso ;-)), quindi l'ho semplicemente eliminato.


Vorrei far notare che le correzioni che sono state fatte non sono delle vere correzioni, ma dei workaround: non ci si assicura che il codice faccia quel che deve fare, ma solo che non ci siano errori formali.

Purtroppo la correzione vera 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

Come abbiamo già detto, è possibile inserire la tabella DSDT generata in modo statico nel kernel, oppure renderla disponibili tramite initrd.

  • Il primo metodo prevede di includere la DSDT nel kernel. Questo comporta la ricompilazione del kernel al termine della procedura. Se usate questo metodo avete bisogno del file dsdt.hex.
  • Il secondo metodo prevede di passare la DSDT al kernel durante il caricamento nella fase di boot tramite initrd. Se usate questo metodo avete bisogno del file DSDT.aml.


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

È necessario applicare una patch al kernel per far sì che sia in grado di leggere la nuova DSDT. Per fare questo ci spostiamo nella directory dove sono presenti i sorgenti:

$ cd /usr/src/linux-2.6.8
$ patch -p1 < /percorso_dove_avete_salvato_la_patch

Se non appaiono errori, significa che la patch è stata applicata correttamente.

Copiamo il file dsdt.hex, rinominandolo in dsdt_table.h, nella directory dei sorgenti del kernel:

$ cp dsdt.hex /usr/src/linux-2.6.8/include/acpi/dsdt_table.h

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

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. I kernel Debian standard usano l'initramfs a partire dalla versione 2.6.14 compresa, ma per essere sicuri è sufficiente usare il comando file. Per esempio nel mio sistema ho:

$ file /boot/initrd.img-2.6.12-1-686-smp
/boot/initrd.img-2.6.12-1-686-smp: Linux Compressed ROM File System data, little endian \
size 5046272 version #2 sorted_dirs CRC 0x5c015a8f, edition 0, 2920 blocks, 338 files

che è un tipico initrd Debian e usa il cramfs, e anche

$ file /boot/initrd.img-2.6.15-1-686-smp
/boot/initrd.img-2.6.15-1-686-smp: gzip compressed data, from Unix, max compression

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 gzip: per indagare oltre è sufficiente decomprimere una copia del file (notate l'aggiunta del suffisso .gz, senza il quale gunzip rifiuta di decomprimere il file): l'initramfs è un archivio cpio.

$ cp /boot/initrd.img-2.6.15-1-686-smp initramfs.gz
$ gunzip initramfs.gz
$ file initramfs
initramfs: ASCII cpio archive (SVR4 with no CRC)

Se usate l'initrd (da root):

# cp DSDT.aml /etc/mkinitrd/DSDT
# mkinitrd -o initrd-<versione>  <versione> 

in cui <versione> è il nome della directory che contiene i moduli, e che trovate in /lib/modules/.

Se usate l'initramfs (sempre da root):

# cp DSDT.aml /etc/mkinitramfs/DSDT.aml
# mkinitramfs -o initrd-<versione>  <versione> 

con le stesse avvertenze di prima.

Se il vostro kernel non comprende la patch che gli permette di leggere la DSDT nell'initrd, dovete ricompilarlo. Prima però applicate la patch, spostandovi nella directory dove sono presenti i sorgenti:

$ cd /usr/src/linux-2.6.8
$ patch -p1 < / percorso_dove_avete_salvato_la_patch

Al momento in cui si scrive, se usate l'initramfs vi serve anche una seconda patch che trovate allo stesso indirizzo della prima (in futuro verranno probabilmente unificate).

Prima di compilare è necessario assicurarsi che i seguenti moduli (ramdisk e initrd) siano compilati staticamente nel kernel:

Device Drivers ---> 
    Block Devices ---> 
        <*> RAM disk support 
        [*] Initial RAM disk (initrd) support

Inoltre è necessario controllare che l’opzione Read DSDT from initrd sia selezionata nel menu delle opzioni ACPI:

Power management options (ACPI, APM) ---> 
    ACPI (Advanced Configuration and Power Interface) Support ---> 
        [*] Read DSDT from initrd

Se queste opzioni non sono abilitate, abilitarle e ricompilare il kernel. Se sono già abilitate non è necessario ricompilare il kernel ;-).

Ora il kernel è pronto ad accettare la DSDT con initrd. Se non avete a disposizione i tool mkinitrd e/o mkinitramfs che Debian mette a disposizione è necessario modificare l'initrd che avete, ma prima di farlo è fortemente consigliato di farne una copia di backup:

# cp /boot/initrd-kernel-2.6.8.img /boot/initrd-kernel-2.6.8.img.bak
# echo -n "INITRDDSDT123DSDT123" >> /boot/initrd-kernel-2.6.8.img
# cat DSDT.aml >> /boot/initrd-kernel-2.6.8.img

Riavviare e controllare se il supporto ACPI funziona. Ricordarsi di aggiornare i bootloader!

Siti ufficiali dei progetti