我需要做什么才能获得 /dev/hidraw* 的读取权限?
我正在查看有关 udev 规则的内容并看到这在网上,但 udev 的世界对我来说就像是异国他乡,如果有某种更简单的解决方案,我只需将自己添加到一个组中,那就太好了......
(Ubuntu 13.10 预览版)
请随意重新标记这个问题 - 我不太热衷于“hidraw”到底是什么。
编辑:
好吧,所以,只需提供更多信息来澄清问题:我逐字逐句地执行了调用 POSIXopen()
方法的代码,并得到了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;
}
答案1
我放弃了四处寻找除 udev 规则之外的其他方法,而是只是了解了一些有关 udev 的知识并编写了一个简单的规则。以下行放置在位于 下的.rules
文件(我命名为我的)中。99-hidraw-permissions.rules
/etc/udev/rules.d
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0660", GROUP="plugdev"
基本上,这会将内核中 hidraw 子系统出来的所有设备分配给该组,plugdev
并将权限设置为 r/wr/wr(分别针对 root [默认所有者]、plugdev 和其他所有人)。我自己加入了 Plugdev 小组,一切都很顺利。
没有我想象的那么大脑融化。 Udev 规则实际上看起来非常简单......我的意思是,它们看起来像能如果你处理的是单独的产品 ID 之类的东西,这会变得很荒谬,但它们的作用似乎非常温和。
答案2
要理解某事...开始了解它。
好的,首先让我们看看是什么hidraw
意思以及由什么组成:
- hid(人机接口设备):人机接口设备或 HID 是一种计算机设备,它直接与人类交互,并且通常从人类获取输入,并且可以将输出传递给人类。来源维基百科
- raw:这意味着原油,但在 Linux 环境中它也意味着直接。
由此我们可以推断出这hidraw
是一个原油/直接方法来访问隐藏。现在让我们看看我们的系统对此有何看法:
$ 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
,否则您的大脑可能会受到永久性损坏。