Inject USB Manual

Ở bài hướng dẫn này mình sẽ chỉ các bạn cách tạo ra 1 Kext Map USB cho riêng mình nghe có vẻ thú vị đúng ko nào

Và giờ bắt đầu thôi.

Chuẩn bị

  • Tải IORegistryClone tại đây.

  • 1 số tên Device USB Control.

XHC
XHC0
XHC1
XHC2
XHCI
XHCX
AS43
PTXH // thường gặp ở các main amd
PTCP // thường gặp ở AsRock X399 
PXSX // đây là 1 tên thường gặp hãy kiểm tra kỹ xem nó có phải là bộ điều khiển usb không

Tạo Kext

Ở đây mình sẽ hướng dẫn cho AMD, Intel làm tương tự vì cùng 1 nguyên tắc hoạt động

Với Intel các bạn sử dụng trên Kext USB-Inject-All.

B1: các bạn Search XHC trên IOReg và nhìn 1 danh sách sổ xuống tìm gốc của các thành phần ta được tên bộ điều khiển USB.

Ở đây ta có bộ điều khiển USB là PTXH

Nếu các bạn có các bộ điều khiển trùng với nhau thì các bạn sẽ lấy hết tên của nó là PTXH@000000, phần này mình sẽ nói rõ hơn ở mục sau).

B2: Dump DSDT theo hướng dẫn tại đây.

B3: Các bạn mở DSDT lên và Search tên bộ điều khiển USB vừa xác định ở IOReg.

Ở đây ta có thể thấy số Port trong IOReg đang bị thiếu tức macOS đang nhận thiếu Port trong DSDT là do Kext AppleUSBHostPlatformProperties nó chỉ tạo USB Map theo SMBios của Apple vì vây nên ta sẽ bị thiếu các Port USB để khắc phục các bạn sẽ tạo 1 Kext cho riêng mình

Đầu tiên các bạn sẽ Download Kext mẫu tại đây

đối với Intel thì các bạn sửa trên USB-Inject-All.

B4: Các bạn Click chuột phải chọn Show Package Contents.

B5: Các bạn mở file Info.plist bằng ProperTree

Ở đây các bạn chú ý các mục sau:

  1. Các bạn sẽ sửa lại theo SMBios và bộ điều khiển USB.

  2. Mục IONameMatch là tên bộ điều khiển USB.

    • Đối với 1 số bộ điều khiển USB

      • thường là PXSX sẽ dùng IOPathMatch thay cho IONameMatch

        • xem chi tiết ở mục dưới

  3. Port-Count là giá trị của Port cao nhất

    • VD như khi nãy ta có Port P022 có giá trị 0x16 cao nhất thì khi đưa vào Port Count nó sẽ là 16 00 00 00 00

  4. Port đây là mục các bạn sẽ làm việc chủ yếu để Add thêm các Port bị thiếu.

  5. Mode ở mục này các bạn sẽ chỉnh về SMBios hiện tại đang sử dụng.

B6: Các bạn sẽ tiến hành nhìn vào DSDT kết hợp IOReg để xác định Type dựa vào tên

Thông thước 3 ký tự đầu của USB 3.0 sẽ trùng nhau và 2.0 cũng vậy

B7: Tiến hành xác định giá trị Port các bạn sẽ dựa vào mục

Name (_ADR

để xác định giá trị Port.

VD như ở đây mình có

Device (PO18)
   {
   Name (_ADR, 0x12) // _ADR: Address
   Name (_UPC, Package (0x04) // _UPC: USB Port Capabilities
      {
         Zero,
         0xFF,
         Zero,
         Zero
      })
   }

Thì port P018 ta có giá trị Port0x12=1200000000 ta sẽ được

Do ở trên IOReg ta có port P010usbconnector0x3 tức là 3.0 nên cũng trương tự với P018

Nhớ rằng USB 3.0 sẽ có 2 Port được xuất ra

Lưu ý : 1 số DSDT mục

Name (_ADR

Sẽ bị ẩn đi do đó ta sẽ phải tự đọc DSDT

VD như ở đây mình có

Ta sẽ có PR30xFFFFFFF0.

Trường hợp ngoại lệ thứ 1: DSDT bị thiếu Port

Đối với DSDT bị thiếu Port ta sẽ cần Remove tất cả các bộ điều khiển USB và để cho macOS tự khởi tạo dữ liệu bằng cách cho DSDT đã xóa device vào EFI -> OC -> ACPI

Các bạn sẽ cần Convert định dạng DSDT sang .dsl tại đây

Ở đây ta thấy dsdt này thiếu các port usb như HS02, HS03, HS04, HS05,…

Trường hợp ngoại lệ thứ 2: Tên của các Port bị nhầm hoặc chưa đặt tên

Đối với trường hợp này các bạn chỉ việc dựa vào DSDT và đổi tên hoặc đặt tên trong Kext của các bạn ở trên là được.

Do ở đây có 2 bộ điều khiển USB nên mình dùng IOPathMatch.

Trường hợp ngoại lệ thứ 3: Có 2 Method XHC0

Trường hợp này thường xảy ra trên bộ điều khiển USB PXSX.

Cách 1: dùng Kext với phương thức IOPathMatch (khuyến khích)

Ở đây ta có thể thấy có 2 Device XHC0 ta có thể thấy mục XHC0@61000000 ở dưới mục XHC0 và là gốc của tất cả các mục trên nên ta sẽ lấy path của mục này là:

IOService:/AppleACPIPlatformExpert/S0D1@0/AppleACPIPCI/D1C0@7,1/IOPP/XHC0@0,3/XHC0@61000000

dựa vào vault củaport trên usb và ioreg để xme mục nào là bộ điều khiển usb ta sài thực sự

Tiếp theo ta chỉ cần Add Path trên vào mục IOPathMatch.

Cách 2: Dùng SSDT

B1: các bạn tải SSDT tại đây.

B2: Các bạn nhìn vào mục ACPI-Path trong bộ điều khiển USB đã xác định ở trên.

Ta có thể thấy IOACPIPlane:/_SB/PC00@0/RP05@1c0004/PXSX@0 có nghĩa là SB.PC00.RP05.PXSX

B3: Ta sẽ chuyển các mục sau tương ứng sau bằng số liệu bạn lấy được trong IOReg tương tự như sau

External (_SB_.PCI0.GP13, DeviceObj) -> External (_SB_.PC00.RP05, DeviceObj)
External (_SB_.PCI0.GP13.XHC0, DeviceObj) -> External (_SB_.PC00.RP05.PXSX, DeviceObj)
Scope (\_SB.PCI0.GP13) -> Scope (\_SB.PC00.RP05)
Scope (XHC0) -> Scope (PXSX)

Source tham khảo: USB Mapping | OpenCore Post-Install (dortania.github.io)

Last updated