其實寫這篇文章的時間有點晚了,網路上的教學已經很多。然而自從使用黑蘋果三號機以後,使用情境越來越多樣化,例如導入 RGB 控制、手邊也出現 USB-C 3.2 gen2 的裝置,所以來來回回參考過各種不同做法,重做了好幾次 USB Port Mapping,乾脆寫一篇文章紀錄自己覺得最妥當也最方便的作法,做做筆記也供有興趣的人參考。
記得多年前使用黑蘋果二號機嚐鮮 OSX 10.11 Capitian 預覽版的時代,首度遇到 BCM94360CD 的藍芽無法運作的情況,後來發現把藍芽的 USB 訊號線插到另一個插槽上暫時解決。之後得知從這版 macOS 開始引入了 USB Port Limit 機制,從此以後「訂製 USB 映射」(USB Port Mapping)也成為黑蘋果用戶的必修課程。
一、USB Port Limit 緣由
在 Intel 與微軟聯手發表 USB 介面之後,Windows 系統使用 0xFF 紀錄 USB 的連接埠號,也就是最多 255 個。當然了,硬體廠商目前不太可能把 255 個埠全部實作出來,例如黑蘋果三號機的 Z490 平台,原生晶片組最多只支援 26 個 USB 埠,實際把 USB 做出可用的實體介面其實也不到 20 個。以 Windows 用戶來說,系統會根據 ACPI 內容進一步測試 USB 埠是否可用,用戶只需把 USB 驅動安裝妥當即可。然而 Apple 公司對 USB 用法卻有獨到的見解,認為用戶同時不可能用到那麼多的 USB 裝置,於是在軟硬體層面(作業系統/韌體 ACPI)限制 USB 數量,從 OSX 10.11 開始把 USB 連接埠限制在 15 個之內(0x00 ~ 0x0F),並且直接指定實體(沒有 Windows 的驅動測試)。以往發表過的 Mac 設備,USB 實體連接埠也全都不超過這個數字,這就是 USB Port Limit。
Apple 聲稱 USB Port Limit 可大幅優化軟硬體設計的體驗,然而瞧瞧那 2015 年只剩一個 USB-C 的 MacBook,拿來充電就沒其他 USB 可用了,用戶不僅得額外花錢買 HUB 外掛擴充,一團擴充線材還會佔用一堆桌面空間,這樣算是優化體驗嗎?
二、USB Port Limit 對黑蘋果的影響
Apple 的獨家見解與限制 USB 數量的手段,對黑蘋果的用戶來就會出問題了。黑蘋果硬體的原始 ACPI 內容裡,定義 USB 連接埠數量很可能超過 15 個(以黑蘋果三號機的 Z490 VISION G 來說 ACPI 內有 26 個),而且不一定每一個都有實體線路對應(Z490 VISION G 主機板並未把 26 個 USB 埠全部做出來),但 macOS 從黑蘋果的 ACPI 表中取 15 個時,也不會知道哪些是有、或沒有實體線路的 USB 埠,最終導致某些黑蘋果硬體的實體連接埠在 macOS 中無法正常發揮使用(不在取用的 15 個之內)。不僅如此,由於 USB 對應的內容不正確,還會連帶影響 macOS 睡眠喚醒功能也不正常。
早期黑蘋果二號機的解決方式是使用 USBInjectAll.kext 以注入的方式,將 macOS 系統 kext 驅動 Patch ,用以解除 macOS 系統 15 個限制,不過這個方法也常跟著系統改版而失效,無法一勞永逸,不是理想的解決方式。真正的解決方式,就是乖乖按照蘋果的遊戲規則只取 15 個,也就是將黑蘋果硬體的 ACPI 表的 USB 連接埠限制在 15 個之內,並保證每一個都有實體 USB 埠對應,理論上就不會受到 macOS 系統改版的影響,但可用的 USB 最多就 15 個(畢竟 Mac 電腦也沒超過 15 個 USB 埠給你)。
三、訂製 USB Port Mapping 的方法
這個議題從 OSX 10.11 時代開始,已經廣泛流傳很多年了,所以方法很多種,例如在 macOS 環境中使用 Hacktools、USBMap 這類工具,不過我個人推薦以下的「USBToolBox」方式,因為 USBToolBox 支援 Windows 環境下的 USB Port Mapping 訂製。
以往在 macOS 定製 USB Port Mapping 的方法,第一步就得先設法解除 macOS 環境下的 USB Port Limit 限制再來訂製,而解除的方法又會根據 macOS 版本而有所不同,做法相當分歧,還不如乾脆到 Windows 訂製。 Windows 系統對 USB 的支援是最完整且直接,可確保在 Windows 支援最大數量 USB 連接埠的環境中,取出自己想要的 15 個連接埠,並且操作上也更直覺簡便。
準備工作:
- Windows 10 系統,可連線 Internet。
- 一個使用 USB Type A 接頭的裝置:滑鼠鍵盤就可以了。
- 一個使用 USB Type C 接頭的裝置(若主機板有 USB-C 連接埠時):我用 PS5 的 DualSense 控制器,這玩意其實只有 USB 2.0 的連線速度(480Mb/s)。
不需要 USB3.0 的裝置,因為在 Windows 環境中,USBToolBox 支援自動偵測,工具會從 USB 2.0 把 3.0 的埠號抓出來。
操作方式:
1. 下載 USBToolBox for Windows 版,也就是這個 Release 網頁的「Windows.zip」。
2. 將 Windows.zip 解壓縮。裡面有一個 Windows.exe。
3. 執行 Windows.exe。第一次執行的畫面如下:
這個工具的介面操作方式以終端文字呈現,操作很簡單。會列出可執行的命令項目,底下 Select an option: 就是等待操作者輸入的位置。
為了後續操作上的方便與流暢,所以一開始要先做一些設定,也就是「C. Change Settings」。
接著畫面如下:
設定操作功能的開(Enabled)或關(Disabled),輸入項目的字母(T、N、A、C、B)按 Enter 即可切換開關。
為了後續的操作流暢,以下把 N 與 A 開啟,T 與 C 關閉(尤其是 C. Bind Companions 綁定配對功能建議關閉,後面會說到原因)
設定完成之後,輸入 B [Enter] 回到上一頁。
回到主選單之後,輸入 D [Enter] 進入以下的畫面。這個畫面每 5 秒刷新一次。
上圖中可看到有幾個連接埠已經連接裝置了。
- 連接中的裝置會呈現綠色,
- 連接過的裝置會呈現藍綠色。
接下來是真正的重點了。
3. 使用 USB 裝置(如上面提到的 USB Type A 接頭的鍵盤滑鼠),把機器上所有的實體 USB 埠全部插拔過一次。如果機器上有 USB-C 埠的話,也要接上 USB-C 的裝置插拔。
機上上所有的 USB 埠全部都被插拔過一輪之後,畫面大致如下(每台機器不同):
可以發現,即使只用 USB 1.1/2.0 的設備插拔, USB3.0 的埠號也會呈現插拔過的藍綠色狀態。
做完之後,輸入 B [Enter] 回到主選單,準備進入下一個步驟。
(如果覺得剛剛的插拔不過癮,想重新再來的話,可以在主選單輸入 P [Enter] 再輸入 D [Enter] 重來一次)
4. 編修 USB 連接埠數量與屬性
回到主選單之後,輸入 S [Enter] 進入編修介面
接著畫面如下:
這個列表中,連接埠超過 15 個,有些 USB 連接埠屬性也不太對。另外,也可看到 USB 3.0 Type 3 埠號與 USB 2.0 Type A 兩兩對應,例如 #3 (2.0) 跟 #19 (3.0),#4 (2.0) 跟 #20 (3.0),#5 (2.0) 跟 #21 (3.0),#6 (2.0) 跟 #22 (3.0) ... 等等。
對照抽插的情況,整理出實體 USB 的位置:
也就是說,PC 機器上的 USB Type A 孔,如果有支援 3.0 的話,向下支援 2.0 就會使用兩個埠號(3.0 / 2.0 各一)。
首先要處理的是超過 15 個連接埠,我的情況是已經自動標示出 19 個連接埠,所以至少需刪除 4 個。選出哪 4 個就全看個人的使用習慣了。#18 確定沒有實體線路(對應 #2 是網卡的藍芽埠 USB2 主板插槽,沒有 USB3 實體),#3,#4,#5 是位於主機板後方的 USB Type A 3.0 連接埠,用到 2.0 的機會極低,所以決定刪除 #18,#3,#4,#5 這四個。輸入 18 [Enter] 3 [Enter] 4 [Enter] 5 [Enter],把數量刪至剩 15 個。
上面提到,在設定功能中關閉 Bind Companions 的原因就在這裡。#2 跟 #18,#3 跟 #19, #4 跟 #20,#5 跟 #21 這四組為倆倆綁定,如果不關閉的話,刪除其中一個時,配對的另一個也會跟著被刪除,所以強烈建議關閉 Bind Companions 功能。
再來要處理的是辨識錯誤的情況。內建連接埠 2 跟 12 誤識別為 USB Type A 類型。而 Type-C USB3.0 的接頭類型也被誤認為 Type A USB 3.0。
以下是電腦常見的接頭類型:
如果不知道有哪些接頭類型的話,可以在這個畫面輸入 T [Enter] 查看
黃色匡起來的部分是一般可能會使用的類型。按 B [Enter] 回上一頁。
接著來修改接頭類型。輸入的指令為
T:埠號(超過一個的話可用逗號隔開):類型碼
例如把 2 跟 12 改為主機板內建,則輸入
T:2,12:255
當然也可以輸入 T:2:255 [Enter] 和 T:12:255 [Enter],個別修改埠號類型。
接著是修改 Type-C 的部分。支援 USB 2.0 的 USB-C 埠號是 6,類型為 8。
USB 3.x 的話,Type-C 插拔的時候記得要反過來再插一次,埠號還是一樣就是類型 9 ,會變化就是類型 10。這張主板正反插的埠號都是 22 ,所以是類型 9。
如果想針對埠號加上註解(comment)的話,可以輸入 C:埠號(多個埠號用逗號隔開):註解內容。這個動作可以省略。
最終編修完成的 USB Port Mapping 如下:
確認沒問題的話,下一步就可以產生 USBMap.kext 檔案了。按 K [Enter]。
由於在 Windows 底下操作,這套工具並不知道是做給哪一種 Mac 機型,所以要手動輸入。
以黑蘋果三號來說,SMBIOS 機型為 iMac20,1,輸入完按 Enter。
在工具的目錄下就會產生 USBMap.kext,在 Windows 系統下是目錄的類型。
5. 回到 macOS 底下,將產出的 USBMap.kext 複製到 EFI/OC/Kexts 底下,記得編輯 config.plist 內 Kernel -> Add 把驅動加上去,重開機即可生效。
這個方式的作用原理是變更主機板 BIOS 內的 ACPI 內容。開機成功載入 USBMap.kext 之後,ACPI 內的 USB 連接埠描述只剩下選定的 15 個,且每一個都是 USB 裝置實際抽差確認位置之後的連接埠,且並未對 macOS 系統本身有任何 Patch 的動作,理論上支援所有的 macOS 系統,
四、後記:
定製 USB 映射( USB Port Mapping)對於黑蘋果用戶來說是一門必修課。或許是網路教學很多,所以先前就一直沒寫。然而看了一下, Windows 訂製 USBMap.kext 的方式似乎比較少人提到,所以就乾脆直接補完了。
留言列表