/ dev / hidraw:读取权限


8

要获得对/ dev / hidraw *的读取权限,我该怎么做?

我在网上看到了有关udev规则的内容,并在网上看到了,但是udev的世界对我来说就像是一块异乡,如果有某种更简单的解决方案,我只是将自己添加到一个花花公子的团队中...

(Ubuntu 13.10预览)

随意重提问题-我不太想知道“ hidraw”到底发生了什么。

编辑:

好的,所以,仅提供一些更多信息来阐明问题:我逐字逐句地执行了调用POSIX open()方法的代码,并获得了errno权限不足的提示。cat以普通用户身份在文件上运行会导致权限不足错误,而以普通用户运行会su导致成功(尽管无意义)cat操作。

编辑编辑:

根据要求,我将通过POSIX调用提供相关代码。它来自Signal11的HIDAPI库(函数hid_open_path)。我相信这段代码是正确的,因为它显然已经使用了很长时间了。我errno在GDB中相关阅读所在的位置添加了一条注释。

hid_device *dev = NULL;

hid_init();

dev = new_hid_device();

if (kernel_version == 0) {
    struct utsname name;
    int major, minor, release;
    int ret;
    uname(&name);
    ret = sscanf(name.release, "%d.%d.%d", &major, &minor, &release);
    if (ret == 3) {
        kernel_version = major << 16 | minor << 8 | release;
        //printf("Kernel Version: %d\n", kernel_version);
    }
    else {
        printf("Couldn't sscanf() version string %s\n", name.release);
    }
}

/* OPEN HERE */
dev->device_handle = open(path, O_RDWR);

// errno at this location is 13: insufficient permissions

/* If we have a good handle, return it. */
if (dev->device_handle > 0) {

    /* Get the report descriptor */
    int res, desc_size = 0;
    struct hidraw_report_descriptor rpt_desc;

    memset(&rpt_desc, 0x0, sizeof(rpt_desc));

    /* Get Report Descriptor Size */
    res = ioctl(dev->device_handle, HIDIOCGRDESCSIZE, &desc_size);
    if (res < 0)
        perror("HIDIOCGRDESCSIZE");


    /* Get Report Descriptor */
    rpt_desc.size = desc_size;
    res = ioctl(dev->device_handle, HIDIOCGRDESC, &rpt_desc);
    if (res < 0) {
        perror("HIDIOCGRDESC");
    } else {
        /* Determine if this device uses numbered reports. */
        dev->uses_numbered_reports =
            uses_numbered_reports(rpt_desc.value,
                                  rpt_desc.size);
    }

    return dev;
}
else {
    /* Unable to open any devices. */
    free(dev);
    return NULL;
}

@Braiam代码段已添加。
用户

Answers:


11

我放弃了尝试找出除udev规则以外的其他方式来做事,而只是学习了一些有关udev的知识并编写了一个固定的规则。将以下行放置在下方的.rules文件(我称为mine 99-hidraw-permissions.rules)中/etc/udev/rules.d

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"

基本上,这会将来自内核中的hidraw子系统的所有设备分配给该组plugdev,并将权限设置为r / wr / wr(分别针对root [默认所有者],plugdev和其他所有人)。将我自己添加到plugdev组中,一切都变得很花哨。

不像我预期的那样融化。实际上udev的规则似乎很简单......我的意思是,他们看起来像他们可以,如果你正在处理个别产品ID和诸如此类的东西得到可笑,但他们似乎很该死驯服为他们做什么。


这对我有用,因为我想使用Roccat配置工具,并且需要root权限。这样,我可以与普通用户一起使用该工具。
LnxSlck

5

要了解某件事...开始了解它。

好吧,首先让我们看看什么hidraw意思,以及它的组成:

  • hid(人机接口设备):人机接口设备或HID是一种计算机设备,可以直接与人类互动,并通常从人类那里获取输入,并可以将输出传递给人类。维基百科
  • raw:这是粗略的意思,但是在Linux环境中,它还意味着直接。

由此我们可以推断出这hidraw是访问hid粗略/直接方法。现在让我们看看我们的系统对此有何看法:

$ ls -l /dev/hidraw*
crw------- 1 root root 251, 0 Aug  3  2013 /dev/hidraw0
crw------- 1 root root 251, 1 Aug  3  2013 /dev/hidraw1
crw------- 1 root root 251, 2 Aug  3  2013 /dev/hidraw2
$ file /dev/hidraw*
/dev/hidraw0: character special 
/dev/hidraw1: character special 
/dev/hidraw2: character special

那是什么character special意思 字符特殊文件或字符设备涉及系统每次通过一个字符传输数据的设备getchar维基百科再次成为我们的朋友。命令c开头的内容相同ls -l

要获得对/ dev / hidraw *的读取权限,我该怎么做?

那么,这如何解决您的问题?要访问,/dev/hidraw*您应该使用C实现来读取/写入此文件。但是,如果您想要的是有关HID连接的信息,则应查看/sys/class/hidraw/hidraw*/。例:

$ cat /sys/class/hidraw/hidraw2/device/uevent
DRIVER=hid-generic
HID_ID=0003:000015D9:00000A4C
HID_NAME= USB OPTICAL MOUSE
HID_PHYS=usb-0000:00:1d.1-2/input0
HID_UNIQ=
MODALIAS=hid:b0003g0001v000015D9p00000A4C

考虑到在大多数情况下,只有内核可以直接访问设备,并且您应该仅使用用户空间中提供的调用与这些设备进行通信。

我在网上看到了有关udev规则的内容,并且在网上看到了,但是udev的世界对我来说就像是一片异国他乡

除非您正在开发新的驱动程序/设备,否则您不应过分玩耍udev,否则可能会永久损坏大脑。


我逐字检查了调用POSIX open()方法的代码,并获得了errno不足的权限。cat以普通用户身份在文件上运行会导致权限不足错误,而以普通用户运行会su导致成功(尽管无意义)cat操作。虽然我很欣赏这些额外的信息,但实际上并不能解决我缺少权限的问题...而且,我正在使用实验性的HID,因此我完全可以让我的大脑充满如此如此的好udev的东西是必要的。
用户
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.