ポインティングデバイスがついたキーボードがいい
ロボットに組み込まれたPCにローカルでアクセスしたいと思ったら、ポインティングデバイス付きのキーボードがいいのです。
(キーマウをテーブルに置いて作業できると思わないほうがいい)
普段はこの用途にThinkpadからキーボードだけ分離させて単体で使えるようにしたThinkpadキーボードを使っていますが、残念ながら現在(2026/4)入手困難です。
(Lenovo公式のページもリンク切れてる)
そこでトラックボール付きのキーボードFKB-R252というのを見つけて買ってきました。
が、Ubuntu Linux 24.04だとキーボードしか動かなかったので、動くようにしてみました。
性質上、すでにキーボードやポインティングデバイスがつながっているマシンで実行するとデバイスの接続が切れるおそれがあります。
リモートログイン環境などデバイスの接続がきれてもよい状況を確保してください。
また、設定が競合するかどうかは十分な確認が取れていませんので、ご自身の環境に応じて判断してください。
他にいいポインティングデバイス付きキーボードがあったら教えてください。
選択肢が少なすぎて困っています。
結論
とりあえず動けばいいなら(この方法は他のポインティングデバイスを無効化する可能性が高いです)
sudo modprobe -r hid-multitouch
sudo modprobe usbhid quirks=0x24d3:0x7139:0x20
永続的に有効化するには
/etc/modprobe.d/fkb-r252.confを以下の内容で作成
options usbhid quirks=0x24d3:0x7139:0x20
/etc/udev/rules.d/99-fkb-r252.rulesを以下の内容で作成
ACTION=="add", SUBSYSTEM=="hid", \
ATTRS{idVendor}=="24d3", ATTRS{idProduct}=="7139", \
ENV{HID_PHYS}=="*input1*", \
RUN+="/bin/sh -c 'echo 1 > /sys/module/hid/parameters/ignore_special_drivers; echo %k > /sys/bus/hid/drivers/hid-multitouch/unbind 2>/dev/null; echo %k > /sys/bus/hid/drivers/usbhid/bind 2>/dev/null; echo 0 > /sys/module/hid/parameters/ignore_special_drivers'"
その場で適用するには
sudo udevadm control --reload-rules
sudo update-initramfs -u
経緯と解説
接続した状態でdmesgを見てみると、以下のようなメッセージが出ている。
[1208622.573013] usb 1-7.2: new full-speed USB device number 11 using xhci_hcd
[1208622.648541] usb 1-7.2: New USB device found, idVendor=24d3, idProduct=7139, bcdDevice= 0.00
[1208622.648546] usb 1-7.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1208622.648548] usb 1-7.2: Product: FKB-R252
[1208622.648549] usb 1-7.2: Manufacturer:
[1208622.648550] usb 1-7.2: SerialNumber: (Null)
[1208622.661541] input: FKB-R252 Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.0/0003:24D3:7139.000E/input/input27
[1208622.767066] input: FKB-R252 Consumer Control as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.0/0003:24D3:7139.000E/input/input28
[1208622.767129] input: FKB-R252 System Control as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.0/0003:24D3:7139.000E/input/input29
[1208622.767166] input: FKB-R252 Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.0/0003:24D3:7139.000E/input/input30
[1208622.767203] input: FKB-R252 Touchpad as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.0/0003:24D3:7139.000E/input/input31
[1208622.767301] hid-multitouch 0003:24D3:7139.000E: input,hiddev3,hidraw9: USB HID v1.10 Keyboard [ FKB-R252] on usb-0000:00:14.0-7.2/input0
[1208622.771951] hid-multitouch 0003:24D3:7139.000F: HID_DG_BUTTONTYPE out of range
[1208622.771993] input: FKB-R252 Touchpad as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7.2/1-7.2:1.1/0003:24D3:7139.000F/input/input35
[1208622.772317] hid-multitouch 0003:24D3:7139.000F: input,hiddev4,hidraw10: USB HID v1.10 Mouse [ FKB-R252] on usb-0000:00:14.0-7.2/input1
[1208622.773252] hid-generic 0003:24D3:7139.0010: hiddev5,hidraw11: USB HID v1.10 Device [ FKB-R252] on usb-0000:00:14.0-7.2/input2
hid-multitouchで不具合が起きているようだ。が、認識自体はされていそうなのでなんとかなるのでは?
これをclaudeに解読してもらうと、
エラーはhid-multitouchで標準外のHIDディスクリプタを解釈できなかったことによる。
解決方法として考えられるのはhid-multitouchからhid-genericに切り替える。
sudo modprobe -r hid-multitouch
sudo modprobe usbhid quirks=0x24d3:0x7139:0x20
quirksはこのデバイスのID24D3:7139のinput1(=0x20)にusbhidを使う、という意味。
これで、動くことを確認。が、hid-multitouchを外してしまうと他のデバイスにまで影響するのでは?
であれば、対象となるデバイスだけを切り替えればよい。
# デバイスのbusid確認(例: 0003:24D3:7139.000F)
ls /sys/bus/hid/devices/
# hid-multitouchのバインドを外す
echo "0003:24D3:7139.000F" | sudo tee /sys/bus/hid/devices/0003:24D3:7139.000F/driver/unbind
# 次のbindがそのままだと失敗してしまうので
echo 1 | sudo tee /sys/module/hid/parameters/ignore_special_drivers
# hid-genericに再バインド
echo "0003:24D3:7139.000F" | sudo tee /sys/bus/hid/drivers/hid-generic/bind
末尾の000Fは接続し直すたびに増えていくので毎度確認が必要。
3つ見つかったうちの真ん中がポインティングデバイス。
また、ignore_special_driversは下記のサイトを参考に追加。
これがないとbindに失敗する。
https://unix.stackexchange.com/questions/687191/how-to-bind-the-hid-generic-driver-to-an-hid-interface-thats-taken-by-a-differe
ドライバのバインド状況を確認するには、
for d in /sys/bus/hid/devices/0003:24D3:7139.*; do echo "$d -> $(readlink $d/driver 2>/dev/null || echo 'NO DRIVER')"; done
これで3つのデバイスが見つかり、何も設定していない状態では上から
hid-multitouch, hid-multitouch, hid-generic
となる。正しく設定されていれば
hid-generic, hid-generic, hid-generic
となり、バインドに失敗すると
hid-multitouch, NO DRIVER, hid-generic
になる。これがでたらignore_special_driversが設定されてない。
で、これを自動で行っているのが結論に書かれている設定ファイルである。