從 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_REP
20, EV_REL
2 /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
我意識到這些不是很詳細,請隨意詢問更多。