ThinkPad X1 でトラックパッドやトラックポイントを動かしたい


# これは何？

[Lenovo ThinkPad X1 Carbon \(Gen 6\) \- ArchWiki](https://wiki.archlinux.org/index.php/Lenovo_ThinkPad_X1_Carbon_(Gen_6)#TrackPoint_and_Touchpad_issues)
上記の設定を試してみたが、トラックパッドやトラックパッドが動かない。
どうやら、以下のようなメッセージが表示され、RMI4_SMBを有効にしないとだめで、結構はまったので、その記録。

```shell
$ dmesg -H
...
[    4.005445] psmouse serio1: synaptics: The touchpad can support a better 
bus than the too old PS/2 protocol. Make sure MOUSE_PS2_SYNAPTICS_SMBUS and 
RMI4_SMB are enabled to get a better touchpad experience.
...
```

# 対象について

タッチパットについては、ThinkPadの製品で異なり自分の場合は `LEN0091` というIDだった。
プラグアンドプレイのデバイスリスト調べることでわかる。

```shell
cat /sys/bus/pnp/devices/*/id                                                                                                                                                             
...
PNP0c02
LEN0071
PNP0303
LEN0091 # <ー これ
PNP0f13
...
```

[Lenovo X1C6 \(2018\): TrackPoint/Touchpad issues, 20KG model / Laptop Issues / Arch Linux Forums](https://bbs.archlinux.org/viewtopic.php?id=236367)

もしくは、dmesgにログが出てるかもしれない。

```
$ sudo dmesg | grep LEN0                                                                                                                                                                                              
[    0.703328] pnp 00:05: Plug and Play ACPI device, IDs LEN0071 PNP0303 (active)
[    0.703349] pnp 00:06: Plug and Play ACPI device, IDs LEN0091 PNP0f13 (active)
```


# やり方

RMI4_SMBはデフォルトで有効にするため、カーネルの設定を変更し、対象のモジュールをビルドしてインストールする必要がある。

カーネルのソースコードをダウンロードし、開発用のディレクトリを整える。

```shell
$ apt install linux-source
$ ls /usr/src
$ mkdir ~/kernel; cd ~/kernel
$ tar -xaf /usr/src/linux-source-x.x.tar.xz
```

現在のコンフィグをコピーして、RMI4＿SMBが設定されてない場合は編集して有効化する。

```shell

$ cp /boot/config-x.x.x ~/kernel/linux-source-x.x/.config
$ cd ~/kernel/linux-source-x.x
$ ack "MOUSE_PS2_SYNAPTICS_SMBUS|RMI4_SMB" .config # 設定を確認                                                                                                                                                              
3470:CONFIG_MOUSE_PS2_SYNAPTICS_SMBUS=y
3656:# CONFIG_RMI4_SMB is not set
```

```diff
9 diff -u .config .config.old                                                                                                                                                                               (1m 24s 986ms) 
--- .config	2019-01-13 04:13:55.115883212 +0900
+++ .config.old	2019-01-13 04:13:26.515680877 +0900
@@ -3653,7 +3653,7 @@
 CONFIG_RMI4_CORE=m
 # CONFIG_RMI4_I2C is not set
 # CONFIG_RMI4_SPI is not set
 # CONFIG_RMI4_SMB is not set
+CONFIG_RMI4_SMB=m
 CONFIG_RMI4_F03=y
 CONFIG_RMI4_F03_SERIO=m
 CONFIG_RMI4_2D_SENSOR=y
```

自分のデバイスIDを加えて、モジュールをビルドする。

```diff
diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
index a246fc686bb7..ce1945630f40 100644
--- a/drivers/input/mouse/synaptics.c
+++ b/drivers/input/mouse/synaptics.c
@@ -172,6 +172,7 @@  static const char * const smbus_pnp_ids[] = {
 	"LEN0048", /* X1 Carbon 3 */
 	"LEN0046", /* X250 */
 	"LEN004a", /* W541 */
+	"LEN0091", /* X1 Carbon 6 */
 	"LEN200f", /* T450s */
 	NULL
 };
```

```shell

$ make prepare && make scritpts
$ make M=drivers/input/mouse
...
...
  Building modules, stage 2.
  MODPOST 9 modules
...
  CC      drivers/input/mouse/synaptics_i2c.mod.o
  LD [M]  drivers/input/mouse/synaptics_i2c.ko
  CC      drivers/input/mouse/synaptics_usb.mod.o
  LD [M]  drivers/input/mouse/synaptics_usb.ko
...
$ make M=drivers/rmi4
...
  Building modules, stage 2.
  MODPOST 2 modules
  CC      drivers/input/rmi4/rmi_core.mod.o
  LD [M]  drivers/input/rmi4/rmi_core.ko
  CC      drivers/input/rmi4/rmi_smbus.mod.o
  LD [M]  drivers/input/rmi4/rmi_smbus.ko
...
```

ビルドできたカーネルモジュールをインストールする。

```shell
$ sudo cp ./drivers/input/rmi4/*.ko /usr/lib/modules/(uname -r)/updates/
$ sudo cp ./drivers/input/mouse/synaptics*.ko /usr/lib/modules/(uname -r)/updates/
$ ls /usr/lib/modules/(uname -r)/updates/
rmi_core.ko  rmi_smbus.ko  synaptics_i2c.ko  synaptics_usb.ko
$ sudo depmod -a
$ sudo update-initramfs -u  
$ sudo reboot
```

これで動くはず。

開発マシンOSを Linux に変えてから間もないが、OSの仕組みやモジュールの仕組みの勉強になってよかった。

# 参考

[Input: synaptics \- Lenovo Thinkpad Carbon X1 6th Gen should use RMI \- Patchwork](https://patchwork.kernel.org/patch/10309739/)
[ubuntu \- Lenovo X1 Carbon Gen\.6 \(2018\) touchpad and trackpoint issues with linux \- Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/428975/lenovo-x1-carbon-gen-6-2018-touchpad-and-trackpoint-issues-with-linux/431820#431820)
[Recompiling the Kali Linux Kernel \| Kali Linux](https://docs.kali.org/development/recompiling-the-kali-linux-kernel)