I'm writing a C/C++ application in NetBeans based on libusb-1.0 on Ubuntu 12.04. I can get basic information from the USB device (for example, the interface description) but I am not able to open the device. The function libusb_open gives me the error:
libusb:error [op_open] libusb couldn't open USB device /dev/bus/usb/002/003: Permission denied.
libusb:error [op_open] libusb requires write access to USB device nodes.
I understand that I need to change the permissions but I don't know how (I am a very basic Linux-user). Thank you!
After adding rule to
/etc/udev/rules.d/
something like:do not forget to reload rules with:
I think the best way to do this is to create a udev rules file for your devices. Simply create a text file names something like
myVendor.rules
and put the following text in it (where1234
is your vendor ID:Put this udev file in your
/etc/udev/rules.d/
directory. This udev file will grant read and write access to ALL users, include non-privileged users, for ALL USB devices that have a matching Vendor ID. This means your device is accessible to non-root users even without modifying your executable or running it with sudo.This udev example is specific to the idVendor, but you can restrict it to a VID and PID to be more strict. Check this article for writing udev rules for more information.
Well you can run your application in root user mode and get rid with the permission issue. However you should be aware about the consequences of running the program in root user and should not be do until you fully understand the user/group permission on UNIX based system. However if it is your test machine, i think you can do the following(for program name ./a.out):
Now you should be able to run the program successfully.
However if you want to provide/change the permission of read/write/execute for a particular user you should try to understand about chmod command. You would have to change the permission to directory(/dev/bus/usb/002/) and any particular file residing under this directory. Hope this information would be useful.
I think this might be a temporary solution for the problem while Preston's solution would work consistently.
1. Check which usb port is assigned for your device
You can figure out which usb port is assigned to your device by invoking
ls
command two times(first with device disconnected and second with device connected).Let's say /dev/bus/usb/003/008 is your device.
2. Giving write permission for everyone(other)
According to the output of
ls -l
command, root user(group) has read/write permission on003/008 port
while other user has only read permission.You can allow every user to write on specific device using
chmod
command. While usingchmod
command, you will needsudo
permission.or
Now if you check the permission of usb, you have to see this output
3. Everytime plugging it out or shutting down the system repeat step 1,2
If you plug the device out from usb port or shut down the system, what you did for your usb port will reset.
You have to repeat step 1,2 again.
This is why I'm saying my solution is temporary(volatile).
Further readings
I find these two blog articles would be helpful to your understanding.