我正在尝试让OWPDK
(1-wire 库)访问 USB 至 1-wire 适配器(DS9490R,基于 DS2490 USB 至 1-wire 桥接芯片)。
该库使用 libusb 枚举设备(使用usb_get_busses
,然后探索bus->devices
每个总线)。然后它将获取第一个与供应商和产品 ID 匹配的设备(我只插入了一个),并调用usb_open
它,然后usb_set_configuration
调用返回的句柄。
在我的 Debian 10 系统上,当我以 root 身份运行该程序时,它运行良好。
但是,我想以只能访问此 USB 设备的onewire
组中的用户身份运行该程序。onewire
所以,我创建了这个文件:/etc/udev/rules.d/90-onewire.rules
其中包含这一行:
SUBSYSTEMS=="usb", ATTRS{vendor}=="04fa", GROUP="onewire", MODE="0660"
然后我重新加载规则sudo udevadm control --reload
虽然usb_open
适用于该用户,但usb_set_configuration
不适用于(返回非零结果)。
我已经尝试了规则中的各种组合,例如SUBSYSTEM
(不带 S)、删除 ATTRS 条件等,但没有成功。我缺少什么?
答案1
int libusb_set_configuration(libusb_device_handle *devh, int config)
将 devh 包含的设备的活动配置设置为 config。如果成功,此函数返回 0;如果请求的配置不存在,则返回 LIBUSB_ERROR_NOT_FOUND;如果接口当前已声明,则返回 LIBUSB_ERROR_BUSY;如果设备已断开连接,则返回 LIBUSB_ERROR_NO_DEVICE;如果失败,则返回 LIBUSB_ERROR 代码。
那么,您得到哪个非零结果?
如果适配器有内核驱动程序,您将获得LIBUSB_ERROR_BUSY
.
在这种情况下,您(或图书馆)需要先将其分离。如果设置的话,库可以自动执行此操作libusb_set_auto_detach_kernel_driver(handle, 1)
(可能是默认值),但可能需要 root 权限才能成功执行此操作。
如果您希望用户能够访问1-wire 适配器,您可能需要将ds2490
内核模块列入黑名单,以防止其占用 1-wire 适配器。创建一个包含以下内容的文件:onewire
libusb
/etc/modprobe.d/blacklist-1wire.conf
blacklist ds2490
然后modprobe -r ds2490
以 root 身份运行,或者重新启动。