macOS 10.11+ USB Çalıştırma

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:
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:
    1. Sadece hedef makinedeki aktif portların yer aldığı özel bir Injector oluşturmak.
    2. USBInjectAll.kext tarafından yapılan Port Injection işlemini düzenleyen bir SSDT oluşturmak.
Port Limiti

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>
Eğer 100 serisi bir anakarta sahipseniz XHCI’da limit en fazla 26’ya çıkacaktır. Bu durumda düzenlemeyi bu şekilde yapın:
  • Yorum: AppleUSBXHCIPCI altından 15 port limitini 26 yap
  • İsim: AppleUSBXHCIPCI
  • Bul: <83bd8cfe ffff10>
  • Değiştir: <83bd8cfe ffff1b>
Yamayı config_patches.plist dosyasından kopyala/yapıştır yapabilirsiniz. macOS 10.11.x dışındaki sürümler için gereken yamalar dosyanın içindedir. Ayrıca EHC1’i EH01 olarak, EHC2’yi de EH02 olarak isimlendirmek için gerekli DSDT yaması da dahil edilmiştir. Bu, Kext'in gömülü Kext’lerdeki Port Injector’ler ile çakışmaması için önemli.

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.
Örneğin: -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
Info.plist, generate_Info_plist.sh ile oluşturulmuştur. Bu yüzden Info.plist’i doğrudan düzenlemeyin. USBInjectAll_model_template.plist'te her bir model Inject edilmiştir ve bunu başlangıç Info.plist dosyası olarak da kullanabilirsiniz. Böylece script düzenlenerek yeni modeller kolaylıkla eklenebilir.

Ayrıca:
 
Son düzenleyen: Moderatör:
Uyarı! Bu konu 7 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Technopat Haberler

Yeni konular

Geri
Yukarı