以非root用户身份使用libusb-1.0访问USB设备 [英] Accessing a USB device with libusb-1.0 as a non-root user

查看:383
本文介绍了以非root用户身份使用libusb-1.0访问USB设备的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试以RHEL5上的非root用户身份与USB设备连接.该设备是GPIO接口(其文档可在 http://www.xdimax.com/sub20/sub20.html中找到)使用libusb-1.0.使用其API打开设备的过程是:

I am trying to interface with a USB device as a non-root user on RHEL5. The device is a GPIO interface (its documentation can be found at http://www.xdimax.com/sub20/sub20.html) which uses libusb-1.0. The procedure for opening the device, using its API, is:

sub_device d;
d = sub_find_devices(0);
sub_handle h = sub_open(d);

执行此操作时,sub_find_devices()调用有效,但是在sub_open()调用上,我收到libusb错误-3,这表明我没有打开该设备进行写入的权限.

When I do this, the sub_find_devices() call works, but on the sub_open() call, I get the libusb error -3, which indicates that I do not have permissions to open the device for writing.

我对此问题进行了一些研究,发现我应该创建一个udev规则.在设备的sysfs节点上使用udevinfo,我得到了:

I did some research on this problem, and found that I should create a udev rule. Using udevinfo on the device's sysfs node, I got:

looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
KERNEL=="2-1.2"
SUBSYSTEM=="usb"
SYSFS{configuration}==""
SYSFS{serial}=="15F2"
SYSFS{product}=="SUB-20"
SYSFS{manufacturer}=="XDIMAX"
SYSFS{maxchild}=="0"
SYSFS{version}==" 1.10"
SYSFS{devnum}=="6"
SYSFS{speed}=="12"
SYSFS{bMaxPacketSize0}=="64"
SYSFS{bNumConfigurations}=="1"
SYSFS{bDeviceProtocol}=="00"
SYSFS{bDeviceSubClass}=="00"
SYSFS{bDeviceClass}=="ff"
SYSFS{bcdDevice}=="0001"
SYSFS{idProduct}=="ffc3"
SYSFS{idVendor}=="04d8"
SYSFS{bMaxPower}=="100mA"
SYSFS{bmAttributes}=="80"
SYSFS{bConfigurationValue}=="1"
SYSFS{bNumInterfaces}==" 1"

然后我在文件/etc/udev/rules.d/991-local.rules中创建了以下udev规则:

I then created the following udev rule, in the file /etc/udev/rules.d/991-local.rules:

SYSFS{idVendor}=="04d8", SYSFS{idProduct}=="ffc3", NAME="sub20", GROUP="582", MODE="0660"

582是我的普通用户所属的组的GID.我还尝试了使用组名的规则,但该规则不起作用.创建此规则后,将使用正确的权限创建设备文件/dev/sub20,但仅在插入设备时存在该文件,这使我有足够的把握相信udev规则在正确的设备上匹配.但是,我的代码仍然出现错误-3.

582 is the GID of a group that my normal user belongs to. I also tried the rule with the group name and it did not work. After creating this rule, the device file /dev/sub20 is created with the correct permissions, but only exists when the device is plugged in, which gives me reasonable confidence that the udev rule is matching on the correct device. However, my code still gets error -3.

对代码进行跟踪显示了此调用:

Doing an strace on the code revealed this call:

open("/dev/bus/usb/002/006", O_RDWR)    = -1 EACCES (Permission denied)

/dev/bus/usb...节点上的权限仍然是root:root,因此这也许表明我的udev规则存在问题,尽管我不知道这可能是什么.

The permissions on the /dev/bus/usb... node are still root:root, so maybe this is an indication that there is a problem with my udev rule, although I don't know what that could be.

如果我尝试调用open("/dev/sub20", O_RDWR),则会得到返回值ENXIO (No such device or address),这是udev规则错误的另一个可能指示,尽管/dev/sub20文件显然与正确的设备相关联,因为它仅在插入设备后存在.

If I try doing a call to open("/dev/sub20", O_RDWR), I get the return value ENXIO (No such device or address), another possible indicator of an error in the udev rule, although the /dev/sub20 file clearly is associated with the correct device somehow, since it only exists when the device is plugged in.

我还能做些什么来使它正常工作?

What else can I do to try and get this to work?

推荐答案

我用来能够使用libusb访问设备的udev规则如下所示:SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ffc3", SYMLINK+="sub20", GROUP="usb", MODE="660".应该只是在设备上添加符号链接,但之后权限对我也起作用(我是usb组的成员).

The udev rules I use to be able to access devices with libusb look like this: SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ffc3", SYMLINK+="sub20", GROUP="usb", MODE="660". It's supposed to just add a symlink to the device, but the permissions are also working for me afterwards (I am a member of the group usb).

这篇关于以非root用户身份使用libusb-1.0访问USB设备的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆