# Map USB

## Tìm hiểu chung

> Các conector type của usb được thể hiện dưới dạng decimal nhưng khi các bạn viết ssdt-uiac (hay ssdt-usb,..) thì cần chuyển nó về dạng hex&#x20;
>
> cách chuyển decimal to hex mình đã hướng dẫn rất nhiều ở các post trước các bạn có thể xem cách chuyển ở trong bài patch i2c

#### Usb type A

* USB type A 2.0 connector type: 0<br>

  <figure><img src="https://i.imgur.com/Fr9JZxi.png" alt=""><figcaption></figcaption></figure>
* usb type A 3.0 connector: 3<br>

  <figure><img src="https://i.imgur.com/OzyqrsH.png" alt=""><figcaption></figcaption></figure>

#### Usb type Mini

* Usb type mini-ab connector type: 1<br>

  <figure><img src="https://i.imgur.com/ufoNYJd.png" alt=""><figcaption></figcaption></figure>

#### Usb type B

* Usb 3 type B connector type: 4<br>

  <figure><img src="https://i.imgur.com/9eCxIRi.png" alt=""><figcaption></figcaption></figure>

#### Usb Type Micro

* USB 3 Type Micro-B có connector type: 5<br>

  <figure><img src="https://i.imgur.com/43haG29.png" alt=""><figcaption></figcaption></figure>
* USB 3 Type Micro-AB có connector type: 6<br>

  <figure><img src="https://i.imgur.com/0QGX1Cc.png" alt=""><figcaption></figcaption></figure>

#### USB Type Power-B

* USB 3 Type Power-B có connector type: 7<br>

  <figure><img src="https://i.imgur.com/aBC9J8x.gif" alt=""><figcaption></figcaption></figure>

#### USB Type C

![](https://i.imgur.com/b8fjAvM.png)

#### Bảng Type Port

<table data-full-width="true"><thead><tr><th width="131">Port Name </th><th width="204.33333333333331">Devices</th><th width="305">Type Port</th><th width="158">Type Port decimal</th><th>Type Port Hex</th></tr></thead><tbody><tr><td><code>HSxx</code></td><td>USB 2.0</td><td>Set là 2.0</td><td>0</td><td>0X00</td></tr><tr><td><code>HSxx</code></td><td>Bluetooth và Camera</td><td>Set là internal</td><td>255</td><td>0xFF</td></tr><tr><td><code>SSxx</code></td><td>USB 3.0</td><td>Set là 3.0</td><td>03</td><td>0x03</td></tr><tr><td><code>SSxx</code></td><td>Type C 3.0</td><td><ul><li>Set là type C with switch</li><li>Set là type C w/o switch</li></ul></td><td><ul><li>09</li><li>10</li></ul></td><td><ul><li>0x09</li><li>0x0A</li></ul></td></tr><tr><td><code>HSxx</code></td><td>Type C 2.0</td><td><ul><li>Set là type C with usb 2.0</li><li>Set là type C with switch</li><li>Set là type C w/o switch</li></ul></td><td><ul><li>08</li><li>09</li><li>10</li></ul></td><td><ul><li>0x08</li><li>0x09</li><li>0x0A</li></ul></td></tr></tbody></table>

{% hint style="info" %}
Nhưng làm sao biết thế nào là type 2.0 hay có switch hay không?

* Type C 2.0: Tức là khi bạn cắm cáp 2.0 và 3.0 thì nó cũng chỉ nhận 1 port 2.0 `HSxx`
* Type C with switch: Tức là khi cắm cáp 2.0 và 3.0 thì nhận 2 port `HSxx` và `SSxx`
  * Khi cắm vào cáp type C vào thì khi xoay đầu cáp type C thì cũng chỉ nhận chung 1 port&#x20;
* Type C w/o switch: Tức là khi cắm cáp 2.0 và 3.0 thì nhận 4 port `HSxx` và `SSxx`
  * Khi cắm vào cáp type C vào thì khi xoay đầu cáp type C thì cũng chỉ nhận riêng 2 port&#x20;
    {% endhint %}

## Usbtoolbox

### Windows

B1: Các bạn tải `usbtoolbox` [tại đây](https://github.com/USBToolBox/tool/releases)

![](https://i.imgur.com/f9ieXrf.png)

B2: Các bạn cài `python` [tại đây](https://www.python.org/downloads/)

B3: Các bạn chạy tool lên và nhấn `D`

![](https://i.imgur.com/FelbSzo.png)

B4: Các bạn cắm lần lượt usb vào hết các cổng&#x20;

> Cổng nào nhận sẽ hiện màu xanh và không nhận sẽ hiện màu trắng

![](https://i.imgur.com/n4ClFIg.png)

B5: Nhấn `B`

B6: Nhấn `C` để tiến hành thay đổi setting

<figure><img src="https://272971286-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FauskGAp5wYbI1xQWn4YZ%2Fuploads%2FHFVsRREeQa4C03Kqm1HN%2Fimage.png?alt=media&#x26;token=be01dd31-d70f-483b-bc3f-0b92c42492aa" alt=""><figcaption></figcaption></figure>

B7: Ấn `N` để enable `Use Native Classes`

{% hint style="info" %}
Nếu không làm bước này bạn sẽ phải dùng kext kèm với kext [`usbtoolbox.kext`](https://github.com/USBToolBox/kext/releases)
{% endhint %}

{% hint style="danger" %}
Chú ý: Đối với AMD bắt buộc phải dùng Native Classses
{% endhint %}

<figure><img src="https://272971286-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FauskGAp5wYbI1xQWn4YZ%2Fuploads%2FRaA2o5YPhGR9zJkkdUvV%2Fimage.png?alt=media&#x26;token=66a1f57e-0fa3-47e6-bc0d-6a797ea0ad1f" alt=""><figcaption></figcaption></figure>

B8: Ấn `B`

B9: Nhấn `S`

Ta sẽ dùng cú pháp `T:port:type`&#x20;

> Đọc ở phần [tìm hiểu chung](#tim-hieu-chung) để biết type port ở decimal là gì
>
> Tuy nhiên với windows bạn có thể bỏ qua câu lệnh này

![](https://i.imgur.com/itTke7q.png)

<details>

<summary>Phân tích</summary>

* Ta thấy port 2 là 2.0 nhưng nhận dạng lại là 3.0 ta sẽ cần set nó lại thành 2.0 `T:2:0`
* Tiếp đó là port 3 ta thấy usb 2.0 nhận dạng là type A tức 2.0 --> đúng không cần sửa
* port 4 là 2.0 nhận dạng là 2.0 --> đúng
* port 5 là card mạng nhận dạng internal --> đúng
* Port 7 là bluetooth nhận dạng internal --> đúng
* Port 8 là web cam nhận dạng internal --> đúng
* Port 14 usb 3.0 nhận dạng là 3.0 --> đúng

</details>

B10: Nhấn `K`

B11: Ở màn hình `Enter Model Identifier` nhập model SMBIOS của bạn vào

<figure><img src="https://272971286-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FauskGAp5wYbI1xQWn4YZ%2Fuploads%2FV4Src64gNls4TpFLYcxn%2Fimage.png?alt=media&#x26;token=488f45bb-2259-4904-9da8-1aafb1b5a819" alt=""><figcaption><p>Before</p></figcaption></figure>

<figure><img src="https://272971286-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FauskGAp5wYbI1xQWn4YZ%2Fuploads%2FIIZUdeqDg8iA1VsMxtMO%2Fimage.png?alt=media&#x26;token=1d56538e-cc44-4401-a34a-fe4776c6f74b" alt=""><figcaption><p>After</p></figcaption></figure>

<details>

<summary>Các xem SMBIOS của bạn </summary>

Dành cho các bạn dùng tool build EFI&#x20;

B1: Mở `config.plist` có thể mở bằng [Propertree](https://github.com/corpnewt/ProperTree) hoặc bất cứ trình edit văn bản nào bạn có

B2: Tìm `SystemProductName` trong `config.plist`

![](https://272971286-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FauskGAp5wYbI1xQWn4YZ%2Fuploads%2Fx4hm4xIpLWJ50ddAPVrE%2Fimage.png?alt=media\&token=a9055bc7-e60b-4f68-958c-76084751fedf)

Đối với các bạn dùng tool build EFI thì sau khi thêm kext usbmap không cần snapshot

</details>

B12: Thêm kext `USBMap.kext` vào `EFI --> OC --> Kext` và snapshot lại theo hướng dẫn [tại đây](https://app.gitbook.com/s/Kkg5oI9lF3urxLNHi996/build-efi/create-efi)&#x20;

> Hoặc `EFI --> clover --> kext --> other`

{% hint style="info" %}
Đối với nhưng bạn không làm bước 8&#x20;

Các bạn sẽ copy kext `UTBmap.kext` và `Usbtoolbox.kext` vào `EFI --> OC --> kext` sau đó snapshot theo hướng dẫn [tại đây](https://app.gitbook.com/s/Kkg5oI9lF3urxLNHi996/build-efi/create-efi)&#x20;
{% endhint %}

B13: Save lại và reboot

### Macos

B1: Tải `usbtoolbox` [tại đây](https://github.com/USBToolBox/tool/releases)

![](https://i.imgur.com/q4zUsBP.png)

B2: Tải và cài đặt `USBToolBox.kext` và `UTBDefault.kext` [tại đây](https://github.com/USBToolBox/kext)

![](https://i.imgur.com/Mfatjy6.png)

B3: Chạy tool vừa tại về và nhấn `D`

![](https://i.imgur.com/uySyTsf.png)

B4: Các bạn cắm lần lược usb vào các cổng&#x20;

> Các cổng nhận sẽ hiện màu xanh

![](https://i.imgur.com/zRyRaKs.png)

B5: Nhấn `B`

![](https://i.imgur.com/9p5F7X6.png)

B6: Nhấn `S`

sử dụng cú pháp `T:port:type` để chọn type cho port&#x20;

> Xem ở phần [tìm hiểu chung](#tim-hieu-chung) để biết type phù hợp

![](https://i.imgur.com/qTwcdnA.png)

> Do mình không kiếm được 1 máy chưa map usb nên các bạn xem cú pháp và áp dụng vào máy các bạn

* `Port 1` là 1 hub device nhận dạng `internal` --> đúng
* `Port 2` là cam và bluetooth nhận dạng là `internal` --> đúng
* `Port 3` là usb `2.0` nhận dạng type A tức `2.0` --> đúng
* `Port 4` là usb `3.0` nhận dạng là `3.0` --> đúng

B7: Nhấn `K`

![](https://i.imgur.com/UvRqJxF.png)

![](https://i.imgur.com/xFt1P3u.png)

B8: Bỏ kext `UTBmap.kext` và xóa kext `UTBDefault.kext` sau đó snaps theo hướng dẫn [tại đây](https://app.gitbook.com/s/Kkg5oI9lF3urxLNHi996/build-efi/create-efi)

B9: Save và reboot

> #### Lưu ý
>
> * Đối với `usbtoolbox` ở mac thì sẽ không có khả năng tiên đoán port các bạn phải tự set bằng tay.&#x20;
> * Còn đối với windows có khả năng tiên đoán port các bạn có thể bỏ qua bước set port bằng tay và trực tiếp build kext.
> * &#x20;Khi map usb bằng usbtoolbox 1 số controller có thể sẽ không nhận. Biện pháp khắc phục là bạn sẽ cần load kext [xhci-unsupported](https://github.com/RehabMan/OS-X-USB-Inject-All) chung với kext usb vừa map

## Hackintool

### Chuẩn bị&#x20;

{% hint style="danger" %}
Chú ý:

`XHCI-unsupported.kext` phải cùng ver với `usbinjectall`&#x20;
{% endhint %}

B1: Tải kext `usbinjectall` [tại đây](https://github.com/daliansky/OS-X-USB-Inject-All)

B2: Tải `XHCI-unsupported.kext` [tại đây](https://github.com/daliansky/OS-X-USB-Inject-All/releases)

B3: Các bạn tiến hành nhìn vào mục type của `controller` trong tab usb của `hackintool`

![](https://i.imgur.com/2a13Ghj.png)

![](https://i.imgur.com/nemXgWt.png)

Nếu controller của bạn có type khác với

* `EH01`
* `EH02`
* `XHCI`
* `XHC`

Thì bạn sẽ cần rename chúng thành các tên tương ứng. Một số rename thường gặp là

* `EHC1 to EH01`
* `EHC2 to EH02`
* `XHC1 to XHCI`

Trường hợp trong DSDT tên XHCI đã được sử dụng thì các bạn có thể rename là `XHC1 to XHC_`

> Xem chi tiết hướng dẫn add patch rename [tại đây](https://app.gitbook.com/s/WaDTVx2hJ0rjBEHrlRj9/acpi-advance/patch-dsdt-phan-3) mẫu patch rename xem [tại đây](https://www.mediafire.com/file/dkclyfcox4jay60/Heavietnam_usb_rename.plist/file)

{% hint style="info" %}
Có trường hợp DSDT dã sử dụng cả `XHCI` và `XHC` khi này các bạn sẽ tiến hành rename `XHCI` thành `XHC2` và rename controller thành `XHCI`
{% endhint %}

B3: Reboot

### Method `XhciPortLimit`

{% hint style="info" %}
Lưu ý

Trước hết chúng ta phải tìm hiểu đây là cách làm rất phổ biến trước đây&#x20;

> Từ Catalina trở lại trước

Tuy nhiên từ sau phiên bản Macos 11.3 trở về sau thì các bạn sẽ không dùng được Quirk `XhciPortLimit`&#x20;

> Bật lên có thể không boot được hoặc không có tác dụng&#x20;

Nhưng đối với phiên bản OpenCore 0.9.3 trở về sau acidanthera đã fix lỗi ở quirk `XhciPortLimit` nên các bạn hoàn toàn có thể sử dụng quirk này để map usb một cách dễ dàng hơn
{% endhint %}

B1: Mở `config.plist` và bật quirk `XhciPortLimit`&#x20;

> Path: `Root --> Kernel --> Quirk --> XhciPortLimit`

B2: Save lại và reboot

B3: Tải app [Hackintool](https://github.com/benbaker76/Hackintool/releases)

B4: Mở Hackintool và đến tab `USB`

B5: Chuẩn bị 2 chiếc usb `3.0` và `2.0`

B6: Tiếp tục cắm các usb vào hết tất cả cổng

> Mỗi cổng đợi 5s rồi rút ra cắm cổng tiếp theo&#x20;
>
> > Sao cho mỗi usb đều cắm vào tất cả các cổng

B7: Các port không hiện xanh thì các bạn tiến hành ấn dấu ![](https://i.imgur.com/K3uqfX7.png)

B8: Tiến hành set port type các port màu xanh theo phần [tìm hiểu chung](#tim-hieu-chung)

> Vậy làm sao để biết cái nào là 3.0 cái nào là type C. Các bạn hãy quan sát trong quá trình cắm usb để có thể xác định một cách chính xác

![Đây là của mình sau khi điều chỉnh xong](https://lh4.googleusercontent.com/-CcjUexMrlgpj8X1LhxCbmgVSCXtDBYSAM94AVXohQJvqMvWvZlo3qt9UyoRvXD835h-xQJV77L1P6EAsyaqKWpOhzzhNlpycuASsEBbKDDNM6gxA48hGbMnw6_FzviyrdpSKD4h=s0)

B9: Ấn `export`&#x20;

* Có thể sử dụng `ssdt-uiac` kèm `usb injectall.kext`
* Hoặc `usbport.kext`

B10: Copy `ssdt-uiac` vào `EFI --> OC --> ACPI` và snapshot

> Hoặc `EFI --> Clover --> ACPI --> Patched`&#x20;
>
> Hoặc `usbport.kext` vào `EFI --> OC --> kext`&#x20;
>
> > Hoặc `EFI --> Clover --> kext --> other`

B11: Tiến hành tắt `xhciportlimit`

B12: OC\_Snapshot theo hướng dẫn [tại đây](https://app.gitbook.com/s/Kkg5oI9lF3urxLNHi996/general/tim-hieu-chi-tiet-ve-config.plist) nếu là OC và reboot

> #### Lưu ý
>
> * USB 3.0 type A và USB type C xuất ra 2 port là 2.0 và 3.0. Lưu ý cắm usb 2.0 và usb 3.0 lần lược vào USB 3.0 type A và USB type C
> * Sau khia add file đã xuất từ hackitool các bạn có thể xóa code ở `boot-arg`
>   * Chỉ dành cho `uia_exclude` và `include`
> * Các bạn hoàn toàn có thể dựa vào cấu trúc của `ssdt-uiac` để tự map usb bằng ssdt manual xem chi tiết [tại đây](https://app.gitbook.com/s/WaDTVx2hJ0rjBEHrlRj9/acpi-advance/map-usb-via-ssdt)

{% hint style="warning" %}
Chú ý:&#x20;

Nếu như máy các bạn có hơn 15 port usb dù làm theo cách nào đi chăng nữa thì các bạn cũng phải bật `xhciportlimit` trong `config.plist` để có thể sử dụng được tất cả 15 port
{% endhint %}

### Method `uia_include`

B1: Các bạn cắm usb vào port usb `2.0`

![](https://i.imgur.com/7TdvZo4.png)

B2: Add boot-arg `-uia_exclude_ss uia_include=XX`&#x20;

> Thay `XX` bằng các port usb 2.0

```
-uia_exclude_ss uia_include=PR11,PR21,HP21,HP23,HS01,HS02
```

B3: Reboot

B4: Cắm tiếp usb `2.0` vào các port `2.0` sau đó xóa hết những port không xanh&#x20;

> Các usb khi đã nhận có màu xanh

B5: Add boot-arg `-uia_exclude_hs` và xóa boot-arg `-uia_exclude_ss`

B6: Reboot

B7: Cắm các port usb 3.0 và type C vào sau đó tiếp tục xóa các port không xanh

B8: Điều chỉnh type các port theo bảng ở phần [tìm hiểu chung](#tim-hieu-chung)

B9: Ấn export

* Có thể sử dụng `ssdt-uiac` kèm `usb injectall.kext`
* Hoặc `usbport.kext`

B10: copy `ssdt-uiac` vào `EFI --> OC --> ACPI`  và snapshot

> Hoặc `EFI --> Clover --> ACPI --> Patched`&#x20;
>
> Hoặc `usbport.kext` vào E`FI --> OC --> kext`
>
> > Hoặc `EFI --> Clover --> kext --> other`

B11: Save lại và reboot

### Method  `uia_exclude`

#### Remap USB 2.0

B1: Cắm 1 thiết bị USB `2.0` vào tất cả cổng trong hệ thống&#x20;

> Mở Hackintool, chọn tab `USB`

B2: Ở đây các cổng thực sẽ hiện màu xanh các bạn hãy ghi nhớ phần name của các cổng ko hiện xanh&#x20;

> Có thể gh‌i tên các cổng đấy ra&#x20;

B3: Các bạ‌n thêm đoạn code sau vào boot-arg&#x20;

`uia_exclude=“tên các cổng không hiện xanh”`&#x20;

> &#x20;Khi viết code không có dấu `“ ”`

```
// Ví dụ

uia_exclude=HP11;PR12;HP12;PR13;HP13;PR14;HP14;PR15;HP15;PR16;HP16;PR17;HP17;PR18;HP18;PR22;HP22;PR23;PR24;HP24;PR25;HP25;PR26;HP26;HP27;HP28;HS03

// khi viết ra các bạn nhớ thêm vào boot-arg nhé
```

![](https://lh4.googleusercontent.com/gYzSUtlhSnlAD_u4tQC2GKCo0D2DGhFK9AzBzJXJOyFol9Z9bgyOdLflgc2jDY2Tk2v8gnN7DSR4kudYjRbD_LCAICVxfqozFxelTYS0QMVJgTGlqgzeg7YiUvizva_9Na2O2ggj=s0)

B4: Restart

#### Remap USB 3.0 và Type C

B1: Các bạn cắm 1 thiết bị `USB 3.0` và `USB Type-C` vào tất cả cá‌c cổng trên hệ thống&#x20;

**B2**: Các bạn sửa lại đoạn code trên theo đúng với hiện tại&#x20;

> &#x20;Loại bỏ 1 số cổng vừa hiện xanh trong code &#x20;

B3: Tiếp các bạn xóa đoạn code ở phần 1 đi và dán đoạn code mới vào `boot-arg`&#x20;

B4: Restart

#### Set Type Port

B1: Mở và cắm các usb `2.0` vào các cổng `2.0` usb `3.0` vào các cổng `3.0` sau đó ấn dấu ![](https://i.imgur.com/K3uqfX7.png) để Loại bỏ các port không xanh&#x20;

> Port rỗng

B2: Sau khi các bạn đã làm xong cả 2 phần trên thì hãy điều chỉnh lại loại cổng trong hackintool cho đúng nhé&#x20;

> Đọc bảng ở phần [tìm hiểu chung](#tim-hieu-chung)

![Đây là của mình sau khi điều chỉnh xong](https://lh4.googleusercontent.com/-CcjUexMrlgpj8X1LhxCbmgVSCXtDBYSAM94AVXohQJvqMvWvZlo3qt9UyoRvXD835h-xQJV77L1P6EAsyaqKWpOhzzhNlpycuASsEBbKDDNM6gxA48hGbMnw6_FzviyrdpSKD4h=s0)

B3: Ấn export

* Có thể sử dụng `ssdt-uiac` kèm `usb injectall.kext`
* Hoặc `usbport.kext`

B4: Copy `ssdt-uiac` vào `EFI --> OC --> ACPI` và snapshot

> Hoặc `EFI --> Clover --> ACPI --> Patched`&#x20;
>
> Hoặc `usbport.kext` vào `EFI --> OC --> kext`&#x20;
>
> > Hoặc `EFI --> Clover --> kext --> other`

B5: Snaps theo hướng dẫn [tại đây](https://app.gitbook.com/s/Kkg5oI9lF3urxLNHi996/build-efi/create-efi) nếu là OC và reboot

###

<details>

<summary>Check xem bạn có cần  <code>XHCI-unsupported.kext</code> hay không</summary>

B1: mở hackintool vào tab usb chú ý và `vendor id` và `device id`

<img src="https://i.imgur.com/WgIjlzQ.png" alt="" data-size="original">

B2: nếu bạn có `vendor id` là `8086` và device id là 1 trong những id sau:

* `8D31`
* `A2AF`
* `A36D`
* `9DED`

Thì bạn sẽ cần thêm kext trên. Đối với những bạn chưa boot được vào macos thì có thể xác định `vendor-id` và `device-id` theo hướng dẫn [tại đây](https://app.gitbook.com/s/Kkg5oI9lF3urxLNHi996/general/cach-xac-dinh-phan-cung#xac-dinh-vendor-id-va-device-id-cua-usb-controller)

</details>

> Source tham khảo: [USBToolBox/tool: the USBToolBox tool (github.com)](https://github.com/USBToolBox/tool) | [tool/TYPES.md at master · USBToolBox/tool (github.com)](https://github.com/USBToolBox/tool/blob/master/TYPES.md) | [Hackintosh USB Port Mapping Guide 2021 / 2022 – Mojave – Catalina – BigSur – Monterey – Guides and Tutorials – Olarila](https://www.olarila.com/topic/14220-hackintosh-usb-port-mapping-guide-2021-2022-mojave-catalina-bigsur-monterey/) | [headkaze/Hackintool: The Swiss army knife of vanilla Hackintoshing (github.com)](https://github.com/headkaze/Hackintool)
