FreeBSD usbhid(4) at FreeBSD 13.0R
https://gyazo.com/10dade4084e77698b5ea153d8c1621d3
空きがあったので、短い記事を作ってみました。
きっかけ
どうもキーボードやマウスの挙動がおかしい。
マウスのumsだけしか生えず、キーボードのデバイスが生えない。
takawataさん情報によると、FreeBSD 13.0RからUSB HID用の新しいフレームワークusbhid(4)が導入されたらしい。
-> 使ってみるべ!!
usbhid(4)ってなぁに?
hid(4)フレームワークを使った新しいUSB Human Interface Deviceの実装。
hid(4)のマニュアルが無い…
ukbd(4), ums(4), uhid(4)に変わるもの。
hkbd(4), hms(4) hid(4)として認識される。
13.0Rでは、まだデフォルトで有効にはなっていない(設定方法は後述)。
usbhid(4)の使い方
現状、以下のように設定すると、USBデバイスを抜き差しした時にも、期待どおりの動作が得られます。
code:/boot/loader.conf
usbhid_load="YES"
hw.usb.usbhid.enable=1
リリースノートに書かれている以下の設定では、USBデバイスを抜き差しした時に、usbhidではなく古いumsやukbdとして認識される場合があり、期待どおりの動作にならないことがあります。
FreeBSD 13.0Rでは、デフォルトで動くようになっていないので、以下のような設定が必要。
code:/boot/loader.conf
hw.usb.usbhid.enable=1
code:/etc/rc.conf
kld_list="usbhid"
usbhid(4)がある時〜
起動時にデバイスを刺していた場合…
キーボードとマウスは、それぞれhkbdとhmsとして認識
code:dmesg
Root mount waiting for: usbus0
(snip)
ugen0.4: <Raspberry Pi Pico> at usbus0
umass0 numa-domain 0 on uhub3
umass0: <CircuitPython Mass Storage> on usbus0
umass0: SCSI over Bulk-Only; quirks = 0x0000
umass0:2:0: Attached to scbus2
da0 at umass-sim0 bus 0 scbus2 target 0 lun 0
da0: <Raspberr Pico 1.0> Removable Direct Access SCSI-2 device
da0: Serial Number E66058388343B530
da0: 1.000MB/s transfers
da0: 1MB (2049 512 byte sectors)
da0: quirks=0x2<NO_6_BYTE>
(snip)
hkbd0: <Raspberry Pi Pico Keyboard> numa-domain 0 on hidbus0
kbd3 at hkbd0
hms0: <Raspberry Pi Pico Mouse> numa-domain 0 on hidbus0
hms0: 5 buttons and XYW coordinates ID=2 hcons0: <Raspberry Pi Pico Consumer Control> numa-domain 0 on hidbus0
(snip)
umodem0 numa-domain 0 on uhub3
umodem0: <CircuitPython CDC control> on usbus0
umodem0: data interface 1, has no CM over data, has no break
uaudio0 numa-domain 0 on uhub3
uaudio0: <CircuitPython Audio> on usbus0
uaudio0: No playback.
uaudio0: No recording.
uaudio0: MIDI sequencer.
uaudio0: No HID volume keys found.
デバイスを抜いた場合…
code:dmesg
ugen0.4: <Raspberry Pi Pico> at usbus0 (disconnected)
umodem0: at uhub3, port 3, addr 3 (disconnected)
umodem0: detached
umass0: at uhub3, port 3, addr 3 (disconnected)
da0 at umass-sim0 bus 0 scbus2 target 0 lun 0
da0: <Raspberr Pico 1.0> s/n E66058388343B530 detached
(da0:umass-sim0:0:0:0): Periph destroyed
umass0: detached
usbhid0: at uhub3, port 3, addr 3 (disconnected)
hcons0: detached
hms0: detached
hkbd0: detached
hidbus0: detached
usbhid0: detached
uaudio0: at uhub3, port 3, addr 3 (disconnected)
uaudio0: detached
以下の例は、リリースノートの設定で動作させた時に起こります。
修正版の設定では、hkbdとhmsとして認識されます。
プラグアンドプレイ(って死語かな…)した場合…
なんかおかしい…umsだけでukbdが認識されないorz
code:dmesg
ugen0.5: <Raspberry Pi Pico> at usbus0
umass0 numa-domain 0 on uhub3
umass0: <CircuitPython Mass Storage> on usbus0
umass0: SCSI over Bulk-Only; quirks = 0x0000
umass0:2:0: Attached to scbus2
ums0 numa-domain 0 on uhub3
ums0: <CircuitPython HID> on usbus0
ums0: 5 buttons and XYZ coordinates ID=2 da0 at umass-sim0 bus 0 scbus2 target 0 lun 0
da0: <Raspberr Pico 1.0> Removable Direct Access SCSI-2 device
da0: Serial Number E66058388343B530
da0: 1.000MB/s transfers
da0: 1MB (2049 512 byte sectors)
da0: quirks=0x2<NO_6_BYTE>
umodem0 numa-domain 0 on uhub3
umodem0: <CircuitPython CDC control> on usbus0
umodem0: data interface 1, has no CM over data, has no break
uaudio0 numa-domain 0 on uhub3
uaudio0: <CircuitPython Audio> on usbus0
uaudio0: No playback.
uaudio0: No recording.
uaudio0: MIDI sequencer.
uaudio0: No HID volume keys found.
usbhid(4)が無い時〜
以下のように認識され、キーボード(ukbd)が利用できないようになっています。
code:dmesg
ugen0.5: <Raspberry Pi Pico> at usbus0
umass0 numa-domain 0 on uhub3
umass0: <CircuitPython Mass Storage> on usbus0
umass0: SCSI over Bulk-Only; quirks = 0x0000
umass0:2:0: Attached to scbus2
ums1 numa-domain 0 on uhub3
ums1: <CircuitPython HID> on usbus0
ums1: 5 buttons and XYZ coordinates ID=2 da0 at umass-sim0 bus 0 scbus2 target 0 lun 0
da0: <Raspberr Pico 1.0> Removable Direct Access SCSI-2 device
da0: Serial Number E66058388343B530
da0: 1.000MB/s transfers
da0: 1MB (2049 512 byte sectors)
da0: quirks=0x2<NO_6_BYTE>
umodem0 numa-domain 0 on uhub3
umodem0: <CircuitPython CDC control> on usbus0
umodem0: data interface 1, has no CM over data, has no break
uaudio0 numa-domain 0 on uhub3
uaudio0: <CircuitPython Audio> on usbus0
uaudio0: No playback.
uaudio0: No recording.
uaudio0: MIDI sequencer.
uaudio0: No HID volume keys found.
おわりに
簡単にusbhidを試してみました。
設定によっては、期待どおりの動作が得られません。
カーネルモジュールのロードと、sysctl MIBの設定を/boot/loader.confで行うのが吉。
リリースノートの手順で設定すると、プラグアンドプレイ時の動作が怪しいです。
起動時に刺さっているとhkbdとhmsとして認識される
プラグアンドプレイ時だとumsだけになってしまう…
おまけ: とあるPCでのある時とない時 (2023/05/25)
とあるPCでは、以下のようにhconf(4)やhsctrl(4)やhcons(4)も生えました。
code:dmesg.diff
$ diff -u dmesg.no-usbhid.txt dmesg.usbhid.txt
--- dmesg.no-usbhid.txt 2023-05-25 13:35:01.693511000 +0900
+++ dmesg.usbhid.txt 2023-05-25 13:22:33.438428000 +0900
(snip)
@@ -345,22 +345,22 @@
Unresolved linked clock found: clkin_gmac
Trying to mount root from ufs:/dev/ufs/rootfs rw... uhub4: 1 port with 1 removable, self powered
-uhub2: 2 ports with 2 removable, self powered
uhub3: 2 ports with 2 removable, self powered
-Dual Console: Video Primary, Serial Secondary
+uhub2: 2 ports with 2 removable, self powered
uhub0: 1 port with 1 removable, self powered
-uhub5: 1 port with 1 removable, self powered
+Dual Console: Video Primary, Serial Secondary
ugen5.2: <Realtek 802.11n NIC> at usbus5
+uhub5: 1 port with 1 removable, self powered
ugen2.2: <vendor 0x05e3 USB2.0 Hub> at usbus2
uhub6 on uhub5
uhub6: <vendor 0x05e3 USB2.0 Hub, class 9/0, rev 2.00/85.36, addr 2> on usbus2
ugen1.2: <HAILUCK CO.,LTD USB KEYBOARD> at usbus1
-ukbd0 on uhub1
-ukbd0: <HAILUCK CO.,LTD USB KEYBOARD, class 0/0, rev 1.10/1.00, addr 2> on usbus1
-kbd1 at ukbd0
-ums0 on uhub1
-ums0: <HAILUCK CO.,LTD USB KEYBOARD, class 0/0, rev 1.10/1.00, addr 2> on usbus1
-ums0: 3 buttons and XY coordinates ID=1 +usbhid0 on uhub1
+usbhid0: <HAILUCK CO.,LTD USB KEYBOARD, class 0/0, rev 1.10/1.00, addr 2> on usbus1
+hidbus0: <HID bus> on usbhid0
+usbhid1 on uhub1
+usbhid1: <HAILUCK CO.,LTD USB KEYBOARD, class 0/0, rev 1.10/1.00, addr 2> on usbus1
+hidbus1: <HID bus> on usbhid1
uhub6: 4 ports with 4 removable, self powered
ugen2.3: <Sonix Technology Co., Ltd. USB Camera> at usbus2
pwm_backlight0: <PWM Backlight> on ofwbus0
@@ -369,6 +369,13 @@
device_attach: rk_iodomain1 attach returned 6
mx25l0: <M25Pxx Flash Family> at cs 0 mode 0 on spibus0
mx25l0: device type gd25q128, size 16384K in 256 sectors of 64K, erase size 4K
+hkbd0: <HAILUCK CO.,LTD USB KEYBOARD> on hidbus0
+kbd1 at hkbd0
+hms0: <HAILUCK CO.,LTD USB KEYBOARD Mouse> on hidbus1
+hms0: 3 buttons and XY coordinates ID=1 +hconf0: <HAILUCK CO.,LTD USB KEYBOARD Configuration> on hidbus1
+hsctrl0: <HAILUCK CO.,LTD USB KEYBOARD System Control> on hidbus1
+hcons0: <HAILUCK CO.,LTD USB KEYBOARD Consumer Control> on hidbus1
lo0: link state changed to UP
rtwn0 on uhub2
rtwn0: <Realtek 802.11n NIC, class 0/0, rev 2.00/0.00, addr 1> on usbus5