ThinkPad X220 Full HDディスプレイ化

X220/X230 FHD mod kit (rev.6)を使って、ThinkPad X220のディスプレイをFull HDディスプレイに換装する。

ディスプレイの分解までは、LenovoThinkPad X220 ハードウェア保守マニュアルに則って分解する。
X220 FHD mod kitの実装手順については、FHD mod kit overview and installation guideを参照する。

購入した商品

商品 価格
X220/X230 FHD mod kit (rev.6) $49.99
LG LP125WF2-SPB3 IPS Full HD $68.00

Full HDディスプレイ換装

届いたFull HDディスプレイ。
f:id:ryochack:20190928095455j:plain
f:id:ryochack:20190928124827j:plain

マザーボードのカバーを切り取る。
f:id:ryochack:20190928125242j:plain
f:id:ryochack:20190928131245j:plain

X220 Core i7マザーボードの場合はR318の抵抗を取り除く。
f:id:ryochack:20190928131516j:plain
f:id:ryochack:20190928132136j:plain

これがX220 FHD mod kit。
f:id:ryochack:20190928135131j:plain

X220のマザーボードとFHD mod kitをジャンパでつなげる。同時にFHD mod kitの上部7箇所をマザーボードと半田づけする。
f:id:ryochack:20190928134916j:plain
f:id:ryochack:20190928135230j:plain
f:id:ryochack:20190928140440j:plain

電源用の配線をする。
f:id:ryochack:20190928143324j:plain

元々のディスプレイを取り外し、Full HDディスプレイを繋げる。
f:id:ryochack:20190928143643j:plain
f:id:ryochack:20190928144457j:plain
f:id:ryochack:20190928144818j:plain
f:id:ryochack:20190928145249j:plain
f:id:ryochack:20190928152532j:plain

電源を入れると、Full HDディスプレイに起動画面が表示される。
f:id:ryochack:20190928172020j:plain
Linux側からFull HDで見えていることがわかる。
f:id:ryochack:20190928152802j:plain

ここで、ThinkPadロゴの起動画面やBIOS画面が暗い・映らないときには、FHD mod kitとマザーボードの半田づけ不良の可能性があるのでやり直してみるといい。

他にもFull HDディスプレイをディスプレイカバーに収めるために、ディスプレイパネルを切ったり、ディスプレイカバーを切ったりする。
f:id:ryochack:20191003213246j:plain
f:id:ryochack:20191003213250j:plain
f:id:ryochack:20191003213300j:plain
f:id:ryochack:20191003215346j:plain
f:id:ryochack:20191003215349j:plain
f:id:ryochack:20191003215422j:plain
f:id:ryochack:20191003215454j:plain
f:id:ryochack:20191003215656j:plain
f:id:ryochack:20191003215659j:plain
f:id:ryochack:20191003221242j:plain
f:id:ryochack:20191003221245j:plain
f:id:ryochack:20191003221622j:plain
f:id:ryochack:20191003221630j:plain
f:id:ryochack:20191003222051j:plain
f:id:ryochack:20191003222044j:plain
f:id:ryochack:20191003223034j:plain

ディスプレイが収まった。
f:id:ryochack:20191003231808j:plain

Linuxの設定

Fakeディスプレイをミラーリング設定にする

X220/X230 FHD mod kitのページに以下の記述がある。
X220/X230 FHD mod kit (rev.6)

Q: Does the brightness control work?
A: Brightness control does work in dual display mode: FHD display + fake display for brightness control (appears as "Dummy Display"). Otherwise brightness is fixed at 100%. Linux users can apply this kernel patch. BIOS (or coreboot) patch is required to overcome this limitation (I'm working on it sorry, I don't have time for that).

FHD mod kitを使ってFull HDディスプレイを接続すると、確かにLVDS-1とDP-3の2つのディスプレイがLinuxから見える。

$ xrandr
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192
LVDS-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 480mm x 270mm
   1920x1080     60.03*+  59.93
   1680x1050     59.88
   1400x1050     59.98
   ...
   320x240       60.05
   360x202       59.51    59.13
   320x180       59.84    59.32
VGA-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
HDMI-3 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 276mm x 156mm
   1920x1080     60.03*+

f:id:ryochack:20191022143119p:plain

LVDS-1がプライマリディスプレイ扱いになっているが、実際のFull HDディスプレイに表示されるのはDP-3の方となる。(つまり、LVDS-1がFakeディスプレイとなる)
また、Full HDのディスプレイの輝度コントロールは以下のように行えるが、これはFakeディスプレイのLVDS-1がアクティブになっていないと制御できない。

$ sudo tee /sys/class/backlight/intel_backlight/brightness <<< 50

よって、ディスプレイ映像を出力するためにはDP-3が必要、輝度コントロールするためにはLVDS-1が必要となり、どちらもアクティブにしておかなくてはならない。
(LVDS-1の出力を無効にすると、Full HDディスプレイは常に最大輝度で表示されるようだ)

FakeディスプレイのLVDS-1で拡張されていると、存在しないディスプレイにマウスが移動してしまって混乱のもとになるので、.xinitrcの中で以下のコマンドを実行してX起動時にミラーリング設定を行う。

xrandr --output DP-3 --auto --primary --output LVDS-1 --auto --same-as DP-3

これでFakeディスプレイがミラーリングされ、ディスプレイが1つにまとまるようになる。
f:id:ryochack:20191022143114p:plain

フタを閉じたときにサスペンドさせる

もともとsystemd-logindの HandleLidSwitch=suspend の設定で、ThinkPadのフタを閉めたときにサスペンドするように設定していた。
電源管理 - ArchWiki

/etc/systemd/logind.conf

HandleLidSwitch=suspend

しかし、Full HDディスプレイ化してから、フタを閉じてもサスペンドしなくなっていた。

これは、FullHDディスプレイにするとディスプレイがLVDS-1とDP-3の2つが見えている状態になっており、HandleLidSwitchが実行されなくなっているためだ。
電源管理 - ArchWiki

外付けモニターが接続されている場合、フタが閉じられても HandleLidSwitch オプションはアクションを実行しません。

そこで、systemd-logindのHandleLidSwitchからサスペンドするのは諦めて、acpiイベントから直接サスペンドするように設定する。

acpi_listen すると、フタを閉じたときには、 button/lid LID close のイベントが呼ばれているのがわかる。

acpiにフタ閉じ検出イベントとそのハンドラを追加するために、以下2つのファイルを作成する。

/etc/acpi/events/lid_close

event=button/lid LID close
action=/etc/acpi/handlers/sleep

/etc/acpi/handlers/sleep

#!/bin/env sh
systemctl suspend

ハンドラに実行権限をつけて、acpidを再起動する。

$ sudo chmod a+x /etc/acpi/handlers/sleep
$ sudo systemctl restart acpid

これでフタを閉じたらサスペンドされるようになった。

参考記事