Linux Troubleshooting

This section is intended to help you debug common issues related to using our cameras on Linux hosts.

Setup UDEV rules for USB

Hint

You can test if you are having UDEV permission issues, if your application can see cameras only when run as the root user.

Modern Linux distro’s include UDEV, a system to manage device events and permissions. By default (at least on headless servers) USB devices are given only read permissions. This is insufficient for Phase One cameras, since we need write permission to send commands to the camera.

Therefore, to make USB camera work on Linux, you must add custom UDEV rules to your host machine, that allows writing to Phase One devices.

Adding the UDEV rule

Custom UDEV rules are located in /etc/udev/rules.d. These rules takes precedence over the default system rules. Which is what we want.

On your Linux machine create a file called 50-usb-phaseone-iqp-cameras.rules in the /etc/udev/rules.d directory. Now, add this content to the file:

# Standard IQP camera device
SUBSYSTEM=="usb", ATTR{idVendor}=="22db", ATTR{idProduct}=="0003", MODE="0666"

# IQP + Mass storage
SUBSYSTEM=="usb", ATTR{idVendor}=="22db", ATTR{idProduct}=="000B", MODE="0666"

# IQP + PTP
SUBSYSTEM=="usb", ATTR{idVendor}=="22db", ATTR{idProduct}=="000C", MODE="0666"

# IQP + PTP + Mass storage
SUBSYSTEM=="usb", ATTR{idVendor}=="22db", ATTR{idProduct}=="000D", MODE="0666"

This adds rules for all (current) Phase One USB devices. Depending on the camera settings it might use different USB Product Id’s.

To put these new rules into effect, to should reload UDEV:

$ sudo udevadm control -R
$ sudo udevadm trigger

Now, all application have write access to Phase One USB devices.

Debugging dynamic linking of libusb

If your Phase One camera still does not show up in the CameraSDK, you should check that libusb is loaded correctly. We can do that by using the LD_DEBUG environment variable. This puts the Linux dynamic linker / loader into debug mode.

Run your application as you normally would, but prepend this to the command line:

$ LD_DEBUG=libs ./CamTool

In the example we use the sample application from CamTool Sample.

The dynamic linker will output the libraries it tries to load:

3397:   find library=libusb-1.0.so.0 [0]; searching
3397:    search cache=/etc/ld.so.cache
3397:    search path=/lib/x86_64-linux-gnu/tls/haswell/x86_64:/lib/x86_64-linux-gnu/tls/haswell:/lib/x86_64-linux-gnu/tls/x86_64:/lib/x86_64-linux-gnu/tls:/lib/x86_64-linux-gnu/haswell/x86_64:/lib/x86_64-linux-gnu/haswell:/lib/x86_64-linux-gnu/x86_64:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu/tls/haswell/x86_64:/usr/lib/x86_64-linux-gnu/tls/haswell:/usr/lib/x86_64-linux-gnu/tls/x86_64:/usr/lib/x86_64-linux-gnu/tls:/usr/lib/x86_64-linux-gnu/haswell/x86_64:/usr/lib/x86_64-linux-gnu/haswell:/usr/lib/x86_64-linux-gnu/x86_64:/usr/lib/x86_64-linux-gnu:/lib/tls/haswell/x86_64:/lib/tls/haswell:/lib/tls/x86_64:/lib/tls:/lib/haswell/x86_64:/lib/haswell:/lib/x86_64:/lib:/usr/lib/tls/haswell/x86_64:/usr/lib/tls/haswell:/usr/lib/tls/x86_64:/usr/lib/tls:/usr/lib/haswell/x86_64:/usr/lib/haswell:/usr/lib/x86_64:/usr/lib        (system search path)
3397:     trying file=/lib/x86_64-linux-gnu/tls/haswell/x86_64/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/tls/haswell/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/tls/x86_64/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/tls/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/haswell/x86_64/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/haswell/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/x86_64/libusb-1.0.so.0
3397:     trying file=/lib/x86_64-linux-gnu/libusb-1.0.so.0

...

Here the dynamic linker cannot find the needed libusb shared object file: libusb-1.0.so.0, and it tries multiple search paths to locate it.

Overwrite libusb Search Path

In case your Linux distribution or root filesystem uses another filename or location for libusb, you can overwrite the search path that CameraSDK uses.

If CameraSDK sees the environment variable P1_LIBUSB_FILE, it will load libusb from that location instead of its default behaviour. The (string) value of P1_LIBUSB_FILE is directed into the dlopen call. Meaning you can either supply a filename, or the complete path.