Mac信者のHackintosh修行

惑星で一番美しいOSが1台でも多くのマシンで動くことを目指します。

USBポートを設定する

f:id:siroanko:20170930110251p:plain 

この記事の結論を先に書いておきます。

  • 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相当になってしまうこともあります。その対策について説明します。

無も対策しない場合のUSB構成

まずは、何も対策しないとどうなるかを見て見ましょう。IORegistryExplorer.appなどのツールを使うと、macOSから見たハードウェア構成がわかります。 ちなみに表示される情報は、Cloverのパッチや各種kextが機能した後の結果で、マザーボードUEFIが提示しているオリジナルの構成ではありません。

mac.softpedia.com

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)では、以下のような結果になりました。

f:id:siroanko:20170930112634p:plain

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ポートを使用できます。

  1. config.plistにポート数を増やすパッチを当てる
  2. USBInjectAll.kextを使用する

1. 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からは違うパッチを当てないといけないようです。

www.insanelymac.com

後にも書きましたが、ポート数を増やすパッチは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を使った結果を以下に示します。

f:id:siroanko:20170930115552p:plain

このように、全ての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ポートを特定する必要があります。ちょっと大変な作業ですが、マザーボードの構成を把握できるので、達成感はあります。それぞれのポートの番号は、

  1. それぞれのポートにUSB機器を接続し、
  2. IORegistryExplorer.app の表示の変化を確認する

ことで、特定できます。下の例は、とあるUSB 3ポートにUSB 3.0メモリを挿入してみたところです。SSP5のport-statusが、最初は0x0だったのですが、下の図のように0x1400に変化しました。(kUSBBusCurrentAllocationの値も変化しました。)これで、このポートはSSP5だということがわかります。このポートに、USB 2.0のデバイスを接続すれば、USB 2.0端子の番号もわかります。

f:id:siroanko:20170930121219p:plain

 こうして手元のマザーボードを調べて見ました。各ポートの番号は以下のようになっていました。

  • 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に

<key>Boot</key>

  <dict>

    <key>Arguments</key>
    <string>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へのパッチは不要です。

f:id:siroanko:20170930220458p:plain 

解決策3:DSDTを変更してUSBポートを選別する

こちらの記事でDSDTの変更でUSBポートを選別する方法を書いておきました。

siroanko.hatenablog.com