UbuntuデスクトップでMagic Trackpad 2を快適に使う

2019-03-03
Ubuntu
Magic Trackpad 2

環境

OS : Ubuntu 18.04 LTS

ひとまず、何も考えずにBluetoothペアリングさせるとSynaptic Touchpadとは認識されない。Synaptic Touchpadというのは、二本指スクロールとか、タップクリックとかのいわゆるスマートなTouchpad。

カーソルは動かせるしクリックは出来るけど、その他は何も出来ない使えないTouchpadになってしまいます。

Magic Trackpad 2を取り巻く現状

現状を正しく認識することがとても大事なので、調べた内容を一つずつ書きます。このコンテキストを知識として持った上で環境を整えれば、今後の変化にもついていけるはず。

1. ドライバーについて

Linux用のMagic Trackpad 2ドライバーは有志の方が作ってくれています。

https://github.com/robotrovsky/Linux-Magic-Trackpad-2-Driver

そして、嬉しいことにKernel 4.20以降のバージョンではデフォルトで入っています。なので、まずはKernelのバージョンを4.20に上げるのが素直な対応です。

こんな感じで4.20系にしておきましょう。

1
2
$ uname -r
4.20.13-042013-generic

2. xserver-xorg-input-synapticsについて

上記のMagic Trackpad 2ドライバーは、libinputというライブラリーを使うのですが、すでにdistributionに含まれているxserver-xorg-input-synapticsというドライバーがあります。もし、Magic Trackpad 2がこっちのドライバーを掴んでしまうと、上手く動作しません。

なので、下記コマンドで入力デバイスの詳細を表示して確認します。

これで一覧を出します。下記は例ですが、idが表示されるのでMagic TrackPad 2のidをひかえます。

1
2
3
4
5
$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=12 [slave pointer (2)]
⎜ ↳ TPPS/2 Elan TrackPoint id=13 [slave pointer (2)]

入力デバイスの詳細を表示します。下はX1 CarbonのTouchPadの例です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ xinput list-props 12
Device 'SynPS/2 Synaptics TouchPad':
Device Enabled (153): 1
Coordinate Transformation Matrix (155): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
libinput Tapping Enabled (288): 1
libinput Tapping Enabled Default (289): 0
libinput Tapping Drag Enabled (290): 1
libinput Tapping Drag Enabled Default (291): 1
libinput Tapping Drag Lock Enabled (292): 0
libinput Tapping Drag Lock Enabled Default (293): 0
libinput Tapping Button Mapping Enabled (294): 1, 0
libinput Tapping Button Mapping Default (295): 1, 0
libinput Natural Scrolling Enabled (296): 1
libinput Natural Scrolling Enabled Default (297): 0
libinput Disable While Typing Enabled (298): 0
libinput Disable While Typing Enabled Default (299): 1
libinput Scroll Methods Available (300): 1, 1, 0
libinput Scroll Method Enabled (301): 1, 0, 0
libinput Scroll Method Enabled Default (302): 1, 0, 0
libinput Click Methods Available (303): 1, 1
libinput Click Method Enabled (304): 0, 1
libinput Click Method Enabled Default (305): 1, 0
libinput Middle Emulation Enabled (306): 0
libinput Middle Emulation Enabled Default (307): 0
libinput Accel Speed (308): 1.000000
libinput Accel Speed Default (309): 0.000000
libinput Left Handed Enabled (310): 0
libinput Left Handed Enabled Default (311): 0
libinput Send Events Modes Available (273): 1, 1
libinput Send Events Mode Enabled (274): 0, 0
libinput Send Events Mode Enabled Default (275): 0, 0
Device Node (276): "/dev/input/event5"
Device Product ID (277): 2, 7
libinput Drag Lock Buttons (312): <no items>
libinput Horizontal Scroll Enabled (313): 1

表示されたデバイス詳細にlibinputとあれば、libinputを使えています。synapticXXXXXみたいな感じの表示が沢山書いてあったらsynapticのドライバーを使ってしまっています。もう少しマシな確認方法を見つけたかったのですが、まあコレで分かります。

もし、synapticだった場合は、思い切ってアンインストールします。まあ、問題が出たら元に戻せばいいさの精神です。

1
sudo apt remove xserver-xorg-input-synaptics

3. libinputのバージョンについて

Kernelを4.20にアップデートして、synapticドライバーをアンインストールしても、Magic TrackPad 2は思ったように動いてくれません。正確に言うと、動作はするのですが、かなり圧力をかけてタッチしないと動きません。

これは、TouchPadのsensitivity(敏感さ)の設定らしいのですが、libinputのデフォルトの状態だとMagic TrackPad 2は相当重たい感じになります。はっきり言って使い物にならないです。

このSensitivityの設定についてですが、Ubuntu18.04LTSにstableでインストールされているlibinputのバージョン1.10系で、公式サイトの手順通りに試したのですが、上手く行かなかったです。そのため、libinputのバージョン1.12系にアップデートしました。libinputのバージョンは下記のコマンドでチェック出来ます。※libinput-toolsのインストールが必要です。

1
2
$ libinput --version
1.10.4

この記事を書いている2019/03/03現在、1.12.1-1がstableですので、それをインストールします。

https://launchpad.net/ubuntu/+source/libinput

サイトにアクセスして、下記の4つのdebをダウンロードします。お使いの環境に合わせてダウンロードするファイルは変えてください。X1 Carbonであれば、AMD64でOK。

1
2
3
4
libinput10_1.12.1-1_amd64.deb
libinput-bin_1.12.1-1_amd64.deb
libinput-dev_1.12.1-1_amd64.deb
libinput-tools_1.12.1-1_amd64.deb

インストールが終わったら、rebootしてバージョンを確認します。

1
2
$ libinput --version
1.12.1

4. quirk

libinputの1.12系は、設定ファイルを適切な場所に配置することで、libinputの設定を上書きすることが出来ます。細かいデバイスごとの差異をこれで吸収しようという意図のようです。なお、公式サイトにはquirkのやり方は将来変更されるかもしれないと書いてあるので、libinputのバージョンごとにやり方が細かく変わって来そうです。

1.12系の場合は、下記のファイルを設置すればOKです。

1
2
3
4
5
$ cat /etc/libinput/local-overrides.quirks
[Touchpad touch override]
MatchUdevType=touchpad
MatchName=*Magic Trackpad 2
AttrPressureRange=4:0

内容については、Magic Trackpad 2のドライバーを作成した方が、README.mdに書いてくれているものです。

https://github.com/robotrovsky/Linux-Magic-Trackpad-2-Driver

quirkは「癖、ねじれ」とかいう意味だそうで、まさしくデバイスごとの癖を直すためのファイルですね。

libinputのquirk設定については公式サイトに確認方法も含めてよく書いてあるので、試してみると面白いです。感圧の数値とかも見ることができます。

https://wayland.freedesktop.org/libinput/doc/1.12.4/touchpad-pressure.html

まとめ

以上の設定を完了すると、Ubuntu 18.04 LTSでMagic Trackpad 2がヌルヌル動いてくれます。今回の設定作業の最中に、libinputをアップデートしたり削除したりしている内にUbuntuの入力装置が全部動かなくなるという状態に陥りましたが、復旧できました。その手順については、次のエントリーにて…

2020-05-14追記

Magic Trackpad 2 がlibinputの力でヌルヌル動くようになったのですが、基本的に自宅で作業するときに一時的に使うことが多かったため、あまり長時間の使用はしていませんでした。たまに、カーソルが反応しなくなる時もありましたが、電源ON/OFFをすることで復旧するので、あまり気にもしていませんでした。

変化が起きたのは、Covid-19の影響で自宅作業が増えてきた2020年2月以降、自宅作業が多くなってくると、カーソル無反応現象が1〜2時間に1回の頻度で発生することがわかりました。打ち合わせをしている時に発生すると、大急ぎで電源ON/OFFをする羽目になるので、ストレスがたまります。

Web上での情報を元に、この問題を解消するために自分がやってみたことが下記の通りです。

  • Ubuntu自体のバージョンアップ 18.04 -> 20.04
  • libinputのバージョンアップ 1.12 -> 1.15
  • bluetoothdのコントローラーモード変更 “dual” -> “bredr”, “le”
  • qurikでのtouch-size, touchpad-pressureの調整

これらは、全て効果がありませんでした。

しかし、最後にダメ元で試した方法により、カーソル無反応現象の発生が収まりました。対応後二日以上経過していますが、Magic Trackpad 2の接続状態は良好です。

対応内容詳細

dmesgjournalctl -ru bluetoothで出てくるログに以下のような行が出てくると、私の症状と同じです。
このログが出ると、Magic Trackpad 2のマウスカーソルは動かなくなります。

1
[28915.578230] magicmouse 0005:004C:0265.0016: unknown main item tag 0x0

厳密にいうと、指でトラックパッドの上をいろんな方向になぞるとちょっとだけカーソルが動いたりします。接続されているがカーソルが動かないというフリーズしたような状態になるのがポイントです。

カーネルのbugzillaに下記の投稿があり、投稿者からのpatchファイルも添付されています。

103631 – magicmouse disconnects when CONFIG_HID_BATTERY_STRENGTH=Y

2015年頃にCONFIG_HID_BATTERY_STRENGTHというカーネルパラーメーターのデフォルト値が変わったことが影響しているとのことです。 Magic Trackpad 2のバッテリー容量が現象してくると、電池消費を抑えるために接続断するという動作です。

どうやら、バッテリーが減って、カーネルパラメーターの閾値以下になることで、Magic Trackpad 2との接続を切ろうとするのですが、ドライバーが上手く対応できておらず、フリーズしたような状態に陥るようです。

投稿されているパッチは2種類あります。それぞれ、以下の内容です。

  1. Bluetoothモジュールの電池消費を抑える機能を全体的にOFFにする
  2. Magic Trackpad 2だけを対象にして、電池消費を抑える機能をOFFにする

今回は、2のパッチをあててカーネルをコンパイル&適用&再起動しました。

パッチの内容

1
2
3
4
5
6
7
8
9
10
11
12
--- a/drivers/hid/hid-input.c
+++ b/drivers/hid/hid-input.c
@@ -321,6 +321,9 @@
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI),
HID_BATTERY_QUIRK_PERCENT | HID_BATTERY_QUIRK_FEATURE },
+ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
+ USB_DEVICE_ID_APPLE_MAGICMOUSE),
+ HID_BATTERY_QUIRK_IGNORE },
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_ELECOM,
USB_DEVICE_ID_ELECOM_BM084),
HID_BATTERY_QUIRK_IGNORE },

でも、どうやってパッチあてたら…という方もいると思いますので、手順の参考リンクを貼っておきます。というか私も初めてやった作業でした。

初心者向けKernelのビルド手順 | ガジェット好きの日記

私の場合、Ubuntu 20.04 LTSにアップグレードした状態で、カーネルのバージョンは

1
2
$ uname -r
5.4.0-29-generic

でした。完全に同じバージョンのソースを落としたかったのですが、見つけられなかったので5.4.40を元にしてパッチをあてて作業しました。

現在は…

1
2
$ uname -r
5.4.40-magicmouse-hack

となっています。ひとまず現状としては、Linux上で快適に動くトラックパッドを得ることができたので満足しています。パッチを当てるという新しい経験も出来て、非常に嬉しいです。

この修正内容は、内容が内容なのでカーネルに取り込まれることは無さそうです。Bluetoothモジュールのデバッグ方法を色々としらべているので、上手くデバッグできるようになったら、ドライバー本体にPR投げてみたいなぁという野望が生まれました。