USB device access permissions

If your device does not work with your GNU/Linux distribution out of the box, perhaps its access permissions are configured incorrectly.

Most distributions assign very restrictive permissions to connected USB devices by default, which makes it impossible for regular users to access them. This is what typically can be seen when an application fails to access a virtual serial port (USB CDC ACM) due to insufficient permissions:

Diagnosing the USB permissions problem
$ cat /dev/ttyACM0
cat: /dev/ttyACM0: Permission denied

We can fix the problem in the following way:

  • Configure udev so that it assigns the correct permissions to attached devices automatically.
  • Add the current user to the group dialout, so that the system would enable it to access all serial port devices (including the virtual serial ports) by default.

Run the following commands to apply the solution. Do not run the snippet as root unless you replace $USER with your actual user name, otherwise it will be expanded as root and the solution may fail to work as expected.

Run this
echo 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="60c7", MODE="0666"' | sudo tee /etc/udev/rules.d/10-zubax.rules
echo 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="1d50", ATTRS{idProduct}=="6018", MODE="0666"' | sudo tee -a /etc/udev/rules.d/10-zubax.rules
sudo udevadm control --reload
sudo usermod -a -G dialout $USER

Now you should log out and then log back in, or (better yet) just reboot.

Afterwards you can connect your device and it should work. If it still doesn't, please reach out to the Zubax Forum for help.

On most distributions, instead of directly specifying the TTY device such as /dev/ttyACM0, it is possible to use the persistent symlinks under /dev/serial/by-id/ that are helpfully provided by the udev subsystem.

These symlinks allow the user to refer directly to the specific device using its vendor name, product name, and/or unique ID, which is more convenient because, unlike the TTY number, these parameters are persistent. For example, /dev/ttyACM0 in the example above could be replaced with (this is just an example) /dev/serial/by-id/usb-Zubax_Robotics_Zubax_GNSS_34FFD305435730343944224300000000-if00, or just /dev/serial/by-id/usb-Zubax_Robotics_Zubax_GNSS* to refer to any connected Zubax GNSS regardless of its unique ID. Usage of glob expressions allows you to make more complex queries to the udev subsystem in this way.

You can see the full list of connected devices by listing the directory /dev/serial/by-id/, as shown below.

Listing udev symlinks
$ ls -l /dev/serial/by-id/
total 0
lrwxrwxrwx 1 root root 13 Dec 14 15:50 usb-Zubax_Robotics_Zubax_GNSS_34FFD305435730343944224300000000-if00 -> ../../ttyACM0