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.hexusrp_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:
- UHD was installed from a different source than the images downloader script expects
- The downloader wasn’t actually installed with UHD
- 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.hexusrp_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:
- UHD is actually running a different version than expected (e.g., 4.9.1 even though the config says 4.9.0).
- The images are correct but UHD can’t read them (permissions).
- The B210 is not being detected over USB (so UHD never reaches the image-loading step).
- 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 normal — and 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:
- The flag name is spelled slightly wrong.
- The flag parser expects something like:
- -ezColDriver airspy
instead of -exzColDriver_airspy.
- The script is expecting uppercase/lowercase differently.
- 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:
- The line of code where ezColDriver is parsed.
- 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:
- ezColDriver = UHD — uppercase “UHD”
- SoapySDR is returning only one device: driver=audio, meaning it sees no UHD device at all.
- “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
- The UHD B210 is installed and working (as we confirmed with uhd_usrp_probe).
- 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
- SoapySDR finds the UHD driver, but links against the old 4.1.0 library, which has no images directory.
- 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.
- 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
- Check installed SoapySDR modules:
SoapySDRUtil –info
- You should see a uhd module listed under Available devices.
- If not, the UHD module is not installed.
- 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
- Verify:
SoapySDRUtil –find
- Should return your B210:
driver=uhd, label=…, serial=…
- Set UHD images directory (if needed):
export UHD_IMAGES_DIR=/usr/share/uhd/images
- This avoids the “cannot find firmware” error.
- 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
- 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).
- Verify images directory:
ls /usr/share/uhd/images
- You should see files like usrp_b200_fw.hex, usrp_b205_fw.img, etc.
- 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.
- Test with SoapySDR:
SoapySDRUtil –find
- It should now list your B210:
driver = uhd
label = …
serial = 8004136
- 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).
- If you find it, execute it with:
- sudo python3 /path/to/uhd_images_downloader.py
or simply:
sudo uhd_images_downloader
if it’s in your PATH.
- If you cannot find the utility, you may need to install the images package:
- sudo apt update
- sudo apt install uhd-images
(If available in your repo), or download the images manually from Ettus Research. Ettus Files+1
- Once the images are downloaded, set the environment variable (if needed) so UHD knows where to find them:
- 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.