2018/07/30

Linux環境におけるThinkPadのトラックポイントのボタン長押し(ドラッグ)が機能しない対処方法まとめ

概要

ThinkPadを始めとした一部のラップトップコンピュータには、ポインティング・スティックが搭載されている。
この入力デバイスは、Linux環境であっても、標準デバイスドライバである psmouse で動作する。
(以下、Lenovo社の商標である「トラックポイント」を用いる)

しかし、私が新たに購入したThinkPadでは、Linux環境でトラックポイントのボタン長押し(ドラッグ)が、機能しない問題が発生した。
そこで、自分への備考録および同様の問題に遭遇した人への参考として、対処方法をまとめた。



本記事では、Linux環境において、ThinkPadのトラックポイントのボタン長押し(ドラッグ)が機能しない問題に関する、対処方法を述べる。


環境

  • ThinkPad A275

  • Arch Linux(4.17.10-1-ARCH)

  • libinput(1.11.2)

※トラックパッドの機能は、UEFIにて無効済

事象

トラックポイントの全マウスボタン(左・中央・右)にて、ボタンの長押しが認識されない。 その結果、ドラッグ操作が一切出来ない状態になっている。 なお、クリック操作は、どのボタンでも可能である。

以下、 libinput debug-events を用いて、「左ボタンを押下し、ドラッグ操作をした後、解放する」操作に関する、具体的な事象を示す。

# libinput debug-events
...
-event17  DEVICE_ADDED     TPPS/2 IBM TrackPoint             seat0 default group9  cap:p left scroll-nat scroll-button
...

(左ボタンを押下し、ドラッグ操作をした後、解放する)

-event17  POINTER_BUTTON    +2.80s      BTN_LEFT (272) pressed, seat count: 1
 event17  POINTER_BUTTON    +2.81s      BTN_LEFT (272) released, seat count: 0

上記の出力を見ると、左ボタンが押下されたイベント BTN_LEFT (272) pressed が表示された直後に、 ボタンが解放されたイベント BTN_LEFT (272) released が発生している。

この操作で本来期待する動作は、以下の通りである。

# libinput debug-events
...
-event16  DEVICE_ADDED     PS/2 Generic Mouse                seat0 default group8  cap:p left scroll-nat scroll-button
...

(左ボタンを押下し、ドラッグ操作をした後、解放する)

-event16  POINTER_BUTTON    +0.85s      BTN_LEFT (272) pressed, seat count: 1
 event16  POINTER_MOTION    +1.52s        0.30/  0.00
 event16  POINTER_MOTION    +1.64s        0.00/  0.35
 event16  POINTER_MOTION    +1.66s        0.00/  0.41
 event16  POINTER_MOTION    +1.67s        0.00/  0.47
 event16  POINTER_MOTION    +1.69s        0.55/  1.10
 event16  POINTER_MOTION    +1.70s        0.68/  2.05
 event16  POINTER_MOTION    +1.71s        0.78/  0.78
 event16  POINTER_MOTION    +1.72s        1.75/  2.63
 event16  POINTER_MOTION    +1.73s        1.98/  2.97
 event16  POINTER_MOTION    +1.75s        2.00/  3.00
 event16  POINTER_MOTION    +1.76s        3.00/  6.00
 event16  POINTER_MOTION    +1.77s        2.00/  3.00
 event16  POINTER_MOTION    +1.78s        2.00/  3.00
 event16  POINTER_MOTION    +1.79s        2.00/  3.00
 event16  POINTER_MOTION    +1.81s        1.00/  3.00
 event16  POINTER_MOTION    +1.82s        6.00/  7.00
 event16  POINTER_MOTION    +1.83s        2.00/  4.00
 event16  POINTER_MOTION    +1.84s        3.00/  3.00
 event16  POINTER_MOTION    +1.85s        2.00/  4.00
 event16  POINTER_MOTION    +1.86s        3.00/  3.00
 event16  POINTER_MOTION    +1.88s       -2.00/ -2.00
 event16  POINTER_MOTION    +1.89s       -1.00/ -1.00
 event16  POINTER_MOTION    +1.92s        0.00/ -0.97
 event16  POINTER_BUTTON    +2.30s      BTN_LEFT (272) released, seat count: 0

上記の出力では、 BTN_LEFT (272) pressedBTN_LEFT (272) released の間に、 ドラッグ操作(カーソル移動)をした事が、確認できる。

原因

原因は、カーネル側がトラックポイントを、不適切なデバイスとして誤認識していた事だと思われる。

以下、カーネルメッセージに出力されていた、誤認識されたデバイス名を示す。

$ dmesg
....
[ 5740.679950] psmouse serio3: trackpoint: IBM TrackPoint firmware: 0x0e, buttons: 3/3
[ 5740.941526] input: TPPS/2 IBM TrackPoint as /devices/platform/i8042/serio1/serio3/input/input379

本来期待する認識デバイスは、以下のようなデバイス名である。

$ dmesg
....
[ 5863.157030] input: PS/2 Generic Mouse as /devices/platform/i8042/serio1/input/input381

あくまで推測だが、この誤ったデバイス認識が原因となり、各ボタンの長押しが正常に機能しなかったと思われる。

設定手順

設定は、以下の手順でおこなう。

  1. 一時的な設定

  2. 永続的な設定

一時的な設定

一度、 rmmodpsmouse カーネルモジュールを除去した後、 modprobe で汎用PS/2マウスとして psmouse を追加する。

# rmmod psmouse
# modprobe psmouse proto=bare

これらのコマンドを実行すると、カーネルメッセージ内に、汎用PS/2マウスデバイスとして認識された内容が出力される。
以下、出力例を示す。

$ dmesg
...
[ 7978.357786] input: PS/2 Generic Mouse as /devices/platform/i8042/serio1/input/input22

以上の出力が確認できれば、一時的な設定は完了である。

永続的な設定

/etc/modprobe.d/ 以下に、次の内容を記述した、任意名称のファイルを配置する。

$ cat /etc/modprobe.d/trackpoint.conf
options psmouse proto=bare

以降、システム起動時から、トラックポイントが適切なデバイスとして認識されるようになる。

雑記

  • 今回のデバイス誤認識の根本原因は、どうやらカーネルのバグらしい。
    https://bugzilla.kernel.org/show_bug.cgi?id=33292 2018/07/30 21:35:54 (JST) 参照
    → まさかドラッグ操作が出来なくなるとは、思ってもいなかったorz
    → とはいえ、バグだと判明しているのなら、誤認識した理由が納得できる…ような?

  • modprobe psmouse proto=barebare は、汎用PS/2マウスを意味しているらしい。
    https://srad.jp/~oku/journal/261113 2018/07/30 21:44:21 (JST) 参照
    → 他にも、 impsexps があるとか。
    → これらの違いは、ソースコードを眺めた感じ、スクロールホイール( imps )や、第4・5ボタン( exps )の有無っぽい。
    https://github.com/torvalds/linux/blob/master/drivers/input/mouse/psmouse-base.c 2018/07/30 21:47:26 (JST) 参照

  • ちょっとよく分からなかったのが、マウスデバイスが2つ割り当てられていた事。
    → というのも、トラックパッドはUEFIで無効化しており、使用可能なマウスデバイスはトラックポイントしか無いはずなので…
    → この現象の原因が、結局よく分からなかった。
    → これも、前述のカーネルバグに起因しているんだろうか?
    → 以下、参考として、マウスデバイスが2つ存在する事と、 dmesg の出力を貼っておく。

### 本問題が発生している状態
$ ls -l /dev/input/mouse*
crw-rw---- 1 root input 13, 32  7月 30 13:52 /dev/input/mouse0
crw-rw---- 1 root input 13, 33  7月 30 13:52 /dev/input/mouse1

$ dmesg
...
[ 6307.737972] psmouse serio1: synaptics: queried max coordinates: x [..5712], y [..4780]
[ 6307.778426] psmouse serio1: synaptics: queried min coordinates: x [1232..], y [1074..]
[ 6307.778436] psmouse serio1: synaptics: Your touchpad (PNP: LEN2053 PNP0f13) says it can support a different bus. If i2c-hid and hid-rmi are not used, you might want to try setting psmouse.synaptics_intertouch to 1 and report this to linux-input@vger.kernel.org.
[ 6307.867424] psmouse serio1: synaptics: Touchpad model: 1, fw: 8.16, id: 0x1e2b1, caps: 0xf40aa3/0x943300/0x12e800/0x410000, board id: 3075, fw id: 2622508
[ 6307.867438] psmouse serio1: synaptics: serio: Synaptics pass-through port at isa0060/serio1/input0
[ 6307.923962] input: SynPS/2 Synaptics TouchPad as /devices/platform/i8042/serio1/input/input393
[ 6308.616931] psmouse serio6: trackpoint: IBM TrackPoint firmware: 0x0e, buttons: 3/3
[ 6308.824904] input: TPPS/2 IBM TrackPoint as /devices/platform/i8042/serio1/serio6/input/input394


### 対処方法を実行する
# rmmod psmouse
# modprobe psmouse proto=bare
$ ls -l /dev/input/mouse*
crw-rw---- 1 root input 13, 32  7月 30 13:53 /dev/input/mouse0

$ dmesg
...
[ 6387.478804] input: PS/2 Generic Mouse as /devices/platform/i8042/serio1/input/input398
Tags: Linux ThinkPad
このエントリーをはてなブックマークに追加