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. 모든 짝수 유형에는 1, 20, 2 로 정의된 지정된 비트 오프셋이 있습니다 /usr/include/linux/input-event-codes.h. 주어진 값에서 이 비트를 조회하여 관심 있는 장치를 찾을 수 있습니다.EV_KEYEV_REPEV_REL/sys/class/input/input*/capabilities/ev

답변2

모든 장치의 세부 정보를 찾으려면(저는 event22를 사용합니다) 다음 명령을 실행할 수 있습니다(터미널/python/C++에서):

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

출력은 제품 및 공급업체라는 두 가지 중요한 정보만 포함된 거대한 세부 정보 목록입니다.

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이 있는 장치를 발견했습니다. 이 장치 이름은 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

자세한 내용이 아니라는 점 알고 있으니 더 문의해 주세요.

관련 정보