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 だけ置いてみた。これならそれらしく表示された。ただ、以前の版とは表示フォーマットが随分違うようだけど…。
[ ツッコむ ]
以上です。