Jump to content

[Guida] Caricare AppleLPC.kext via DSDTinject AUTOMATICA!


scrax
 Share

32 posts in this topic

Recommended Posts

Questa patch permette di avere un device LPC appropriato con OSX.

Permette di ridurre la temperatura Usando lo Speedstep nativo del sistema (Appleintelcpupowermanagement.kext).

 

Necessario:

 

Update!

  • 19-02-2011
    corretto riconoscimento patch da applicare
    sostituzione metodo DTGP con MCDP (codice migliore)
    iniziato a inserire prima parte automatizzare la scelta del id da inserire
    aggiunte opzioni -i e-z e mini help
  • 17-02-2011 Aggiunti SMBus fix e download automatico iasl in caso mancasse

Al post #12 uno script per controllare in automatico il giusto caricamento di LPC ed in caso contrario correggere il dsdt in automatico ;)

Qua l'ultima versione aggiornata in tempo reale (possibili errori a ondate)

Qui invece uno zip con li ultime modifiche o aggiunte stabili

 

  • Iaslme per de/compilare il file dsdt da modificare;
  • TextEdit per modificare dsdt.dsl
  • lspci per conoscere i nostri device id

 

OTTENERE DSDT.DSL

  • DA Terminale postate questo codice:
    perl -e 'open(CMD, "ioreg -lw0 \| grep DSDT|") or die; while(<CMD>) { chomp; if($_ =~ /\"DSDT\.?\d?\"=<([^>]*)>/) { $buff = $1; open(PIP, "|xxd -r -p > ~/Desktop/dsdt.aml") or die; print PIP "$1"; } }'



  • avrete un nuovo file dsdt.aml sul desktop
  • Trascinate il file sull'icona di IaslMe e vi apparirà dsdt.dsl sul desktop
  • Apritelo con un text editor per effettuare le patch

MODIFICARE DSDT.DSL

Prima cosa verificate se nel dsdt.dsl c'e questa parte (che serve per far funzionare le iniezioni tramite dsdt):

	// New Method V1.3 – By Master Chief. USE: MCDP (Arg2, RefOf (Local0))\
Method (MCDP, 2, NotSerialized) {If (LEqual (Arg0, Zero)) /*Function index: 0*/\
	{Return (Buffer (One) { 0x03 })} Return (DeRefOf (Arg1))}// Modified return value!\

Se non c'è aggiungetela prima dell'ultima parentesi grafa }

 

Poi cercate nel vostro dsdt.dsl:

Name (_ADR, 0x001F0000)

E nella linea subito sotto incollate:

				Method (_DSM, 4, NotSerialized)
			{
				Store (Package (0x02)
					{
						"device-id",
						Buffer (0x04)
						{
							/*SOSTITUIRE_CON_ID_VOLUTO*/
						}
					}, Local0)
				MCDP (Arg2, RefOf (Local0))
				Return (Local0)
			}

 

Ora la parte importante, otteniamo il nostro device id da terminale con

lspci -nn

dopo aver installato il pacchetto lspci.

 

Quindi dobbiamo sceglierne uno il più simile possibile tra questi (cioè quelli riconosciuti da AppleLPC.kext):

 

INTEL :

pci8086,2811 -> 0x11, 0x28, 0x86, 0x80

pci8086,2815 -> 0x15, 0x28, 0x86, 0x80

pci8086,27b9 -> 0xb9, 0x27, 0x86, 0x80

pci8086,27bd -> 0xbd, 0x27, 0x86, 0x80

pci8086,2670 -> 0x70, 0x26, 0x86, 0x80

pci8086,8119 -> 0x19, 0x81, 0x86, 0x80

pci8086,2916 -> 0x16, 0x29, 0x86, 0x80

pci8086,3a18 -> 0x18, 0x3a, 0x86, 0x80

pci8086,3b00 -> 0x00, 0x3b, 0x86, 0x80

pci8086,3b01 -> 0x01, 0x3b, 0x86, 0x80

pci8086,3b02 -> 0x02, 0x3b, 0x86, 0x80

pci8086,3b09 -> 0x09, 0x3b, 0x86, 0x80

NVIDIA

pci10de,aac -> 0x0C, 0xAA, 0xDE, 0x10

pci10de,aae -> 0x0E, 0xAA, 0xDE, 0x10

pci10de,aaf -> 0x0F, 0xAA, 0xDE, 0x10

pci10de,d80 -> 0x80, 0x0d, 0xDE, 0x10

pci10de,d81 -> 0x81, 0x0d, 0xDE, 0x10

pci10de,d82 -> 0x82, 0x0d, 0xDE, 0x10

pci10de,d83 -> 0x83, 0x0d, 0xDE, 0x10

 

ad esempio per un LPC che ha come ID pci10de,aab useremo pci10de,aac

 

deciso che id vogliamo usare sostituiamo nella parte appena incollata nel dsdt

/*SOSTITUIRE_CON_ID_VOLUTO*/

con l'id che vogliamo iniettare ma scritto così:

0x0C, 0xAA, 0xDE, 0x10

 

Altro es. ID pciABCD,EFGH -> 0xGH 0xEF 0xCD 0xAB

 

COMPILAZIONE DSDT.AML

salvate dsdt.dsl e trascinatelo sull'icona di IaslMe, otterrete una cartella sessions con dentro un'altra cartella contenete il dsdt.aml compilato

Trascinate dsdt.aml in /Extra sostituendolo se già presente (avete già un backup vero?)

 

Riavviando dovrebbe venir caricato AppleLPC.kext

Usate da terminale

 kextstat -k | grep LPC

per verificarlo, se non ottenete nulla vuol dire che non c'è nessun driver caricato e quindi LPC non è riconosciuto

Se viene riconosciuto il driver viene caricato e otteniamo un messaggio tipo:

76 0 0x5d4e4000 0x3000 0x2000 com.apple.driver.AppleLPC (1.4.12) <14 5 4 3>

I numeri posson cambiare l'importante è che com.apple.driver.AppleLPC sia visualizzato e quindi caricato

 

SPIEGAZIONE COMANDO:

kextstat -k | grep LPC

kextstat serve per visualizzare i kext caricati dal sistema, mentre grep cerca (nel risultato di kextstat che gli passiamo con il carattere "|") una linea che contenga LPC e se la trova la visualizza (-k serve per non includere info sul kernel che non ci interessano)

Link to comment
Share on other sites

quindi se dopo il

kextstat -k | grep LPC

il terminale risponde

   76	0 0x5d4e4000 0x3000	 0x2000	 com.apple.driver.AppleLPC (1.4.12) <14 5 4 3>

è tutto ok! no??

Esatto, aggiungo l' es. nel primo post per evitare dubbi, grazie.

 

ora ne vogliamo una per il southbridge :P

 

complimenti per la guida ovviamente!

ciao!

:P

 

Per ora accontentiamoci, LPC è nel southbridge... :gun::P

 

 

Le funzionalità di un southbridge attuale includono

Bus PCI - Include le tradizionali specifiche, ma anche quelle per PCI-X e PCI-Express

Bus ISA - L' ISA bus è ancora integrato nei moderni southbridge anche se nei PC consumer non è più utilizzato. Lo si adopera però ancora nei PC industriali, specie nel formato PC/104.

Bus SM - È usato per comunicare con altre periferiche della scheda madre (p.e. ventole)

Controller DMA - Permette alle periferiche sotto al southbridge di accedere direttamente alla memoria principale senza ricorrere alla CPU

Controller Interrupt - Permette alle periferiche collegate di ottenere attenzione dalla CPU

Controller IDE, SATA o PATA - Consentono una connessione diretta delle periferiche di archiviazione al sistema

LPC Bridge- Fornisce il data e il control path per il Super IO (SIO)

Real Time Clock - Orologio in tempo reale, alimentato da una batteria a tampone

Gestione dell'alimentazione elettrica (APM e ACPI) - Forniscono metodi e segnali per permettere al computer di andare in stand-by o spegnersi per risparmiare energia

CMOS - Aiutato dalla batteria tampone, crea un'area limitata di memoria non volatile per le configurazioni di sistema (BIOS)

Inoltre il southbridge include anche il supporto per Ethernet, RAID, USB, codec audio e firewire. Può anche includere, anche se raramente, il supporto per tastiere, mouse e porte seriali, ma normalmente queste periferiche sono connesse tramite un'altra periferica chiamata Super IO.

da wikipedia
Link to comment
Share on other sites

eccovi una sorpresina...

ma mi serve aiuto per testarla bene.

 

eccovi un Autopatcher per LPC e SMBUS ,

in pratica fa in automatico guello cho dice la guida, manca solo la parte per decidere che id usare (chiede a noi di scegliere)

se vi funziona proverò a espanderlo con altre patch e soprattutto vorrei renderlo totalmente automatico.

 

Per ora eliminiamo LPC e SMBUS dalla lista :D

Bus PCI - Include le tradizionali specifiche, ma anche quelle per PCI-X e PCI-Express

Bus ISA - L' ISA bus è ancora integrato nei moderni southbridge anche se nei PC consumer non è più utilizzato. Lo si adopera però ancora nei PC industriali, specie nel formato PC/104.

Bus SM - È usato per comunicare con altre periferiche della scheda madre (p.e. ventole)

Controller DMA - Permette alle periferiche sotto al southbridge di accedere direttamente alla memoria principale senza ricorrere alla CPU

Controller Interrupt - Permette alle periferiche collegate di ottenere attenzione dalla CPU

Controller IDE, SATA o PATA - Consentono una connessione diretta delle periferiche di archiviazione al sistema

LPC Bridge- Fornisce il data e il control path per il Super IO (SIO)

Real Time Clock - Orologio in tempo reale, alimentato da una batteria a tampone

Gestione dell'alimentazione elettrica (APM e ACPI) - Forniscono metodi e segnali per permettere al computer di andare in stand-by o spegnersi per risparmiare energia

CMOS - Aiutato dalla batteria tampone, crea un'area limitata di memoria non volatile per le configurazioni di sistema (BIOS)

Inoltre il southbridge include anche il supporto per Ethernet, RAID, USB, codec audio e firewire. Può anche includere, anche se raramente, il supporto per tastiere, mouse e porte seriali, ma normalmente queste periferiche sono connesse tramite un'altra periferica chiamata Super IO.

 

ROSSO: In implementazione

ARANCIO: In test

VERDE: Testato (poco per ora. serve il vostro aiuto.)

USO:

Spacchettate e eseguite il file .commad

la cartella Tools con all'interno iasl non va spostata o iasl verrà scaricato ogni volta che non viene trovato dallo script per poter funzionare. :)

 

STRUTTURA FILE:

/qualsiasi cartella/LPCBFix.command

/qualsiasi cartella/Tools/iasl

 

risultato:

/qualsiasi cartella/dsdt.aml

o

/Extra/dsdt.aml (rinomina il precedente come dsdt.backup.aml)

 

NOTA: Può servire anche semplicemente come controllo. Se LPC e SMBUS sono ok vi avverte e si ferma

 

 

EDIT: DOWNLOAD AGGIORNATO NEL PRIMO TOPIC

Link to comment
Share on other sites

Si potrebbe provare a strutturarlo in modo che determini automaticamente qual è il miglior id da usare.

Hai qualche idea in mente?

 

si è quello che intendevo qui, per ora non so ancora

in pratica fa in automatico guello cho dice la guida, manca solo la parte per decidere che id usare (chiede a noi di scegliere)

se vi funziona proverò a espanderlo con altre patch e soprattutto vorrei renderlo totalmente automatico

 

Pensavo a convertire gli id in numero decimale e poi vedere matematicamente quale è il più simile, però forse c'è un comando che lo fa già.

 

Si accettano suggerimenti e modifiche.

 

Da aggiungere:

  • Automatizzare completamente LPC con scelta codec-id più simile
  • Cercare nella cartella di avvio eventuali dsdt.aml o .dsl e usare questi se presenti invece che quello in uso dal sistema.

 

buoo l'hai provato? ti funziona?

Link to comment
Share on other sites

Ho provato a realizzare un piccolo algoritmo che determina il corretto id per il Device LPC

 

[b]A=   //Assegnata  di dimensione ( 4 X 19 )

1 1 2 8
1 5 2 8
b 9 2 7
b d 2 7
7 0 2 6
1 9 8 1
1 6 2 9
1 8 3 a
0 0 3 b
0 1 3 b
0 2 3 b
0 9 3 b        
0 c a a
0 e a a
0 f a a
8 0 0 d
8 1 0 d
8 2 0 d
8 3 0 d

B=         //Proprio id   di dimensione ( 4 )

1
6
3
a


For i = 1,19

     C ( i ) = 0

  For j = 1,4

      If

         A ( i , j ) = B ( j )

      Then

         C ( i ) = C ( i ) + 1     // Vettore di dimensione 19 , l'i-sima componente può avere un valore minore o uguale a 4 
                                   // Questo numero sta per il numero di elementi dell'i-sma riga che coincidono con gli elementi del vettore B
      EndIf 

EndFor    

C ( 1 ) = Max

r = 1            

For i = 2,19

     If

        C ( i ) > Max

     Then

        Max = C ( i )

        r = i                 // i-sima riga della matrice ( Corretto id da usare )
                              // Alla fine del ciclo For l'elemento r conterrà l'indice riga della matrice A 
     EndIf

EndFor   [/b]

 

 

Non l'ho ancora testato, stasera lo provo.

Ho testato lo script con i giusti id nel dsdt, la risposta è stata SMBus : OK

Poi avviato senza dsdt ed ha risposto ancora SMBus : OK , nella cartella temp ho trovato un dsdta.dsl contenente il method dtgp ma non ha aggiunto id.

Link to comment
Share on other sites

Ho provato a realizzare un piccolo algoritmo che determina il corretto id per il Device LPC

 

[b]A=   //Assegnata  di dimensione ( 4 X 19 )

1 1 2 8
1 5 2 8
b 9 2 7
b d 2 7
7 0 2 6
1 9 8 1
1 6 2 9
1 8 3 a
0 0 3 b
0 1 3 b
0 2 3 b
0 9 3 b        
0 c a a
0 e a a
0 f a a
8 0 0 d
8 1 0 d
8 2 0 d
8 3 0 d

B=         //Proprio id   di dimensione ( 4 )

1
6
3
a


For i = 1,19

     C ( i ) = 0

  For j = 1,4

      If

         A ( i , j ) = B ( j )

      Then

         C ( i ) = C ( i ) + 1     // Vettore di dimensione 19 , l'i-sima componente può avere un valore minore o uguale a 4 
                                   // Questo numero sta per il numero di elementi dell'i-sma riga che coincidono con gli elementi del vettore B
      EndIf 

EndFor    

C ( 1 ) = Max

r = 1            

For i = 2,19

     If

        C ( i ) > Max

     Then

        Max = C ( i )

        r = i                 // i-sima riga della matrice ( Corretto id da usare )
                              // Alla fine del ciclo For l'elemento r conterrà l'indice riga della matrice A 
     EndIf

EndFor   [/b]

 

 

Non l'ho ancora testato, stasera lo provo.

Ho testato lo script con i giusti id nel dsdt, la risposta è stata SMBus : OK

Poi avviato senza dsdt ed ha risposto ancora SMBus : OK , nella cartella temp ho trovato un dsdta.dsl contenente il method dtgp ma non ha aggiunto id.

Grazie!

 

Avviando senza dsdt vuol dire che Osx ha caricato quello originale, che avrebbe dovuto esser patchato?

Puoi postare il dsdt.dsl originale e il dsdta.dsl che hai ottenuto?

 

Senza dsdt.aml cosa ottieni con:

 

kextstat -k | grep SMBusController

Link to comment
Share on other sites

Test #1

 

Utilizzando in Extra un dsdt patchato con questi ID

 

206hpgx.png

 

e dando il comando al terminale ottengo

 

w4eo6.png

 

lancio lo script ed ottengo questo

 

14b3rew.png

 

Questa è la cartella temp che ottengo temp.zip

 

 

 

------------------------------------------------------------------------------

 

 

Test #2

 

Avviando con il dsdt originale del mio bios e dando il comando al terminale ottengo

 

167l5xx.png

 

lancio lo script ed ottengo questo

 

14site.png

 

Questa è la cartella temp che ottengo temp2.zip

Link to comment
Share on other sites

Una GUIDA per l' lpc? :)

E' nata come aggiunta di questa guida: Analisi del nosto hack*

 

Poi con lo script sta diventando qualcosa di più di una semplice guida...

 

Per adesso lo script nelle sue ultime modifiche controlla SMBus e LPC e avviato con -z prepara il caBp con le EFI string per la GPU e isl SATA della mia mobo, ma penso di aggiungere altri controlli generici tipo da AZAL a HDEF per l' audio e binpatch di AppleHDA, HPET fix, SATA fix, e già con questi molte ASUS son abbastanza apposto. Un RTCfix generico forse è più difficile da fare, ma vedo cosa riesco a inventarmi.

 

Questa cosa mi serve per imparar meglio l'uso degli script e in più mi permette di ricordarmi come fare certe patch.

 

Se volete contribuire testando lo script o proponendo nuovo codice sono tuttorecchi|

 

Per la scelta automatica degli id ad esempio:

 

per trovare l'id più simile ho creato un ciclo che sottrae ad ogni id supportato il nostro id. Per far ciò converto gli id da esadecimali a decimali e ottengo questi valori:

 

AppleID(aac) - YourID(aac) = 0			2732-2732=0 
AppleID(aae) - YourID(aac) = -2			2732-2734=-2 
AppleID(aaf) - YourID(aac) = -3			2732-2735=-3 
AppleID(d80) - YourID(aac) = -724		2732-3456=-724 
AppleID(d81) - YourID(aac) = -725		2732-3457=-725 
AppleID(d82) - YourID(aac) = -726		2732-3458=-726 
AppleID(d83) - YourID(aac) = -727		2732-3459=-727

 

Il valore più basso è quello più simile. Nel nostro caso essendo il mio id uguale a uno apple in un confronto ho 0.

Ora devo trovare la maniera per estrarre dal ciclo solo l'id con il risultato più basso dopo di chè posso convertirlo e aggiungerlo al dsdt

automatizzando il tutto...

con sort -n son riucito ad avere solo il valore che mi interessa....

ora vedo d'implementarlo.. :)

 

Risolto così:

		range=( $( (for v in d80 d81 d82 d83 aac aae aaf; do   #  ciclo di id apple (v)
		let t=0x"${v}"; y=$((${t}-${d}))	# convertiti in decimale da let uno per ciclo e sottratto nostro id
		echo ""${y}" "${v}""						  # Mostra risultato per primo e id da iniettare poi 
	done) | sed s/-// | sort -n | awk '{print $2}' ) )   # finito il ciclo togliamo i - , ordiniamo i risultati e prindiamo solo il secondo valore  della riga (l'id da iniettare)
	IDFinal="0x0"${range[0]:2:1}", 0x"${range[0]:0:2}", 0xde, 0x10"   # id convertito per l'iniezione

 

Ho fatto ulteriori modifiche e aggiustamenti. Ora cerca i giusti indirizzi delle periferiche sfruttando ioreg (LPC) o lspci -nn (SMBus). Preferirei fare a meno di usare lspci ma non ho trovato una maniera equivalente usando ioreg, infatti la parte per LPC è abbastanza a rischio errori...

 

Eccolo:

ACPISmartPatch v0.3

Link to comment
Share on other sites

Altra bellissima guida ;) i miei complimenti

Io ottengo "Nessuna patch necessaria" ad entrambi i controlli, e con entrambe le versioni di ACPISmartPatch. Possibile che il dsdt che uso vada bene per la mia mobo? (non ho mai fatto modifiche per abilitare lo speed step)

Inoltre dai log vedo correttamente avviato Appleintelcpupowermanagement, anche se ho un errore

ACPI_SMC_PlatformPlugin::pushCPU_CSTData - _CST evaluation failed
Feb 20 22:59:30: --- last message repeated 1 time ---
Feb 20 22:59:24 MacPro-di-fiox kernel[0]: ACPI_SMC_PlatformPlugin::registerLPCDriver - WARNING - LPC device initialization failed: C-state power management not initialized

Link to comment
Share on other sites

Altra bellissima guida ;) i miei complimenti

Io ottengo "Nessuna patch necessaria" ad entrambi i controlli, e con entrambe le versioni di ACPISmartPatch. Possibile che il dsdt che uso vada bene per la mia mobo? (non ho mai fatto modifiche per abilitare lo speed step)

Inoltre dai log vedo correttamente avviato Appleintelcpupowermanagement, anche se ho un errore

ACPI_SMC_PlatformPlugin::pushCPU_CSTData - _CST evaluation failed
Feb 20 22:59:30: --- last message repeated 1 time ---
Feb 20 22:59:24 MacPro-di-fiox kernel[0]: ACPI_SMC_PlatformPlugin::registerLPCDriver - WARNING - LPC device initialization failed: C-state power management not initialized

se stai usando quello id maldon le ha già applicate lui,

Per quell'errore prova aggiungendo GenerateCStates=Yes e DropSSDT=Yes in com.apple.Boot.plist

Link to comment
Share on other sites

se stai usando quello id maldon le ha già applicate lui,

Per quell'errore prova aggiungendo GenerateCStates=Yes e DropSSDT=Yes in com.apple.Boot.plist

 

Si uso quello di Maldon, ma il primo dsdt che ha modificato, appena ho qualche minuto vedo di trovare il problema, anche con GenerateCStates=Yes e DropSSDT=Yes ho gli stessi guai

Link to comment
Share on other sites

  • 1 month later...

ciao matti!!

ho fatto tutto.

2 cose.. lo script mi dice che non ho bisogno di fare nulla.. ma se faccio un kextstat di AppleLPC e AppleSMBus non esce nulla!

come è possibile .. lo script è perfetto.. eppure non sono in memoria!

 

dunque.. ho messo nel dsdt quanto necessario.. a mano

il mio lspci -nn dice

00:1f.0 ISA bridge [0601]: Intel Corporation ICH9M LPC Interface Controller [8086:2919] (rev 03)

00:1f.3 SMBus [0c05]: Intel Corporation 82801I (ICH9 Family) SMBus Controller [8086:2930] (rev 03)

 

 

ho fatto naturalmente le iniezioni..

e come dici tu, nel mio caso 2919 lpc ho messo una voce vicina..

eppure ho boostrappato -v -f.. controllo

nisma

 

ogni volta.. se faccio a mano kextload.. lo carico

e poi lo vedo:

117 0 0xffffff7f81590000 0xb000 0xb000 com.apple.driver.AppleSMBusController (1.0.8d0) <35 9 8 5 4 3>

118 0 0xffffff7f8159b000 0x3000 0x3000 com.apple.driver.AppleLPC (1.4.12) <9 5 4 3>

 

poi al riavvio nulla

come mai mac non li vuole caricare automaticamente?

Link to comment
Share on other sites

 Share

×
×
  • Create New...