장치 는 N /dev/input/
이라는 이름 eventN
이 마우스, 키보드, 잭, 전원 단추 등과 같은 다양한 장치 인 파일을 얻을 가능성이 높습니다 .
ls -l /dev/input/by-{path,id}/
힌트를 주어야합니다.
또한보십시오 :
cat /proc/bus/input/devices
여기서 Sysfs
value는 path 아래에 /sys
있습니다.
예를 들어 테스트 할 수 있습니다
cat /dev/input/event2 # if 2 is kbd.
ioctl을 사용하고 장치 + 모니터를 확인하십시오.
편집 2 :
확인. 나는 가정에 따라이 답변을 확장하고 있습니다./dev/input/eventN
사용 된 있습니다.
한 가지 방법은 다음과 같습니다.
시작시에있는 모든 event
파일을 반복합니다 /dev/input/
. ioctl()
이벤트 비트를 요청하는 데 사용하십시오 .
ioctl(fd, EVIOCGBIT(0, sizeof(evbit)), &evbit);
그런 다음 EV_KEY
-bit가 설정되어 있는지 확인하십시오 .
IFF 설정 후 키 확인 :
ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(keybit)), &keybit);
예를 들어 숫자 키가 흥미로운 경우 KEY_0
- KEY9
및 KEY_KP0
to 비트가 있는지 확인하십시오 KEY_KP9
.
IFF 키가 발견되면 스레드에서 이벤트 파일 모니터링을 시작합니다.
다시 1
이렇게하면 원하는 기준에 맞는 모든 장치를 모니터링해야합니다. 당신은 확인 할 수 EV_KEY
예를 들어, 전원 버튼이 비트가 설정되어하므로,하지만 분명히 필요가 없습니다KEY_A
등을 설정합니다.
이국적인 키에 대해서는 오 탐지를 보았지만 일반 키 에는 오 탐지를 보았습니다 에는 충분합니다. 전원 버튼이나 잭에 대한 이벤트 파일과 같은 모니터링에는 직접적인 해를 끼치 지 않지만 문제가되는 이벤트 (일명 불량 코드)를 방출하지는 않습니다.
아래에 더 자세히 설명되어 있습니다.
편집 1 :
"마지막 진술을 설명 할 때…"와 관련하여 . 여기 에 스택 오버 플로우 토지가 있습니다 ...하지만 :
C의 빠르고 더러운 샘플. 실제로 올바른 장치를 얻고 이벤트 유형, 코드 및 값을 변환하는지 확인하려면 다양한 코드를 구현해야합니다. 일반적으로 키 다운, 키 업, 키 반복, 키 코드 등
나머지를 더할 시간이 없었습니다.
확인 linux/input.h
프로그램은 좋아 dumpkeys
매핑 코드에 대한 등, 커널 코드를. 예 :dumpkeys -l
아무리 해도:
예를 들어 다음과 같이 실행하십시오.
# ./testprog /dev/input/event2
암호:
#include <stdio.h>
#include <string.h> /* strerror() */
#include <errno.h> /* errno */
#include <fcntl.h> /* open() */
#include <unistd.h> /* close() */
#include <sys/ioctl.h> /* ioctl() */
#include <linux/input.h> /* EVIOCGVERSION ++ */
#define EV_BUF_SIZE 16
int main(int argc, char *argv[])
{
int fd, sz;
unsigned i;
/* A few examples of information to gather */
unsigned version;
unsigned short id[4]; /* or use struct input_id */
char name[256] = "N/A";
struct input_event ev[EV_BUF_SIZE]; /* Read up to N events ata time */
if (argc < 2) {
fprintf(stderr,
"Usage: %s /dev/input/eventN\n"
"Where X = input device number\n",
argv[0]
);
return EINVAL;
}
if ((fd = open(argv[1], O_RDONLY)) < 0) {
fprintf(stderr,
"ERR %d:\n"
"Unable to open `%s'\n"
"%s\n",
errno, argv[1], strerror(errno)
);
}
/* Error check here as well. */
ioctl(fd, EVIOCGVERSION, &version);
ioctl(fd, EVIOCGID, id);
ioctl(fd, EVIOCGNAME(sizeof(name)), name);
fprintf(stderr,
"Name : %s\n"
"Version : %d.%d.%d\n"
"ID : Bus=%04x Vendor=%04x Product=%04x Version=%04x\n"
"----------\n"
,
name,
version >> 16,
(version >> 8) & 0xff,
version & 0xff,
id[ID_BUS],
id[ID_VENDOR],
id[ID_PRODUCT],
id[ID_VERSION]
);
/* Loop. Read event file and parse result. */
for (;;) {
sz = read(fd, ev, sizeof(struct input_event) * EV_BUF_SIZE);
if (sz < (int) sizeof(struct input_event)) {
fprintf(stderr,
"ERR %d:\n"
"Reading of `%s' failed\n"
"%s\n",
errno, argv[1], strerror(errno)
);
goto fine;
}
/* Implement code to translate type, code and value */
for (i = 0; i < sz / sizeof(struct input_event); ++i) {
fprintf(stderr,
"%ld.%06ld: "
"type=%02x "
"code=%02x "
"value=%02x\n",
ev[i].time.tv_sec,
ev[i].time.tv_usec,
ev[i].type,
ev[i].code,
ev[i].value
);
}
}
fine:
close(fd);
return errno;
}
편집 2 (계속) :
당신이 보면 /proc/bus/input/devices
각 줄의 시작 부분에 편지가 있습니다. 여기는 B
비트 맵을 의미합니다. 예를 들면 다음과 같습니다.
B: PROP=0
B: EV=120013
B: KEY=20000 200 20 0 0 0 0 500f 2100002 3803078 f900d401 feffffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=7
이러한 비트 각각은 장치의 속성에 해당합니다. 비트 맵을 의미하는 1은에 정의 된 속성이 있음을 나타냅니다 linux/input.h
. :
B: PROP=0 => 0000 0000
B: EV=120013 => 0001 0010 0000 0000 0001 0011 (Event types sup. in this device.)
| | | ||
| | | |+-- EV_SYN (0x00)
| | | +--- EV_KEY (0x01)
| | +------- EV_MSC (0x04)
| +----------------------- EV_LED (0x11)
+--------------------------- EV_REP (0x14)
B: KEY=20... => OK, I'm not writing out this one as it is a bit huge.
B: MSC=10 => 0001 0000
|
+------- MSC_SCAN
B: LED=7 => 0000 0111 , indicates what LED's are present
|||
||+-- LED_NUML
|+--- LED_CAPSL
+---- LED_SCROLL
/drivers/input/input.{h,c}
커널 소스 트리를 살펴보십시오 . 거기에 좋은 코드가 많이 있습니다. (예 : 장치 속성은 이 기능 으로 생성됩니다 .)
각 속성 맵은에 의해 얻을 수 있습니다 ioctl
. 예를 들어 어떤 LED 속성을 사용할 수 있는지 확인하려면 다음과 같이 말합니다.
ioctl(fd, EVIOCGBIT(EV_LED, sizeof(ledbit)), &ledbit);
의 정의를 봐 struct input_dev
의 input.h
방법은 ledbit
정의됩니다.
LED의 상태를 확인하려면
ioctl(fd, EVIOCGLED(sizeof(ledbit)), &ledbit);
비트 1 in ledbit
이 1이면 num-lock이 켜집니다. 비트 2가 1이면 캡 잠금 등이 켜집니다.
input.h
다양한 정의가 있습니다.
이벤트 모니터링에 관한 참고 사항 :
모니터링을위한 의사 코드는 다음과 같은 방향 일 수 있습니다.
WHILE TRUE
READ input_event
IF event->type == EV_SYN THEN
IF event->code == SYN_DROPPED THEN
Discard all events including next EV_SYN
ELSE
This marks EOF current event.
FI
ELSE IF event->type == EV_KEY THEN
SWITCH ev->value
CASE 0: Key Release (act accordingly)
CASE 1: Key Press (act accordingly)
CASE 2: Key Autorepeat (act accordingly)
END SWITCH
FI
END WHILE
일부 관련 문서 :
Documentation/input/input.txt
, 특히 섹션 5.
Documentation/input/event-codes.txt
다양한 이벤트의 설명 등의 예에서 언급 한 것과 양지 EV_SYN
에 대해를SYN_DROPPED
Documentation/input
... 원한다면 나머지를 읽어보십시오.
/dev/disk/by-id/
은 imho에 의해 생성됩니다udev
. 질문은이 부분적 사례 (임베디드 플랫폼)에서 사용 가능한지 여부입니다.