Logic MSO USB Permissions [Linux]

Hello all,

I am trying to get my Logic MSO up and running for some automation scripts following this guide:

docs.saleae.com

Installation — Saleae MSO API Documentation

It seems I have set up my udev rules and user groups correctly, but I cannot seem to get USB permissions to work.

Running the “Quick Example” scope program from above docs with uv run throws the following error:


connornelson@hostmachine:~/Development/myproject-logic$ uv run scope.py 
Traceback (most recent call last):
  File "/home/connornelson/Development/myproject-logic/scope.py", line 15, in <module>
    capture = mso.capture(capture_config, save_dir=save_dir)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/connornelson/Development/myproject-logic/.venv/lib/python3.12/site-packages/saleae/mso_api/mso_device.py", line 56, in capture
    record_options_path = capture_config.to_dir(save_dir, self.part_number)
                                                          ^^^^^^^^^^^^^^^^
  File "/home/connornelson/.local/share/uv/python/cpython-3.12.0-linux-x86_64-gnu/lib/python3.12/functools.py", line 995, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/home/connornelson/Development/myproject-logic/.venv/lib/python3.12/site-packages/saleae/mso_api/mso_device.py", line 45, in part_number
    json_response = self.wrapper.run_json("cli", "fx3", "read-main-board-meta")
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/connornelson/Development/myproject-logic/.venv/lib/python3.12/site-packages/saleae/mso_api/wrapper.py", line 153, in run_json
    stdout = self.run(*all_args, timeout_secs=timeout_secs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/connornelson/Development/myproject-logic/.venv/lib/python3.12/site-packages/saleae/mso_api/wrapper.py", line 189, in run
    raise USBPermissionsError()
saleae.mso_api.exceptions.USBPermissionsError: Could not access MSO due to USB permissions. Consider running `sudo uv run python -m saleae.mso_api.utils.install_udev` to install and reload the udev rules. Note: you will need to unplug and replug the MSO after installing the rules to enumerate with the new permissions.
connornelson@hostmachine:~/Development/myproject-logic$ 

I have installed the udev rules via the uv installer and have verified they are loaded
connornelson@hostmachine:~/Development/myproject-logic$ ll /etc/udev/rules.d/99* -rw-r–r-- 1 root root 975 Jan 5 13:28 /etc/udev/rules.d/99-SaleaeLogic.rules connornelson@hostmachine:~/Development/myproject-logic$ lsusb … Bus 006 Device 010: ID 21a9:1007 Saleae, Inc. Logic MSO … connornelson@hostmachine:~/Development/myproject-logic$ ls -la /dev/bus/usb/006/010 crw-rw-rw- 1 root root 189, 649 Jan 5 13:56 /dev/bus/usb/006/010

Maybe there are some pathing issues?
I am also new to UV so I am not certain what all is abstracted from the user in that regard.

User groups
connornelson@hostmachine:~/Development/myproject-logic$ groups connornelson adm dialout cdrom sudo dip plugdev users lpadmin docker

Versions:
saleae-mso-api 0.5.4
Logic-2.4.40-linux-x64.AppImage

Other Notes:

  • The MSO is connected directly to my machine (not a USB HUB)
  • I installed the Logic AppImage manually and am running it Executable as Program, and it works flawlessly. I can get captures from the device and see device ID so I know that Logic can talk to my device.
  • Python 3.12

Hopefully there is something obvious that I am missing! Thanks in advance for any suggestions for further troubleshooting.
-Connor

Hi Connor,

The fact that the Logic 2 app is working properly proves that the udev rules rule is installed correctly and working.

The other reason you might get a permissions error is if there is another process currently using the Logic MSO. (e.g. the Logic 2 software or another python instance also trying to access the device)

Any chance you were testing this while Logic 2 was open?

Came back to it the next day and seems like everything works on a fresh restart! Perhaps there was a hidden process and I just needed a full restart.
Thanks for your quick response.

-Connor