這裡簡單的描述一下如何寫一個user program去讀去input device data,基本上,就是直接open /dev/inputN,然後將data mapping成struct input_event。
struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value; };type: event type
code: key code for EV_KEY
摘入一段/usr/include/linux/input-event-codes.h
/* * Event types */ #define EV_SYN 0x00 #define EV_KEY 0x01 #define EV_REL 0x02 #define EV_ABS 0x03 #define EV_MSC 0x04 #define EV_SW 0x05 #define EV_LED 0x11 #define EV_SND 0x12 #define EV_REP 0x14 #define EV_FF 0x15 #define EV_PWR 0x16 #define EV_FF_STATUS 0x17 #define EV_MAX 0x1f #define EV_CNT (EV_MAX+1) /* * Key code */ #define KEY_RESERVED 0 #define KEY_ESC 1 #define KEY_1 2 #define KEY_2 3 ... #define BTN_MISC 0x100 #define BTN_0 0x100 #define BTN_1 0x101 #define BTN_2 0x102 ... #define KEY_OK 0x160 #define KEY_SELECT 0x161 ...
#include <stdio.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <linux/input.h> int main(int argc, char *argv[]) { struct input_event evt; int fd; fd = open(argv[1], O_RDONLY); if (fd < 0) { printf("open %s failed: %s/%d\n", argv[0], strerror(errno), errno); return -1; } while (1) { if (sizeof(evt) == read(fd, &evt, sizeof(evt))) { printf("type:%d, code:%d, val:%d\n", evt.type, evt.code, evt.value); } else { printf("read failed: %s/%d\n", strerror(errno), errno); } } return 0; }
-
參考資料:
- Documentation/input/event-codes.rst