O_NONBLOCK で開いた file descriptor から blocking read する手段ってあるのかな。 fnctl して O_NONBLOCK 外してやるか自前でループするしかないか?

いや違うわ、これひとつの Usage page で Report Count 7 と Report Size 8 を持ってる、そりゃ8ビットのレポートが7個同じ usage index で送られてくるわけだ……
なんだこれ

github.com/torvalds/linux/blob

レポートに usage index とかいろいろ付くようになるだけで、 usage ごとに分断されたイベントが来ることには変わりないのかな

スレッドを表示

HIDIOCSFLAG を使わないと ambiguity がある場合がある風なこと書いてあるな?

kernel.org/doc/html/latest/hid

> and returns to hiddev.c the individual usages that have changed within the report.

ちょっとまって、差分のある Usage page しか報告されないように書いてあるけど、実際毎回7イベントが返ってきてる……

そうか、 Usage が7つ指定されているからイベントが7つ飛んでくるんだな

あーそうか、私の目的が report descriptor が完全に既知であるという前提で特定のデバイスだけ弄ろうとしているからそう感じるわけか

スレッドを表示

hiddev 眺めてみたんだけど、1回のキープレスあたりで7イベントとか送られてくるな…… (そんでvalue は signed int なのに1バイト分の情報しか持ってなさげ)
これだったら hidraw の方が素敵

いや実際 report descriptor が壊れてることあるんですよね、まさに私の手元にあるマウスがそれでパッチ書く破目になったんですが……

今更気付いたんだけど、 UHID (User-space I/O driver support for HID subsystem) なるものがあるのか。
Bluetooth のために有効化していたし、もしや hidraw や hiddev を直接叩くよりこっち使うべきでは? (ただし report descriptor が壊れていない場合を除く)

カーネルコンパイルタイム (BGM: バジリスクタイムの歌)

カーネルサイズ削減バトルしてると、こういうことが頻繁にある

スレッドを表示

hidraw を弄る前に hiddev を試すべきでは……🤔 と思ったので確認してみたところ、そもそも USB_HIDDEV is not set になってた

hidraw を弄ってるんだけど、なんで hidraw_devinfo::{vendor, product} は __s16 なんだろう。
普通に Vendor ID と Product ID なら __u16 でいいじゃんという気がするんだけど

古いものから表示
Mastodon

Mastodon は、オープンなウェブプロトコルを採用した、自由でオープンソースなソーシャルネットワークです。電子メールのような分散型の仕組みを採っています。