首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uinput和Raspberry Pi

Uinput和Raspberry Pi
EN

Stack Overflow用户
提问于 2015-03-30 08:42:10
回答 1查看 446关注 0票数 4

我试着在Raspberry Pi论坛上问这个问题,但我根本没有收到任何回应。我想我可能会质疑过去一直很有帮助的StackOverflow社区的想法。

我正在为Raspberry Pi编写一个用户空间驱动程序(具体地说,以后可能会移植到其他平台),它利用了bcm2835库(GPIO)和uinput (Linux用户输入虚拟设备)。我需要读取GPIO引脚,并将它们的值转换为虚拟键盘上的模拟按键。GPIO部分已经完成,翻译部分也已经完成。不幸的是,虚拟键盘部分还没有解决。Uinput拒绝合作。

现在,完全相同的代码可以在Debian台式机上完美地运行。evdevuinput模块是必需的,所有测试用例中都加载了这两个模块。在桌面上,可以触发输入,但是,在Raspberry Pi上,我可以验证GPIO子系统已经注册了输入,但uinput事件不会触发。有没有人知道我会怎么做?

非常感谢,如果您需要任何信息,日志,或其他,请让我知道,我会尽快张贴他们。

EN

回答 1

Stack Overflow用户

发布于 2020-08-29 01:25:12

这是一个对我有效的完整解决方案。我有一个定制的键盘,这些是我定义的键。Here是我使用的原始pdf的链接。当然,您可以定义任何您想要的键,只需将其添加到数组中。

注意:此代码仅在权限提升的情况下有效。

代码语言:javascript
复制
int allowed_keys[allowed_KEYS_size][2] = {0};
void main()
{
   init_keys();
   
   int fd = open_uinput();

   int key_evt = getKeyEVT(49);   // ASCII code for 1
   
   // simulate key press and key release
   emit(fd, EV_KEY, key_evt, 1);
   emit(fd, EV_SYN, SYN_REPORT, 0);
   emit(fd, EV_KEY, key_evt, 0);
   emit(fd, EV_SYN, SYN_REPORT, 0);
}

long int emit(int fd, int type, int code, int val)
{    
    struct input_event ie;

    ie.type = type;
    ie.code = code;
    ie.value = val;
    /* timestamp values below are ignored */
    ie.time.tv_sec = 0;
    ie.time.tv_usec = 0;

    long int y = write(fd, &ie, sizeof(ie));
    return y;
}
int open_uinput()
{
    int fdui = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
    if (fdui < 0)
    {
        printf("uinput fd creation failed!\n");
        exit(EXIT_FAILURE);
    }

    ioctl(fdui, UI_SET_EVBIT, EV_KEY);
    ioctl(fdui, UI_SET_EVBIT, EV_SYN); //added by behzad

    for (int i = 0; i < allowed_KEYS_size; i++)
        ioctl(fdui, UI_SET_KEYBIT, allowed_keys[i][1]);

    struct uinput_setup usetup;
    memset(&usetup, 0, sizeof(usetup));
    usetup.id.bustype = BUS_USB;
    usetup.id.vendor = 0x1234;  /* sample vendor */
    usetup.id.product = 0x5678; /* sample product */
    strcpy(usetup.name, "My Keypad. Ver 1.1");

    ioctl(fdui, UI_DEV_SETUP, &usetup);
    ioctl(fdui, UI_DEV_CREATE);

    sleep(2);
    return fdui;
}

int getKeyEVT(int k)
{
    for (int i = 0; i < allowed_KEYS_size; i++)
    {
        if (allowed_keys[i][0] == k)
            return allowed_keys[i][1];
    }
    return -1;
}
void init_keys()
{
    //   Reference:
    //      https://www.alt-codes.net/arrow_alt_codes.php
    //      /usr/include/linux/input-event-codes.h    

    allowed_keys[0][0] = 48;    //ASCII     ---> 0
    allowed_keys[0][1] = KEY_0; //LINUX

    allowed_keys[1][0] = 49;    //ASCII
    allowed_keys[1][1] = KEY_1; //LINUX

    allowed_keys[2][0] = 50;    //ASCII
    allowed_keys[2][1] = KEY_2; //LINUX

    allowed_keys[3][0] = 51;    //ASCII
    allowed_keys[3][1] = KEY_3; //LINUX
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29336740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档