15個制限のためのUSBPorts.kextをHackintoolで作る

macOSのUSB 15個制限を解決するために、使用する15個未満のUSBポートを決定し、macOSに伝えます。以前の記事でいくつかの方法を紹介しましたが、今回はHackintoolを使ってkextを作ります。作業が楽で、作ったkextを1個インストールするだけなので簡単でした。

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個制限の設定が可能でした。今まで紹介した方法のどれよりも簡単だと思いますので、今後はこの方法で設定していこうと思います。コメントで教えていただきありがとうございました。

4件のコメント

  1. お疲れ様です。
     時間があったので、さっそく試して見ました。
     環境は①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は謎な動きもあるので、ほかの方で再現できるかわかりませんが、ご報告まで。(最終的に不安定要素をかかえてしまいそうなので、元に戻しました。)

  2. Hackintoolで重複した表示になることは経験しています。一旦全てを消去して(ほうきマークボタンで)、回転矢印ボタンでリフレッシュすると改善したように思います。

    動かない方のUSBPorts.kextのInfo.plistの内容は確認されたでしょうか?Info.plistに機種IDを書くところが2箇所ありますが、そこが違っているのかもしれないです。また、ベンダーID, デバイスIDを書くところがありますが(IOPCIPrimaryMatch)それがチップセットと違っているのかもしれないです。USBInjectAll.kextを入れた状態でHackintool作業をすると多分IDは正しくなるのかと想像してます。

  3. お疲れさまです。早いリプライありがとうございます。
     チップセット依存だけではなくて、機種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は便利ですねぇ。

    1. ProperTreeのOC Clean Snapshot機能がなかったらOCに移行する気になれなかったと思います🙂

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です