追記:この記事ではUSBの15個制限を簡易的に回避します。本気で対応するには、この記事の方法よりも、以下をお薦めします。
USBInjectAll.kextの役割を確認するために外して調べてみました。マザボ搭載USBポートの情報を正しく反映するために必要でした。さらに正確に反映させるためのSSDTを作りました。USBInjectAll.kextの役割このkextを外してみるRehabManさんが開発してくれているUSBInjectAll.kextは、いつも使用しているのですが、そのありがたみがイマイチ理解できていませんでした。そこで外してみたらどうなるのか調べました。USBポートの状態を調べるために、macOSから見えるハードウェア構成を確認するツールであるIORegistryExplorerを使用... 15個制限を回避するUSBInjectAll.kextの役割と使用法 - Boot macOS |
この記事の結論を先に書いておきます。
- 15個の制限を外すパッチとUSBInjectAll.kextを併用すると全てのUSBポートが使えるようになる (tonymacx86のMultiBeast方式)
- 15個制限解除パッチを使用せずに、USBInjectAll.kextのみを使って、実際に使用するポートを15個まで選択できる (お勧めの方式)
El Capitanから使用可能なUSBポートの数が、 コントローラ当たり15までと制限されました。その後のSierraでもHigh Sierraでも同じです。理由は不明です。15ポートもあれば十分と思われるかもしれませんが、そうでもありません。まず、USB 3ポートは、互換性のためにUSB 2.0の端子も持っています。なので、2ポート分としてカウントされます。また、USB 2.0の端子から先にアサインされるので、USB 3の端子が使えず、USB 3のポートがUSB 2.0相当になってしまうこともあります。その対策について説明します。
Table of Contents
無も対策しない場合のUSB構成
まずは、何も対策しないとどうなるかを見て見ましょう。IORegistryExplorer.appなどのツールを使うと、macOSから見たハードウェア構成がわかります。 ちなみに表示される情報は、Cloverのパッチや各種kextが機能した後の結果で、マザーボードのUEFIが提示しているオリジナルの構成ではありません。
IORegistryExplorer.appを起動して、右上の虫眼鏡アイコンのところに、xhcと入力します。するとXHC関係の情報が現れます。XHCの下にHS01やSSP1と見えているのが、現在OSが認識しているUSBポートです。HSはHigh Speed、SSPはSuper Speed PlusでそれぞれUSBの速度のモードです。HSがUSB 2.0で、SSPはUSB 3です。
全く対策しない状態の手元のマザーボード(MSI Z97A Gaming 7)では、以下のような結果になりました。
USB 2.0がHS01からHS14までの14本あり、USB 3がSSP1の1本あるという結果です。このマザーボードには、実際には他にもSSP2からSSP6の5本のUSB 3があるのですが、15本の制限を超えてしまったので、見えなくなっています。そのポート、例えばSSP6に接続しているUSBポートにUSB 3のUSBメモリを挿しても読み書きできません。(ちなみに、そのポートにUSB 2.0のUSBメモリを刺すと、2.0の端子はHS10に接続されているので、読み書きできます。)
解決策1:15個の制限を取り払う
解決策の一つは、上限15個の制限を外すパッチを当てることです。次の手順で15個の制限を外して、チップセットに接続された全てのUSBポートを使用できます。
- config.plistにポート数を増やすパッチを当てる
- USBInjectAll.kextを使用する
1. 2.の両方を実施する必要があります。片方だけではダメです。この解決策の問題点は、パッチパターンがmacOSのバージョンごとに異なることです。パッチは、macOSの該当するバージョンにしか効きません。今使っているmacOS用のパッチが見つからない場合は、解決策2に進んでください。
ポート数を増やすパッチ
まずは、AppleUSBXHCIPCI.kextに以下のパッチを当てます( New USB Raise Port Limit Patch for High Sierra | tonymacx86.com より)。
<dict> <key>Comment</key> <string>Change 15 port limit to 24 in XHCI</string> <key>Find</key> <data>g32MEA==</data> <key>Name</key> <string>AppleUSBXHCIPCI</string> <key>Replace</key> <data>g32MGw==</data> </dict>
これは10.13 PB1をインストールした100シリーズマザーボード用のパッチと書いてありましたが、正式版10.13でZ97チップマザーボードでも動きました。
一方で、10.13.4からは違うパッチを当てないといけないようです。
後にも書きましたが、ポート数を増やすパッチはmacOSのマイナーバージョンごとに違っています。マイナーアップデートの都度対応する必要があり、お勧めの方法ではないです。
USBInjectAll.kextを使用
次にUSBInjectAll.kextをEFI/CLOVER/kexts/Otherもしくはバージョン番号のフォルダに入れます。
RehabMan / OS-X-USB-Inject-All / Downloads — Bitbucket
このkextは、チップセットで用意されているUSBポートの全てをmacOSから参照できるように設定する機能があります。Z97チップセットのUSBは、PCIeのvender-id/device-idが8086/8cb1に割り当てられています(IORegistryExplorer.appで見ることができます)。USBInjectAll.kextの中のInfo.plistの8086_8xxxというキーを見ると、HS01からHS14とSSP1からSSP6までの20のポートがあることがわかります。
config.plistへのパッチ当てとUSBInjectAll.kextを使った結果を以下に示します。
このように、全てのUSBポートが使えるようになっていることがわかります。これで、順番の最後尾に並んでいたUSB 3も全て機能します。簡単に全USBを使えるように設定できました。tonymacx86で配布しているMultiBeastというインストールツールは、この手法を使っています。
実際に使っているUSBポートを特定する
上記の解決策で、全部のUSBが使えるようになります。簡単ですが、多少問題があります。まずは、そもそもmacOSが何らかの理由で15個に制限しているのに、その上限を増やしてしまって大丈夫なのかという懸念です。今のところ問題点は報告されていませんが、将来、何らかの副作用が出てくる可能性は否定できません。もう一つは、パッチの内容が、OSのバージョンやチップセットによって変わるらしいことです。今回のHigh Sierraへの移行にあたっても、パッチが更新されました。Sierraの時のパッチでは、上限を回避できないようです。この先のバージョンアップでも対応が必要になると思われます。
一方、USBInjectAll.kextは、名前は、「全てのUSBポートをインジェクトする」ですが、実際には、一部のUSBポートを遮断する機能があります。たとえば、もともとある20個のポートのうち、任意のポートを指定して、使用しないよう設定することができます。実際に使用しているポートだけを15個選んで設定すれば、15個の上限を外す必要は無くなります。そうすればconfig.plistに素性の良くないパッチを書き込む必要がなくなります。USBInjectAll.kextの方は、RahabManさんによってこまめに更新されているので、今後も安心して使用できます。
使用しないポートを除外するためには、実際に使っているUSBポートを特定する必要があります。ちょっと大変な作業ですが、マザーボードの構成を把握できるので、達成感はあります。それぞれのポートの番号は、
- それぞれのポートにUSB機器を接続し、
- IORegistryExplorer.app の表示の変化を確認する
ことで、特定できます。下の例は、とあるUSB 3ポートにUSB 3.0メモリを挿入してみたところです。SSP5のport-statusが、最初は0x0だったのですが、下の図のように0x1400に変化しました。(kUSBBusCurrentAllocationの値も変化しました。)これで、このポートはSSP5だということがわかります。このポートに、USB 2.0のデバイスを接続すれば、USB 2.0端子の番号もわかります。
こうして手元のマザーボードを調べて見ました。各ポートの番号は以下のようになっていました。
- HS01 基板上のUSB 3の2.0端子 (フロントパネルで使用)
- HS02 基板上のUSB 3の2.0端子 (フロントパネルで使用)
- HS03 バックパネルのUSB 3の2.0端子
- HS04 不明
- HS05 バックパネルのUSB 2.0
- HS06 バックパネルのUSB 2.0
- HS07 不明
- HS08 不明
- HS09 バックパネルのUSB 3の2.0端子
- HS10 バックパネルのUSB 3の2.0端子
- HS11 基板上のUSB 2.0 (フロントパネルで使用)
- HS12 基板上のUSB 2.0 (未使用)
- HS13 基板上のUSB 2.0 (未使用)
- HS14 基板上のUSB 2.0 (Bluetoothで使用)
- SSP1 基板上のUSB 3 (フロントパネルで使用)
- SSP2 基板上のUSB 3 (フロントパネルで使用)
- SSP3 バックパネルのUSB 3
- SSP4 不明
- SSP5 バックパネルのUSB 3
- SSP6 バックパネルのUSB 3
HS01,02,03,09,10は、それぞれSSP1,2,3,5,6のUSB 3ポートに含まれているUSB 2.0端子です。HS14はBluetoothモジュールに接続しているので、これを無効にするとキーボードもトラックパッドも使えなくなります。不明とあるポートは発見できませんでした。マザーボード上で配線されていないのかもしれません。
解決策2:使うポートを15個以下に選別する
行方不明のポートを使うことはありませんし、マザーボード上で接続していない端子のポートも当分は使いません。これを考えるとUSBポートを15個以下に絞り込むことができます。上の例では、HS04, HS07, HS08, HS12, HS13, SSP4は除外して良いです。
USBInjectAll.kextに除外するポートを伝える方法は、いくつかあるようですが、最も簡単なのは、Cloverのブートオプションで伝える方法です。HS04, HS07, HS08, HS12, HS13, SSP4を除外したい場合は、config.plistのBootキーの中にあるArgumentsキーに、
<key>Boot</key> <dict> <key>Arguments</key> <string>uia_exclude=HS04;HS07;HS08;HS12;HS13;SSP4</string>
と書いておけば良いです。もしもすでに他のオプションが書いてあったら、空白で区切って追記します。例えば-vが書いてあって
<string>-v</string>
これを残したかったら、以下のようにします。
<string>-v uia_exclude=HS04;HS07;HS08;HS12;HS13;SSP4</string>
このconfig.plistで起動した結果を以下に示します。使用している14個のポート、HS01, 02, 03, 05, 06, 09, 10, 11, 14およびSSP1, 2, 3, 5, 6が機能していることがわかります。これなら15個未満ですので、config.plistへのパッチは不要です。
解決策3:DSDTを変更してUSBポートを選別する
こちらの記事でDSDTの変更でUSBポートを選別する方法を書いておきました。
追記:DSDTの編集例としてのUSB個数制限の回避を説明します。USB個数制限を回避するには、こちらの方法をお… DSDTを変更してUSBポートを選別する - Boot macOS |