macOS 10.11 sonrası sürümlerde USB sürücülerinin çalışma mantığı önemli ölçüde değişti. Artık sürücüler hangi portun aktif olduğu bilgisini Port Injector olmadığı zaman ACPI’dan alıyor. ACPI’dan alınan bu bilgi de çoğu zaman yanlış oluyor. Bu yüzden DSDT düzenlemek yerine, aynı Apple’ın kendi bilgisayarlarında yaptığı gibi Port Injector kullanılabilir.
Böyle bir Port Injector oluşturmak için öncelikle hangi portların gerçekten kullanıldığını bilmeniz gerekiyor. Bunun için de önce tüm portları aktifleştirmeli, her bir portu bilgisayarda test etmeli ve hangisinin uygun port adresine karşılık geldiğini bulmalısınız.
İşte burada USBInjectAll.kext devreye giriyor.
Bu Kext, her bir kontrolcü ve Hub için bütün portları aktif etmeye çalışıyor. Bunu kullanarak geçici süreliğine tüm portları aktif hale getirip oluşturacağınız Injector’de hangilerinin yer alması gerektiğini bulabilirsiniz.
Diğer Hub’lar modifikasyon gerektirdiğinden şu anda sadece EH01.PRT1 ve EH02.PRT1’deki Hub etkinleştirilebiliyor. Açıkçası şu ana kadar başka portlara bağlı bir dahili Hub’a da rastlamadık.
Kext, USB kontrolcü yonga setlerini temel alarak portları ve port adreslerini otomatik olarak belirliyor:
Başlangıç
macOS 10.11’de bazı yonga setlerinde bulunan 15 port kısıtlamasını ortadan kaldırmanız gerekebilir. Özellikle Device-ID’si 8 ile başlayan XHCI kontrolcülerinde bu gerekiyor.
Bu limiti ortadan kaldırmak için Clover’daki Kext Patch özelliğini kullanarak AppleUSBXHCIPCI’ı yamalamanız gerek.
Kext için en fazla 20 port gerekiyor. Bunu için
Not: Yamayı uzun vadeli kullanmayı düşünmeyin, problem yaratabilir. Eğer XHC’da 15’ten fazla port varsa FakePCIID_XHCIMux kullanarak USB3 portlarındaki USB2 bileşenlerini EHCI’a yönlendirebilirsiniz. XHC’dan maksimum 8 adet USB2 portu yönlendirilirse limitin altında kalmak daha kolay olur.
Inject İşlemlerini Düzenleme
Bu Kext’in gerçekleştirdiği Inject işlemlerini iki şekilde düzenleyebiliriz.
Normalde aktif edilen portları elemek için bu kernel flag komutunu kullanabilirsiniz:
Örneğin, Lenovo u430’da FakePCIID_XHCIMux olmadan Bluetooth, XHC altında HS06’ye bağlı. Dokunmatik ekran ise HS01’e bağlı. Biz
FakePCIID_XHCIMux kullanıldığında dokunmatik ekran EH01’da bulunan USB port1’deki Hub’a bağlanıyor. Bu Hub'ı devre dışı bırakmak için de
Burada hangi cihazın hangi porta bağlı olduğunu rahatlıkla görebilirsiniz. Kext tarafından aktif edilen her bir port tanımlayıcısı benzersiz olduğundan kolaylıkla tespit edilebilir.
Kullanılabilir diğer flag komutları:
Fakat portları devre dışı bırakmak gereken esnekliği tam olarak sağlamaz. ConfigurationData için Info.list içindeki her şey ACPI ile yapılandırılabilir. Mesela
SSDT-UIAC.dsl içinde buna benzer bir örnek daha bulunmaktadır. Her bir cihaz için Inject bilgisi yine bu şekilde ile değiştirilebilir.
SSDT-UIAC.dsl içeriği Info.plist’te bulunan veriler ile aynıdır. Bunu kullandığınızda hiçbir değişiklik yapmamış olacaksınız. Yine de SSDT ile kendi özel USB yapılandırmanızı oluşturmak amacıyla taslak olarak kullanabilirsiniz. Burada gereksiz portları silin ya da UsbConnector veya portType’ı kendi USB donanım yapılandırmanıza uygun olacak şekilde değiştirin. Tüm XHC tanımlayıcıları (üretici_cihaz) içindedir, bu yüzden kendi cihazınız için geçerli olmayan yapılandırmaları eleyerek işe başlayabilirsiniz, sadece cihazınız için gerekli yapılandırmalar kalsın. Ayrıca donanım kimliğinizi XHC bölümündeki ioreg içinden, (Üretici-ID ve Cihaz-ID) şeklinde görebilirsiniz.
İndirme
RehabMan / OS-X-USB-Inject-All / Downloads — Bitbucket
Config_patches.plist ve diğer arşiv dosyalarını indirmek için:
https://github.com/RehabMan/OS-X-USB-Inject-All/archive/master.zip
Kurulum
Not: Bu Kext; EHC1’i EH01, EHC2’yi EH02 ve XHCI kontrolcünüzü de XHC ya da XHCI (XHC1 değil) olarak isimlendirdiğinizi varsayacaktır. Bu isimler, (EH01/EH02/XHC) varsa dahili herhangi bir Port Injector ile çakışmayı önlemek adına Apple cihazlar için önemlidir. Gerekli yamalar için config_patches.plist’e bakabilirsiniz. (config_patches.plist/ACPI/DSDT/Patches)
Eğer 9 serisi yonga setine ait bir XHC kontrolcünüz (8086:8cb1) varsa XHCI-9-series.kext’i yükleyin. Bu Kext olmadan USB 3.0 sürücüleri yüklenmeyecektir.
Bazı Intel xHCI kontrolcüler doğal olarak desteklenmediğinden Injector gerektiriyor. Bu sistemlerde XHCI-unsupported.kext yükleyin.
Ayrıca doğal destek sürümden sürüme değişiklik gösteriyor. XHCI kontrolcünüzün doğal olarak desteklenip desteklenmediğini buradan kontrol edebilirsiniz:
XHCI-unsupported.kext, Info.plist’teki değerden daha düşük bir IOProbeScore kullandığından, kontrolcü doğal desteğe sahip olsa da kurulmasında bir sakınca yok.
XHCI-unsupported.kext’e ihtiyaç duyan kontrolcüler (macOS sürümüne göre değişkenlik gösterir):
Ayrıca:
www.technopat.net
Böyle bir Port Injector oluşturmak için öncelikle hangi portların gerçekten kullanıldığını bilmeniz gerekiyor. Bunun için de önce tüm portları aktifleştirmeli, her bir portu bilgisayarda test etmeli ve hangisinin uygun port adresine karşılık geldiğini bulmalısınız.
İşte burada USBInjectAll.kext devreye giriyor.
Bu Kext, her bir kontrolcü ve Hub için bütün portları aktif etmeye çalışıyor. Bunu kullanarak geçici süreliğine tüm portları aktif hale getirip oluşturacağınız Injector’de hangilerinin yer alması gerektiğini bulabilirsiniz.
Diğer Hub’lar modifikasyon gerektirdiğinden şu anda sadece EH01.PRT1 ve EH02.PRT1’deki Hub etkinleştirilebiliyor. Açıkçası şu ana kadar başka portlara bağlı bir dahili Hub’a da rastlamadık.
Kext, USB kontrolcü yonga setlerini temel alarak portları ve port adreslerini otomatik olarak belirliyor:
Kod:
EH01: 8-USB2 ports PR11-PR18.
EH02: 6-USB2 ports PR21-PR28.
EH01 hub: 8-USB2 ports HP11-HP18.
EH02 hub: 8-USB2 ports HP21-HP28.
XHC, 7-series chipset (8086:1e31): 4-USB2 ports HS01-HS04, 4-USB3 ports SS01-SS04.
XHC, 8/9-series chipset (8086:9xxx): 9-USB2 ports HS01-HS09, 6-USB3 ports SS01-SS06.
XHC, 8/9-series chipset (8086:8xxx): 14-USB2 ports HS01-HS14, 6-USB3 ports SS01-SS06.
XHC, 8/9-series chipset (8086:9cb1): 11-USB ports HS01-HS11, 4-USB3 ports SS01-SS04.
XHC, 100-series chipset (8086:a12f): 14-USB2 ports HS01-HS14, 10-USB3 ports SS01-SS10, plus USR1/USR2)
XHC, 100-series chipset (8086:9d2f): 10-USB2 ports HS01-HS10, 6-USB3 ports SS01-SS06, plus USR1/USR2)
XHC, 200-series/300-series chipset, vb.
Başlangıç
- Kext sadece macOS 10.11 üstü sürümlerde geçerlidir, önceki sürümlerde bir geçerliliği yoktur. Şu an sadece Intel kontrolcülerin desteklendiğini de belirtelim.
- En sık kullanılan SMBIOS modelleri Kext’e dahildir.
- Özel bir yapılandırma olmadan bu Kext uzun vadede kullanışlı olmayacaktır. Bu yüzden iki seçeneğiniz var:
- Sadece hedef makinedeki aktif portların yer aldığı özel bir Injector oluşturmak.
- USBInjectAll.kext tarafından yapılan Port Injection işlemini düzenleyen bir SSDT oluşturmak.
macOS 10.11’de bazı yonga setlerinde bulunan 15 port kısıtlamasını ortadan kaldırmanız gerekebilir. Özellikle Device-ID’si 8 ile başlayan XHCI kontrolcülerinde bu gerekiyor.
Bu limiti ortadan kaldırmak için Clover’daki Kext Patch özelliğini kullanarak AppleUSBXHCIPCI’ı yamalamanız gerek.
Kext için en fazla 20 port gerekiyor. Bunu için
<83bd8cfe ffff10>
değerini <83bd8cfe ffff15>
olarak değiştireceksiniz. Yani yama şu şekilde olmalı:- Yorum: AppleUSBXHCIPCI altından 15 port limitini 20 yap
- İsim:
AppleUSBXHCIPCI
- Bul:
<83bd8cfe ffff10>
- Değiştir:
<83bd8cfe ffff15>
- Yorum: AppleUSBXHCIPCI altından 15 port limitini 26 yap
- İsim:
AppleUSBXHCIPCI
- Bul:
<83bd8cfe ffff10>
- Değiştir:
<83bd8cfe ffff1b>
Not: Yamayı uzun vadeli kullanmayı düşünmeyin, problem yaratabilir. Eğer XHC’da 15’ten fazla port varsa FakePCIID_XHCIMux kullanarak USB3 portlarındaki USB2 bileşenlerini EHCI’a yönlendirebilirsiniz. XHC’dan maksimum 8 adet USB2 portu yönlendirilirse limitin altında kalmak daha kolay olur.
Ayrıca bu Kext arızalı USB nedeniyle kuruluma boot edilemeyen durumlarda da faydalı olabilir. EFI/Clover/kexts altından çalışabilir.
Inject İşlemlerini Düzenleme
Bu Kext’in gerçekleştirdiği Inject işlemlerini iki şekilde düzenleyebiliriz.
Normalde aktif edilen portları elemek için bu kernel flag komutunu kullanabilirsiniz:
uia_exclude
Örneğin, Lenovo u430’da FakePCIID_XHCIMux olmadan Bluetooth, XHC altında HS06’ye bağlı. Dokunmatik ekran ise HS01’e bağlı. Biz
uia_exclude=HS01
komutu ile dokunmatik ekranı devre dışı bırakabiliriz. Ya da uia_exclude=HS06
ile Bluetooth devre dışı bırakılabilir. İkisini birden devre dışı bırakmak için aralarına virgül ekleyerek uia_exclude=HS01,HS06
komutu kullanılabilir.FakePCIID_XHCIMux kullanıldığında dokunmatik ekran EH01’da bulunan USB port1’deki Hub’a bağlanıyor. Bu Hub'ı devre dışı bırakmak için de
uia_exclude=HP11
komutunu kullanabiliriz.Burada hangi cihazın hangi porta bağlı olduğunu rahatlıkla görebilirsiniz. Kext tarafından aktif edilen her bir port tanımlayıcısı benzersiz olduğundan kolaylıkla tespit edilebilir.
Kullanılabilir diğer flag komutları:
lag -uia_exclude_hs
: tüm HSxx portlarını devre dışı bırakır.flag -uia_exclude_ss
: tüm SSxx portlarını devre dışı bırakır.flag -uia_exclude_xhc
: XHC’deki Injection’u devre dışı bırakır.flag uia_include
: Belirli portları normalde devre dışı bırakılsalar dahi aktif etmeye yarar.
-uia_exclude_hs uia_include=HS01
komutu HS01’i tutar ama diğer HSxx portlarını devre dışı bırakır.Fakat portları devre dışı bırakmak gereken esnekliği tam olarak sağlamaz. ConfigurationData için Info.list içindeki her şey ACPI ile yapılandırılabilir. Mesela
8086_8xxx
yonga seti için ben sadece XHC’deki SS01 portunu aktif etmek isteseydim:
Kod:
DefinitionBlock ("", "SSDT", 1, "hack", "UIAC", 0)
{
Device(UIAC)
{
Name(_HID, "UIA00000")
// Sadece bir porta sahip olmak için XHC yapılandırmasını geçersiz kıl
Name(RMCF, Package()
{
"8086_8xxx", Package()
{
"port-count", Buffer() { 0xa, 0, 0, 0 },
"ports", Package()
{
"SS01", Package()
{
"UsbConnector", 3,
"port", Buffer() { 0xa, 0, 0, 0 },
}
}
}
})
}
}
SSDT-UIAC.dsl içinde buna benzer bir örnek daha bulunmaktadır. Her bir cihaz için Inject bilgisi yine bu şekilde ile değiştirilebilir.
SSDT-UIAC.dsl içeriği Info.plist’te bulunan veriler ile aynıdır. Bunu kullandığınızda hiçbir değişiklik yapmamış olacaksınız. Yine de SSDT ile kendi özel USB yapılandırmanızı oluşturmak amacıyla taslak olarak kullanabilirsiniz. Burada gereksiz portları silin ya da UsbConnector veya portType’ı kendi USB donanım yapılandırmanıza uygun olacak şekilde değiştirin. Tüm XHC tanımlayıcıları (üretici_cihaz) içindedir, bu yüzden kendi cihazınız için geçerli olmayan yapılandırmaları eleyerek işe başlayabilirsiniz, sadece cihazınız için gerekli yapılandırmalar kalsın. Ayrıca donanım kimliğinizi XHC bölümündeki ioreg içinden, (Üretici-ID ve Cihaz-ID) şeklinde görebilirsiniz.
İndirme
RehabMan / OS-X-USB-Inject-All / Downloads — Bitbucket
Config_patches.plist ve diğer arşiv dosyalarını indirmek için:
https://github.com/RehabMan/OS-X-USB-Inject-All/archive/master.zip
Kurulum
- Kullandığınız herhangi bir Kext yükleyicisi ile kurulumu yapabilirsiniz. Kext Wizard, Kext Utility vb. olabilir.
- Terminal’den kurulum için:
Kod:sudo cp -R Release/USBInjectAll.kext /Library/Extensions sudo touch /System/Library/Extensions && sudo kextcache -u /
Not: Bu Kext; EHC1’i EH01, EHC2’yi EH02 ve XHCI kontrolcünüzü de XHC ya da XHCI (XHC1 değil) olarak isimlendirdiğinizi varsayacaktır. Bu isimler, (EH01/EH02/XHC) varsa dahili herhangi bir Port Injector ile çakışmayı önlemek adına Apple cihazlar için önemlidir. Gerekli yamalar için config_patches.plist’e bakabilirsiniz. (config_patches.plist/ACPI/DSDT/Patches)
Eğer 9 serisi yonga setine ait bir XHC kontrolcünüz (8086:8cb1) varsa XHCI-9-series.kext’i yükleyin. Bu Kext olmadan USB 3.0 sürücüleri yüklenmeyecektir.
Güncelleme: 10.11.1 ile doğrudan destek geldiğinden bu Injector’e artık ihtiyaç kalmamıştır. Yine de ihtiyacınız varsa buradan geçmişe giderek bulabilirsiniz:
Bazı Intel xHCI kontrolcüler doğal olarak desteklenmediğinden Injector gerektiriyor. Bu sistemlerde XHCI-unsupported.kext yükleyin.
Ayrıca doğal destek sürümden sürüme değişiklik gösteriyor. XHCI kontrolcünüzün doğal olarak desteklenip desteklenmediğini buradan kontrol edebilirsiniz:
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/Plugins/AppleUSBXHCIPCI.kext/Contents/Info.plist
XHCI-unsupported.kext, Info.plist’teki değerden daha düşük bir IOProbeScore kullandığından, kontrolcü doğal desteğe sahip olsa da kurulmasında bir sakınca yok.
XHCI-unsupported.kext’e ihtiyaç duyan kontrolcüler (macOS sürümüne göre değişkenlik gösterir):
- X99-series chipset XHC controller, 8086:8d31
- 200-series chipset XHC controller, 8086:a2af
- 300-series chipset XHC controller, 8086:a36d ya da 8086:9ded
Ayrıca:
macOS USB port limitini kaldırma
Apple genellikle 4 veya daha az USB port ile gelen cihazlar üretiyor. Bu nedenle PC üzerinde macOS çalıştırırken bu durum bize sorunlar çıkarabilir. DSDT yamalarıyla uğraşmadan bu durumu çözebilmek için bu rehberimizi takip edebilirsiniz. Yapmanız gereken şey, gerektiğinde bir XHCI Serisi kext...
Son düzenleyen: Moderatör: