# Map usb via SSDT

{% hint style="info" %}
Như các bạn đã biết, đối với map usb mình đã làm rất nhiều guide về rất nhiều cách khác nhau cho cả amd và intel xem chi tiết [tại đây](https://app.gitbook.com/s/auskGAp5wYbI1xQWn4YZ/usb-fix/map-usb) và [tại đây](https://advance.heavietnam.com/general/inject-usb-manual). Nhưng hôm nay mình xin giới thiệu đến các bạn một cách map usb thông qua SSDT. Vậy các này có những ưu điểm gì?

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é
> {% endhint %}

## Chuẩn bị

B1: Các bạn tải file `SSDT-XHCI` mẫu mình đã tạo sẵn [tại đây](https://drive.heavietnam.com/d/s/zGchfQgLKgwt8NbASQ4dR8i9bAUGGWqC/zU5ieta_9WL1EEJkac85odRglRoseCdy-a7sAUq6Xggs)

B2: Tải [MacIasl ](https://github.com/acidanthera/MaciASL/releases)hoặc [Xiasl](https://github.com/ic005k/Xiasl/releases)

B3: Tải UsbtoolBox [tại đây](https://github.com/USBToolBox/tool)

> Nếu như ở MacOs thì bạn tải hackintool [tại đây](https://github.com/benbaker76/Hackintool/releases)

B4: Dump folder `orgi` hoặc `sys report` theo hướng dẫn [tại đây](https://advance.heavietnam.com/acpi-advance/patch-dsdt-phan-1)

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

{% hint style="info" %}
Sau khi mở file S`SDT-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
{% endhint %}

<figure><img src="https://380024514-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FWaDTVx2hJ0rjBEHrlRj9%2Fuploads%2FEq7ScyLK2zvH41Jf6EWC%2Fimage.png?alt=media&#x26;token=db423ba5-9eff-4d8d-8841-82c1c1a81949" alt=""><figcaption></figcaption></figure>

```
                    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é:

* &#x20;`Device (HS01)` : Đây là device usb port tìm hiểu cụ thể ở phần tiếp theo.&#x20;
* `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&#x20;
  * 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`&#x20;
* `Name (_UPC, Package (0x04)`: Ở đây là đang call qua method UPC&#x20;
* Các giá trị của `Package`&#x20;
  * 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&#x20;
      * 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

| `0x00` | USB Type `A`                   |
| :----: | ------------------------------ |
| `0x01` | USB `Mini-AB`                  |
| `0x02` | USB Smart Card                 |
| `0x03` | USB 3 Standard Type `A`        |
| `0x04` | USB 3 Standard Type `B`        |
| `0x05` | USB 3 `Micro-B`                |
| `0x06` | USB 3 `Micro-AB`               |
| `0x07` | USB 3 `Power-B`                |
| `0x08` | USB Type `C` **(USB 2 only)**  |
| `0x09` | USB Type `C` **(with switch)** |
| `0x0A` | USB Type `C` **(w/o switch)**  |
| `0xFF` | Built-in                       |

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

{% hint style="info" %}
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`&#x20;
* Giá trị thứ 1 và giá trị thứ 2 của `Package`&#x20;
  {% endhint %}

## Phân tích `SSDT-xh_xxxxx`

{% hint style="info" %}
Ở đâ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ó&#x20;
{% endhint %}

<figure><img src="https://380024514-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FWaDTVx2hJ0rjBEHrlRj9%2Fuploads%2Fx3MhSup2n6con3dZmb6f%2Fimage.png?alt=media&#x26;token=e4f022fc-c880-4c2f-8286-643e6dc22de7" alt=""><figcaption><p>SSDT-3-xh_cfht4.dsl</p></figcaption></figure>

> Ở đâ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ó&#x20;

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](https://www.rapidtables.com/convert/number/decimal-to-hex.html?x=26)
2. Ở đây là `ACPI path` của controller usb

<details>

<summary>Mở rộng</summary>

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

</details>

## Kiểm tra `Port Usb`

B1: mở usbtoolbox

> Đối với các bạn dùng hackintool thì có thể tham khảo thông qua hướng dẫn mapusb [tại đây](https://app.gitbook.com/s/auskGAp5wYbI1xQWn4YZ/usb-fix/map-usb)

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

<figure><img src="https://380024514-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FWaDTVx2hJ0rjBEHrlRj9%2Fuploads%2FMsYb5ZJ0pCXli5nHstWi%2Fimage.png?alt=media&#x26;token=dd30585e-15d2-4162-be42-7cae04d2e9ed" alt=""><figcaption></figcaption></figure>

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&#x20;
     * Sắp xếp theo thứ tự port
2. Port type&#x20;
   * 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-XHCI` và `SSDT-xh_xxxxx`&#x20;

<figure><img src="https://380024514-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FWaDTVx2hJ0rjBEHrlRj9%2Fuploads%2FyRNe2CLz9lh8lvTJ78u1%2Fimage.png?alt=media&#x26;token=59307030-af91-4970-b945-86f53eb72014" alt=""><figcaption></figcaption></figure>

> 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&#x20;

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

<figure><img src="https://380024514-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FWaDTVx2hJ0rjBEHrlRj9%2Fuploads%2FGxpxOIJrNR00i2KQ1cQ3%2Fimage.png?alt=media&#x26;token=488ae7fd-87fa-46cb-8146-24a1d4b77467" alt=""><figcaption><p>Before</p></figcaption></figure>

<figure><img src="https://380024514-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FWaDTVx2hJ0rjBEHrlRj9%2Fuploads%2FQk2UFITqsAFZzOgvVWAX%2Fimage.png?alt=media&#x26;token=47d8c389-8065-48fe-a5c4-4fa7267304c9" alt=""><figcaption><p>After</p></figcaption></figure>

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](#kiem-tra-port-usb) 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](https://advance.heavietnam.com/acpi-advance/patch-dsdt-phan-1)

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

> Hoặc `EFI --> Clover --> ACPI --> Patch`&#x20;

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>
