PC自作したりゲーミングPC買って、グラフィックボードから外部モニタへ接続している人にはお馴染みの映像規格、DisplayPort(以下、DPと略)。
HDMIと比べるとマイナー寄りな規格ですが、大半のグラフィックボードにはHDMIは1個しか付いてない*1ため、マルチモニタ環境を作ろうとすると必然的にDisplayPortも使うことになります。
ここで問題になってくるのが、スリープから復帰する時の挙動。
それなりに調べてそれなりの対策を打ったので、記録の意味で残しておきます。
----------------------------------
目次
----------------------------------
1.いつもの
非公式かつ規格から逸脱した改造になるため、各自の環境により対策が有効にならない、何もしてないのにこわれた、などの症状が起きるリスクがあります。全て自己責任でよろしくです。
2.症状
・メインモニタA:DP接続
・サブモニタB:HDMI接続
・モニタA、Bにそれぞれ任意のアイコン・ウインドウを配置
この状態でPCをスリープ→復帰させると、HDMI接続のモニタB側に全てのアイコン・ウインドウが集まってしまうことがあります。さらにウインドウサイズも保持されません。
自身の環境ではほぼ100%再現しました。マルチモニタ環境でこの挙動は致命的ですので原因を調べることに。。
3.原因
3-1.事実
・DP規格/HDMI規格ともに、プラグ&プレイというPCとの接続にまつわる仕様がある
・プラグ&プレイの認識はホットプラグという信号のON/OFFで判断される*2
・DP規格のホットプラグ信号はモニタ電源がOFFになると自動的にOFFになる。よってDP接続したモニタの電源をOFFにすると、PCとモニタとの接続が失われる
・このホットプラグ信号の挙動はDP規格の「仕様」である
3-2.推測
・HDMI規格のホットプラグ信号はモニタ電源がOFFになってもONのままであり、HDMI接続したモニタの電源をOFFにしても、PCとモニタとの接続は維持される*3
・PCスリープによりメイン・サブモニタの電源がOFFになると、以下の状態になる
DP側のホットプラグ信号:OFF|HDMI側のホットプラグ信号:ON
↓
DP側のモニタ:PCから切断|HDMI側のモニタ:PCとの接続を維持
・PCのスリープ復帰時に、スリープ直前に一時保存したアイコン・ウインドウ状態をどのモニタに再出力するかを決めるために、モニタとの接続状態をPCが確認する
・この時点ではHDMI側のモニタしか接続されていないため、スリープ直前のアイコン・ウインドウ状態が全てHDMI側に集まってしまう
・少し遅れてDP側のモニタが認識されるも、すでにアイコン・ウインドウ状態がHDMI側に出力されているため、該当症状に至る。
4.対策
ITエンジニアならソフトウェア上で対策を…というスマートなアプローチを取るのかもしれませんが、ハードウェアエンジニアにはちょっと敷居が高いので、ハード面での対策を考えます。
要はDPのホットプラグ信号をHDMI規格と同じく常時ONにする挙動をさせれば良いのです*4。
…というわけでDP規格のホットプラグ信号周りの仕様を確認すると、
・ホットプラグ信号は2.25~3.6Vの電圧が入るとONになる
・ホットプラグ信号はコネクタピンのNo.18に配置されている
・コネクタピンのNo.20に3.3Vの電圧が常時来ている
Amazonで適当なDisplayPortのプラグ/レセプタクルの変換端子をゲットします。
おもむろに外装を剥きます。
プラグ/レセプタクルの両端子の間を銅箔パターンで繋いでいるだけのシンプルさ。こういうのでいいんだよ、こういうので。
ピンアサイン表を参考にホットプラグ信号を伝えているピン18を探します。この写真だとプラグ/レセプタクルともに上から2番目の赤い矢印部分。
このピンは前述したようにディスプレイ電源のON/OFFでフラフラ変動します。そこでカッターナイフ等で基板の銅箔パターンをカットし、断線させます。
モニタに接続する側の、3.3Vが来ているピン20を探します。自分の環境だと写真右側の1番上。
このピン20と、左側のピン18を電気的に接続すれば、ピン18が3.3V前後≒ホットプラグ信号ON の状態になるため、スリープ復帰時の問題が解消されるはず、です。
また本来の目的だけを達成するなら電線だけでOKなのですが、付近のGNDピンに誤って短絡した時のリスクを考慮して、その辺に転がっていた抵抗1KΩを挟んでいます。
また抵抗を挟んでいるため厳密にはピン18の電圧は3.3Vより若干下がっているはずですが、ホットプラグONしきい値である2.25V以下には流石になってないだろうと判断しています。
5.効果
2020年6月に上記対策を行い、私の環境ではスリープ復帰時のトラブルは一切なくなりました。
参考までに私の環境を記載しておきます。
DPモニタ:BenQ/EX2780Q
HDMIモニタ:iiyama/XU2290HS-B2
ビデオカード:MSI/GeForce RTX 2060 SUPER VENTUS XS J OC
6.余談
改造にかかった材料とコストは以下。
・DP変換コネクタ:400円
・1KΩ抵抗:数円
・DP規格を調べている時のワクワク感:プライスレス
この記事を書くにあたって同じようなことをやっている方々の情報を見ると、モニタのメーカーによっては効果がなかったりするようですね。スリープ復帰時のPC~モニタ間の通信に問題があったりするんでしょうか。
また他にも対策はあるようです。詳細は自分で調べてください。
・レジストリいじる
・PCとメインディスプレイをDP以外のケーブルでもつなぐ
・EIZOの対策済みモニタを買う
X.参考サイト
ja.wikipedia.org
プラグ・レセプタクルのピンアサイン表あり。