Map usb via SSDT

  1. Đơn giản quản lý

    • Chỉ có 1 file SSDT-XHCI mà không cần thêm các patch phụ

  2. Luyện kỹ năng patch DSDT

  3. Không cần drop SSDT

  4. Làm cho EFI của bạn trong có vể "pro" hơn

Bây giờ thì chúng ta tiến hành thôi nhé

Chuẩn bị

B1: Các bạn tải file SSDT-XHCI mẫu mình đã tạo sẵn tại đây

B2: Tải MacIasl hoặc Xiasl

B3: Tải UsbtoolBox tại đây

Nếu như ở MacOs thì bạn tải hackintool tại đây

B4: Dump folder orgi hoặc sys report theo hướng dẫn tại đây

B4: Mở file SSDT-XHCI vừa tải ra và bây giờ chúng ta sẽ tiến hành phân tích

Phân tích SSDT-XHCI

Sau khi mở file SSDT-XHCI ra các bạn có thể thấy là các device usb sẽ có cùng một cấu trúc Package

                    Device (HS01)
                    {
                        Name (_ADR, One)  // _ADR: Address
                        Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                        {
                            Zero, //Giá trị thứ 1
                            Zero, //Giá trị thứ 2
                            Zero, //Giá trị thứ 3
                            Zero  //Giá trị thứ 4
                        })
                    }

Bây giờ chúng ta sẽ tiến hành phân tích nhé:

  • Device (HS01) : Đây là device usb port tìm hiểu cụ thể ở phần tiếp theo.

  • Name (_ADR, One) : Ở đây là Address của device

    • Nói cách khác thì đây chính là thứ tự của port này trong root hub

    • Có thể dễ dàng tìm được giá trị này bằng cahcs chuyển thứ tự của port từ decimal sang hex

  • Name (_UPC, Package (0x04): Ở đây là đang call qua method UPC

  • Các giá trị của Package

    • Giá trị thứ 1 dùng để khai báo tình trạng của port

      • Disable là Zero hoặc 0x00

      • Enable là các giá trị khác

        • Nhưng thường người ta sẽ sử dụng 0xFF hoặc One để biểu thị trạng thái enable

    • Giá trị thứ 2 dùng để khai báo port type xem chi tiết tại bảng phía dưới

    • Giá trị thứ 3 và thứ 4 là giá trị mặc định không cần động vào

Đây là bảng giá trị Port Type

Tóm lại qua phần này chúng ta sẽ chỉ cần quan tâm đến các phần sau

  • Device usb port

  • Address

  • Giá trị thứ 1 và giá trị thứ 2 của Package

Phân tích SSDT-xh_xxxxx

Ở đây là file SSDT các bạn dump được ở folder origi hoặc sys report. Các file này không cố định tên các bạn phải mở từng file và xem cấu trúc của nó

Ở đây là cấu trúc 1 file SSDT chứa các thông tin về usb chúng ta hãy cũng nhau phân tích một chút nhé

Chú ý đến phần tô đỏ ta sẽ có

  1. List các port usb

    • Ở đây cũng là phần để các bạn tìm được thứ tự của device port usb bằng cách đếm các port này

    • Ví dụ: hs01 thì thứ tự là 1 chuyển sang hex có dạng 0x01

      • hoặc ss01 có thứ tự là 17 chuyển sang hex có dạng 0x11

      • Convert decimal to hex tại đây

  2. Ở đây là ACPI path của controller usb

Mở rộng

Như ở trên ta có thể thấy ở sẽ có 26 port (HS01 --> HS14 | USR1 --> USR2 | SS01 --> SS10). Nhưng macos chỉ giới hạn 15 port vì vậy ta sẽ cần disable các port rỗng

Theo mặc định thì USR1 và USR2 thì sẽ luôn phải disable bởi vì macos sẽ không hỗ trợ hai chuẩn này. Để tìm hiểu cụ thể hơn về các chuẩn này chúng ta hãy xem dưới đây

  • HS01…HS14

    • HS = High Speed Ports

    • USB 2.0 only

    • 480 mbit/s

  • SS01…SS10

    • SS = Super Speed Ports

    • USB 3.0, 3.1, 3.2

    • 5 to 20 Gbit/s

  • USR1/2

    • Không được support bởi macos

    • Intel AMT

Kiểm tra Port Usb

B1: mở usbtoolbox

B2: Nhấn D

B3: Chuẩn bị 2 chiếc usb

  • 1 chiếc usb 2.0

  • 1 chiếc usb 3.0

B4: Cắm lần lượt từng chiếc usb vào tất cả các cổng và quan sát phân tích ở hình bên dưới

  1. Đây là thứ tự port của nó để tìm được device name usb port thì có thể xem trong ssdt

    • Ví dụ: port 1 tương ứng hs01

      • Sắp xếp theo thứ tự port

  2. Port type

    • Tra theo bẳng usb port type ở trên

  3. Các port màu xanh là enable

    • Màu trắng là port rỗng

Tiến hành

B1: Quan sát các port có sẵn ở trong SSDT-XHCISSDT-xh_xxxxx

Port nào còn thiếu thì thêm vào bằng cách copy và sửa ADR, Device()

B2: Các bạn mở file SSDT-XHCI

B3: thay thế các scope thành acpi path controller

Ví dụ: acpi path controller của mình có dạng _SB.PC00.XHCI thì ta sẽ thay thế nó như ảnh

B4: Chỉnh sửa các giá trị của Package trong từng device usb controller

  • Tìm đến các device enable và chính sửa giá trị thứ 1 thành 0xFF

  • Tiếp tục chỉnh sửa giá trị thứ 2 theo type port đã xác dịnh ở phần trên và dựa vào bảng type port

Ví dụ ta có:
 Port 2 | USB 2.0 | Type A (guessed)
 
 //Có nghĩa là:
   //HS02 có type port là usb 2.0 type A

 //Như vậy ta sẽ set như sau
 
 //Before
                     Device (HS02)
                    {
                        Name (_ADR, 0x02)  // _ADR: Address
                        Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                        {
                            Zero, 
                            Zero, 
                            Zero, 
                            Zero
                        })
                    }
                    
//After

                    Device (HS02)
                    {
                        Name (_ADR, 0x02)  // _ADR: Address
                        Name (_UPC, Package (0x04)  // _UPC: USB Port Capabilities
                        {
                            0xFF, // 0xFF là để enable port này
                            0x00, // 0x00 là usb 2.0 type A
                            Zero, 
                            Zero
                        })
                    }

B5: Chỉnh tương tự cho đến hết các device

B6: Comlie SSDT và biên dịch thành .aml theo hướng dẫn tại đây

B7: Thêm SSDT vừa tạo được vào EFI --> OC --> ACPI và Snapshot

Hoặc EFI --> Clover --> ACPI --> Patch

B8: Reboot và tận hưởng thôi

Source tham khảo: https://github.com/5T33Z0/OC-Little-Translated/tree/main/03_USB_Fixes/ACPI_Mapping_USB_Ports

Last updated