ThinkPad X220の無線LANカードをIntel 9260NGWに換装

ThinkPad X220に標準で搭載されている無線LANカードとBluetoothドーターカードでは、IEEE 802.11a/b/g/n、Bluetooth 2.0までしかサポートされていない。
そこで、これらをIntel 9260NGWに換装し、IEEE 802.11a/b/g/n/ac + Bluetooth 5に対応させる。

購入した商品

商品 価格
Intel 9260NGW $14.62
Fenvi M.2 NGFF Key A to Mini PCI E PCI Express Converter Adapter $5.99
IPEX 4 IPEX MHF4 Gen4 UFL Female to IPEX 1 Connector Jack Male Pin $3.68

最新の公式BIOSにアップデート

Intel 9260NGWを換装する前に、BIOSを最新のものにアップデートしておく。

この記事に沿って作業する。

ここからX220の最新のBIOS(1.4.6)をダウンロードする。
https://support.lenovo.com/jp/ja/downloads/DS018807

imgを作成する。

$ geteltorito.pl -o x220_bios.img 8duj31jp.iso

USBを挿してimageを書き込む。

$ sudo dd if=x220_bios.img of=/dev/sdb bs=64K

USBをX220に挿して起動する。起動画面でF12を押してUSBから起動し、「システム・プログラムの更新」を行う。
更新が終わり再起動し、F1でBIOS設定画面に入り、BIOSのバージョンが1.4.6になっていることを確認する。

もしくは以下をダウンロードしてWindows PEから実行、でもいいはず。(LinuxからのWindows PE環境の作成方法についてはこの記事を参照)
BIOS アップデート ユーティリティ (Windows 8 32bit, 64bit/ 7 32bit, 64bit/ Vista 32bit, 64bit/ XP) - ThinkPad X220, X220i, X220 Tablet - JP

Intel 9260NGWへの換装

キーボードの取り外しなどは、LenovoThinkPad X220 ハードウェア保守マニュアルに則って行う。

購入したIntel 9260NGWと、変換アダプタ、アンテナ変換ケーブル。

f:id:ryochack:20191020155536j:plain

元々挿さっている無線LANカードのIntel Centrino Advanced-N 6205とBluetoothドーターカードのBroadcom BCM2045Bを抜いて、Intel 9260NGWを挿す。
f:id:ryochack:20191002213729j:plain
f:id:ryochack:20191021002909j:plain
f:id:ryochack:20191020160530j:plain
f:id:ryochack:20191020172412j:plain

ただし、この状態で電源を入れると、公式BIOSホワイトリストに阻まれて起動できない。
f:id:ryochack:20191002214806j:plain

カスタムBIOSに変更する

公式BIOSホワイトリストを回避して、Intel 9260NGWで起動できるようにBIOSをカスタムBIOSに変更する。
以下の記事を参考にして、USB起動のWindows PEから最新のBIOS(1.46)に更新し、カスタムBIOSのパッチを当てる。
Windows PEのUSBイメージの作成方法については以下を参照する。

ryochack.hatenablog.com

Resources - ThinkPad X220 の "BIOS / FIRMWARE > WHITELIST REMOVED + ADVANCED MENU BIOS"の手順に従ってBIOSを入れ替える。

カスタムBIOSのX220_v1.46_Modified_BIOS.zipを以下からダウンロードする。
BIOS - ThinkPad X220

カスタムBIOS更新のための実行ファイルを含んだWindows PEイメージを作成する。

$ sudo mkdir /mnt/waik
$ sudo mount KB3AIK_EN.iso /mnt/waik
$ unzip X220_v1.46_Modified_BIOS.zip 
$ mv Lenovo\ X220\ v1.46\ Modified\ BIOS/ mod_bios

$ mkwinpeimg --waik-dir=/mnt/waik --overlay=${PWD}/mod_bios winpe.img
:: Copying primary boot files from the Windows Automated Installation Kit (/mnt/waik, X86
:: Extracting boot.wim from "/mnt/waik/WinPE.cab"
:: Overlaying "/home/ryo/Downloads/bios/mod_bios" on the Windows PE filesystem 
:: Rebuilding WIM with changes made 
:: Making disk image "winpe.img"
The image (winpe.img) is 139730944 bytes.

作成したイメージをUSBに焼く。

$ sudo dd if=winpe.img of=/dev/sdb bs=64K
2132+1 records in
2132+1 records out
139730944 bytes (140 MB, 133 MiB) copied, 15.3978 s, 9.1 MB/s

$ sync

Windows PEを書き込んだUSBをX220に挿したまま電源を入れ、起動画面でF12を押して、USBから起動する。
WIndows PEが立ち上がる。
f:id:ryochack:20191003014554j:plain

X直下まで移動し、LenovoカスタムBIOSディレクトリに入り、flash.batを実行する。
f:id:ryochack:20191003015035j:plain

実行中に3回くらいVerifyエラーになったが、その後通った。

f:id:ryochack:20191003015126j:plain

再起動後、BIOSを確認するとAdvancedの項目が増えており、カスタムBIOSに変更できていることがわかる。
f:id:ryochack:20191003015548j:plain
f:id:ryochack:20191003015536j:plain

Linuxのlspciコマンドから、intel 9260が見えていることがわかる。
f:id:ryochack:20191003210007j:plain

Intel 9260NGWを認識させる

lspciでIntel 9260NGWのモジュールは見えているが、ip linkでinterfaceが見えない。

$ lspci -k
03:00.0 Network controller: Intel Corporation Wireless-AC 9260 (rev 29)
        Subsystem: Intel Corporation Wireless-AC 9260
        Kernel modules: iwlwifi

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

dmesgを確認すると、iwlwifiドライバのloadでエラーが出ているのがわかる。

$ dmesg | grep "iwlwifi"
[    5.264385] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-46.ucode failed with error -2
[    5.264407] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-45.ucode failed with error -2
[    5.264424] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-44.ucode failed with error -2
[    5.264442] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-43.ucode failed with error -2
[    5.264459] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-42.ucode failed with error -2
[    5.264474] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-41.ucode failed with error -2
[    5.264491] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-40.ucode failed with error -2
[    5.264507] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-39.ucode failed with error -2
[    5.264525] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-38.ucode failed with error -2
[    5.264542] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-37.ucode failed with error -2
[    5.264559] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-36.ucode failed with error -2
[    5.264575] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-35.ucode failed with error -2
[    5.264593] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-34.ucode failed with error -2
[    5.264609] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-33.ucode failed with error -2
[    5.264625] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-32.ucode failed with error -2
[    5.264641] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-31.ucode failed with error -2
[    5.264659] iwlwifi 0000:03:00.0: Direct firmware load for iwlwifi-9260-th-b0-jf-b0-30.ucode failed with error -2
[    5.264662] iwlwifi 0000:03:00.0: no suitable firmware found!
[    5.265300] iwlwifi 0000:03:00.0: minimum version required: iwlwifi-9260-th-b0-jf-b0-30
[    5.266585] iwlwifi 0000:03:00.0: maximum version supported: iwlwifi-9260-th-b0-jf-b0-46
[    5.267823] iwlwifi 0000:03:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

以下の情報を参考に、intel 9260NGWのFirmwareを入れる。
drivers - Ubuntu 18.04 cannot recognized Intel Wireless-AC 9260 - Ask Ubuntu

$ yay -S linux-firmware

これで再起動後に、wlp3s0のwlanインターフェースが見えるようになる。

$ lspci -k
03:00.0 Network controller: Intel Corporation Wireless-AC 9260 (rev 29)
        Subsystem: Intel Corporation Wireless-AC 9260
        Kernel driver in use: iwlwifi
        Kernel modules: iwlwifi

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff

この後に、 wicdbluetoothctl を使用してWi-Fiへの接続及び、Bluetoothバイスへのペアリングができることを確認した。

その他留意点

  • Intel 9260NGWに換装すると、ディスプレイベゼル下の無線LANBluetoothのLEDインジケータが光らなくなる。
  • 本体左にある無線ON/OFFのハードウェアスイッチは正常に機能する。

参考

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

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

参考記事

ThinkPad X220マザーボード換装

ThinkPad X220のマザーボードを換装して、Core i5-2520MからCore i7-2640Mにアップグレードする。

LenovoThinkPad X220 ハードウェア保守マニュアルに則って分解する。

購入した商品

商品 価格
ThinkPad motherboard core i7-2640M $56.66
ドイツ Thermal Grizzly社製 オーバークロック用特別設計高性能熱伝導グリス Kryonaut 1g ¥1,136

マザーボード換装

届いたマザーボードがこれ。
f:id:ryochack:20190922121318j:plain
f:id:ryochack:20190922122139j:plain

ThinkPad X220を分解する。
f:id:ryochack:20190922133844j:plain

マザーボードの比較。
f:id:ryochack:20190922134123j:plain

もともと付いていたグリスを取る。
f:id:ryochack:20190922121638j:plain
f:id:ryochack:20190922122222j:plain

高性能熱伝導グリスを塗る。
f:id:ryochack:20190922140248j:plain

組み立てる。
f:id:ryochack:20190922143241j:plain

電源を入れると、起動画面が立ち上がる。
f:id:ryochack:20190922142810j:plain

起動すると、時刻情報が消えていてRTCエラーが出るのでBIOS設定から時刻情報を設定する。
f:id:ryochack:20190922143405j:plain
f:id:ryochack:20190922143530j:plain

また、BIOSの情報からCPUがCore i7-2640Mになっていることが確認できる。
f:id:ryochack:20190922143508j:plain

再起動して、Linuxを起動する。
f:id:ryochack:20190922143851j:plain

USB3.0も使えるようになった。
f:id:ryochack:20190922144011j:plain

ThinkPad X220のカスタム

ThinkPad X220のキーボードが好きだ。

ThinkPad A285を買ったが、やはりX220のキーボードを打ちたくなる。

ただX220は今となっては、解像度は低いし、802.11 acやBluetooth 4以降に対応していないし、手元にあるCore i5モデルだとUSB3.0もついてないし、そして重い。

そこでX220に以下の改造を施して延命させることにする。

改造項目

  1. マザーボード換装: Core i5マザーボードからCore i7-2640Mマザーボードに交換
  2. Full HDディスプレイ換装
  3. Intel 9260NGW (Wi-Fi IEEE802.11ac + Bluetooth 5) 換装
  4. USB PD充電

それぞれの記事のリンクを以下に貼っていく。

ryochack.hatenablog.com

ryochack.hatenablog.com

ryochack.hatenablog.com

USB PD充電化については、後日追加予定。

LinuxでWindows PEのLive USBを作る

BIOSの更新プログラムや、CPUのファームウェアの更新プログラムはWindowsしかサポートしていないものが多い。
PC環境がLinuxしかない場合、以下のような記事に従い、isoをUSBに書き込むことでBIOSのアップデートができる。
How to update Lenovo BIOS from Linux without using Windows - nixCraft

しかし、ベンダーから exe しか提供されていない場合に詰む。
そこで、USBから起動できるWindows PE(プレインストール)環境を使って、exe を実行する環境を構築する。

なお、作業環境はArchLinuxのため、パッケージのインストール方法などは各ディストリビューションのものに置き換えること。

必要なパッケージをインストールする。

$ yay -S fuse2 cdrtools cabextract wimlib 
$ yay -S syslinux mtools

Windows PEのイメージ(KB3AIK_EN.iso)を以下からダウンロードする。
Download The Windows® Automated Installation Kit (AIK) for Windows® 7 from Official Microsoft Download Center
Windows PE - ArchWiki

Windows PEのLive USBを以下の手順で作成する。

$ sudo mkdir /mnt/waik
$ sudo mount KB3AIK_EN.iso /mnt/waik

$ mkwinpeimg --waik-dir=/mnt/waik --overlay=${USER_DIR}
:: Copying primary boot files from the Windows Automated Installation Kit (/mnt/waik, X86
:: Extracting boot.wim from "/mnt/waik/WinPE.cab"
:: Overlaying "/home/ryo/Downloads/bios/mod_bios" on the Windows PE filesystem 
:: Rebuilding WIM with changes made 
:: Making disk image "winpe.img"
The image (winpe.img) is 139730944 bytes.

$ sudo umount /mnt/waik

$ sudo dd if=winpe.img of=/dev/sdb bs=64K
2132+1 records in
2132+1 records out
139730944 bytes (140 MB, 133 MiB) copied, 15.3978 s, 9.1 MB/s

$ sync

以下の --overlay= オプションでディレクトリを指定することで、そこに含まれるファイルがWindows PEのXドライブ直下に配置される。

$ mkwinpeimg --waik-dir=/mnt/waik --overlay=${USER_DIR}

ThinkPad X220の場合、作成したUSBを挿したまま電源を入れ、起動画面でF12を押して起動ディスクにUSBを指定するとWIndows PEが立ち上がる。

Xドライブ直下まで移動し、適宜実行ファイルを実行する。

なお、以下のコマンドでWindows PEの電源を落とせる。

> wpeutil shutdown