Tôi đang cố gắng kết nối với thiết bị USB dưới dạng người dùng không phải root trên RHEL5. Thiết bị này là giao diện GPIO (tài liệu của nó có thể được tìm thấy tại http://www.xdimax.com/sub20/sub20.html) sử dụng libusb-1.0. Thủ tục mở thiết bị, sử dụng API của nó, là:Truy cập thiết bị USB có libusb-1.0 với tư cách người dùng không phải là người chủ gốc
sub_device d;
d = sub_find_devices(0);
sub_handle h = sub_open(d);
Khi tôi làm điều này, các công trình sub_find_devices()
cuộc gọi, nhưng trên sub_open()
cuộc gọi, tôi nhận được lỗi libusb -3, mà chỉ ra rằng tôi không có quyền mở thiết bị để viết.
Tôi đã thực hiện một số nghiên cứu về vấn đề này và thấy rằng tôi nên tạo quy tắc udev. Sử dụng udevinfo vào nút sysfs của thiết bị, tôi nhận:
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"
sau đó tôi đã tạo ra quy tắc udev sau, trong file /etc/udev/rules.d/991-local.rules
:
SYSFS{idVendor}=="04d8", SYSFS{idProduct}=="ffc3", NAME="sub20", GROUP="582", MODE="0660"
582 là GID của một nhóm mà người dùng bình thường của tôi thuộc về đến. Tôi cũng đã thử quy tắc với tên nhóm và nó không hoạt động. Sau khi tạo quy tắc này, tệp thiết bị /dev/sub20
được tạo với quyền chính xác nhưng chỉ tồn tại khi thiết bị được cắm vào, điều này mang lại cho tôi sự tự tin hợp lý rằng quy tắc udev phù hợp trên thiết bị chính xác. Tuy nhiên, mã của tôi vẫn bị lỗi -3.
Làm một strace trên mã tiết lộ cuộc gọi này:
open("/dev/bus/usb/002/006", O_RDWR) = -1 EACCES (Permission denied)
Các điều khoản trên các nút /dev/bus/usb...
vẫn là root: root, như vậy có lẽ đây là một dấu hiệu cho thấy có một vấn đề với quy tắc udev của tôi, mặc dù Tôi không biết điều đó có thể là gì.
Nếu tôi thử gọi open("/dev/sub20", O_RDWR)
, tôi nhận được giá trị trả về ENXIO (No such device or address)
, một chỉ báo khác có thể có lỗi trong quy tắc udev, mặc dù tệp /dev/sub20
rõ ràng được liên kết với thiết bị chính xác bằng cách nào đó, vì nó chỉ tồn tại khi thiết bị đã được cắm.
Tôi có thể làm gì khác để thử và làm việc này?