2021/02/27(土) [n年前の日記]
#1 [hsp][raspberrypi][linux] HSPと/dev/input/についてまだ調べてる
HSP3.6beta を Raspberry Pi Zero W + Raspberry Pi OS buster 上で動かした際に、キーボードやマウスの入力が取得できない件について、まだ調べてる。
_HSP と /dev/input/by-id について調べてる
_HSP と /dev/input/by-id についてもう少し調べてる
/dev/input/by-id/ 以下に出現する文字列を頼りにして、どれがキーボードでどれがマウスかを判別するのはどうやら難しそう、という気配を感じているのだけど。
では、どうすれば、どれがキーボードでどれがマウスかを判別できるのだろうか?
Linux は、/proc/bus/input/devices を見れば、どんな入力機器が接続されているのか情報を得ることができる。cat /proc/bus/input/devices と打ってみれば、入力機器の名前だの、どの event番号に何が割り当てられているのか等々を取得できるわけで。
ならば、その /proc/bus/input/devices を読んで、これがキーボードでこれがマウス、と当たりをつけることができるのではないか。
と思って、Raspberry Pi Zero W上でそのあたりを確認してみたのだけど。こうすればいいのでは、という方法が見えてこなくて…。以下に、調べてみた結果を挙げておくけれど…。
_BUFFALO BSKBW03WH + Logicool VX Nano (キーボードは反応するけどマウスは無反応)
_Logicool K400r (キーボードもタッチパッドも無反応)
_Lenovo KU-1255 (キーボードもトラックポイントも反応)
/proc/bus/input/devices を眺めてみても、ココを頼りに判断すればいいのだ、という部分が見つからない…。
ちなみに、確認した機器は以下。
Linuxのデスクトップ画面上でキーボードもマウスも使えているのだから、これがキーボードでこれがマウスだと判別する方法が絶対必ずあるはずだけど。ググってみても、作法に遭遇しない…。それぞれどうやって実現しているのやら…。
_HSP と /dev/input/by-id について調べてる
_HSP と /dev/input/by-id についてもう少し調べてる
/dev/input/by-id/ 以下に出現する文字列を頼りにして、どれがキーボードでどれがマウスかを判別するのはどうやら難しそう、という気配を感じているのだけど。
では、どうすれば、どれがキーボードでどれがマウスかを判別できるのだろうか?
Linux は、/proc/bus/input/devices を見れば、どんな入力機器が接続されているのか情報を得ることができる。cat /proc/bus/input/devices と打ってみれば、入力機器の名前だの、どの event番号に何が割り当てられているのか等々を取得できるわけで。
ならば、その /proc/bus/input/devices を読んで、これがキーボードでこれがマウス、と当たりをつけることができるのではないか。
と思って、Raspberry Pi Zero W上でそのあたりを確認してみたのだけど。こうすればいいのでは、という方法が見えてこなくて…。以下に、調べてみた結果を挙げておくけれど…。
_BUFFALO BSKBW03WH + Logicool VX Nano (キーボードは反応するけどマウスは無反応)
_Logicool K400r (キーボードもタッチパッドも無反応)
_Lenovo KU-1255 (キーボードもトラックポイントも反応)
/proc/bus/input/devices を眺めてみても、ココを頼りに判断すればいいのだ、という部分が見つからない…。
ちなみに、確認した機器は以下。
- USB接続ワイヤレスキーボード BUFFALO BSKBW03WH
- USB接続ワイヤレスマウス Logicool VX Nano
- USB接続ワイヤレスキーボード(タッチパッド付) Logicool K400r
- USB有線接続キーボード(トラックポイント付) Lenovo KU-1255
Linuxのデスクトップ画面上でキーボードもマウスも使えているのだから、これがキーボードでこれがマウスだと判別する方法が絶対必ずあるはずだけど。ググってみても、作法に遭遇しない…。それぞれどうやって実現しているのやら…。
◎ EV値は今一つだった。 :
/proc/bus/input/devices の中に「B: EV=xxxxxx」という部分があって、その機器がどういう信号を出してくるのか、ビット単位のフラグで列挙されているのだけど。
もしかして、その値を見れば、どれがキーボードでどれがマウスか分かるのでは? と思ったものの…。同じ値が並ぶ場合が多くて、これだけでは判別できそうにないなと…。
ちなみに、16進数を眺めても何がなんだか分からんので、EV値がどういう内容なのか確認するための Pythonスクリプトを書いてしまった。
_evdump.py
動作させると以下のような感じになる。EV値(16進数)を打ち込むとフラグ内容を表示してくれる。exit と打ち込むと終了。
ちなみに、lsinput の出力結果と照らし合わせてみたけど、結果は一致した。処理は合ってるっぽい。というか、Raspberry Pi OS上では lsinput を使ったほうが楽。
ところで、lsinput を、PC + Ubuntu Linux 20.04 LTS で動作させたら、フラグ文字列が全部「(null)」になってしまった。何故? Raspberry Pi OS buster 上で lsinput を動かすと、ちゃんと表示されているのだけど…。
もしかして、その値を見れば、どれがキーボードでどれがマウスか分かるのでは? と思ったものの…。同じ値が並ぶ場合が多くて、これだけでは判別できそうにないなと…。
ちなみに、16進数を眺めても何がなんだか分からんので、EV値がどういう内容なのか確認するための Pythonスクリプトを書いてしまった。
_evdump.py
""" EV値が何を示しているかを表示 Windows10 x64 20H2 + Python 3.8.7 64bit """ # reference material # # Programming for a Touchscreen on the Raspberry Pi | ozzmaker.com # https://ozzmaker.com/programming-a-touchscreen-on-the-raspberry-pi/ # # linux/input.h at master - spotify/linux # https://github.com/spotify/linux/blob/master/include/linux/input.h # ( 0 0 0 0 0 0)H # (7654 .21. .... .... ..54 3210)B # |||| || || |||| # |||| || || |||+- EV_SYN # |||| || || ||+-- EV_KEY # |||| || || |+--- EV_REL # |||| || || +---- EV_ABS # |||| || |+------ EV_MSC # |||| || +------- EV_SW # |||| |+---------------------- EV_LED # |||| +----------------------- EV_SND # |||+-------------------------- EV_REP # ||+--------------------------- EV_FF # |+---------------------------- EV_PWR # +----------------------------- EV_FF_STATUS ev_list = { 0x00:"EV_SYN", 0x01:"EV_KEY", 0x02:"EV_REL", 0x03:"EV_ABS", 0x04:"EV_MSC", 0x05:"EV_SW", 0x11:"EV_LED", 0x12:"EV_SND", 0x14:"EV_REP", 0x15:"EV_FF", 0x16:"EV_PWR", 0x17:"EV_FF_STATUS", 0x1f:"EV_MAX" } def main(): allmask = 0 for k, v in ev_list.items(): allmask = allmask | (1 << k) print("Please input, hexadecimal or 'exit'") while True: s = input("EV=") if s == "" or s == "bye" or s == "quit" or s == "exit": break val = int(s, 16) result = " -> " for k, v in ev_list.items(): # print("0x%02x : %s" % (k, v)) mask = 1 << k if (val & mask) != 0: result = result + v + " " print(result) if (val & ~allmask) != 0: v = val & ~allmask print("Unknown : 0x%x" % v) print() if __name__ == '__main__': main()
動作させると以下のような感じになる。EV値(16進数)を打ち込むとフラグ内容を表示してくれる。exit と打ち込むと終了。
> python evdump.py Please input, hexadecimal or 'exit' EV=120013 -> EV_SYN EV_KEY EV_MSC EV_LED EV_REP EV=17 -> EV_SYN EV_KEY EV_REL EV_MSC EV=1f -> EV_SYN EV_KEY EV_REL EV_ABS EV_MSC EV=
ちなみに、lsinput の出力結果と照らし合わせてみたけど、結果は一致した。処理は合ってるっぽい。というか、Raspberry Pi OS上では lsinput を使ったほうが楽。
ところで、lsinput を、PC + Ubuntu Linux 20.04 LTS で動作させたら、フラグ文字列が全部「(null)」になってしまった。何故? Raspberry Pi OS buster 上で lsinput を動かすと、ちゃんと表示されているのだけど…。
◎ 2021/02/28追記。 :
Ubuntu Linux 20.04 LTS + lsinput が「(null)」を表示する件。ビルドし直せば治るらしい…?
_Why is "bits ev" of mouse input device null? - Unix & Linux Stack Exchange
ビルドして、/usr/local/bin/ 以下に lsinput だけ置いてみた。これならそれらしく表示された。ただ、以前の版とは表示フォーマットが随分違うようだけど…。
_Why is "bits ev" of mouse input device null? - Unix & Linux Stack Exchange
$ wget https://www.kraxel.org/releases/input/input-1.3.tar.gz $ tar xf input-1.3.tar.gz $ cd input-1.3 $ make $ ./lsinput -v
ビルドして、/usr/local/bin/ 以下に lsinput だけ置いてみた。これならそれらしく表示された。ただ、以前の版とは表示フォーマットが随分違うようだけど…。
[ ツッコむ ]
以上、1 日分です。