uinput 에서 절대값을 받기 위해서는 마우스가 아니라 터치로 인식을 시켜야 한다.
가장 도움을 받았던 문서가 오히려 함정 카드(?)였는데
1.7.4.2의 내용은 상대좌표를 이용하는 일반적인 마우스의 예라서
[링크 : https://www.kernel.org/doc/html/v4.12/input/uinput.html]
struct uinput_setup 구조체를 이용하고 있지만
struct uinput_setup { struct input_id id; char name[UINPUT_MAX_NAME_SIZE]; __u32 ff_effects_max; }; |
[링크 : https://github.com/torvalds/linux/blob/master/include/uapi/linux/uinput.h]
터치패드의 경우(혹은 터치 스크린) 아래의 구조체 중 absmax, absmin 에 시작, 끝 좌표를 넣어 주어야 한다.
ABS_CNT(64)가 왜 상당히 크게 잡혀있는지 모르겠지만
absmax[0] = WIDTH, absmax[1] = HEIGHT를 넣고 초기화 해주면 된다.
struct uinput_user_dev { char name[UINPUT_MAX_NAME_SIZE]; struct input_id id; __u32 ff_effects_max; __s32 absmax[ABS_CNT]; __s32 absmin[ABS_CNT]; __s32 absfuzz[ABS_CNT]; __s32 absflat[ABS_CNT]; }; |
[링크 : https://elixir.bootlin.com/linux/v4.6/source/include/uapi/linux/uinput.h#L222]
VID와 PID 혹은 문자열이 영향을 주는진 모르겠다.
[링크 : https://github.com/bendahl/uinput/blob/master/touchpad.go#L172]
UI_DEV_SETUP을 ioctl을 이용하여 setup 하는게 아니라
/dev/uinput fd에 write() 함수로 써버리는 것이 EV_REL과의 차이라고 해야하나..?
void init_uinput_touchscreen() { int ret = 0; struct uinput_user_dev usetup; int keys[] = {BTN_LEFT, BTN_RIGHT, BTN_TOUCH}; int fd_touch = open("/dev/uinput", O_WRONLY | O_NONBLOCK); printf("fd[%d]\n", fd_touch); //Custom key events init ioctl(fd_touch, UI_SET_EVBIT, EV_KEY); for(int i = 0; i < sizeof(keys) / sizeof(int); i++){ ioctl(fd_touch, UI_SET_KEYBIT, keys[i]); } //Mouse Pointer events init ret = ioctl(fd_touch, UI_SET_EVBIT, EV_ABS); printf("EV_ABS ret[%d]\n",ret); ret = ioctl(fd_touch, UI_SET_ABSBIT, ABS_X); printf("ABS_X ret[%d]\n",ret); ret = ioctl(fd_touch, UI_SET_ABSBIT, ABS_Y); printf("ABS_Y ret[%d]\n",ret); memset(&usetup, 0, sizeof(usetup)); usetup.id.bustype = BUS_USB; usetup.id.vendor = 0x4711; usetup.id.product = 0x0817; strcpy(usetup.name, "TouchPad"); usetup.absmax[0] = 1024; usetup.absmax[1] = 768; // ret = ioctl(fd_touch, UI_DEV_SETUP, &usetup); ret = write(fd_touch, &usetup, sizeof(struct uinput_user_dev)); printf("UI_DEV_SETUP ret[%d]\n",ret); printf("sizeof %d\n",sizeof(struct uinput_user_dev)); ret = ioctl(fd_touch, UI_DEV_CREATE); printf("UI_DEV_CREATE ret[%d]\n",ret); } |
'프로그램 사용 > uinput' 카테고리의 다른 글
touchscreen 장치 프로토콜 분석 (0) | 2024.03.12 |
---|---|
uinput 으로 touchscreen을 만들기 (0) | 2024.03.12 |
struct uinput_setup 와 struct uinput_user_dev (0) | 2022.08.05 |
uinput 터치 스크린 예제 (0) | 2022.08.05 |
evbug - 키보드/마우스 입력 디버깅 하기 (0) | 2022.08.05 |