프로그램 사용/uinput2024. 3. 13. 14:49

실제 장치에서 터치 한번 하는걸 흉내냈는데 안되서, 프로토콜 대로 구현하니 된다.

 

linux 5.10.72 이긴 한데 그거 영향인진 모르겠지만

Protocol A 로 구현하니 커서나 클릭도 안되는 것 같고

Protocol B를 따라 구현하니 된다.

 

3.4. Protocol Example B
Here is what a minimal event sequence for a two-contact touch would look like for a type B device:

ABS_MT_SLOT 0
ABS_MT_TRACKING_ID 45
ABS_MT_POSITION_X x[0]
ABS_MT_POSITION_Y y[0]
ABS_MT_SLOT 1
ABS_MT_TRACKING_ID 46
ABS_MT_POSITION_X x[1]
ABS_MT_POSITION_Y y[1]
SYN_REPORT
Here is the sequence after moving contact 45 in the x direction:

ABS_MT_SLOT 0
ABS_MT_POSITION_X x[0]
SYN_REPORT
Here is the sequence after lifting the contact in slot 0:

ABS_MT_TRACKING_ID -1
SYN_REPORT

[링크 : https://docs.kernel.org/input/multi-touch-protocol.html]

 

 

초기화

    struct uinput_setup usetup;
    int keys[] = {BTN_TOUCH}; // BTN_LEFT, BTN_RIGHT, 

    fd_touch = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    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);
    ret = ioctl(fd_touch, UI_SET_ABSBIT, ABS_MT_SLOT);
    ret = ioctl(fd_touch, UI_SET_ABSBIT, ABS_MT_POSITION_X);
    ret = ioctl(fd_touch, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
    ret = ioctl(fd_touch, UI_SET_EVBIT, EV_SYN);

    struct uinput_abs_setup abs_setup_x;
    struct uinput_abs_setup abs_setup_y;
    memset(&abs_setup_x, 0, sizeof(abs_setup_x));
    memset(&abs_setup_y, 0, sizeof(abs_setup_y));
    abs_setup_x.code = ABS_MT_POSITION_X;
    abs_setup_x.absinfo.minimum = 0;
    abs_setup_x.absinfo.maximum = 1024;
    abs_setup_y.code = ABS_MT_POSITION_Y;
    abs_setup_y.absinfo.minimum = 0;
    abs_setup_y.absinfo.maximum = 768;
    ret = ioctl(fd_touch, UI_ABS_SETUP, &abs_setup_x);
    ret = ioctl(fd_touch, UI_ABS_SETUP, &abs_setup_y);

    memset(&usetup, 0, sizeof(usetup));
    usetup.id.bustype = BUS_USB;
    usetup.id.vendor = 0x4711;
    usetup.id.product = 0x0817;
    strcpy(usetup.name, "virtual touch device");
    ret = ioctl(fd_touch, UI_DEV_SETUP, &usetup);
    ret = ioctl(fd_touch, UI_DEV_CREATE);

 

터치(클릭) 처리

switch(buttonMask)
{
    default:
        printf("buttonMask[%02X]\n",buttonMask);
    break;
    
    case BUTTON_RELEASE:
        switch(prev_click)
        {
            case BUTTON_L_DOWN:
                printf("BUTTON_L_DOWN BUTTON_RELEASE\n");
                prev_click = -1;
                emit(fd_touch, EV_ABS, ABS_MT_TRACKING_ID, -1);
                emit(fd_touch, EV_SYN, SYN_REPORT, 0);
                break;
        }
        break;

    case BUTTON_L_DOWN:
        if(prev_click == -1)
        {
            printf("BUTTON_L_DOWN\n");
            prev_click = buttonMask;
            emit(fd_touch, EV_ABS, ABS_MT_SLOT, 0);
            emit(fd_touch, EV_ABS, ABS_MT_TRACKING_ID, track_id++);
            emit(fd_touch, EV_ABS, ABS_MT_POSITION_X, pos_x);
            emit(fd_touch, EV_ABS, ABS_MT_POSITION_Y, pos_y);
            emit(fd_touch, EV_ABS, ABS_X, pos_x);
            emit(fd_touch, EV_ABS, ABS_Y, pos_y);
            emit(fd_touch, EV_SYN, SYN_REPORT, 0);
        }
        else
        {
            printf("BUTTON_L_DOWN MOVE\n");
            emit(fd_touch, EV_ABS, ABS_MT_SLOT, 0);
            emit(fd_touch, EV_ABS, ABS_MT_POSITION_X, pos_x);
            emit(fd_touch, EV_ABS, ABS_MT_POSITION_Y, pos_y);
            emit(fd_touch, EV_ABS, ABS_X, pos_x);
            emit(fd_touch, EV_ABS, ABS_Y, pos_y);
            emit(fd_touch, EV_SYN, SYN_REPORT, 0);
        }
        break;
}

 

Posted by 구차니
프로그램 사용/uinput2024. 3. 12. 18:17

대충 봐선(?)

protocol A에 ABS_X, ABS_Y를 추가한 변종(?) 같긴한데

 

아래는 한번 터치해서 클릭하는 내용

BTN_TOUCH로 눌렸다 떼었다 라는 걸 보내주는데

깔끔(?) 하게 원격으로 좌표 + 떼어라 만 보내도 되는지 테스트 해봐야 할 듯 (눌렀다 없이 떼었다가 될지 모르겠음)

 

그 와중에 ABS_MT_TRACKING_ID는 왜 음수 값이 나오지?

 

세번의 터치가 있었는데(터치 1회, 드래그, 줌 인)

그 때 마다 ABS_MT_TRACKING_ID가 증가하고 매번 -1 로 BTN_TOUCH 0 을 누르기 전에 트래킹이

사용되지 않는다는걸 알려주는건가..?

마지막의 Tracking_id 2,3은 두 손가락으로 줌 인 한 거라, 각각의 손가락에 대해서 처리하는 듯

 

A non-negative tracking id is interpreted as a contact, and the value -1 denotes an unused slot

[링크 : https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt]

Posted by 구차니
프로그램 사용/uinput2024. 3. 12. 11:03

아래와 같이 설정하면 BTN_LEFT, BTN_RIGHT 때문에, udev에서 Mouse Touchscreen으로 인식된다.

    int keys[] = {BTN_LEFT, BTN_RIGHT, BTN_TOUCH};

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);

    //Custom key events init
    ioctl(fd, UI_SET_EVBIT, EV_KEY);
    for(int i = 0; i < sizeof(keys) / sizeof(int); i++){
        ioctl(fd, UI_SET_KEYBIT, keys[i]);
    }
[01:49:49.721] event5  - virtual touch driver: is tagged by udev as: Mouse Touchscreen
[01:49:49.722] event5  - virtual touch driver: kernel bug: device has min == max on ABS_MT_POSITION_X
[01:49:49.722] event5  - virtual touch driver: was rejected
[01:49:49.722] event5  - using input device '/dev/input/event5'

 

그래서 BTN_TOUCH만 넣으면 Mouse는 빠지고 Touchscreen만 뜨는데, 도대체 커널 버그 쪽은 어떻게 해결해야 할까?

    int keys[] = {BTN_TOUCH}; // BTN_LEFT, BTN_RIGHT

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);

    //Custom key events init
    ioctl(fd, UI_SET_EVBIT, EV_KEY);
    for(int i = 0; i < sizeof(keys) / sizeof(int); i++){
        ioctl(fd, UI_SET_KEYBIT, keys[i]);
    }
[01:50:22.720] event5  - virtual touch driver: is tagged by udev as: Touchscreen
[01:50:22.720] event5  - virtual touch driver: kernel bug: device has min == max on ABS_MT_POSITION_X
[01:50:22.720] event5  - virtual touch driver: was rejected
[01:50:22.720] event5  - not using input device '/dev/input/event5'

 

+

chatGPT 응답해준 것을 조합하면 아래와 같이 하면

일단 터치 장비로 인식은 되는데.. 커서도 안되고 터치 이동, 클릭을 어떻게 구현해야 하나...

void initializeTouchEvent(int fd) {
    struct uinput_setup usetup;
    int keys[] = {BTN_TOUCH}; // BTN_LEFT, BTN_RIGHT, 

    fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    ioctl(fd, UI_SET_EVBIT, EV_KEY);

    // 사용할 키 등록(터치니까 BTN_TOUCH 만, BTN_LEFT 나 BTN_RIGHT가 등록되면 마우스로 인식됨)
    for(int i = 0; i < sizeof(keys) / sizeof(int); i++){
       ioctl(fd, UI_SET_KEYBIT, keys[i]);
    }

    ioctl(fd, UI_SET_EVBIT, EV_ABS);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_SLOT);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_TRACKING_ID);  // 요건 없어도 되는 듯
    ioctl(fd, UI_SET_EVBIT, EV_SYN);

    struct uinput_abs_setup abs_setup_x;
    struct uinput_abs_setup abs_setup_y;
    memset(&abs_setup_x, 0, sizeof(abs_setup_x));
    memset(&abs_setup_y, 0, sizeof(abs_setup_y));
    abs_setup_x.code = ABS_MT_POSITION_X;
    abs_setup_x.absinfo.minimum = 0; // 최솟값
    abs_setup_x.absinfo.maximum = 1024; // 최댓값
    abs_setup_y.code = ABS_MT_POSITION_Y;
    abs_setup_y.absinfo.minimum = 0; // 최솟값
    abs_setup_y.absinfo.maximum = 1024; // 최댓값

    ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_X);
    ioctl(fd, UI_SET_ABSBIT, ABS_MT_POSITION_Y);
    ioctl(fd, UI_ABS_SETUP, &abs_setup_x);
    ioctl(fd, UI_ABS_SETUP, &abs_setup_y);

    // 가상 디바이스를 생성
    memset(&usetup, 0, sizeof(usetup));
    usetup.id.bustype = BUS_USB;
    usetup.id.vendor = 0x1;
    usetup.id.product = 0x1;
    strcpy(usetup.name, "Virtual Touch Device");

    ioctl(fd, UI_DEV_SETUP, &usetup);
    ioctl(fd, UI_DEV_CREATE);
}
Posted by 구차니
프로그램 사용/uinput2022. 8. 11. 23:42

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);
}
Posted by 구차니

왼쪽은 golang의 touchscreen uinput 기능을 이용한 것, 오른쪽은 uinput 예제에서 설정한 것인데

UI_DEV_SETUP 대신 write로 쓰는게 좀.. 특이하다. 

그리고 write로 장치 이름을 쓰고 1116 바이트가 써졌다라..

ioctl(3, UI_SET_EVBIT, 0x1)             = 0
ioctl(3, UI_SET_KEYBIT, 0x110)          = 0
ioctl(3, UI_SET_KEYBIT, 0x111)          = 0
ioctl(3, UI_SET_KEYBIT, 0x14a)          = 0

ioctl(3, UI_SET_EVBIT, 0x3)             = 0
ioctl(3, UI_SET_ABSBIT, 0)              = 0
ioctl(3, UI_SET_ABSBIT, 0x1)            = 0

write(3, "testpad\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 1116) = 1116
ioctl(3, UI_DEV_CREATE, 0)              = 0
ioctl(3, UI_SET_EVBIT, 0x1)             = 0
ioctl(3, UI_SET_KEYBIT, 0x110)          = 0
ioctl(3, UI_SET_KEYBIT, 0x111)          = 0
ioctl(3, UI_SET_KEYBIT, 0x14a)          = 0

ioctl(3, UI_SET_EVBIT, 0x3)             = 0
ioctl(3, UI_SET_ABSBIT, 0)              = 0
ioctl(3, UI_SET_ABSBIT, 0x1)            = 0

ioctl(3, UI_DEV_SETUP, 0x7ffc48a87ef0)  = 0
ioctl(3, UI_DEV_CREATE, 0)              = 0

 

struct uinput_user_dev   uinp;

            // create input device in input subsystem
            retcode = write(ufile, &uinp, sizeof(uinp));
            printf("First write returned %d.\n", retcode);

First write returned 1116.

[링크 : https://hybridego.net/1823]

 

sturct uinput_setup 은 92 바이트 길이

#define UINPUT_MAX_NAME_SIZE 80
struct uinput_setup {
struct input_id id;
char name[UINPUT_MAX_NAME_SIZE];
__u32 ff_effects_max;
};

[링크 : https://elixir.bootlin.com/linux/v4.7/source/include/uapi/linux/uinput.h#L66]

 

struct uinput_user_dev도 그리 길어 보이진 않는데..

#define UINPUT_MAX_NAME_SIZE 80
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.0/source/include/uapi/linux/uinput.h#L148]

 

64개까지 등록 가능하도록 되어있는건가?

#define ABS_MAX 0x3f
#define ABS_CNT (ABS_MAX+1)

[링크 : https://github.com/spotify/linux/blob/master/include/linux/input.h]

 

+

uinput old interface 로 분류된 구조체인듯..

Programs supportinf older versions of uinput interface need to fill a uinput_user_dev structure and write it to the uinput file descriptor to configure the new uinput device

[링크 : https://www.kernel.org/doc/html/v4.12/input/uinput.html]

Posted by 구차니

golang의 예제로는 원하는대로 절대 좌표 이동이 되는데..

C로 하는건 영 안되네 ㅠㅠ 무슨 차이냐!!!

 

[링크 : https://pkg.go.dev/github.com/bendahl/uinput#section-readme]

[링크 : https://github.com/torvalds/linux/blob/master/include/uapi/linux/uinput.h]

[링크 : https://github.com/bendahl/uinput/blob/master/touchpad.go]

Posted by 구차니

uinput에 대한 이벤트 로그를 dmesg를 통해 볼 수 있게 해주는 디버그용 모듈

 

$ sudo modprobe evbug

[링크 : https://www.linuxquestions.org/questions/debian-26/how-to-disable-the-evbug-module-478529/]

[링크 : https://copyprogramming.com/howto/simulating-absolute-mouse-movements-in-linux-using-uinput] << 링크 깨짐

'프로그램 사용 > uinput' 카테고리의 다른 글

struct uinput_setup 와 struct uinput_user_dev  (0) 2022.08.05
uinput 터치 스크린 예제  (0) 2022.08.05
uinput 장치 확인  (0) 2022.03.04
uinput absolute mouse  (0) 2022.02.23
xmodmap  (0) 2022.02.21
Posted by 구차니

/sys/devices 하위의 장치가 /sys/class/input 에 심볼릭 링크로 걸리는데

uinput을 통한 가상 장치는 /sys/devices/virtual/input에 잡힌다.

 

$ ls /sys/class/input/
$ ls /sys/devices/virtual/input/

[링크 : https://stackoverflow.com/questions/15623442/]

 

가상으로 잡힌 장치를 보는데 이게 키보드냐.. 마우스냐.

abs, rel도 값을 보는법을 찾아야 할 듯..

(abs 모드로 초기화 하면 capabilities/abs가 3으로 capabilities/rel 이 0으로 뜬다.)

# cat /sys/class/input/input33/uevent
PRODUCT=3/1234/5678/0
NAME="melih-hid"
PROP=0
EV=7
KEY=30000 7ffffffff ffffffffffffffff ffffffffffffffff fffffffffffffffe
REL=3
MODALIAS=input:b0003v1234p5678e0000-e0,1,2,k71,72,73,74,75,76,77,78,79,7A,7B,7C,7D,7E,7F,80,81,82,83,84,85,86,87,88,89,8A,8B,8C,8D,8E,8F,90,91,92,93,94,95,96,97,98,99,9A,9B,9C,9D,9E,9F,A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,AA,AB,AC,AD,AE,AF,B0,B1,B2,B3,B4,B5,B6,B7,B8,B9,BA,BB,BC,BD,BE,BF,C0,C1,C2,C3,C4,C5,C6,C7,C8,C9,CA,CB,CC,CD,CE,CF,D0,D1,D2,D3,D4,D5,D6,D7,D8,D9,DA,DB,DC,DD,DE,DF,E0,E1,E2,110,111,r0,1,amlsfw

/sys/class/input/input33/capabilities# cat abs
0
/sys/class/input/input33/capabilities# cat rel
3
/sys/class/input/input33/capabilities# cat key
30000 7ffffffff ffffffffffffffff ffffffffffffffff fffffffffffffffe

 

'프로그램 사용 > uinput' 카테고리의 다른 글

uinput 터치 스크린 예제  (0) 2022.08.05
evbug - 키보드/마우스 입력 디버깅 하기  (0) 2022.08.05
uinput absolute mouse  (0) 2022.02.23
xmodmap  (0) 2022.02.21
uinput  (0) 2022.02.21
Posted by 구차니
프로그램 사용/uinput2022. 2. 23. 14:55

 

[링크 : https://www.kernel.org/doc/Documentation/input/event-codes.txt]

[링크 : https://stackoverflow.com/questions/5190921/simulating-absolute-mouse-movements-in-linux-using-uinput]

 

+

2022.02.25

 

// uinput.h
#define UI_SET_EVBIT _IOW(UINPUT_IOCTL_BASE, 100, int)
#define UI_SET_KEYBIT _IOW(UINPUT_IOCTL_BASE, 101, int)
#define UI_SET_RELBIT _IOW(UINPUT_IOCTL_BASE, 102, int)
#define UI_SET_ABSBIT _IOW(UINPUT_IOCTL_BASE, 103, int)

#define UI_DEV_CREATE _IO(UINPUT_IOCTL_BASE, 1)
#define UI_DEV_DESTROY _IO(UINPUT_IOCTL_BASE, 2)
#define UI_DEV_SETUP _IOW(UINPUT_IOCTL_BASE, 3, struct uinput_setup)

// input-event-codes.h
#define EV_KEY 0x01
#define EV_REL 0x02
#define EV_ABS 0x03

#define REL_X 0x00
#define REL_Y 0x01

#define ABS_X 0x00
#define ABS_Y 0x01

[링크 : https://github.com/aosp-mirror/platform_bionic/blob/master/libc/kernel/uapi/linux/input-event-codes.h]

[링크 : https://github.com/torvalds/linux/blob/master/include/uapi/linux/uinput.h]

[링크 : https://github.com/nmelihsensoy/virtual-hid-tcp/blob/master/server/src/server.c]

'프로그램 사용 > uinput' 카테고리의 다른 글

uinput 터치 스크린 예제  (0) 2022.08.05
evbug - 키보드/마우스 입력 디버깅 하기  (0) 2022.08.05
uinput 장치 확인  (0) 2022.03.04
xmodmap  (0) 2022.02.21
uinput  (0) 2022.02.21
Posted by 구차니
프로그램 사용/uinput2022. 2. 21. 15:43

키코드 확인하는 명령어

여전..히 키코드와 키입력은 헷갈리네

 

$ xmodmap -pke
keycode   8 = Mode_switch NoSymbol Mode_switch
keycode   9 = Escape NoSymbol Escape
keycode  10 = 1 exclam 1 exclam
keycode  11 = 2 at 2 at
keycode  12 = 3 numbersign 3 numbersign
keycode  13 = 4 dollar 4 dollar
keycode  14 = 5 percent 5 percent
keycode  15 = 6 asciicircum 6 asciicircum
keycode  16 = 7 ampersand 7 ampersand
keycode  17 = 8 asterisk 8 asterisk
keycode  18 = 9 parenleft 9 parenleft
keycode  19 = 0 parenright 0 parenright
keycode  20 = minus underscore minus underscore
keycode  21 = equal plus equal plus
keycode  22 = BackSpace BackSpace BackSpace BackSpace
keycode  23 = Tab ISO_Left_Tab Tab ISO_Left_Tab
keycode  24 = q Q q Q
keycode  25 = w W w W
keycode  26 = e E e E
keycode  27 = r R r R
keycode  28 = t T t T
keycode  29 = y Y y Y
keycode  30 = u U u U
keycode  31 = i I i I
keycode  32 = o O o O
keycode  33 = p P p P

[링크 : https://forums.raspberrypi.com/viewtopic.php?t=21804]

'프로그램 사용 > uinput' 카테고리의 다른 글

uinput 터치 스크린 예제  (0) 2022.08.05
evbug - 키보드/마우스 입력 디버깅 하기  (0) 2022.08.05
uinput 장치 확인  (0) 2022.03.04
uinput absolute mouse  (0) 2022.02.23
uinput  (0) 2022.02.21
Posted by 구차니