Risolto il problema della modalità sleep in Snow Leopard 2


Dopo l’istallazione di snow leopard sul mio PC basato sulla motherboard Gigabyte GA-EP35C-DS3R, il mio hackintosh funziona bene… ma non al 100%. Se si cerca di usare la funzione sleep (STOP sul menu della mela) si vede spegnere alcune periferiche (tra cui gli HD) ma il PC non si riuscirà a spegnere tutto, in particolare si sentono ancora le ventole girare e non si spegne il led di alimentazione. Inoltre NON E’ POSSIBILE RIACCENDERE CORRETTAMENTE SNOW LEOPARD muovendo il mouse o premendo un tasto da tastiera, unica possibilità è un riavvio brutale con il pulsante de reset.

Da quello che ho letto in giro su forum e googlate varie sembra essere un problema di gestione dell’alimentazione degli HUB USB da parte del sistema operativo, questo accade perchè nativamente Snow Leopard non gestisce il controller ICH9R, tuttavia gestisce il suo fratello maggiore ICH10R. Il trucco per risolvere questo dettaglio sulla mia GA-EP35C-DS3R consiste nel far credere al sistema operativo di avere (solo per quel che riguarda gli HUB USB) un ICH10R, patchando a dovere il file DSDT.aml.

Questo problema non è bloccante, si sopravvive anche senza usare la modalità sleep, ma è veramente utile per non aspettare i tempi di riavvio e sopratutto quando si vuole congelare tutte le finestre allo stato attuale per riprendere poi dal punto in cui ci si trovava. Finalmente la soluzione l’ho trovata.

Mi sono ispirato a questa guida: http://www.insanelymac.com/forum/index.php?showtopic=168014

  • procurarsi l’ultima versione dell’editor per DSDT a questo link: http://www.osx86.es/?p=610 (attenzione: se avete cambiato il percorso della cartella utente sulla vostra istallazione di SL questo programma può avere delle difficoltà di funzionamento, consiglio di ripristinare il percorso originale oppure utilizzare una istallazione di SL vergine)
  • caricare l’attuale file DSDT che si trova sotto /Extra/DSDT.aml
  • verificare che compili correttamente (in caso contrario non saprei cosa consigliare)
  • ricercare la sezione che inizia con Device (USB0)
  • come già spiegato il trucco è di assegnare dei device-id dell’ICH10R al posto di quelli dell’ICH9R
  • i device id delle USB dell’ICH9R sono questi (dovreste verificare che corrispondono a quelli presenti dall’interrogazione dell’hardware con il programma IORegistryExplorer, se non corrispondono questa guida non fa per voi)
UHCI 1: 1D    2934
UHCI 2: 1D,1  2935
UHCI 3: 1D,2  2936
UHCI 4: 1A    2937
UHCI 5: 1A,1  2938
UHCI 6: 1A,2  2939
  • i device id delle USB dell’ICH10R che dovremmo considerare nella patch in questione:
UHCI 1: 1D    3a34
UHCI 2: 1D,1  3a35
UHCI 3: 1D,2  3a36
UHCI 4: 1A    3a37
UHCI 5: 1A,1  3a38
UHCI 6: 1A,2  3a39
  • i buffers sono scritti in notazione “back-wards”, per esempio il device-id per USB0 (che è “3a34”) deve essere scritto come “0x34, 0x3A, 0x00, 0x00”
  • per ogni USB0,1,2,3,4,5 andare ad aggiungere in fondo alla sezione Device (USBx) (prima della chiusura della parentesi graffa) questo codice:
               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x34, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }

…sostituendo adeguatamente il devide-id per ciascuna delle 6 USB HUB

  • si dovrebbe ottenere un risultato simile a questo:
    Device (USB0)
           {
               Name (_ADR, 0x001D0000)
               [...]

               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x34, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }
           }

           Device (USB1)
           {
               Name (_ADR, 0x001D0001)
               [...]

               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x35, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }
           }

           Device (USB2)
           {
               Name (_ADR, 0x001D0002)
               [...]

               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x36, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }
           }

           Device (USB3)
           {
               Name (_ADR, 0x001A0000)
               [...]

               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x37, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }
           }

           Device (USB4)
           {
               Name (_ADR, 0x001A0001)
               [...]

               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x38, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }
           }

           Device (USB5)
           {
               Name (_ADR, 0x001A0002)
               [...]

               Method (_DSM, 4, NotSerialized)
               {
                   Store (Package (0x02)
                       {
                           "device-id",
                           Buffer (0x04)
                           {
                               0x39, 0x3A, 0x00, 0x00
                           }
                       }, Local0)
                   DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                   Return (Local0)
               }
           }
  • salvate e compilate il file, ottenendo il nuovo DSDT.aml
  • sostituite il nuovo DSDT.aml dentro la cartella /Extra
  • riavviare e verificare quindi il corretto funzionamento della funzione STOP

Altre persone che testimoniano che questa procedura funziona sono su questo thread: http://ihackintosh.org/forum/index.php?topic=13353.0