macOSのUSB 15個制限を解決するために、使用する15個未満のUSBポートを決定し、macOSに伝えます。以前の記事でいくつかの方法を紹介しましたが、今回はHackintoolを使ってkextを作ります。作業が楽で、作ったkextを1個インストールするだけなので簡単でした。
Table of Contents
USBポート個数対処の方法
今までの記事では、USBポート個数制限に対処する方法として、
- AppleUSBXHCIPCI.kextにパッチを当てる
- OpenCoreのconfig.plistでXhciPortLimitをtrueにする
- DSDTを書き換えて使用する15個のUSBポートを指定する
- USBInjectAll.kextとブートオプションで15個を指定する
- USBInjectAll.kextとこれに指示するSSDTを作って15個を指定する
などの方法を紹介しました。
先日の記事で、OpenCore用の手順を書いたところ、P2B-Fさんからコメントで「Hackintoolを使ってUSBPorts.kextを作る方が簡単です」と教えていただきました。試してみたら確かに簡単でした。その手順をまとめておきます。以下の方法は、個数制限に対応する方法の中で、現時点で一番おすすめの方法だと思います。
Hackintoolを入手する
Hackintoolは以下から入手できます。HackintoolはiGPUの設定でも使いました。色々便利な機能があります。USBポートの情報などのハードウェア構成情報はIORegistoryExplorerでも見ることができますので、併用して確認するのも良いです。
一時的に制限を撤廃する
まずOpenCoreのconfig.plistでXhciPortLimitをtrueにするなどして一時的に15個制限を解除します。Cloverでしたらconfig.plistで15個制限撤廃パッチを当てても良いです。また、以前紹介したようにUSBInjectAll.kextとブートオプションを使って少しずつ解除しても良いです。以下では、全てを解除した状態で説明します。全解除状態でHackintoolを起動し、ウィンドウ上部のボタンからUSBを選択すると、下の図のようになります。
ウィンドウの下には、7個のボタンが表示されています。マウスを持っていくと機能が文字表示されます。それによると左から、Info, マイナスマークのDelete, ホウキのマークのClear All, 回転矢印マークのRefresh, 注射器マークのInject, Import, Exportのボタンです。Clear All, Inject, Refreshの順に押していくと、現在認識されているポートが全て表示されます。Z390チップセットのASUS ROG MAXIMUX XI HEROでは以下のようになりました。上部のウィンドウに、Canon Lake用の300シリーズチップセットのマザーボードであることが表示されていて、マザーボードが正しく認識されています。
ここでHS03とHS12がアクティブになっています。HS03には、一時的にLogicoolのタッチパッド付きキーボード用の無線ドングルを接続したので、それが見えています。また、HS12にはUSB 2.0のハブを接続しているので、それが見えてます。実はHS13には、Apple純正のBluetoothモジュールが接続されているのですが見えていません。マザーボード上のUSB 2.0コネクタなのですが、これがマザーボード内蔵のhub経由で接続されているらしく、そのためか、XhciPortLimitをtrueにしても見えないようです。なので設定作業用にLogicoolのキーボードを接続しているわけです。(さらにはSS10にもハブがつながっているのですがそれも見えていないようです。後の図で示すように、15個制限を設定したら、これらも見えるようになりました。)
USBポートを特定して選別する
この状態で、USBポートにデバイスを取り付けて、変化を観察します。例えば上の状態では、バックパネルのUSB 3ポートにLogicoolのキーボードドングルが反応したので、これがHS03であることがわかります。この作業には、キーボード、マウス、USB Bluetoothアダプタなどを使うと良いです。これらはUSB 2.0ですし、抜き差しも簡単です。USB 2.0メモリーを使用すると、アンマウントする手間が必要です。USB 3のポートを確認するには、USB 3対応のUSBメモリーなどを使います。この場合は、取り外す際にアンマウントしないと、データを壊す危険があります。(大抵は大丈夫ですが)
HackintoolのConnectorの欄をクリックするとポップアップメニューが出ます。この欄には、USBの速度ではなく、接続された物理的なコネクタの形状を書きます。HS03はUSB 2ですが、USB 3コネクターに接続されています。なのでHackintoolのConnectorの欄はUSB3に設定します。
Connectorとして選択できるのは、USB2, USB3, TypeC+Sw, TypeC, Internalの5種類です。ここでの選択で、後で述べる出力ファイルのUsbConnectorプロパティ値が変化します。それによると、それぞれの選択で、0, 3, 9, 10, 255が割り当てられることがわかりました。これらの値について、Hackintoolのソースを調べたところ、ヘッダファイルに以下の記述がありました。
kTypeA = 0x00, // Type ‘A’ connector kMiniAB = 0x01, // Mini-AB connector kExpressCard = 0x02, // ExpressCard kUSB3StandardA = 0x03, // USB 3 Standard-A connector kUSB3StandardB = 0x04, // USB 3 Standard-B connector kUSB3MicroB = 0x05, // USB 3 Micro-B connector kUSB3MicroAB = 0x06, // USB 3 Micro-AB connector kUSB3PowerB = 0x07, // USB 3 Power-B connector kTypeCUSB2Only = 0x08, // Type C connector - USB2-only // These only implement the USB2 signal pair, and do not implement the SS signal pairs kTypeCSSSw = 0x09, // Type C connector - USB2 and SS with Switch // These implement the USB2 signal pair, and a Functional Switch with a physical // Multiplexer that is used to dynamically connect one of the two receptacle SuperSpeed // signal pairs to a single USB Host Controller port as function of the Type-C plug // orientation. kTypeCSS = 0x0A, // Type C connector - USB2 and SS without Switch // These implement the USB2 signal pair and a Functional Switch by connecting each // receptacle SuperSpeed signal pair to a separate USB Host Controller port. // 0x0B – 0xFE: Reserved kInternal = 0xFF // Proprietary connector
0, 3, 9, 10, 255以外にも、いくつかの設定値があるようです。ただ、Hackintoolのメニューにあるように、この5種類が一般的で、これ以外を設定することはなさそうです。この説明から、割り当ては以下のようです。
- USB2 (0) はUSB 2.0 Type Aコネクター
- USB3 (3) はUSB 3.x Type Aコネクター
- TypeC+Sw (9) はスイッチ経由USB Type-C (Gen1またはGen2)
- TypeC (10) はスイッチを経由しないUSB Type-C (Gen1x2またはGen2x2)
- Internal (255) はマザーボード上の専用コネクタ
USB規格のType-A, Type-Cコネクタの場合は、0, 3, 9, 10を指定するのに対して、マザーボード上にあるヘッダピンのようなUSB規格外のコネクタに接続されている場合はInternal (255) を選択します。どのコネクタに接続されていてもUSBはUSBなので関係ない気もしますが、macOSの中での電力制御の扱いが異なるようです。IORegistoryExplorerなどでコネクタの情報を見ると、コネクタ種類の違いで電流関係のパラメータが異なっています。その関係と思われますが、Bluetoothアダプタが接続するポートは、255に設定しないとスリープを妨げることがあるようです。
Type-Cコネクタの設定
Hackintoolのコネクタ選択肢であryTypeC+SwとTypeCの違いを説明します。Type-Cケーブルは、以下のように1セットのUSB2配線(A6, A7とB6, B7)と、2セットのUSB3配線(A2, A3, B11, B10とA10, A11, B3, B2)で構成されています。
このうち、Type-CのUSB2 (信号名はD+とD-) は、コネクタを裏表どちらに挿しても同じUSB2が接続されます。コネクタが冗長に使用されています。それに対して、2個のUSB3 (TX1+/-, RX1+/-, TX2+/-, RX2+/-) は、裏表どちらかに挿すことで、2セットのUSB3が別々に接続されます。なのでUSB3に関しては、2セット分用意しないといけないわけです。これを実現するために、もともと1個しかないUSB3をスイッチングハブで分岐して2個にして接続するか、もしくは2個のUSB 3ポートを用意するか、の2種類の実装方法があります。これがHackintoolのメニューにあるTypeC+Sw(スイッチ付)とTypeCです。どちらも2個のUSB3が使えますが、前者は一つを2個に分岐しています。なので2個のUSB3を両方とも使用した場合は、速度が半々になります。後者は、両方のUSB3を共に使用してもそれぞれのフルスピードが出ます。
最近になって従来のUSB 3.0や3.1の表記に代わって、USB 3.2という名称が使われるようになり、ややこしくなってます。色々調べてみると、以下のような分類になったようです。
- USB 3.2 Gen1 : 昔のUSB 3.0 または 今のUSB 3.1 Gen1と同じもの (5Gbps線を1組使用)
- USB 3.2 Gen2 : 昔のUSB 3.1または今のUSB 3.1 Gen2と同じもの (10Gbps線を1組使用)
- USB 3.2 Gen1x2 : Type-Cでスイッチを使わずに独立した5Gbps線を2組使う (合計10Gbps)
- USB 3.2 Gen2x2 : Type-Cでスイッチを使わずに独立した10Gbps線を2組使う (合計20Gbps)
ちなみにGen2x2は「じぇんつーばいつう」と読むようです。x2が末尾につくコネクタはHackintoolのTypeCを選択し, x2がつかないコネクタはTypeC+Swを選択します。今回チェックしたマザーボードでは、裏表どちらに挿してもSS06に接続されました。スイッチで分岐しているだけのようなのでこれはUSB 3.1 Gen2x1です。HackintoolのConnectorメニューではTypeC+Swを選択します。
使わないポートを除外
こうしてUSBポートを特定していくと同時に、使わないポートを外していきます。最終的に15個のUSBポートまで削減していきます。使えるものなら使いたいけど、個数制限で諦めざるを得ないポートもあると思います。また、Comment欄のところにメモ書きをしておくと、後で説明する出力ファイルにもコメント記載されます。テキストエディタで修正する場合などに便利です。
今回も、以前の記事で選んだUSBポートを使うことにしました。結果として以下のようになりました。
USBPorts.kextを作る
この後、ウィンドウ下のExportボタンを押します。するとこの設定から、
- SSDT-EC-USBX.aml
- SSDT-EC-USBX.dsl
- SSDT-UIAC.aml
- SSDT-UIAC.dsl
- USBPorts.kext
の5個のファイルをデスクトップに作ってくれます。以前のガイドで作っていたSSDT-UIACは、ここではSSDE-EC-USBXとSSDT-UIACの2つに分割されています。統合すれば内容は同じものでした。なので、SSDT関係のファイルはUSBInjectAll.kextと一緒に使うものであると思います。
一方、ここで作られるUSBPorts.kextは、Info.plistだけを持ったインジェクタkextという種類のkextファイル(実際にはディレクトリ)です。ターミナルからディレクトリを辿る、もしくはファインダーからパッケージを開くと、
USBPorts.kext/Contents/Info.plist
というテキストファイルが見えます。この中に、上で設定した内容が、plist書式のテキストで書かれています。こうして作成されたInfo.plistの内容を以下のところに置いておきました。
このUSBPorts.kextだけを使用すれば、15個のUSBを指定して動かすことができました。kextを使う場合は、USBInjectAll.kextやSSDT-EC.aml, SSDT-UIAC.amlは不要です。実は、Z97の時代にはこの手のインジェクトkextを使って使用USBのリストを設定していました。その後、チップセットが代わって、雛形となるファイルが見つからなくなったので、USBInjectAll.kextとSSDTを組み合わせて使っていました。Hackintoolでこんなに簡単に生成してくれるなら、今後はこのkextを使っていきたいと思います。
USBMap.commandを使う
こちらもコメントで教えていただきました。Hackintool.appと同様に、インジェクトkextを作るPythonスクリプト、USBMap.commandがcorpnewtさんによって配布されています。
こちらはCUIベースで設定していきます。操作が多少独特ですが、USB設定専用のアプリですのでシンプルです。生成されるインジェクトkextはUSBMap.kextという名前ですが、Hackintoolで作るUSBPorts.kextと全く同じ内容です。
% ./USBMap.command ####################################################### # USBMap # ####################################################### Plist: USB.plist UIA Boot Args: None USBInjectAll: Not Loaded - NVRAM boot-args WILL NOT WORK AptioMemoryFix: Unknown NVRAM Arg Options: H. Exclude HSxx Ports (-uia_exclude_hs) S. Exclude SSxx Ports (-uia_exclude_ss) C. Clear Exclusions R. Remove USB.plist from Scripts Folder T. Reset Settings to Defaults P. Edit Plist & Create SSDT/Kext D. Discover Ports U. Validate USB Power Settings Q. Quit Please select an option:
コメントでMifjpnさんから、USBMap.commandの使用例を教えていただきました。
まとめ
USBポート15個制限に対応するため、Hackintollを使って、USBPorts.kextを作りました。このkextを使用するだけで、15個制限の設定が可能でした。今まで紹介した方法のどれよりも簡単だと思いますので、今後はこの方法で設定していこうと思います。コメントで教えていただきありがとうございました。
お疲れ様です。
時間があったので、さっそく試して見ました。
環境は①i7 8700,ASUS PRIME H370H-A/CSMと②i5 9400F ASUS PRIME H370H-Aです。
まず、HackintoolのUSBの表示ですが、OCでUSBポート全部を表示させたところ、重複するものが出てきました(すべての項目で重複したのが2個出ます)。ポート確認をすると、2個のうち下のほうが反応しますので、ポート決めをして、USBPort.Kextを作りました。
Cloverをつかうと、
①では、CatalinaとMojaveが動いているのですが、うまくいきました。
②では、なぜか、制限していないでUSBInjectAllを入れた状態になってしまい、USB3.0が見えなくなりました、①でうまくいっているので、いろいろ試したところ、どうやら、SMBIOSでiMac19,1を単にiMac19.2にすると、15ポートの制限がかかり、うまく読み込めるようです。
ASUS PRIME H370H-A/CSMは謎な動きもあるので、ほかの方で再現できるかわかりませんが、ご報告まで。(最終的に不安定要素をかかえてしまいそうなので、元に戻しました。)
Hackintoolで重複した表示になることは経験しています。一旦全てを消去して(ほうきマークボタンで)、回転矢印ボタンでリフレッシュすると改善したように思います。
動かない方のUSBPorts.kextのInfo.plistの内容は確認されたでしょうか?Info.plistに機種IDを書くところが2箇所ありますが、そこが違っているのかもしれないです。また、ベンダーID, デバイスIDを書くところがありますが(IOPCIPrimaryMatch)それがチップセットと違っているのかもしれないです。USBInjectAll.kextを入れた状態でHackintool作業をすると多分IDは正しくなるのかと想像してます。
お疲れさまです。早いリプライありがとうございます。
チップセット依存だけではなくて、機種ID依存でもあるんですねぇ。配布がチップセット名だけだったので、少し迷いました。
お察しの通り、i7 8700 →iMac19,2、i5-9400F→iMac19,1で、基本的にマザーは同じなので、i7 8700で作ったUSBPorts.kextのInfo.plistの機種IDを置換して使うことができました。
OpenCore0.5.8は、ファイルをセットして、OC Clean Snapshotでうまくいきました。OC Clean Snapshotは便利ですねぇ。
ProperTreeのOC Clean Snapshot機能がなかったらOCに移行する気になれなかったと思います🙂