Mappatura porte USB Intel
Questa sezione della guida è presa da questo link. Tutti i crediti relativi a questa sezione vanno ai rispettivi autore
Quando si sceglie un SMBIOS da emulare - ad esempio iMacPro1,1 - macOS caricherà una mappatura delle porte USB relativa a tale macchina. Apple conosce perfettamente la configurazione hardware dei suoi modelli dunque non occorre effettuare una scansione dell’hardware (come fanno Windows e Linux). Tutto è noto in anticipo.
Una cosa che Apple sa è che nessuna delle loro macchine ha più di una dozzina di porte USB per controller, tant’è che a partire da macOS 10.11 (El Capitan) hanno introdotto un limite rigido di porte USB per controller, pari a 15.
D’altronde, l’hardware dei PC è molto vario. La maggior parte delle schede madri presenta un grande numero di porte USB interne ed esterne. Non è raro trovare 6-8 o più porte USB nel back-panel.
Eventuali porte USB presenti sul case sono collegate agli header interni della scheda madre. Ogni porta USB 3.0 è retrocompatibile con le USB 2.0 e per tanto ogni porta USB 3.0 viene contata due volte (una USB 3.0 e una USB 2.0). In più ci sono le porte USB Type-C che sono compatibili USB 3.0 e USB 2.0 ma sono anche invertibili e per tanto richiedono uno speciale trattamento.
In generale, in funzione del chipset e delle specifiche della scheda madre, questo limite di 15 porte può essere facilmente sforato.
Tuttavia, ciò che ci salva è che di solito ci sono diversi controller USB nell’hardware del PC e dipende dal chipset e dalle scelte del produttore.
Eventuali HUB USB e altri dispositivi non vengono considerati in quatno sono sempre collegati ad una sola porta.
Cosa significa tutto ciò?
La conseguenza più ovvia è che alcune porte USB potrebbero non funzionare: macOS ignorerà ogni porta USB numerata dopo la 15esima su quel particolare controller.
Non c’è alcuna logica specifica relativa a quale porta non funzionerà ma generalmente vengono enumerate prima le porte logiche USB 2.0 e poi le porte USB 3.0. E’ possibile addirittura che alcune porte verranno ignorate, nonostante il numero totale di porte sia inferiore a 15, proprio a causa della mappatura hardware di macOS; sulla mia scheda madre ASRock, le porte 1 e 9 sono state rimosse da uno dei 3 controller USB presenti.
Come potete notare, questa mappa non è sequenziale e le porte fisiche vengono mappate su posizioni (più o meno) casuali.
Requisiti
- Sito e manuale della scheda madre/laptop
- Dispositivo USB 2.0 (un mouse, una tastiera et similia)
- Dispositivo USB 3.0 (una chiavetta USB 3.0, un HDD esterno et similia)
- Chiavetta USB su cui mettere OpenCore
- Tabelle ACPI estratte tramite la EFI di debug
- MaciASL
- Hackintool
- Saper montare una partizione EFI
- Modificare il config.plist di OpenCore
Iniziamo
Come prima cosa è bene contare le porte USB presenti sulla propria macchina seguendo il seguente criterio:
- le porte USB 2.0 vengono contate come porte singole
- le porte USB 3.0 vengono contate come se fossero due porte USB, per via della retrocompatibilità
- eventuali periferiche collegate agli header interni della scheda madre vengono contate come porte singole (esempio: porte del front panel del case o Fenvi T919)
- non rientrano nella mappatura eventuali porte del controller ASMedia
- non rientrano nella mappatura eventuali HUB USB collegati alla macchina: questi sono pur sempre collegati ad una singola porta USB
Esempio
Scheda madre: Asus Z370 Prime A II (link sito)
Secondo la pagina ufficiale della scheda madre abbiamo fino a 12 porte USB (inclusi gli header USB della motherboard):
La seguente è una foto del back panel della scheda madre stessa:
Procedendo da sinistra verso destra e dall’alto verso il basso, possiamo contare ben:
- 1 porta USB 3.1 Gen 2 Type-A, appartenente al controller ASMedia (la porta color verde acqua)
- 1 porta USB 3.1 Gen 2 Type-C, appartenente al controller ASMedia (la porta Type-C)
- 2 porte USB 2.0 Type-A
- 2 porte USB 3.1 Gen 1 Type-A
Q: Dunque quante porte della scheda madre dobbiamo mappare?
A: Escludendo le porte appartenenti al controller ASMedia, dobbiamo mappare le 2 porte USB 2.0 Type-A e le due porte USB 3.1 Gen 1 Type-A, per un totale di 6 porte USB:
- 2 porte USB 2.0
- 4 porte USB (2 USB 3.0 e le due porte USB 2.0 retrocompatibili con le USB 3.0)
N.B. Qualora il numero di porte USB calcolate sia superiore a 15, bisogna abilitare il quirk config.plist/Kernel/Quirks/XhciPortLimit
Step 1: Estraiamo le tabelle ACPI ed identifichiamo la tabella USB
Prima di spiegare come estrarre le tabelle ACPI ci terrei a ringraziare @A23SS4NDRO per il testing di questa procedura.
Per prima cosa, scaricare la EFI di Debug di OpenCore e dopo averla messa nella partizione EFI della chiavetta USB, avviare il PC dalla stessa.
Compariranno diverse scritte: non c’è motivo di temere. Una volta arrivati al boot-menu spegnere il PC, riavviare su macOS e montare la partizione EFI della USB.
Oltre alla cartella EFI precedentemente posizionata, troverete due nuovi elementi:
- cartella
SysReport
opencore-YYYY-MM-DD_hh-mm-ss.txt
Il risultato è simile alla seguente foto:
Arrivati a questo punto, aprire la cartella SysReport/ACPI
e identificare la tabella ACPI contenente la mappatura delle porte USB.
Q: Come diamine identifico questa tabella?
A: Generalmente la tabella ACPI che definisce il comportamento delle porte USB si chiama SSDT-xxxxxx.aml
: aprire ogni singolo file che si chiama così e cercare HS01
. Iterare questo procedimento finchè non viene identificata la tabella giusta. Qualora non sia stato possibile identificare la tabella ACPI, ripetere il procedimento appena spiegato con il file chiamato DSDT.aml
Esempio: nel mio caso la tabella ACPI che definisce il comportamento delle porte USB si chiama SSDT-2-xh_OEMBD.aml
. So per certo che è la tabella ACPI giusta dal momento che fra le external references ci sono le varie porte USB disponibili sulla mia scheda madre
Q: Ok. e adesso cosa faccio?
A: Adesso occorre identificare il nome delle porte USB tramite Hackintool. E’ bene iniziare dalle porte del back panel per poi procedere con le porte del front panel
Step 2: Identificazione delle porte USB tramite Hackintool
Aprire Hackintool e recarsi nella sezione USB:
Cliccare sull’icona della scopa ed in seguito cliccare sull’icona del refresh button.
Il risultato è simile alla foto di cui sopra.
Arrivati a ciò, staccare ogni periferica USB esterna collegata al PC (mouse, tastiera ecc).
Prendere una periferica USB 2.0, come da requisiti, e collegarla ad una porta USB del back panel. Iterare questo procedimento per ogni porta USB.
Il risultato dovrebbe essere simile al seguente:
Nel mio caso, le seguenti porte USB2.0 sono state testate:
HS01
(è la porta retrocompatibile USB3.0)HS03
HS04
(è la porta retrocompatibile USB3.0)HS06
(lettore schede microSD)
N.B. non tutti i lettori di schede (micro)SD sono mappabili via USB. Dipende dalla motherboard in questione.
Fanno eccezione le seguenti porte, che sono interne alla motherboard (nel mio caso un laptop):
HS05
HS07
Ripetere la procedura per le porte USB 3.0 e segnarsi le porte.
Nel mio caso:
Le porte USB 3.0 sono:
SS01
SS03
SS04
Step 3: Mappare le USB modificando il metodo _UPC
Prima di mappare le porte USB è bene segnare da qualche parte il valore della Table Length
, che trovate in cima al file, come da foto:
Nel mio caso, la Table Length ha un valore di 1879
. E’ bene ricordare questo valore perchè servirà in seguito per caricare la mappatura patchata.
Iniziamo la mappatura aggiungendo il metodo GENG
tramite il menù patch.
Trovate in allegato la patch: patch.txt.zip
Applicate la patch e cercate la prima porta USB 2.0 della lista che avete appuntato prima. Esempio: HS01
Nel mio caso, le porte USB sono definite come segue:
Secondo l’Advanced Configuration and Power Interface (ACPI) Specification, version 6.3, pagina 673, il metodo _UPC
ha come valore di ritorno il seguente Package:
Return Value Information:
Package {
Connectable // Integer (BYTE)
Type // Integer (BYTE)
Reserved0 // Integer
Reserved1 // Integer)
}
Dove:
Connectable
è un valore booleano che disattiva/attiva la porta USB (rispettivamente 0/1)Type
specifica la tipologia di connettore USB
Per semplificarvi la vita ho creato un elenco di valori di Type
Hex | USB Type |
---|---|
0x00 |
Type ‘A’ connector aka USB2 |
0x01 |
Mini-AB connector |
0x02 |
ExpressCard |
0x03 |
USB 3 Standard-A connector |
0x04 |
USB 3 Standard-B connector |
0x05 |
USB 3 Micro-B connector |
0x06 |
USB 3 Micro-AB connector |
0x07 |
USB 3 Power-B connector |
0x08 |
Type C connector - USB2-only |
0x09 |
Type C connector USB2 and SS with Switch |
0x0A |
Type C connector - USB2 and SS without Switch |
0x0B-0xFE |
Reserved |
0xFF |
Proprietary connector |
N.B. lo switch presente nella porta USB identificata dal tipo 0x09
, sta ad indicare che la porta assume il comportamento di una USB3.0 in funzione del verso in cui viene inserita la periferica
Q: Dunque come mappo?
A: Devi cambiare il valore di ritorno del metodo _UPC
come segue:
- le porte USB 2.0 sono identificate dal nome
HSxx
e come valore di Type0x00
se sono porte USB 2.0 appartenenti al back panel, altrimenti0xFF
(esempio: la Fenvi T919 ha come Type0xFF
) - le porte USB 3.0 sono identificate dal nome
SSxx
e come valore di Type0x03
o addirittura0x07
qualora sia presente l’icona di una batteria di fianco alla porta stessa (che sta ad indicarepowered
) - non occorre modificare il metodo
_UPC
per eventuali porte USB Type-C
Dunque nel caso di una porta USB 2.0 presente sul back panel, avrò un risultato simile a quanto segue:
dove il primo parametro One
sta ad indicare che la porta è attiva, mentre Zero
indica la tipologia di connettore.
Iterare questo procedimento per ogni porta USB 2.0 del back panel.
N.B. Per le porte USB 2.0 del front panel il valore di Type deve essere 0xFF
:
Per le porte USB 3.0 invece, il valore di Type è 0x03
(o in casi estremi 0x07
):
Per tutte le altre porte USB non rilevate dalla mappatura (ossia quelle non evidenziate in verde su Hackintool) assicurarsi che il metodo _UPC
ritorni il valore GUPC(Zero)
.
Esempio:
Una volta conclusa la mappatura delle porte USB, salvare il file e posizionarlo nella cartella OC/ACPI
della EFI.
Infine, aprire il config.plist e, dopo aver aggiunto l’SSDT della mappatura USB (consiglio l’utilizzo di OC-Snapshot) recarsi nella sezione config.plist/ACPI/Block
e aggiungere quanto segue:
Sostituire il valore del campo OemTableId
con il Table Id
,che è possibile ricavare dallo step 3 alla voce OEM Table Id
, convertito in esadecimale.
N.B. per evitare il drop di tabelle ACPI indesiderate, consiglio vivamente di lasciare vuoto il campo OemTableId
ed utilizzare il campo TableLength
Salvare il config.plist e riavviare.
Per assicurarsi che la mappatura delle porte USB sia andata a buon fine, ripetere lo step 2 ed assicurarsi che siano presenti ed evidenziate in verde solo le porte USB mappate.
Credits:
- @Gengik84 per il suo thread originale (link) e la patch GENG che ho convertito in patch MaciASL
- @A23SS4NDRO per avermi aiutato con OpenCore e la creazione della EFI di Debug
- Il progetto ACPICA
- Apple
- Acidanthera per lo sviluppo di OpenCore e MaciASL
- Headkaze per lo sviluppo di Hackintool