无法使用 udev 规则授予 libusb 访问权限

无法使用 udev 规则授予 libusb 访问权限

我正在尝试让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

手册usb_set_configuration(3)说:

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 适配器。创建一个包含以下内容的文件:onewirelibusb/etc/modprobe.d/blacklist-1wire.conf

blacklist ds2490

然后modprobe -r ds2490以 root 身份运行,或者重新启动。

相关内容