Uncategorized

Why Linux Ubuntu on LRO-24 can not run ezColS Soapy driver command with USRP B210 Software-Defined Radio 16/11/2025

It sounds like UHD cannot find or load the FPGA/firmware images for the B210, even though you believe they’re installed. This problem is very common when UHD was installed one way (apt, pip, source) but the FPGA images were installed another way, or not installed in the location UHD expects.

Here’s a clean checklist to get a B210 recognized on Linux.


✅ 1. Confirm UHD is installed correctly

Run:

uhd_config_info --version
uhd_find_devices

If uhd_find_devices already fails, UHD itself may not be installed properly.


✅ 2. Install the FPGA images the UHD way

Even if you downloaded images manually, UHD may not see them unless installed via:

sudo uhd_images_downloader

After it runs, check that images exist at:

/usr/share/uhd/images/

These include things like:

  • usrp_b200_fw.hex
  • usrp_b200_fpga.bin

If these files are missing, UHD will say “no image”.


✅ 3. Ensure you’re not mixing UHD versions

The #1 cause of the “no image found” error is that:

  • UHD was installed via apt
    AND
  • You built UHD from source
    OR
  • You installed a different UHD with pip

Then UHD loads one version but looks for images of another.

Check for duplicates:

which uhd_find_devices
dpkg -l | grep uhd
pip list | grep uhd

If you find two installations, remove one (preferably pip/source) and reinstall cleanly.


✅ 4. Check permissions (the silent cause!)

Make sure you’re in the correct group:

sudo usermod -a -G usrp $USER

Then log out and back in.

Also ensure the USB rules are present:

sudo cp /usr/lib/uhd/utils/uhd-usrp.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger

✅ 5. Test device communication

Run:

sudo uhd_usrp_probe

If it still says “no image found”, it usually means UHD can’t locate the image directory.

Verify UHD knows where images are:

uhd_config_info --print-all | grep image

You should see something like:

Image path: /usr/share/uhd/images

If it’s empty or wrong, set it manually:

export UHD_IMAGES_DIR=/usr/share/uhd/images

(You can put that in ~/.bashrc.)


If the images aren’t appearing in /usr/share/uhd/images/ even after running uhd_images_downloader, then one of three things is happening:

  1. UHD was installed from a different source than the images downloader script expects
  2. The downloader wasn’t actually installed with UHD
  3. UHD is looking for images in a different location

Let’s fix this methodically.


✅ 1. Check where uhd_images_downloader is actually located

Run:

which uhd_images_downloader

Typical expected result:

/usr/lib/uhd/utils/uhd_images_downloader

If you get no output or it points to somewhere weird (like ~/.local), UHD is mismatched.


✅ 2. Force-install the UHD images package

On Ubuntu/Debian:

sudo apt install uhd-host
sudo apt install uhd-images

Many distros split the firmware into a second package.

Then check again:

ls /usr/share/uhd/images/

Does anything appear?


✅ 3. If you installed UHD from source

Then you must run this version:

cd <your-uhd-source-tree>/host/utils
sudo ./uhd_images_downloader.py

Because the system downloader only installs images matching the system UHD, not your custom build.

After running it, confirm:

/usr/local/share/uhd/images/

If they’re there instead of /usr/share/uhd/images/, then UHD is installed under /usr/local.

Then set:

export UHD_IMAGES_DIR=/usr/local/share/uhd/images

Add permanently:

echo 'export UHD_IMAGES_DIR=/usr/local/share/uhd/images' >> ~/.bashrc

✅ 4. Ask UHD where it THINKS images should be

This is crucial:

uhd_config_info --print-all | grep -i image

Typical output:

UHD_IMAGES_DIR: /usr/share/uhd/images

If yours says:

  • /usr/local/share/uhd/images
  • empty
  • some other directory

then UHD is looking in the wrong place.

Set it manually:

export UHD_IMAGES_DIR=/usr/share/uhd/images

If you can paste these three outputs, I can pinpoint the exact cause:

which uhd_images_downloader
uhd_config_info --print-all | grep image
dpkg -l | grep uhd

Your pattern strongly suggests UHD was installed two different ways, and the images are being downloaded to one location while UHD looks at another. I’ll guide you directly once I see the outputs.

/usr/bin/uhd_images_downloader means your UHD installation is different from the one that normally installs images under /usr/share/uhd/images/.
This almost always happens when UHD was installed via PPA, pip, or source, not the distro’s default packages.

Because of that, the downloader is almost certainly putting the images somewhere else.

Let’s locate where it actually put them.


✅ 1. Find where UHD images actually are

Run:

sudo find / -type d -name uhd -prune -o -type f -name "usrp_b200_*.bin" 2>/dev/null

And also:

sudo find / -type d -name "images" -path "*uhd*" 2>/dev/null

This will show the real location.

Typical hits might be:

  • /usr/local/share/uhd/images/
  • /usr/share/uhd/usrp_b200_fpga.bin (wrong structure)
  • /usr/lib/uhd/images/
  • ~/.local/share/uhd/images/

✅ 2. Ask UHD where it expects images

This is the key:

uhd_config_info --print-all | grep -i image

You will see something like:

Image search path:
  /usr/share/uhd/images

or possibly:

  /usr/local/share/uhd/images

If the expected path and the actual images path do not match → UHD reports “no image”.


✅ 3. Fix by pointing UHD to the correct directory

Once you discover the real image folder, set:

export UHD_IMAGES_DIR=<actual-path>

Example:

export UHD_IMAGES_DIR=/usr/local/share/uhd/images

Make it permanent:

echo "export UHD_IMAGES_DIR=<actual-path>" >> ~/.bashrc

👍 The most likely scenario

Given your downloader is in /usr/bin, your UHD is probably installed from a newer PPA or pip and the images ended up in:

/usr/local/share/uhd/images/

And UHD is looking in:

/usr/share/uhd/images/

So pointing UHD to the correct folder solves it immediately.


🟦 If you paste me these two outputs, I can tell you the exact fix:

1.

uhd_config_info --print-all | grep -i image

2.

sudo find / -type d -name "images" -path "*uhd*" 2>/dev/null

Then I’ll give you the exact one-line fix for your machine.

I did following and got /usr/bin/uhd_images_downloader

Run:

which uhd_images_downloader

Typical expected result:

/usr/lib/uhd/utils/uhd_images_downloader

If you get no output or it points to somewhere weird (like ~/.local), UHD is mismatched

Ubuntu does not like following says unrecognised option ‘-i’

uhd_config_info –print-all | grep -i image

No problem — the issue isn’t with uhd_config_info; it’s with the grep you used.

On Ubuntu, grep -i is valid, but grep -i image will fail if you used a dash that’s NOT a normal hyphen (e.g., copied from formatted text and it became an en-dash “–”). Ubuntu treats that as an invalid option.

Let’s fix it cleanly.


✅ Try this EXACT command (with plain ASCII characters)

uhd_config_info --print-all | grep -i image

If you still get an error, run it in two steps:

Step 1:

uhd_config_info --print-all

Step 2:

Then search manually for lines like:

UHD_IMAGES_DIR
images
image path

If grep keeps complaining

Use fgrep which ignores options:

uhd_config_info --print-all | fgrep -i image

Or:

uhd_config_info --print-all | grep --ignore-case image

When you get the output

Just paste the few lines showing the image paths and I’ll tell you exactly what’s wrong and how to fix the B210 “no image” error.

The critical thing we need is whatever UHD prints under Image path / Image directory / UHD_IMAGES_DIR.

Images directory: /usr/share/uhd/4.9.0/images

Great — that tells us exactly what’s going on.


✅ What this means

Your UHD installation expects images in:

/usr/share/uhd/4.9.0/images

…but earlier you looked in:

/usr/share/uhd/images

So UHD is searching in a version-specific directory, and your images were downloaded into the wrong one (or into the generic path instead of the versioned path).

This is why UHD says “no image”.


✅ Fix: Create the correct directory and copy (or move) the images into it

First create the directory:

sudo mkdir -p /usr/share/uhd/4.9.0/images

Then copy any existing UHD images into it. If you know where they exist, copy them, e.g.:

sudo cp /usr/share/uhd/images/* /usr/share/uhd/4.9.0/images/

If you’re not sure where the images were downloaded, search:

sudo find / -name "usrp_b200*" 2>/dev/null

Once found, copy them into:

/usr/share/uhd/4.9.0/images/

✅ Or: Re-run the downloader with the correct version directory in place

Now that the directory exists, do:

sudo uhd_images_downloader

This time it should install the images directly into:

/usr/share/uhd/4.9.0/images

Verify

ls /usr/share/uhd/4.9.0/images

You should see files like:

  • usrp_b200_fw.hex
  • usrp_b200_fpga.bin

Then test:

uhd_find_devices
sudo uhd_usrp_probe

Your B210 should now load its firmware successfully.


If you want, tell me the output of:

sudo find / -name "usrp_b200*" 2>/dev/null

and I will tell you exactly what to copy where.

Great — if both 4.9.0 and 4.9.1 contain the correct B200/B210 firmware and FPGA files, then UHD should now be able to load the image.

So the remaining possibilities are:

  1. UHD is actually running a different version than expected (e.g., 4.9.1 even though the config says 4.9.0).
  2. The images are correct but UHD can’t read them (permissions).
  3. The B210 is not being detected over USB (so UHD never reaches the image-loading step).
  4. UHD was installed from multiple sources and you are accidentally running the wrong one.

Let’s go through the minimal next checks.


✅ 1 — See which UHD version you are actually running

Run:

uhd_config_info --version

This MUST match the directory UHD is using:

/usr/share/uhd/<this version>/images

If it says 4.9.1, then UHD will ignore the 4.9.0 directory entirely.


✅ 2 — Test device detection

This tells us whether UHD even sees the B210 USB connection:

uhd_find_devices

Expected output includes something like:

Device Address:
    serial: xxx
    name: B210

If this fails, UHD will say “no image” because the device wasn’t found.

If uhd_find_devices finds the device, then run:

sudo uhd_usrp_probe

And tell me the exact line of the error.
Even just two lines around the error is enough.


✅ 3 — Check permissions on the image folder

Just in case:

ls -ld /usr/share/uhd/4.9.0/images
ls -l /usr/share/uhd/4.9.0/images/usrp_b200*

Permissions should look like:

-rw-r--r--

If they somehow got incorrect permissions, UHD won’t read them.


❗ 4 — Check for multiple UHD installations

This is very common and causes exactly your symptoms.

Run all three:

which uhd_find_devices
dpkg -l | grep uhd
pip list | grep uhd

If UHD is installed from both apt AND pip (or source), UHD often points to the wrong images directory.


👍 What to send me

Just paste these four things:

(1)

uhd_config_info --version

(2)

uhd_find_devices

(3)

The error lines only from:

sudo uhd_usrp_probe

(4)

which uhd_find_devices
dpkg -l | grep uhd
pip list | grep uhd

With those, I can tell you the exact cause and fix in one step.

Great — if both 4.9.0 and 4.9.1 contain the correct B200/B210 firmware and FPGA files, then UHD should now be able to load the image. So the remaining possibilities are: 1. UHD is actually running a different version than expected (e.g., 4.9.1 even though the config says 4.9.0). 2. The images are correct but UHD can’t read them (permissions). 3. The B210 is not being detected over USB (so UHD never reaches the image-loading step). 4. UHD was installed from multiple sources and you are accidentally running the wrong one. Let’s go through the minimal next checks. ________________________________________ ✅ 1 — See which UHD version you are actually running Run: uhd_config_info –version This MUST match the directory UHD is using: /usr/share/uhd/<this version>/images If it says 4.9.1, then UHD will ignore the 4.9.0 directory entirely. ________________________________________ ✅ 2 — Test device detection This tells us whether UHD even sees the B210 USB connection: uhd_find_devices Expected output includes something like: Device Address: serial: xxx name: B210 If this fails, UHD will say “no image” because the device wasn’t found. If uhd_find_devices finds the device, then run: sudo uhd_usrp_probe And tell me the exact line of the error. Even just two lines around the error is enough. ________________________________________ ✅ 3 — Check permissions on the image folder Just in case: ls -ld /usr/share/uhd/4.9.0/images ls -l /usr/share/uhd/4.9.0/images/usrp_b200* Permissions should look like: -rw-r–r– If they somehow got incorrect permissions, UHD won’t read them. ________________________________________ ❗ 4 — Check for multiple UHD installations This is very common and causes exactly your symptoms. Run all three: which uhd_find_devices dpkg -l | grep uhd pip list | grep uhd If UHD is installed from both apt AND pip (or source), UHD often points to the wrong images directory. ________________________________________ 👍 What to send me Just paste these four things: (1) uhd_config_info –version (2) uhd_find_devices (3) The error lines only from: sudo uhd_usrp_probe (4) which uhd_find_devices dpkg -l | grep uhd pip list | grep uhd With those, I can tell you the exact cause and fix in one step.

ChatGPT said:

Perfect — I can continue from that context.

Go ahead and run the four groups of commands and paste the outputs:

(1)

uhd_config_info –version

(2)

uhd_find_devices

(3) Only the error lines from:

sudo uhd_usrp_probe

(4)

which uhd_find_devices

dpkg -l | grep uhd

pip list | grep uhd

Once I have those, I can pinpoint exactly why your B210 still isn’t loading the FPGA/firmware image.

You said:

Answers to your questions:

ChatGPT said:

It looks like the outputs didn’t come through.

Could you paste the results for those four groups again? Even just copying them directly from your terminal is fine.

I need:

(1)
uhd_config_info –version

(2)
uhd_find_devices

(3)
Only the error lines from:
sudo uhd_usrp_probe

(4)

which uhd_find_devices

dpkg -l | grep uhd

pip list | grep uhd

As soon as I have those, I can tell you exactly where the mismatch is.

You said:

(1) uhd_config_info –version UHD 4.9.0.0-0ubuntu1~jammy3

ChatGPT said:

Great — UHD 4.9.0 is definitely the version in use.
Now we need the rest of the info to pinpoint why the B210 image still isn’t loading.

Please send the remaining outputs:


(2)

uhd_find_devices

(3)

From:

sudo uhd_usrp_probe

Just copy the error lines only (usually 3–10 lines near the bottom).


(4)

which uhd_find_devices

dpkg -l | grep uhd

pip list | grep uhd


Once I see those, I can tell you exactly whether the issue is USB detection, permissions, or mixed installations.

You said:

(2) uhd_find_devices [INFO] [UHD] linux; GNU C++ version 11.4.0; Boost_107400; UHD_4.9.0.0-0ubuntu1~jammy3 ————————————————– — UHD Device 0 ————————————————– Device Address: serial: 8004136 name: Zhixun-wireless product: B210 type: b200

ChatGPT said:

Excellent — the B210 is being detected perfectly.
So the USB link is fine, the device identifies correctly, and UHD 4.9.0 is running.

Now the only things that can still cause a “can’t load FPGA/firmware” error are:

  • mixed UHD installations, or
  • image-file permissions or corruption, or
  • a mismatch in the exact image UHD is trying to load

To determine which one it is, I need the last two pieces:


✅ (3) Error lines only from:

sudo uhd_usrp_probe

Just copy the section starting from the first line containing
WARNING, ERROR, or RuntimeError, until the end.


✅ (4) Installation check

which uhd_find_devices

dpkg -l | grep uhd

pip list | grep uhd


Once I have those, I can tell you the exact cause and the one-line fix.

You said:

(3) sudo uhd_usrp_probe = sudo uhd_usrp_probe [sudo] password for nas: Sorry, try again. [sudo] password for nas: [INFO] [UHD] linux; GNU C++ version 11.4.0; Boost_107400; UHD_4.9.0.0-0ubuntu1~jammy3 [INFO] [B200] Detected Device: B210 [INFO] [B200] Operating over USB 2. [INFO] [B200] Initialize CODEC control… [INFO] [B200] Initialize Radio control… [INFO] [B200] Performing register loopback test… [INFO] [B200] Register loopback test passed [INFO] [B200] Performing register loopback test… [INFO] [B200] Register loopback test passed [INFO] [B200] Setting master clock rate selection to ‘automatic’. [INFO] [B200] Asking for clock rate 16.000000 MHz… [INFO] [B200] Actually got clock rate 16.000000 MHz. _____________________________________________________ / | Device: B-Series Device | _____________________________________________________ | / | | Mboard: B210 | | serial: 8004136 | | name: Zhixun-wireless | | product: 2 | | revision: 4 | | FW Version: 8.0 | | FPGA Version: 16.0 | | | | Time sources: none, internal, external, gpsdo | | Clock sources: internal, external, gpsdo | | Sensors: ref_locked | | _____________________________________________________ | | / | | | RX DSP: 0 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | RX DSP: 1 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | RX Dboard: A | | | _____________________________________________________ | | | / | | | | RX Frontend: A | | | | Name: FE-RX2 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, rssi, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Frontend: B | | | | Name: FE-RX1 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, rssi, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Codec: A | | | | Name: B210 RX dual ADC | | | | Gain Elements: None | | _____________________________________________________ | | / | | | TX DSP: 0 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | TX DSP: 1 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | TX Dboard: A | | | _____________________________________________________ | | | / | | | | TX Frontend: A | | | | Name: FE-TX2 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Frontend: B | | | | Name: FE-TX1 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Codec: A | | | | Name: B210 TX dual DAC | | | | Gain Elements: None

ChatGPT said:

So far this all looks completely normaland crucially, there are no errors at all in what you pasted.

uhd_usrp_probe clearly did load the firmware and FPGA:

  • FW Version: 8.0
  • FPGA Version: 16.0

If the firmware/FPGA were not loading, you would see:

  • “no suitable firmware”
  • “no FPGA image”
  • “could not load image”
  • or a RuntimeError

Instead, everything is initialized, ADC/DAC loopback tests passed, clocks configured, and the front-ends are enumerating normally.

✅ Conclusion so far

Your B210 is working, and UHD successfully loaded the image.

❗ But I still need the last bit

Please paste the rest of the uhd_usrp_probe output — specifically the final 10–20 lines — just to make 100% sure there isn’t a subtle warning right at the end.

Also send section (4) so we can rule out multiple installations:

which uhd_find_devices

dpkg -l | grep uhd

pip list | grep uhd

Once I have those, I’ll give you a final diagnosis — but right now nothing is wrong with the hardware or firmware load.

You said:

(4) which uhd_find_devices /usr/bin/uhd_find_devices nas@lro-pc-24:~/ezRABase/ezRA$ dpkg -l | grep uhd ii libgnuradio-uhd3.10.1:amd64 3.10.1.1-2 amd64 gnuradio universal hardware driver functions ii libuhd-dev 4.9.0.0-0ubuntu1~jammy3 amd64 universal hardware driver for Ettus Research products ii libuhd4.1.0:amd64 4.1.0.5-3 amd64 universal hardware driver for Ettus Research products – library ii libuhd4.9.0:amd64 4.9.0.0-0ubuntu1~jammy3 amd64 hardware driver for Ettus Research products ii python3-uhd 4.9.0.0-0ubuntu1~jammy3 amd64 universal hardware driver for Ettus Research products – Python3 ii soapysdr0.8-module-uhd:amd64 0.4.1-3build1 amd64 UHD device support for SoapySDR ii uhd-host 4.9.0.0-0ubuntu1~jammy3 amd64 hardware driver for Ettus Research products – host apps ii uhd-rfnoc-dev 4.9.0.0-0ubuntu1~jammy3 all USRP hardware driver for Ettus Research products – RFNoC development nas@lro-pc-24:~/ezRABase/ezRA$ pip list | grep uhd

ChatGPT said:

Perfect — this tells us exactly what’s going on.

✅ Diagnosis

You have two separate UHD library versions installed on the system:

  • libuhd 4.9.0 (correct, matches the host tools)
  • libuhd 4.1.0 (old, should not be present)

Specifically, this package should not be installed:

ii  libuhd4.1.0:amd64  4.1.0.5-3

This can cause runtime library conflicts, especially when applications use UHD through Python, SoapySDR, GNU Radio, or any program dynamically linking against UHD.

Even if uhd_usrp_probe works, another program may accidentally load the 4.1.0 library instead of 4.9.0, resulting in:

  • “No suitable firmware image found”
  • “Image not compatible”
  • “Could not load FPGA”
  • “Device init error”
  • or silent failures

This is a known problem on Ubuntu when older UHD libs linger after upgrades.


❗ What you should remove

Run this:

sudo apt remove libuhd4.1.0

This does not affect the correct UHD 4.9.0 installation.


After removal, verify:

ldconfig -p | grep uhd

You should see only:

  • libuhd.so.4.9.0

No 4.1.0.


Then test again:

uhd_usrp_probe

If all is clean, everything should work flawlessly.


👍 If you want, send me:

ldconfig -p | grep uhd

after removal and I’ll confirm you’re 100% clear.

This was the only remaining mismatch.

You said:

uhd_usrp_probe [INFO] [UHD] linux; GNU C++ version 11.4.0; Boost_107400; UHD_4.9.0.0-0ubuntu1~jammy3 [INFO] [B200] Detected Device: B210 [INFO] [B200] Operating over USB 2. [INFO] [B200] Initialize CODEC control… [INFO] [B200] Initialize Radio control… [INFO] [B200] Performing register loopback test… [INFO] [B200] Register loopback test passed [INFO] [B200] Performing register loopback test… [INFO] [B200] Register loopback test passed [INFO] [B200] Setting master clock rate selection to ‘automatic’. [INFO] [B200] Asking for clock rate 16.000000 MHz… [INFO] [B200] Actually got clock rate 16.000000 MHz. _____________________________________________________ / | Device: B-Series Device | _____________________________________________________ | / | | Mboard: B210 | | serial: 8004136 | | name: Zhixun-wireless | | product: 2 | | revision: 4 | | FW Version: 8.0 | | FPGA Version: 16.0 | | | | Time sources: none, internal, external, gpsdo | | Clock sources: internal, external, gpsdo | | Sensors: ref_locked | | _____________________________________________________ | | / | | | RX DSP: 0 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | RX DSP: 1 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | RX Dboard: A | | | _____________________________________________________ | | | / | | | | RX Frontend: A | | | | Name: FE-RX2 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, rssi, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Frontend: B | | | | Name: FE-RX1 | | | | Antennas: TX/RX, RX2 | | | | Sensors: temp, rssi, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 76.0 step 1.0 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | RX Codec: A | | | | Name: B210 RX dual ADC | | | | Gain Elements: None | | _____________________________________________________ | | / | | | TX DSP: 0 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | TX DSP: 1 | | | | | | Freq range: -8.000 to 8.000 MHz | | _____________________________________________________ | | / | | | TX Dboard: A | | | _____________________________________________________ | | | / | | | | TX Frontend: A | | | | Name: FE-TX2 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Frontend: B | | | | Name: FE-TX1 | | | | Antennas: TX/RX | | | | Sensors: temp, lo_locked | | | | Freq range: 50.000 to 6000.000 MHz | | | | Gain range PGA: 0.0 to 89.8 step 0.2 dB | | | | Bandwidth range: 200000.0 to 56000000.0 step 0.0 Hz | | | | Connection Type: IQ | | | | Uses LO offset: No | | | _____________________________________________________ | | | / | | | | TX Codec: A | | | | Name: B210 TX dual DAC | | | | Gain Elements: None

ChatGPT said:

This output is exactly what a fully working B210 looks like after successfully loading firmware and FPGA.
There are no warnings, no runtime errors, no missing-image messages, and no failures.

Everything is clean.

✔ Firmware is loaded

FW Version: 8.0

✔ FPGA is loaded

FPGA Version: 16.0

✔ All RF front-ends enumerate correctly

(RX/TX blocks, ADC/DAC, LO locks, temp sensors, etc.)

✔ USB link is stable

Even over USB 2, everything is operating normally.


So what’s the final status?

If you removed the old UHD library (libuhd4.1.0) as recommended, then your system is now 100% correct, and the B210 is operating on UHD 4.9.0 exactly as it should.

If you still need confirmation, just send:

ldconfig -p | grep uhd

I’ll verify that only libuhd.so.4.9.0 remains, but based on the clean probe output, your system is already behaving exactly right.

If you now run GNU Radio or your own program, it should detect and use the B210 without any image-load errors.

Let me know if you want me to check your GNU Radio flowgraph, or test with a minimal UHD Python script.

You said:

Error =

ChatGPT said:

It looks like the message with the actual error text didn’t come through — I only received:

Error =

Could you paste the full error message that appears after the equals sign?

Even just 3–5 lines around the error is enough for me to diagnose it immediately.

You said:

This Python command = ../../ezRABase/ezRA/ezColS251113b.py -exzColDriver_airspy -ezColReadBinQtyBits 12 -ezColFreqBinQtyBits 12 -ezColReadBinMin 0 -exzColUsbRelay21 -ezColBiasTeeOn 0 -ezColBandwidth 8 -ezColSampleRate 10 -ezColCenterFreqAnt 1418.405 -ezColYLimL .55 .75 -ezColIntegQty 31e4 -ezColGainL 20 0 0 -ezColGain -10 -ezRAObsName LRO-H2_RSPduo_BandW8M_SampleR10_ ezColArgumentsFile(/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezDefaults.txt) =============== ezColArgumentsFile(ezDefaults.txt) =============== ezColArgumentsCommandLine =============== ezRAObsName = LRO-H2_RSPduo_BandW8M_SampleR10_ ezRAObsLat = 39.8282 ezRAObsLon = -98.5696 ezRAObsAmsl = 563.88 ezColFileNamePrefix = LRO-H2_RSPduo_BandW8M_SampleR10_ ezColCenterFreqRef = 0 ezColCenterFreqAnt = 1418.405 ezColBandWidth = 8.0 ezColSampleRate = 10.0 ezColReadBinQtyBits = 12 ezColReadBinMin = 0 ezColFreqBinQtyBits = 12 ezColGain = -10.0 ezColBiasTeeOn = 0 ezColAntBtwnRef = 1 ezColAzDeg = 180.0 ezColElDeg = 45.0 ezColRaH = 11.3 ezColDecDeg = 40.0 ezColGLatDeg = 0.0 ezColGLonDeg = 30.0 coordType = 0 ezColVerbose = 0 ezColDashboard = 1 ezColDispGrid = 0 ezColUsbRelay = 0 ezColIntegQty = 310000 ezColTextFontSize = 10 ezColSampleMax = 9.223372036854776e+18 ezColSecMax = 9.223372036854776e+18 ezColRefAction = 0 ezColYLimL = [ 0.55 , 0.75 ] matplotlib.__version__ = 3.5.1 timeStampUtcZero = 2025-11-16 23:24:25.064531+00:00 SoapySDR.Device.enumerate = {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output} ezColDriver = = ezColDriver = = ‘driver=’ + ezColDriver = driver= = Process Process-1: Traceback (most recent call last): File “/usr/lib/python3.10/multiprocessing/process.py”, line 314, in _bootstrap self.run() File “/usr/lib/python3.10/multiprocessing/process.py”, line 108, in run self._target(*self._args, **self._kwargs) File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2335, in sdrTask sdr = SoapySDR.Device(“driver=” + ezColDriver) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1864, in __new__ return cls.make(*args, **kwargs) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1480, in make return _SoapySDR.Device_make(*args) RuntimeError: SoapySDR::Device::make() no match

ChatGPT said:

Got it — this error has nothing to do with UHD or the B210.
Your Python script is failing before SoapySDR even tries to use SDRplay or the B210.

Here is the key part:

ezColDriver =  =

ezColDriver =  =

‘driver=’ + ezColDriver = driver= =

RuntimeError: SoapySDR::Device::make() no match

This means:

❗ ezColDriver is an empty string.

So your code ends up calling:

SoapySDR.Device(“driver=”)

But “driver=” matches no hardware at all, so SoapySDR correctly throws:

RuntimeError: … no match

This is not a UHD/B210/SOAPY problem — it’s simply a wrong or missing driver name inside your script’s argument logic.


✅ Why this happened

You ran:

… -exzColDriver_airspy …

But your script’s output shows:

ezColDriver =  =

So the command-line argument -exzColDriver_airspy did not set the expected variable.

Possible causes:

  1. The flag name is spelled slightly wrong.
  2. The flag parser expects something like:
  3. -ezColDriver airspy

instead of -exzColDriver_airspy.

  1. The script is expecting uppercase/lowercase differently.
  2. The defaults file is overwriting the value later.

📌 Immediate fix

Try running it with the explicit Soapy driver format:

For Airspy:

-ezColDriver airspy

For SDRplay:

-ezColDriver sdrplay

For UHD devices (B210 via SoapyUHD):

-ezColDriver uhd

Then print the value inside the script:

print(“ezColDriver =”, ezColDriver)

You want to see:

ezColDriver = airspy

or

ezColDriver = sdrplay

or

ezColDriver = uhd


👍 What to do next

Just send me:

  1. The line of code where ezColDriver is parsed.
  2. The expected syntax for enabling Airspy/RSPduo/B210 in your script.

I’ll tell you exactly which argument format you need so that your Soapy driver string is correct.

You said:

This Python command = ../../ezRABase/ezRA/ezColS251113b.py -ezColDriver UHD -ezColReadBinQtyBits 12 -ezColFreqBinQtyBits 12 -ezColReadBinMin 0 -exzColUsbRelay21 -ezColBiasTeeOn 0 -ezColBandwidth 8 -ezColSampleRate 10 -ezColCenterFreqAnt 1418.405 -ezColYLimL .55 .75 -ezColIntegQty 31e4 -ezColGainL 20 0 0 -ezColGain -10 -ezRAObsName LRO-H2_RSPduo_BandW8M_SampleR10_ ezColArgumentsFile(/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezDefaults.txt) =============== ezColArgumentsFile(ezDefaults.txt) =============== ezColArgumentsCommandLine =============== ezRAObsName = LRO-H2_RSPduo_BandW8M_SampleR10_ ezRAObsLat = 39.8282 ezRAObsLon = -98.5696 ezRAObsAmsl = 563.88 ezColFileNamePrefix = LRO-H2_RSPduo_BandW8M_SampleR10_ ezColCenterFreqRef = 0 ezColCenterFreqAnt = 1418.405 ezColBandWidth = 8.0 ezColSampleRate = 10.0 ezColReadBinQtyBits = 12 ezColReadBinMin = 0 ezColFreqBinQtyBits = 12 ezColGain = -10.0 ezColBiasTeeOn = 0 ezColAntBtwnRef = 1 ezColAzDeg = 180.0 ezColElDeg = 45.0 ezColRaH = 11.3 ezColDecDeg = 40.0 ezColGLatDeg = 0.0 ezColGLonDeg = 30.0 coordType = 0 ezColVerbose = 0 ezColDashboard = 1 ezColDispGrid = 0 ezColUsbRelay = 0 ezColIntegQty = 310000 ezColTextFontSize = 10 ezColSampleMax = 9.223372036854776e+18 ezColSecMax = 9.223372036854776e+18 ezColRefAction = 0 ezColYLimL = [ 0.55 , 0.75 ] matplotlib.__version__ = 3.5.1 timeStampUtcZero = 2025-11-16 23:30:15.581430+00:00 SoapySDR.Device.enumerate = {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output} ezColDriver = UHD = ezColDriver = UHD = ‘driver=’ + ezColDriver = driver=UHD = Process Process-1: Traceback (most recent call last): File “/usr/lib/python3.10/multiprocessing/process.py”, line 314, in _bootstrap self.run() File “/usr/lib/python3.10/multiprocessing/process.py”, line 108, in run self._target(*self._args, **self._kwargs) File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2335, in sdrTask sdr = SoapySDR.Device(“driver=” + ezColDriver) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1864, in __new__ return cls.make(*args, **kwargs) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1480, in make return _SoapySDR.Device_make(*args) RuntimeError: SoapySDR::Device::make() no match ^CTraceback (most recent call last): File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2855, in <module> main() File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 1753, in main sdrOut = sdrOutQueue.get() File “/usr/lib/python3.10/multiprocessing/queues.py”, line 103, in get res = self._recv_bytes() File “/usr/lib/python3.10/multiprocessing/connection.py”, line 216, in recv_bytes buf = self._recv_bytes(maxlength) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 414, in _recv_bytes buf = self._recv(4) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 379, in _recv chunk = read(handle, remaining) KeyboardInterrupt

ChatGPT said:

Ah — now it’s clear. The issue is the driver string capitalization and how SoapySDR enumerates UHD devices.

From your output:

ezColDriver = UHD

SoapySDR.Device.enumerate = {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output}

RuntimeError: SoapySDR::Device::make() no match

Key points:

  1. ezColDriver = UHD — uppercase “UHD”
  2. SoapySDR is returning only one device: driver=audio, meaning it sees no UHD device at all.
  3. “driver=UHD” in SoapySDR must match exactly the registered Soapy driver name, which is lowercase uhd, not UHD. SoapySDR driver names are case-sensitive.

✅ Fix

Change the command line to:

-ezColDriver uhd

Lowercase uhd. So the Python code sees:

sdr = SoapySDR.Device(“driver=uhd”)

Then SoapySDR.Device.enumerate() will list your B210 properly.


Optional sanity check

Run this in Python before starting your script:

import SoapySDR

print(SoapySDR.Device.enumerate())

You should see something like:

[{‘driver’: ‘uhd’, ‘label’: ‘B210 (serial: 8004136)’}]

If you see that, your script will successfully open the B210.


Summary

  • Before: driver=UHD → no match, only audio device found.
  • After: driver=uhd → matches UHD/B210, SoapySDR can create the device.

Your UHD/B210 hardware and firmware are perfectly fine, this is purely a Python/SoapySDR driver string mismatch.

Once you change it to lowercase uhd, your script should run correctly.

You said:

This Python command = ../../ezRABase/ezRA/ezColS251113b.py -ezColDriver uhd -ezColReadBinQtyBits 12 -ezColFreqBinQtyBits 12 -ezColReadBinMin 0 -exzColUsbRelay21 -ezColBiasTeeOn 0 -ezColBandwidth 8 -ezColSampleRate 10 -ezColCenterFreqAnt 1418.405 -ezColYLimL .55 .75 -ezColIntegQty 31e4 -ezColGainL 20 0 0 -ezColGain -10 -ezRAObsName LRO-H2_RSPduo_BandW8M_SampleR10_ ezColArgumentsFile(/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezDefaults.txt) =============== ezColArgumentsFile(ezDefaults.txt) =============== ezColArgumentsCommandLine =============== ezRAObsName = LRO-H2_RSPduo_BandW8M_SampleR10_ ezRAObsLat = 39.8282 ezRAObsLon = -98.5696 ezRAObsAmsl = 563.88 ezColFileNamePrefix = LRO-H2_RSPduo_BandW8M_SampleR10_ ezColCenterFreqRef = 0 ezColCenterFreqAnt = 1418.405 ezColBandWidth = 8.0 ezColSampleRate = 10.0 ezColReadBinQtyBits = 12 ezColReadBinMin = 0 ezColFreqBinQtyBits = 12 ezColGain = -10.0 ezColBiasTeeOn = 0 ezColAntBtwnRef = 1 ezColAzDeg = 180.0 ezColElDeg = 45.0 ezColRaH = 11.3 ezColDecDeg = 40.0 ezColGLatDeg = 0.0 ezColGLonDeg = 30.0 coordType = 0 ezColVerbose = 0 ezColDashboard = 1 ezColDispGrid = 0 ezColUsbRelay = 0 ezColIntegQty = 310000 ezColTextFontSize = 10 ezColSampleMax = 9.223372036854776e+18 ezColSecMax = 9.223372036854776e+18 ezColRefAction = 0 ezColYLimL = [ 0.55 , 0.75 ] matplotlib.__version__ = 3.5.1 timeStampUtcZero = 2025-11-16 23:32:02.281808+00:00 SoapySDR.Device.enumerate = {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output} ezColDriver = uhd = ezColDriver = uhd = ‘driver=’ + ezColDriver = driver=uhd = Process Process-1: Traceback (most recent call last): File “/usr/lib/python3.10/multiprocessing/process.py”, line 314, in _bootstrap self.run() File “/usr/lib/python3.10/multiprocessing/process.py”, line 108, in run self._target(*self._args, **self._kwargs) File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2335, in sdrTask sdr = SoapySDR.Device(“driver=” + ezColDriver) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1864, in __new__ return cls.make(*args, **kwargs) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1480, in make return _SoapySDR.Device_make(*args) RuntimeError: SoapySDR::Device::make() no match ^CTraceback (most recent call last): File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2855, in <module> main() File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 1753, in main sdrOut = sdrOutQueue.get() File “/usr/lib/python3.10/multiprocessing/queues.py”, line 103, in get res = self._recv_bytes() File “/usr/lib/python3.10/multiprocessing/connection.py”, line 216, in recv_bytes buf = self._recv_bytes(maxlength) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 414, in _recv_bytes buf = self._recv(4) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 379, in _recv chunk = read(handle, remaining) KeyboardInterrupt

ChatGPT said:

Ah — now I see the problem more clearly.

Even though you changed the driver string to lowercase uhd, SoapySDR is still not detecting any UHD devices:

SoapySDR.Device.enumerate =

     {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output}

This output means SoapySDR only sees the dummy audio device, and your B210 does not appear.


Why this happens

  1. The UHD B210 is installed and working (as we confirmed with uhd_usrp_probe).
  2. But SoapySDR does not have the UHD plugin installed, so it cannot see UHD devices.

So even though uhd is the correct driver string, SoapySDR cannot find the plugin to communicate with UHD hardware.


How to fix

1. Check which SoapySDR modules are installed:

SoapySDRUtil –info

You should see a section like:

Available modules: uhd, sdrplay, airspy, …

If uhd is not listed, SoapySDR cannot see the B210.


2. Install the UHD plugin for SoapySDR:

On Ubuntu, you can do:

sudo apt install soapysdr-module-uhd

Then verify:

SoapySDRUtil –info | grep uhd

You should see uhd listed.


3. Then run your script again:

-ezColDriver uhd

Now SoapySDR will detect your B210 properly, and the RuntimeError: no match will disappear.


Summary

  • UHD hardware and firmware are fine (uhd_usrp_probe works).
  • Python script fails because SoapySDR does not have the UHD module installed.
  • Install soapysdr-module-uhd and re-run the script.

After that, SoapySDR.Device.enumerate() will show your B210, and your script will run correctly.

You said:

This Python command = ../../ezRABase/ezRA/ezColS251113b.py -ezColDriver uhd -ezColReadBinQtyBits 12 -ezColFreqBinQtyBits 12 -ezColReadBinMin 0 -exzColUsbRelay21 -ezColBiasTeeOn 0 -ezColBandwidth 8 -ezColSampleRate 10 -ezColCenterFreqAnt 1418.405 -ezColYLimL .55 .75 -ezColIntegQty 31e4 -ezColGainL 20 0 0 -ezColGain -10 -ezRAObsName LRO-H2_RSPduo_BandW8M_SampleR10_ ezColArgumentsFile(/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezDefaults.txt) =============== ezColArgumentsFile(ezDefaults.txt) =============== ezColArgumentsCommandLine =============== ezRAObsName = LRO-H2_RSPduo_BandW8M_SampleR10_ ezRAObsLat = 39.8282 ezRAObsLon = -98.5696 ezRAObsAmsl = 563.88 ezColFileNamePrefix = LRO-H2_RSPduo_BandW8M_SampleR10_ ezColCenterFreqRef = 0 ezColCenterFreqAnt = 1418.405 ezColBandWidth = 8.0 ezColSampleRate = 10.0 ezColReadBinQtyBits = 12 ezColReadBinMin = 0 ezColFreqBinQtyBits = 12 ezColGain = -10.0 ezColBiasTeeOn = 0 ezColAntBtwnRef = 1 ezColAzDeg = 180.0 ezColElDeg = 45.0 ezColRaH = 11.3 ezColDecDeg = 40.0 ezColGLatDeg = 0.0 ezColGLonDeg = 30.0 coordType = 0 ezColVerbose = 0 ezColDashboard = 1 ezColDispGrid = 0 ezColUsbRelay = 0 ezColIntegQty = 310000 ezColTextFontSize = 10 ezColSampleMax = 9.223372036854776e+18 ezColSecMax = 9.223372036854776e+18 ezColRefAction = 0 ezColYLimL = [ 0.55 , 0.75 ] matplotlib.__version__ = 3.5.1 timeStampUtcZero = 2025-11-16 23:35:01.421692+00:00 SoapySDR.Device.enumerate = [INFO] [UHD] linux; GNU C++ version 11.2.0; Boost_107400; UHD_4.1.0.5-3 [WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output} ezColDriver = uhd = ezColDriver = uhd = ‘driver=’ + ezColDriver = driver=uhd = [WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” [WARNING] [b200_impl.cpp:204] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” [WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” Process Process-1: Traceback (most recent call last): File “/usr/lib/python3.10/multiprocessing/process.py”, line 314, in _bootstrap self.run() File “/usr/lib/python3.10/multiprocessing/process.py”, line 108, in run self._target(*self._args, **self._kwargs) File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2335, in sdrTask sdr = SoapySDR.Device(“driver=” + ezColDriver) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1864, in __new__ return cls.make(*args, **kwargs) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1480, in make return _SoapySDR.Device_make(*args) RuntimeError: LookupError: KeyError: No devices found for —–> Device Address: driver: uhd ^CTraceback (most recent call last): File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2855, in <module> main() File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 1753, in main sdrOut = sdrOutQueue.get() File “/usr/lib/python3.10/multiprocessing/queues.py”, line 103, in get res = self._recv_bytes() File “/usr/lib/python3.10/multiprocessing/connection.py”, line 216, in recv_bytes buf = self._recv_bytes(maxlength) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 414, in _recv_bytes buf = self._recv(4) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 379, in _recv chunk = read(handle, remaining) KeyboardInterrupt

ChatGPT said:

Ah — now it all makes sense. The root issue is that your SoapySDR is using the old UHD 4.1.0 libraries, not your working UHD 4.9.0 installation. That’s why it cannot find the firmware images:

[INFO] [UHD] linux; GNU C++ version 11.2.0; Boost_107400; UHD_4.1.0.5-3

[WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex

Using images directory: <no images directory located>

Key points

  1. SoapySDR finds the UHD driver, but links against the old 4.1.0 library, which has no images directory.
  2. The system B210 works perfectly with UHD 4.9.0 (uhd_usrp_probe), but SoapySDR is using a different version, so it fails to find the firmware.
  3. This explains why driver=uhd no longer works — the old library cannot initialize the B210.

✅ Solution

You need to make SoapySDR use UHD 4.9.0:

1. Remove the old UHD library

sudo apt remove libuhd4.1.0

(You may have already done this; if not, do it now.)

2. Check which UHD library SoapySDR is linking to

ldd /usr/lib/python3/dist-packages/SoapySDR.so | grep uhd

It must point to libuhd.so.4.9.0. If it still points to 4.1.0, SoapySDR was built against the old UHD library and must be reinstalled.


3. Reinstall SoapySDR UHD module

sudo apt install –reinstall soapysdr-module-uhd

This ensures it links against the correct UHD 4.9.0.


4. Set the UHD images directory (if needed)

If SoapySDR still complains about missing firmware:

export UHD_IMAGES_DIR=/usr/share/uhd/images

Then run your script in the same terminal.


5. Verify

SoapySDRUtil –info

  • Should list uhd as a device
  • The driver should link to UHD 4.9.0
  • Running your script with -ezColDriver uhd should now work

⚡ TL;DR

  • The B210 itself is fine.
  • Your Python/SoapySDR failure is because it sees UHD 4.1.0, which cannot find firmware.
  • Remove libuhd4.1.0 and reinstall soapysdr-module-uhd to use UHD 4.9.0.
  • Make sure UHD_IMAGES_DIR points to /usr/share/uhd/images.

After this, SoapySDR will correctly detect your B210.

You said:

This Python command = ../../ezRABase/ezRA/ezColS251113b.py -ezColDriver uhd -ezColReadBinQtyBits 12 -ezColFreqBinQtyBits 12 -ezColReadBinMin 0 -exzColUsbRelay21 -ezColBiasTeeOn 0 -ezColBandwidth 8 -ezColSampleRate 10 -ezColCenterFreqAnt 1418.405 -ezColYLimL .55 .75 -ezColIntegQty 31e4 -ezColGainL 20 0 0 -ezColGain -10 -ezRAObsName LRO-H2_RSPduo_BandW8M_SampleR10_ ezColArgumentsFile(/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezDefaults.txt) =============== ezColArgumentsFile(ezDefaults.txt) =============== ezColArgumentsCommandLine =============== ezRAObsName = LRO-H2_RSPduo_BandW8M_SampleR10_ ezRAObsLat = 39.8282 ezRAObsLon = -98.5696 ezRAObsAmsl = 563.88 ezColFileNamePrefix = LRO-H2_RSPduo_BandW8M_SampleR10_ ezColCenterFreqRef = 0 ezColCenterFreqAnt = 1418.405 ezColBandWidth = 8.0 ezColSampleRate = 10.0 ezColReadBinQtyBits = 12 ezColReadBinMin = 0 ezColFreqBinQtyBits = 12 ezColGain = -10.0 ezColBiasTeeOn = 0 ezColAntBtwnRef = 1 ezColAzDeg = 180.0 ezColElDeg = 45.0 ezColRaH = 11.3 ezColDecDeg = 40.0 ezColGLatDeg = 0.0 ezColGLonDeg = 30.0 coordType = 0 ezColVerbose = 0 ezColDashboard = 1 ezColDispGrid = 0 ezColUsbRelay = 0 ezColIntegQty = 310000 ezColTextFontSize = 10 ezColSampleMax = 9.223372036854776e+18 ezColSecMax = 9.223372036854776e+18 ezColRefAction = 0 ezColYLimL = [ 0.55 , 0.75 ] matplotlib.__version__ = 3.5.1 timeStampUtcZero = 2025-11-16 23:38:17.757427+00:00 SoapySDR.Device.enumerate = {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output} ezColDriver = uhd = ezColDriver = uhd = ‘driver=’ + ezColDriver = driver=uhd = Process Process-1: Traceback (most recent call last): File “/usr/lib/python3.10/multiprocessing/process.py”, line 314, in _bootstrap self.run() File “/usr/lib/python3.10/multiprocessing/process.py”, line 108, in run self._target(*self._args, **self._kwargs) File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2335, in sdrTask sdr = SoapySDR.Device(“driver=” + ezColDriver) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1864, in __new__ return cls.make(*args, **kwargs) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1480, in make return _SoapySDR.Device_make(*args) RuntimeError: SoapySDR::Device::make() no match ^CTraceback (most recent call last): File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2855, in <module> main() File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 1753, in main sdrOut = sdrOutQueue.get() File “/usr/lib/python3.10/multiprocessing/queues.py”, line 103, in get res = self._recv_bytes() File “/usr/lib/python3.10/multiprocessing/connection.py”, line 216, in recv_bytes buf = self._recv_bytes(maxlength) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 414, in _recv_bytes buf = self._recv(4) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 379, in _recv chunk = read(handle, remaining) KeyboardInterrupt

ChatGPT said:

Okay — the output confirms exactly what I suspected: SoapySDR still cannot find any UHD devices. Right now it enumerates only the dummy audio device:

SoapySDR.Device.enumerate =

     {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output}

Even though you requested driver=uhd, it never sees the B210. That means the SoapySDR UHD module is either missing, or linked against the wrong UHD library. Essentially, your Python script cannot talk to UHD 4.9.0, which is what your system probe (uhd_usrp_probe) shows is working fine.


How to fix it

  1. Check installed SoapySDR modules:

SoapySDRUtil –info

  • You should see a uhd module listed under Available devices.
  • If not, the UHD module is not installed.
  1. Install/reinstall the UHD SoapySDR module:

sudo apt install –reinstall soapysdr-module-uhd

  • This ensures it links to the correct UHD library (4.9.0).
  • If you installed UHD from source, you may need to build the SoapySDR UHD module from source as well:

cd ~/SoapySDR/build/modules/uhd

mkdir build && cd build

cmake ../

make -j

sudo make install

sudo ldconfig

  1. Verify:

SoapySDRUtil –find

  • Should return your B210:

driver=uhd, label=…, serial=…

  1. Set UHD images directory (if needed):

export UHD_IMAGES_DIR=/usr/share/uhd/images

  • This avoids the “cannot find firmware” error.
  1. Run your script again with -ezColDriver uhd.
  • SoapySDR should now detect the B210 properly, and the RuntimeError: no match will disappear.

Right now the Python script fails because SoapySDR sees only the dummy driver, not UHD. Once the UHD module is properly installed, everything should work.

You said:

This Python command = ../../ezRABase/ezRA/ezColS251113b.py -ezColDriver uhd -ezColReadBinQtyBits 12 -ezColFreqBinQtyBits 12 -ezColReadBinMin 0 -exzColUsbRelay21 -ezColBiasTeeOn 0 -ezColBandwidth 8 -ezColSampleRate 10 -ezColCenterFreqAnt 1418.405 -ezColYLimL .55 .75 -ezColIntegQty 31e4 -ezColGainL 20 0 0 -ezColGain -10 -ezRAObsName LRO-H2_RSPduo_BandW8M_SampleR10_ ezColArgumentsFile(/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezDefaults.txt) =============== ezColArgumentsFile(ezDefaults.txt) =============== ezColArgumentsCommandLine =============== ezRAObsName = LRO-H2_RSPduo_BandW8M_SampleR10_ ezRAObsLat = 39.8282 ezRAObsLon = -98.5696 ezRAObsAmsl = 563.88 ezColFileNamePrefix = LRO-H2_RSPduo_BandW8M_SampleR10_ ezColCenterFreqRef = 0 ezColCenterFreqAnt = 1418.405 ezColBandWidth = 8.0 ezColSampleRate = 10.0 ezColReadBinQtyBits = 12 ezColReadBinMin = 0 ezColFreqBinQtyBits = 12 ezColGain = -10.0 ezColBiasTeeOn = 0 ezColAntBtwnRef = 1 ezColAzDeg = 180.0 ezColElDeg = 45.0 ezColRaH = 11.3 ezColDecDeg = 40.0 ezColGLatDeg = 0.0 ezColGLonDeg = 30.0 coordType = 0 ezColVerbose = 0 ezColDashboard = 1 ezColDispGrid = 0 ezColUsbRelay = 0 ezColIntegQty = 310000 ezColTextFontSize = 10 ezColSampleMax = 9.223372036854776e+18 ezColSecMax = 9.223372036854776e+18 ezColRefAction = 0 ezColYLimL = [ 0.55 , 0.75 ] matplotlib.__version__ = 3.5.1 timeStampUtcZero = 2025-11-16 23:43:25.079457+00:00 SoapySDR.Device.enumerate = [INFO] [UHD] linux; GNU C++ version 11.2.0; Boost_107400; UHD_4.1.0.5-3 [WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” {default_input=True, default_output=False, device_id=0, driver=audio, label=Monitor of Dummy Output} ezColDriver = uhd = ezColDriver = uhd = ‘driver=’ + ezColDriver = driver=uhd = [WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” [WARNING] [b200_impl.cpp:204] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” [WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex Using images directory: <no images directory located> Set the environment variable ‘UHD_IMAGES_DIR’ appropriately or follow the below instructions to download the images package. Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py” Process Process-1: Traceback (most recent call last): File “/usr/lib/python3.10/multiprocessing/process.py”, line 314, in _bootstrap self.run() File “/usr/lib/python3.10/multiprocessing/process.py”, line 108, in run self._target(*self._args, **self._kwargs) File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2335, in sdrTask sdr = SoapySDR.Device(“driver=” + ezColDriver) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1864, in __new__ return cls.make(*args, **kwargs) File “/usr/lib/python3/dist-packages/SoapySDR.py”, line 1480, in make return _SoapySDR.Device_make(*args) RuntimeError: LookupError: KeyError: No devices found for —–> Device Address: driver: uhd ^CTraceback (most recent call last): File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 2855, in <module> main() File “/home/nas/Astronomy/Soapy_SDRplay3/../../ezRABase/ezRA/ezColS251113b.py”, line 1753, in main sdrOut = sdrOutQueue.get() File “/usr/lib/python3.10/multiprocessing/queues.py”, line 103, in get res = self._recv_bytes() File “/usr/lib/python3.10/multiprocessing/connection.py”, line 216, in recv_bytes buf = self._recv_bytes(maxlength) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 414, in _recv_bytes buf = self._recv(4) File “/usr/lib/python3.10/multiprocessing/connection.py”, line 379, in _recv chunk = read(handle, remaining) KeyboardInterrupt

ChatGPT said:

The problem is now crystal clear: SoapySDR cannot see your B210 because UHD cannot find the firmware images it needs. Your log repeatedly shows:

[WARNING] [B200] EnvironmentError: IOError: Could not find path for image: usrp_b200_fw.hex

Using images directory: <no images directory located>

Set the environment variable ‘UHD_IMAGES_DIR’ appropriately

Please run: “/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py”

Even though uhd_usrp_probe sees your device, SoapySDR fails because it relies on the UHD driver under the hood and needs the firmware files to initialize the B200/B210.


How to fix this

  1. Download the UHD firmware/images:

sudo /lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py

  • This will download usrp_b200_fw.hex and other required images to the default UHD directory (/usr/share/uhd/images on Ubuntu).
  1. Verify images directory:

ls /usr/share/uhd/images

  • You should see files like usrp_b200_fw.hex, usrp_b205_fw.img, etc.
  1. Set the environment variable (if needed):

export UHD_IMAGES_DIR=/usr/share/uhd/images

  • You can add that line to ~/.bashrc to make it permanent.
  1. Test with SoapySDR:

SoapySDRUtil –find

  • It should now list your B210:

driver = uhd

label = …

serial = 8004136

  1. Then run your Python script again with -ezColDriver uhd.

Once UHD can access the firmware, SoapySDR will detect the device, and the RuntimeError: LookupError: KeyError: No devices found will disappear.

The key step is downloading the firmware images and pointing UHD to them. Without that, SoapySDR just sees a dummy audio device.

You said:

sudo /lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py sudo: /lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py: command not found

ChatGPT said:

Good question — the exact path of the image downloader script can vary depending on your Ubuntu version / package. According to the documentation, the utility is typically called:

uhd_images_downloader

And it may be installed at:

/usr/lib/uhd/utils/uhd_images_downloader.py

or

/usr/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py

“` :contentReference[oaicite:0]{index=0}

## ✅ What to try next

1. Search for the utility on your system:

   “`bash

   sudo find /usr -type f -name uhd_images_downloader.py

This will tell you where it is (if installed).

  1. If you find it, execute it with:
  2. sudo python3 /path/to/uhd_images_downloader.py

or simply:

sudo uhd_images_downloader

if it’s in your PATH.

  1. If you cannot find the utility, you may need to install the images package:
  2. sudo apt update
  3. sudo apt install uhd-images

(If available in your repo), or download the images manually from Ettus Research. Ettus Files+1

  1. Once the images are downloaded, set the environment variable (if needed) so UHD knows where to find them:
  2. export UHD_IMAGES_DIR=/usr/share/uhd/images

You can add that to your ~/.bashrc or /etc/environment for persistence.


If you like, I can check your specific Ubuntu release (Jammy, 22.04?) and find the exact package name that provides uhd_images_downloader.py for that release, so you can install it easily. Would you like me to do that?

You said:

how do i move images downloader into that folder?

ChatGPT said:

You don’t actually need to “move” the downloader itself — you need the UHD firmware images in a folder UHD can find. Here’s the step-by-step way to fix it:


1️⃣ Locate or download uhd_images_downloader.py

Check if it exists anywhere:

sudo find /usr -type f -name uhd_images_downloader.py

  • If you find it, note the full path.
  • If not, install the package that provides it:

sudo apt update

sudo apt install uhd-host

After that, the script is usually in:

/usr/lib/uhd/utils/uhd_images_downloader.py

or

/usr/lib/x86_64-linux-gnu/uhd/utils/uhd_images_downloader.py


2️⃣ Run the downloader to get the images

sudo python3 /usr/lib/uhd/utils/uhd_images_downloader.py

This will download the firmware images into the default UHD folder (usually /usr/share/uhd/images).


3️⃣ Set UHD to find them (if needed)

If UHD still can’t find the images, set the environment variable:

export UHD_IMAGES_DIR=/usr/share/uhd/images

To make this permanent, add the line above to your ~/.bashrc and then:

source ~/.bashrc


✅ 4️⃣ Verify

uhd_find_devices

uhd_usrp_probe

You should no longer see the Could not find path for image: usrp_b200_fw.hex warnings.


Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.