evdev 장치 유형 가져오기

evdev 장치 유형 가져오기

Linux 사용자 공간에서 evdev/input_event 장치의 유형(예: 마우스 또는 키보드)을 어떻게 얻을 수 있습니까?

/proc/bus/input/handlers읽 거나 나열 하여 열거할 수 있다는 것을 알고 있지만 /sys/class/input/어떤 장치가 마우스인지 키보드인지는 확실하지 않습니다.

/proc/bus/input/handlerslike 행은 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, 2입니다. 관심 있는 장치를 찾으려면 EV_REL에서 제공한 값에서 해당 비트를 찾을 수 있습니다 ./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를 사용하면 이러한 마법의 숫자도 볼 수 있습니다. 제거/추가하면 마우스, Bluetooth 장치 또는 바코드 리더와 같은 장치의 번호를 쉽게 찾을 수 있습니다. 나에게는 다음과 같은 결과가 나왔습니다.

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을 가진 장치를 발견했습니다. 장치 이름은 evdev에 사용될 수 있습니다. 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

나는 이것이 매우 상세하지 않다는 것을 알고 있습니다. 더 많은 것을 물어보십시오.

관련 정보