取得 evdev 裝置類型

取得 evdev 裝置類型

從 Linux 使用者空間,如何取得 evdev/input_event 裝置的類型(即滑鼠或鍵盤)?

我知道我可以透過閱讀/proc/bus/input/handlers或列出來枚舉它們/sys/class/input/,但不清楚哪些設備是滑鼠或鍵盤。

/proc/bus/input/handlers類似的行H: Handlers=sysrq kbd event3 leds似乎表明這是一個存在“kbd”的鍵盤,但我找不到任何實際的文檔。

答案1

內核並不真正根據設備類型進行推理,而是更多地根據設備可以產生的事件類型進行推理(請參閱事件代碼文檔在內核中)。

因此,您需要一些啟發式方法來識別設備類型。許多設備都可以產生按鍵事件;鍵盤具有產生按鍵事件 ( EV_KEY) 和重複事件 ( )的特殊性EV_REP。我認為,小鼠是唯一產生相關事件的設備(EV_REL)。

設備公開可以在ev其類別目錄的檔案中產生的事件類型capabilities。每個偶數類型都有一個給定的位元偏移量,定義在/usr/include/linux/input-event-codes.h;EV_KEY是 1, EV_REP20, EV_REL2 /sys/class/input/input*/capabilities/ev

答案2

要查找任何設備的詳細資訊(我使用 event22),您可以運行此命令(在終端機/python/C++ 中):

udevadm info -a -n /dev/input/event22

輸出是一個巨大的詳細資訊列表,其中只有 2 個重要的資訊:產品和供應商:

ATTRS{idProduct}=="0100"
ATTRS{idVendor}=="04b4"

當您在終端機中使用 lsusb 時,您也會看到這些神奇的數字。透過刪除/新增,您可以輕鬆找到裝置的編號,例如滑鼠、藍牙裝置或條碼閱讀器。對我來說,我得到以下輸出:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0a2b Intel Corp. 
Bus 001 Device 061: ID 04b4:0100 Cypress Semiconductor Corp. Cino FuzzyScan F760-B
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

當我移除條碼閱讀器並再次運行時,Fuzzyscan 設備消失了。然後我知道我的條碼閱讀器是 04b4:0100。

現在在 Evdev 圖書館中我也可以找到這些數字。首先,我寫一個程式來為每個裝置執行 udevadm info。在某個時候,我找到了一個帶有 04b4 和 0100 的裝置。在 C++ 中我可以運行:

int fd = open("/dev/input/event22", O_RDONLY|O_NONBLOCK)
int rc = libevdev_new_from_fd(fd, &m_evDev);
int vendor = libevdev_get_id_vendor(m_evDev),
int productId = libevdev_get_id_product(m_evDev);
if (vendor == 0x4b4 && productId == 0x100)
    printf("Wooow, you find the barcode scanner!");

備註:可能該設備不被使用者允許,那麼您需要新增讀取/寫入權限,如下所示:

sudo chmod a+=wr /dev/input/event22

我意識到這些不是很詳細,請隨意詢問更多。

相關內容