USB機器がスリープを阻害することがあります

スリープするとすぐに目覚めてしまうマシンがありました。ずっと諦めていたのですがようやく原因がわかりました。5インチベイに取り付けたUSBハブでした。取り外したら正しくスリープし続けるようになりました。

スリープからすぐに目覚める

こちらで紹介したコンピュータ(ASUSのZ390チップセットマザーボードを使用)が、ここのところずっと、スリープからすぐに目覚めてしまう問題を抱えていました。一旦はスリープに入るのですが、2~3秒で目覚めてしまいます。

上の記事を書いた時点では、ケースに入れない状態で仮組をして動かしていたのですが、その時は正しくスリープしていました。ケースに入れて、本格的に使用し始めたら、スリープからすぐに目覚める現象が発生しました。pmset -gなどで目覚める原因を調べると、色々なデーモンがスリープを解除したと表示されて、またiCloudやDropboxの同期がずっと動いて、ドライブへのアクセスが続いていたので、環境構築過程の一時的な状況だと思っていました。

でもよく思い出してみたら、このマザボの先代のMSIのマザーボードでも同様にスリープから目覚める問題がありました。6年くらい前から引きずっていた問題でした。MSIマザーボードでは、BIOSメニューからOSからスリープ復帰しないという設定をして、電源ボタンでスリープ復帰していました。新しいASUSのBIOSでは同様な設定項目が見つからなくて、回避できません。そこで本格的に原因究明することにしました。

目覚めのきっかけ

スリープから目覚める原因には色々なものがあります。電源遮断するのではなくスリープすることの目的は、すぐに目覚めて動作再開することです。ですから、いろんなきっかけで目覚める事自体は正しい動作と言えます。

目覚めのきっかけは、大きく分けて2通りに分類できると思います。一つはOSのデーモンが引き起こす目覚めです。Power Napなどは代表的なものです。iCloud関連の同期や、Spot Lightの索引作成作業もスリープを妨げるようです。実際の仕組みは、RTCを目覚まし時計のように使って、デーモンが一定時間間隔で動作しているものと思われます。もう一つは入出力関係の信号変化です。キーボードを押すとスリープ復帰しますが、これはUSBに信号が来ることがきっかけです。他にも、ネットワーク, SATA, ディスプレイなどからの信号でスリープ復帰することもあります。

目覚める原因を調べる

macOSで設定する

目覚めの原因になりそうな要素を取り除いていくことで、原因究明できると考えました。

まずは「システム環境設定」の「省エネルギー」で、「ネットワークアクセスによるスリープ解除」「Power Napを有効にする」のチェックを外します。また、「Bluetooth」の「詳細設定…」で、「Bluetoothデバイスでコンピュータのスリープ解除を可能にする」のチェックも外します。これで、一般ユーザ向けのmacOS設定でできることをやり尽くしたはずです。でもスリープからすぐに復帰する問題は解決しませんでした。

ネットワークは問題なし

不本意なスリープ復帰は、ネットワークがらみで発生することも多いようです。そこで、まずはLANケーブルを取り外し、WiFiをoffにしました。これでネットワークからの働きかけで目覚める事はなくなると思いました。でも、スリープからすぐに復帰してしまいました。

USBとBluetoothを調べる

次に、バックパネルのUSBケーブルを全部外しました。これでもすぐに復帰します。Apple純正Magic Trackpad/KeyboardをBluetooth接続しているのですが、BTもoffにしてみました。その代わりに前回ご紹介した非Bluetooth接続の無線キーボードを取り付けました。それでもすぐに復帰します。OSでBTをoffにするのでは生ぬるいのかもしれないと考えて、BTアダプタが接続されているUSBポートをoffにしました。本当はケースの蓋を開けてコネクタを外すのが確実だったのですが、面倒だったので、まずはUSBInjectAll.kextの機能を使いました。config.plistのブートオプションに、以下を追加しました。BTはHS13に接続しているからです。これで13番目のUSB 2.0ポートが無効になります。するとスリープし続けるようになりました!

uia_exclude=HS13

どうもHS13に接続されている何かが問題のようです。ここには純正BTアダプタのBroadcom BCM94360CDが接続されています。macOSと高い互換性のあるアダプタでOOBで動くはずのものです。ここでようやく、ケースの蓋を開けてBCM94369CDのUSB接続を外しました。そしてuia_excludeの設定を削除してもと通りに戻しました。なんとスリープからすぐに復帰する現象が再発するようになりました。ということで、HS13が原因であるものの、これに接続したBTモジュールの問題ではなかったようです。

原因は5インチベイI/Oパネル

実は、ASUSのこのマザーボードでは、HS13はマザーボード内部のUSBハブに接続され4本に分岐します。これらはマザーボード上の4個のUSB 2.0ピンに接続されています。取扱説明書の図を以下に引用します。USB_E12とUSB_E34が、HS13から分岐したUSB 2.0ピンです。

そのうち1個 (ISB_E34のうちの1つ) がBTアダプタに接続されていて、今はそれを外したところです。残りのUSB 2.0ピンのうち、2個 (USB_E12) は、実は5インチベイに取り付けたUSBハブ+SDカードリーダーに接続していました。もう販売中止になっているこの製品です。これを買ったのがちょうど6年前でした。スリープが解除される現象が発生した頃です。

この5インチベイパネルには、USB 3.1 gen1ポートとUSB 2.0ポートがぞれぞれ4個あります。またUSB 3.1 gen1接続のSDカードリーダが搭載されています。このうちのUSB 2.0ポートをHS13 (USB_E12) に接続していました。そこで、マザーボードからこの5インチベイパネルへの接続を外してみました。するとスリープからすぐに復帰してしまう現象は治まりました。5インチベイアダプタの中にあるUSB 2.0ハブが、スリープ直後になんらかの信号(ノイズ?)を出して、スリープを妨げているようです。USB 3.1の接続には問題ないようなので、USB 3.1ポートとSDカードリーダは引き続き使用できます。でもUSB 2.0のポートは諦めました。

まとめ

スリープからすぐに目覚めてしまう原因はUSBハブでした。pmsetコマンドやDSDTファイルを駆使して高度な技術で解決するのだと意気込んでいたのですが、あっけない結末でした。USB機器は、スリープ設定でトラブルの原因になりがちな気がします。以前にも、USBスピーカーが原因でスリープしないことがありました。スリープ開始でUSBスピーカへの供給電源が遮断されることで、USB信号線に何らかの信号(ノイズ?)が出るようで、これが引き金でスリープを妨げていました。その時は、外部電源からUSB電力を供給し続けるタイプのUSBハブを調達して、これを介して接続したところスリープするようになりました。何らかの入力によってスリープが復帰される状況自体は、ソフトウェアとしては正しい動作です。なので、機器を取り外して様子を見るという単純なアプローチが有効なようです。

返信を残す

メールアドレスが公開されることはありません。

「名前」「メールアドレス」「サイト」は空白でも投稿できますが、日本語が含まれない投稿は無視されます。(スパム対策)