/dev/hidraw:读取权限

use*_*ser 14 udev devices

我需要做什么才能获得 /dev/hidraw* 的读取权限?

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

(Ubuntu 13.10 预览版)

随意重新标记这个问题 - 我不太热衷于 'hidraw' 到底发生了什么。

编辑:

好吧,所以,只需提供更多信息来澄清这个问题:我确实逐步执行了调用 POSIXopen()方法的代码,并获得了errno权限不足的权限。cat以普通用户身份在文件上运行会导致权限不足错误,而在下运行会su导致cat操作成功(尽管毫无意义)。

编辑 编辑:

应要求,我将通过 POSIX 调用提供相关代码。它来自 Signal11(函数hid_open_path)的 HIDAPI 库。我相信这段代码是正确的,因为它显然已经使用了很长时间了。我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;
}
Run Code Online (Sandbox Code Playgroud)

use*_*ser 21

我放弃了四处寻找除 udev 规则之外的其他方法的尝试,而是只是了解了一些关于 udev 的知识并编写了一个翻转规则。下面的代码行置于.rules文件(我将其命名99-hidraw-permissions.rules)位于下/etc/udev/rules.d

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="plugdev"
Run Code Online (Sandbox Code Playgroud)

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

不像我预期的那样大脑融化。Udev 规则实际上看起来很简单……我的意思是,如果您处理单个产品 ID 之类的东西,它们看起来可能会变得荒谬,但它们的工作似乎非常温和。

  • 我的 Raspberry Pi 3b+ 中插入了一个账本设备 - Node HID 试图访问它但失败了。使用您列出的行添加此文件就像一个魅力,只需在添加文件后拔出并插入设备即可。 (2认同)

Bra*_*iam 7

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

好的,首先,让我们看看是什么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
Run Code Online (Sandbox Code Playgroud)

那么,什么character special意思?字符特殊文件或字符设备与系统通过例如,一次一个字符地传输数据的设备相关getcharWikipedia 再次成为我们的朋友,同样遵循命令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
Run Code Online (Sandbox Code Playgroud)

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

我在网上看到了关于 udev 规则的东西,也看到了这个,但是 udev 的世界对我来说就像异国他乡

除非您正在开发新的驱动程序/设备,否则您不应该玩得太多udev,否则您的大脑可能会永久受损。