|
|
Riga 1: |
Riga 1: |
| ==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 DSTD ('''Differentiated System Description Table''').
| | =Dove= |
| | Il primo Debianizzati Day si svolger� a Piacenza, presso l'[http://www.isii.it/ I.S.I.I. G. Marconi] ([http://www.maporama.com/share/Map.asp?MapID=ECCD9B1B-2977-4402-9566-0C466CEADE56&language=It Dov'�]) |
|
| |
|
| Il problema principale del supporto ad ACPI in linux risiede nella 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.
| | ===Trasporti=== |
| | � possibile raggiungere l'[http://www.isii.it/ I.S.I.I. G. Marconi] nei seguenti modi: |
| | ==== Macchina ==== |
| | Link per il calcolo del percorso: |
| | * [http://www.maporama.com/share/DriveMe.asp?COUNTRYCODE=IT&State=&Zip=29100&_XgoGCTownName=PIACENZA&_XgoGCAddress=via+quattro+novembre+122&XgoPointXY=&AREACODE=IT&GO_DRIVEMETO.x=2&GO_DRIVEMETO.y=2 Maporama] |
| | * [http://mappe.virgilio.it/tc/percorso/index.jsp?com2=piacenza+%28pc%29&to2=Via+Quattro+Novembre&civ2=12&v=2 Virgilio] |
| | * [http://www.viamichelin.it/viamichelin/ita/dyn/controller/ItiWGHomePage?strDestCity=Piacenza&strDestCityCountry=612&strDestAddress=12,%20Via%204%20Novembre&strDestCP=29100 ViaMichelin] |
|
| |
|
| 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. | | ==== Passaggi ==== |
| | Io ([[Utente:MaXeR|MaXeR]]) partir� da Garda sul presto (__ora__) ed ho tre posti liberi in macchina. Per maggiori informazioni: [mailto:maxer@knio.it Scrivimi]. |
|
| |
|
| ==Aggiornamento del BIOS==
| | Io ([[Utente:ilbeppe|ilbeppe]]) parto da Milano la mattina presto (Orario da concordare), ho anche io 3 posti liberi. Per prendere accordi mandatemi un mail: [mailto:ilbeppe@tafferuglio.org Scrivimi] |
| 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==
| | Io ([[Utente:tindal|tindal]]) parto da Bologna in orario da concordare, ho anch'io 3 posti liberi. Tengo a precisare per� che, per quanto io tenga molto a venire, i miei programmi hanno una certa tendenza ad ingarbugliarsi e quindi a cambiare repentinamente, quindi non mi sento di garantire nulla. Per contatti: [mailto:tindal@debianizzati.org Scrivimi] oppure va bene anche un PM dal forum. |
| 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:
| |
|
| |
|
| <pre>ACPI (Advanced Configuration and Power Interface) Support --->
| | ==== Treno ==== |
| ACPI Support --->
| | * Link al sito [http://orario.trenitalia.com/b2c/TimeTable?stazin=in&stazout=Piacenza&datag=25&datam=03&dataa=2006&timsh=07&timsm=00&lang=it&nreq=5&channel=tcom Trenitalia] |
| <*> AC Adapter
| |
| <*> Battery
| |
| <*> Button
| |
| <*> Processor</pre>
| |
|
| |
|
| ==Strumenti per lavorare con le DSDT== | | ==== Bus ==== |
| Per poter leggere e compilare una DSDT � necessario il compilatore ASL di Intel, che in debian esiste gi� precompilato a partire da etch (attuale testing), altrimenti � liberamente disponibile per il download all'indirizzo:
| | * link alla pagina degli orari del bus |
| <pre>http://developer.intel.com/technology/iapc/acpi/downloads.htm</pre>
| |
|
| |
|
| Per utilizzare la DSDT corretta sono disponibili due metodi: 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.
| | =Quando= |
| | La data scelta � Sabato 25 Marzo. |
|
| |
|
| 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===
| |
| 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 <tt>sources.list</tt> un repository per etch, e impartire, da root, il comando
| | =Programma= |
| <pre>
| | ===Mattina=== |
| # aptitude install iasl
| | * '''09:30''' Ritrovo presso __luogo__ |
| </pre>
| | * '''10:00''' Saluti e presentazioni di Lug Piacenza e Debianizzati |
| | * '''10:30''' Talk: ''Introduzione a Linux'' |
| | * '''11:00''' Pausa Caff�/Sigaretta |
| | * '''11:15''' Talk: ''Introduzione a Debian'' |
| | * '''11:30''' Talk: ''Debian: dpkg, apt-get e aptitude'' |
| | * '''12:30''' Pausa Pranzo |
|
| |
|
| Se invece avete scaricato i sorgenti, per avere il compilatore ASL funzionante � necessario compilarlo:
| | ===Pomeriggio=== |
| <pre>$ tar -zxvf acpica-unix-20050624.tar.gz
| | * '''14:30''' Tc: no1984.org e proiezione del filmato "No al Trusted Computing" |
| $ cd acpica-unix-20050624/compiler
| | * '''15:00''' Inizio Installation Party |
| $ make</pre>
| | * '''17:00''' Termine Giornata |
|
| |
|
| ===Ottenere una DSDT=== | | ===Varie=== |
| � possibile ottenere la DSDT attualmente installata per poi correggere gli eventuali errori e problemi, copiandola da un file reso appositamente disponibile dal filesystem virtuale /proc:
| | Durante le pause sar� possibile firmarsi le chiavi GnuPG, chiedere informazioni, chiaccherare, etc :-) |
| <pre>$ cat /proc/acpi/dsdt > dsdt.dat</pre>
| |
|
| |
|
| Ci� creer� un file '''dsdt.dat''' che contiene la DSDT compilata.
| | =Per i Partecipanti= |
| Per poterne leggere il contenuto � necessario decompilarla con il compilatore ASL appena installato: | |
| <pre>$ iasl -d dsdt.dat</pre>
| |
|
| |
|
| Verr� generato un file di testo denominato '''dsdt.dsl''', che contiene la DSDT. Questo file pu� essere modificato con un normale editor di testi e modificato a seconda delle esigenze e dei problemi riscontrati.
| | ==Materiale Disponibile== |
| | ===Documentazione=== |
| | * Copie Cartacee delle slide del talk ''Debian: dpkg, apt-get e aptitude'' |
| | * Debian Reference Card [http://people.debian.org/~debacle/refcard/ Link] |
|
| |
|
| 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.
| | ===Software=== |
| | * CD/DVD di Debian Sarge (per i386, amd64, ppc) |
| | * CD/DVD di Debian Etch (per i386, amd64, ppc) |
| | * CD/DVD di Ubuntu 5.10 (per i386, amd64, ppc) |
| | * CD BarGnu [http://bargnu.lugpiacenza.org/ Link al Progetto] |
|
| |
|
| 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.
| | ==Installation Party== |
| | Chi intende partecipare all'Installation Party deve munirsi delle seguenti cose: |
| | * Computer (mouse, tastiera e monitor non sono necessari) con le seguenti caratteristiche: |
| | ** Presa di Rete |
| | ** Lettore cd o dvd |
| | * Elenco Sommario dell'Hardware installato |
| | * Pazienza ;-) |
|
| |
|
| Una volta corretti gli errori ricompilare il file '''dsdt.dsl'''.
| | =Ringraziamenti= |
|
| | * Lug di Piacenza (in particolare Roberto Premoli e Marco Frattola) |
| <pre>$ iasl -tc dsdt.dsl</pre>
| |
| | |
| Verranno generati due file dalla compilazione:
| |
| *: dsdt.hex
| |
| | |
| *: DSDT.aml
| |
| | |
| {{ 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===
| |
| | |
| 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:
| |
| <pre>
| |
| $ 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
| |
| </pre>
| |
| | |
| in sostanza, c'� un errore ripetuto identico tre volte (<tt>Error 1048</tt>), oltre ad un warning. Andiamo a vedere le sezioni incriminate. La prima �:
| |
| <pre>
| |
| Scope (\_SI)
| |
| {
| |
| Method (_MSG, 1, NotSerialized)
| |
| {
| |
| Store (Local0, Local0)
| |
| }
| |
| Method (_SST, 1, NotSerialized)
| |
| {
| |
| Store (Local0, Local0)
| |
| }
| |
| }
| |
| </pre>
| |
| Come si vede viene utilizzata due volte la variabile <tt>Local0</tt>, ma non viene mai dichiarata.
| |
| | |
| Vediamo di capire almeno un minimo il significato di questo pezzo di codice.
| |
| La funzione <tt>Store</tt> � 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 <tt>Local0</tt> il valore che ha gi�, quindi per correggere l'errore non faccio altro che cancellare l'istruzione commentandola:
| |
| <pre>
| |
| 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.
| |
| | |
| Facendo questa correzione anche nelle altre posizioni segnalate vengono eliminati tutti gli errori, quindi passiamo al warning. Il codice � questo:
| |
| <pre>
| |
| 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)
| |
| }
| |
| </pre>
| |
| 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 <tt>\_WAK</tt>, 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.
| |
| | |
| 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
| |
| <pre>
| |
| Return(Package(0x02){0x00, 0x00})
| |
| </pre>
| |
| Dopo le correzioni il codice viene ricompilato senza errori ne' 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) <tt>0x56</tt> alla variabile <tt>SMIP</tt>, se invece si chiama 'Microsoft Windows NT' assegna <tt>0x58</tt> alla variabile <tt>SMIP</tt> e zero alle variabili <tt>OSFX</tt> e <tt>OSFL</tt> (notare che in molti casi il valore zero � associato a "successo" mentre valori diversi indicano un errore); se il S.O. � diverso da quelli elencati assegna alle tre variabili, rispettivamente, <tt>0x57</tt>, <tt>0x02</tt> e <tt>0x02</tt>".
| |
| | |
| 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 :-)
| |
| | |
| ==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, particolarmente 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.
| |
| | |
| Se usate l'initrd (da root):
| |
| <pre>
| |
| # cp dsdt.asl /etc/mkinitrd/DSDT
| |
| # mkinitrd -o initrd-<versione> <versione>
| |
| </pre>
| |
| in cui <tt><versione</tt> � il nome della directory che contiene i moduli, e che trovate in <tt>/lib/modules/</tt>.
| |
| | |
| Se usate l'initramfs (sempre da root):
| |
| <pre>
| |
| # cp dsdt.asl /etc/mkinitrd/DSDT.asl
| |
| # mkinitrd -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 and 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/
| |
| | |
| ----
| |
| Autore: [[Utente:Net deity|Net deity]]
| |
| | |
| Rivisto e corretto: [[Utente:Tindal|Tindal]] 17:37, Gen 27, 2006 (EST)
| |