View previous topic :: View next topic |
Author |
Message |
theRealMorpheu5 l33t
Joined: 26 Feb 2004 Posts: 841 Location: Vicenza, IT
|
Posted: Tue Mar 21, 2006 11:21 am Post subject: [HOWTO][ACPI][risolto] Aspire 1652 e le mani sulla DSDT |
|
|
Me lo sento che mi odierete per questo post che forse avrei dovuto appiccicare al vecchio ma siccome ho fatto qualche progresso e l'argomento non e' "come mai non si avvia?" bensì "perché la prima volta va e le altre no?", mi è sembrato più giusto aprire un altro topic.
Dunque, la questione è la seguente: visto che nessuna delle DSDT che potevo scaricare da acpi.sourceforge.net pareva funzionare, ho deciso di mettermi di lena e correggere la mia. Ho installato iasl, il compilatore Intel per questo genere di cose, e ho disassemblato e ricompilato la DSDT caricata di default. A manina e con l'aiuto di gùgl sono riucito a compilare correttamente il file, l'ho sostituito al default via initrd e ho riavviato. Magia, tutto ha preso a funzionare, riuscivo a leggere lo stato della batteria, finalmente! Allora ho pensato, bene, è la volta che lo pubblico, ci faccio un howto e contribuisco ad aumentare di qualche punto percentuale la felicità nel mondo.
No. Vado a vedere dove ho messo i sorgenti, cancello quello che non mi serve (perlopiù dump della DSDT Acer) e tengo il sorgente della mia DSDT custom. Faccio una prova per scrupolo, compilo e mi escono duecento e passa errori (ma a duecento il compilatore si ferma, pietosamente ) la cui maggior parte consta in roba tipo "Object is missing" o simili... errori che conosco già ma insomma, l'altra volta ha funzionato, mi dico. Riavvio la macchina con la DSDT Acer e riprovo a compilare la mia (chissà per quale motivo pensavo che avrebbe funzionato) e infatti non funziona.
Ora, siccome è ora di pranzo vado a mangiare, ma mi appresto a ripetere le correzioni che ho già fatto, magari questa volta in modo un po' meno incasinato. Se voi avete qualche esperienza in merito, ditemelo perché non so più da che parte sbattere la testa! o_O
Last edited by theRealMorpheu5 on Tue Mar 21, 2006 8:44 pm; edited 2 times in total |
|
Back to top |
|
|
Cazzantonio Bodhisattva
Joined: 20 Mar 2004 Posts: 4514 Location: Somewere around the world
|
Posted: Tue Mar 21, 2006 11:33 am Post subject: |
|
|
Moved from Forum italiano (Italian) to Forum di discussione italiano. _________________ Any mans death diminishes me, because I am involved in Mankinde; and therefore never send to know for whom the bell tolls; It tolls for thee.
-John Donne |
|
Back to top |
|
|
theRealMorpheu5 l33t
Joined: 26 Feb 2004 Posts: 841 Location: Vicenza, IT
|
Posted: Tue Mar 21, 2006 12:58 pm Post subject: |
|
|
(noticina: capirei l'unione con l'altro topic ma perche' spostarlo nel forum di discussione? Mi sono perso qualche nuova linea guida?)
Ce l'ho fatta, parrebbe funzionare. Adesso, appena ho la sbatta necessaria, pubblico l'howto e la DSDT funzionante. |
|
Back to top |
|
|
theRealMorpheu5 l33t
Joined: 26 Feb 2004 Posts: 841 Location: Vicenza, IT
|
Posted: Tue Mar 21, 2006 8:44 pm Post subject: |
|
|
Come promesso, ecco l'HOW-TO.
Nota e disclaimer: la DSDT che io pubblico funziona sull'Aspire 1652WLMi con BIOS Phonix versione S3A33. Quello che prima non andava (la lettura dello stato della batteria) ora va epperò non mi assumo alcun genere di responsabilità su danni causati da manomissioni da parte di inesperti. Ok, poi parlo io che di DSDT e ACPI ho sentito parlare per la prima volta l'altro ieri, eh...
Cominciamo.
0. Fare il boot
Sembra una sciocchezza ma non lo è, mi sono accorto che per qualche strano motivo, usando l'APIC come gestore delle interruzioni, l'INT 0, ovvero il Real Time Clock, confligge con il sistema ACPI di questo portatile. Ora, avete due strade per fare il boot.
1. Se siete fortunati, vi basterà disabilitare la INT0 dall'APIC (suppongo che il controllo di tale IRQ venga passato al PIC o a qualche altro dispositivo, altrimenti la vedo dura per il sistema funzionare senza temporizzazioni) semplicemente passando al kernel il parametro noapictimer.
Con GRUB, editate il file /boot/grub/grub.conf (o dove ce l'avete voi)
Code: | kernel /wherever/linux-2.6.$cose <opzionivarie> noapictimer |
e il sistema dovrebbe partire.
Con LiLO dovrebbe andare modificando il file di configurazione che forse è in /etc/lilo.conf ma non ci giurerei
Code: | append="<opzionivarie> noapictimer" |
ma non sono sicuro perché è molto che non uso LiLO. Dovrebbe poi bastarvi reinstallare LiLO.
Col vostro altro bootloader non so, ditemelo voi così posso aggiungerlo alla lista.
2. Se invece non siete fortunati vi tocca una strada che mi pare pericolosa non tanto per l'integrità del sistema, della macchina o dei vostri parenti quanto per le prestazioni del sistema. Vorrei che qualcuno mi smentisse ma si tratta di disabilitare il meccanismo di IRQ e passare all'antiquato sistema di polling. Comunque si tratta di aggiungere acpi=noirq irqpoll nei modi descritti poc'anzi.
1. I ferri del mestiere
Il perché la vostra DSDT (Differentiated System Description Table) non funziona come dovrebbe è perché è stata compilata con un compilatore fornito da Microsoft che, alla stregua di Windows, chiude non un occhio, non due occhi, perfino tre occhi su errori ed aberrazioni dei programmatori. Ovviamente due cose che chiudono gli occhi negli stessi punti funzionano abbastanza bene insieme, infatti non avete alcun genere di problemi in Windows, vero? Noticina polemica: la DSDT del mio fisso è perfetta ed è stata peraltro compilata con il compilatore Microsoft. Viene da pensare che questi errori siano introdotti di proposito nei laptop per rendere difficile la vita a Linux. Ok, ok, la smetto con i complottismi. Epperò...
Tanto per farla corta, Intel fornisce anch'essa un compilatore per il linguaggio usato da queste particolari tabelle e, guarda che coincidenza, è disponibile anche per linux. Emergerlo è molto semplice, il compilatore si chiama IASL.
2. Estrarre e disassemblare la DSDT del notebook
Facciamo finta che siete riusciti a fare il boot, ok? Dobbiamo passare alla fase emozionante della faccenda: smandruppare la DSDT. Per prima cosa dobbiamo localizzarla. Suppongo che per fare tutto ciò sia necessario essere root, sul mio portatile sono root di necessità virtù perché ho deciso di non completare l'installazione prima di essere riuscito almeno a far leggere la batteria a Linux, quindi non ho creato un utente. Diventiamo root, quindi. Se il sottosistema ACPI è relativamente attivo, un semplice
Code: | # ls /proc/acpi/dsdt |
dovrebbe darvi conferma circa l'esistenza di tale file. Non ci resta che crearne un dump da qualche parte.
Code: | # cat /proc/acpi/dsdt > ~/default.aml
# cd |
Dovreste ora essere in presenza del dump che ci interessa, non ci resta che disassemblarlo con
Code: | # iasl -d default.aml |
che dovrebbe creare un file di nome default.dsl. Createne una copia su cui lavoreremo.
Code: | # cp default.dsl custom.dsl |
3. Rattoppare il sorgente e ricompilarlo
Ho caricato nel mio sito i tre file salienti di tutto il procedimento. Attenzione, ancora una volta, questi li ho estratti dal mio notebook, fate attenzione, lavorate sui vostri seguendo il mio esempio. Se siete particolarmente temerari provate pure ad usare il mio già pronto e compilato ma non mi assumo responsabilità.
I tre file sono:
Ora, io non sono affatto un esperto di DSDT e DSL credevo fosse, al limite delle mie fantasie, un linguaggio a segni usato dai sub. Ho proceduto con un po' di buon senso, Google e questo sito che tratta di un modello diverso (il 1694WLMi) epperò simile. Il sito è http://djax.linuxbourg.ch/blog/?p=30 e si trova facilmente anche con Google.
Comunque, in teoria dovrebbe bastarvi guardare dentro al mio file dove ho messo in evidenza cosa facevo di volta in volta (i commenti li ho inseriti in stile C con un // a partire dalla prima colonna quindi sono abbastanza evidenti). Ripeto, dovrebbe anche bastarvi compilare il mio file ma... ok, l'avete capita.
Per vedere di volta in volta gli errori che spariscono, vi basta lanciare la compilazione sulla copia di lavoro.
Una volta che vi sono spariti errori e warning, dovreste aver anche ottenuto un file chiamato DSDT.aml. Siamo quasi arrivati.
4. Rattoppare il kernel e cambiare la DSDT col metodo initrd
Esistono due modi per sostituire la DSDT, uno è integrarla nel kernel costringendovi a ripetere il procedimento ogni volta che cambiate kernel, l'altro è via initrd che al momento non è molto migliore perché necessita di una patch del kernel. Si potrebbe forse aprire un bugreport per includerla in genpatches (http://dev.gentoo.org/~dsd/genpatches/)? A me sembrerebbe un'idea intelligente.
Io vi descrivo qui il metodo via initrd perché è quello che ho usato e quello che mi sembra più pratico. Prendete la patch da http://gaugusch.at/kernel.shtml ed applicatela al vostro kernel. Fate riferimento a quel sito per ogni dettaglio, comunque la procedura che ho seguito io è stata questa.
Code: | # cd /usr/src/linux
# patch -p1 < /tmp/acpi-dsdt-initrd-patch-v0.x-....patch
# make menuconfig |
Nel menu di configurazione del kernel dovete abilitare (ovviamente assumo che abbiate disabilitato APM e che abbiate tutto ciò che serve invece per l'ACPI, vero?)
Code: | Power Management options (ACPI, APM) --->
ACPI (Advanced Configuration and Power Interface) Support --->
[*] Read custom DSDT from initrd |
Poi fate il classico
Code: | # make && make modules_install
# mount /boot
# cp arch/i386/boot/bzImage /boot/linux-2.6.$cose |
Torniamo quindi al nostro file DSDT.aml. Io non uso un initrd quindi mi è stato sufficiente copiarlo in /boot e configurare GRUB in modo da caricarlo. Comunque voi potreste voler usare un initrd precedente, in questo caso dovete aggiungergli una firma che renda riconoscibile la posizione della vostra DSDT.
Code: | # echo -n "INITRDDSDT123DSDT123" >> /boot/initrd # supponendo che il vostro attuale initrd sia proprio /boot/initrd
# cat DSDT.aml >> /boot/initrd |
In caso non usaste un initrd vi sarà sufficiente copiare la vostra DSDT in /boot.
Code: | # cd
# cp DSDT.aml /boot |
Successivamente dovrete configurare GRUB o LiLO o chi per loro per caricarla. Con grub vi sarà sufficiente aggiungere
Code: | initrd /wherever/DSDT.aml |
a /boot/grub/grub.conf nella sezione relativa al kernel Linux mentre con LiLO inserirete
Code: | initrd = /wherever/DSDT.aml |
e poi reinstallerete LiLO.
A quanto pare siamo pronti per riavviare. Le opzioni da passare al kernel sono le stesse che vi ho citato al principio. Se tutto va bene, dovreste almeno riuscire a vedere lo stato della batteria (ricordatevi di inserirla, mica come il sottoscritto, eh... )
Ora godetevela. Mi raccomando, aspetto feedback. Quando sarò riuscito a far funzionare tutto, magari, pubblicherò un mega pippone nel mio sito con tutto spiegato per bene.
E ora buonanotte, ché gli esami mica aspettano me... -.-
Last edited by theRealMorpheu5 on Fri Mar 24, 2006 10:21 pm; edited 1 time in total |
|
Back to top |
|
|
gutter Bodhisattva
Joined: 13 Mar 2004 Posts: 7162 Location: Aarau, Aargau, Switzerland
|
Posted: Wed Mar 22, 2006 10:31 am Post subject: |
|
|
Moved from Forum di discussione italiano to Risorse italiane (documentazione e tools). _________________ Registered as User #281564 and Machines #163761 |
|
Back to top |
|
|
!equilibrium Bodhisattva
Joined: 06 Jun 2004 Posts: 2109 Location: MI/BG/LC
|
Posted: Thu Mar 23, 2006 11:16 am Post subject: |
|
|
ottima guida, mi è stata di aiuto per fixare il mio DSDT.
p.s.: hai scritto:
Code: | cat /prov/acpi/dsdt > ~/default.aml |
credo debba essere:
Code: | cat /proc/acpi/dsdt > ~/default.aml |
_________________ Arch Tester for Gentoo/FreeBSD
Equilibrium's Universe
all my contents are released under the Creative Commons Licence by-nc-nd 2.5 |
|
Back to top |
|
|
theRealMorpheu5 l33t
Joined: 26 Feb 2004 Posts: 841 Location: Vicenza, IT
|
Posted: Fri Mar 24, 2006 10:22 pm Post subject: |
|
|
Grazie, corretto |
|
Back to top |
|
|
GiRa l33t
Joined: 07 Apr 2005 Posts: 717
|
Posted: Sat Mar 25, 2006 10:01 am Post subject: |
|
|
Linka nel primo post l'how to oppure copialo nel primo post |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|