mieki256's diary



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のデスクトップ画面上でキーボードもマウスも使えているのだから、これがキーボードでこれがマウスだと判別する方法が絶対必ずあるはずだけど。ググってみても、作法に遭遇しない…。それぞれどうやって実現しているのやら…。

EV値は今一つだった。 :

/proc/bus/input/devices の中に「B: EV=xxxxxx」という部分があって、その機器がどういう信号を出してくるのか、ビット単位のフラグで列挙されているのだけど。

もしかして、その値を見れば、どれがキーボードでどれがマウスか分かるのでは? と思ったものの…。同じ値が並ぶ場合が多くて、これだけでは判別できそうにないなと…。

ちなみに、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
$ 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 日分です。

過去ログ表示

Prev - 2021/02 - Next
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project