2012-11-16 30 views
6

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?

Trả lời

5

Quy tắc udev tôi sử dụng để có thể truy cập các thiết bị có libusb trông giống như sau: SUBSYSTEMS=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="ffc3", SYMLINK+="sub20", GROUP="usb", MODE="660". Đó là nghĩa vụ phải chỉ cần thêm một liên kết tượng trưng cho thiết bị, nhưng các điều khoản cũng làm việc cho tôi sau đó (Tôi là một thành viên của nhóm usb).

0

Đối với thiết bị usb FTDI tôi sử dụng kịch bản:

ftdi_config.sh

#!/bin/sh 

echo "This script is for modern debian systems, and does everything that should" 
echo "be necessary to use ftdi usb devices as a regular user with libftdi," 
echo "instead of the built-in dumb kernel driver." 
echo 
if [ $(id -u) != 0 ]; then 
    echo "This script must be run as root." 
    exit 1 
else 
    read -p "Press enter to continue, or ctrl-c to bail..." x 
fi 
echo 
echo "** Adding usb group" 
groupadd usb 
echo 
echo "** Setting udev permissions on usb devices" 
echo 'SUBSYSTEMS=="usb", ACTION=="add", MODE="0664", GROUP="usb"' >> /etc/udev/rules.d/99-usbftdi.rules 
echo 
echo "** Reloading udev rules" 
/etc/init.d/udev reload 
echo 
echo "** Blacklisting ftdi_sio driver" 
echo 'blacklist ftdi_sio' > /etc/modprobe.d/ftdi.conf 
echo 
echo "** Removing old ftdi_sio driver (it's ok if it fails)" 
rmmod ftdi_sio 
echo 
echo "!! Run the following command as root, to add your user to the usb group:" 
echo "useradd -G usb yourusernamehere" 
echo 
echo "or" 
echo 
echo "Adding to a existing user:" 
echo "usermod -a -G usb yourusernamehere" 
echo 
echo "as then you must reboot the system:" 
echo "reboot" 

sau đó chạy ứng dụng của bạn như một người dùng không phải root. Nó hoạt động !!!

Các vấn đề liên quan