New Custom Firmware for the PlutoSDR with Several Linux SDR Programs Pre-Installed
The PlutoSDR is an Analog Devices $99 - $149 RX/TX capable SDR with 20 MHz of bandwidth and a 325 MHz to 3.8 GHz frequency range that is software hackable to 56 Mhz of bandwidth and a 70 MHz to 6000 MHz frequency. It has an on board Xilinx Zynq Z-7010 FPGA, which has a built in dual core ARM Cortex-A9 processor as well. This processor is capable of running Linux and Linux SDR software on the PlutoSDR itself. PlutoSDR's can be purchased directly from Analog Devices, or via Arrow, DigiKey or Mouser.
Recently "Lama Bleu" has been working on a custom firmware image for the PlutoSDR. Installing custom firmware allows you to load up a pre-configured Linux system which already has a bunch of useful software installed. He writes that his version is not designed to have a nice GUI, but rather focuses on scripting and data acquisition software. A list of software pre-installed to the image is shown below:
- iio tools : iio-info, libiio 0.16
- CW generator (python) (FG8OJ for CW processing code : https://github.com/fg8oj/cwkeyer)
- SoapySDR + SoapyRemote 0.6 (Pothosware https://github.com/pothosware/SoapySDR)
- LeanTRX ( + DATV TX scripts) (F4DAV and PABR team http://www.pabr.org/radio/leantrx/leantrx.en.html)
- Python 2.7 + numpy ( including iio and SoapySDR bindings)
- rxtools : rx_sdr, rx_fm, rx_power ( Robert X. Seger https://github.com/rxseger/rx_tools
- Retrogram (Peter Rakesh https://github.com/r4d10n/retrogram-plutosdr)
- LUAradio (Vanya Sergeev http://luaradio.io)
- multimon-ng (Elias Önal https://github.com/EliasOenal/multimon-ng/)
- csdr ( + nmux) (Simonyi Károly College for Advanced Studies https://github.com/simonyiszk/csdr)
- OpenWebRX (András Retzler HA7ILM https://sdr.hu)
- gnuplot + libpng – -> signal.sh script to acquire and plot directly on the pluto using rx_power.
- Busybox utilities : netcat, at, timeout, ntpd and more (at and timeout to perform scheduled tasks or end a task).
- morfeus_tool !
To access these tools you simply connect to the PlutoSDR via a network connection and SSH. With some of the tools installed it is possible to do things on board the PlutoSDR like recording signals, demodulating signals, transmitting CW, stream demodulated audio over a network, plot the spectrum on the terminal, create an online SDR with OpenWebRX, do a long spectrum scan and transmit DATV.
An alternative custom firmware is PlutoWeb which we posted about in the past. This image is designed for creating a web interface GUI, and for running streaming software such as OpenWebRX.
Any chance you might post your build instructions for the image? I am particularly instrested in the Soapy build. I want to build a custom application that can be copied to the standard pluto firmware with the appropriate soapy libraries.
To build a firmware just follow instructions on AnalogDevices wiki. Another very good starting point : https://manual.hnap.de/building_the_fw/ . However expect short nights and liters of coffee.
You can find latest SoapySDR libs compiled for v0.32 firmware here : http://www.lamableu.net/pluto/ipk/
Perhaps my experience would help others:
1. iio_info did not provide any mention of hw_model_variant for me. However when PlutoSDR shows up in the system as a storage you can check the size of that storage – if it’s around 29MB then you can safely flash the larger firmware version (as I did).
2. When I tried to copy pluto.frm to PlutoSDR storage (the easiest way to flash the firmware) it said that it needed 239 kB more space. I’ve just removed everything except config.txt from PlutoSDR storage and then pluto.frm could be copied there just fine. Ejected PlutoSDR, waited until it flashed itself and rebooted – zero problems.
Now a question: where is multimon-ng? Can’t find it.
Now that is interesting.
After successfully flashing 31 MB firmware I see two extremely strange things:
– iio_info now outputs hw_model_variant and it’s 0, so my hardware shouldn’t be compatible with the bigger firmware, but I’ve flashed it no problem
– now after the upgrade capacity of PlutoSDR storage has increased! It was showing up as 29 MB, now it’s 39.9 MB!
Hi Val, thank you for the report. You were lucky to flash your pluto using the .frm file copied USB gadget volume, for me it often fails, that’s why I prefer DFU.
– Another way to find if the Pluto may have trouble for flashing big files: dmesg | grep n25q
m25p80 spi32765.0: n25q256a (32768 Kbytes)
If reported n25q256a, flashing over 22MB may fail as explained on previous comments.
– The PlutoSDR USB drive size growed to 40MB, yes it’s normal because I modified it. Useful to transfer wav files.. Please do not assume the Gadget storage size is a reference to find faulty unit or not. Obviuosly it should have at least the size of the firmware file you will flash 🙂
– multimon-ng : how yes you are right sorry ! LUAradio can also decode AX25 and POCSAG.
– I updated the light version yesterday, added and improved scripts ( nbfm-rx.sh wbfl-rx.sh for audio streaming, lua scripts to record audio as wave). Explanation in the readme.txt
Thnx for new “light version”.
Please can you explain, what is the root cause of flashih more then 22MB?
# dmesg | grep n25q
m25p80 spi32765.0: n25q256a (32768 Kbytes)
32768Kbytes > 22MB ?
Doh! multimon-ng was why I was updating the firmware. Anyway it’s good to get familiar with other apps I’ve never used before. For instance, Retrogram is amazing and useful. Thanks again!
Hi Val, updated. multimon-ng is back and more. Have also a look to LUAradio use. Enjoy.
Thanks a lot!
Hm, just tried the new firmware and it failed in an interesting way:
1. After I’ve copied pluto.frm to PlutoSDR removable storage and “ejected” the storage flashing has been really long (few minutes).
2. Once it finally stopped flashing and restarted now it shows up as “USB download gadget” (network connection is not available).
What’s the best way to flash it now?
Just got pretty interesting experience with Pluto
As I’ve said before, upgrade from your “old” firmware to the “new” firmware was unsuccessful.
1. Trying to upgrade to the same “new” firmware in DFU mode – fails at 77%
2. The same with “old” firmware – same result.
3. The same with official firmware (the size is less than 10MB) – works fine.
4. Upgrading using Pluto storage to “old” firmware – works fine (even though it failed in DFU mode previously).
5. Upgrading using Pluto storage to “new” firmware again – fails just like before (doesn’t boot normally anymore).
6. Upgrading to official firmware in DFU mode, then upgrading to the “new” firmware using Pluto storage – works fine! multimon-ng is present and works!
It’s really puzzling, but it looks like the storage mode can flash something DFU mode can’t, and that upgrade success depends on what firmware you’re running currently.
Regarding “if it’s around 29MB then you can safely flash the larger firmware version” – obviously I can’t guarantee that it’s going to work for you, I can only tell that it worked fine for me. Proceed at your own risk!
I can confirm the same works for me.
It looks that after running this on pluto, I can flash 32MB version using dfu:
# fw_setenv dfu_ram ‘sf probe && sf protect unlock 0 100000;echo Entering DFU RAM mode … && run dfu_ram_info && dfu 0 ram 0’
# device_reboot ram
Great news, thanks a lot for posting!
And of course thanks a lot to LamaBleu for creating the firmware!
On my revision B flashing by use of the USB storage failed. After 12 minutes still no USB device returned. Flashed the firmware with DFU and it works. (not on an USB3.0 port by the way !!) Had to patch the Pluto to use 2 cores to have openwebrx run at 70 percent instead of stuttering 100 %. There is one “problem” left, my plot’s from signal.sh are “inverted” so the lowest signal value is on the top. Any help on that ?
Thanks for the nice firmware !
Hi Ben, thanks for trying 😉
– flashing using .frm file (by copying to USB storage then eject) may fail for several reasons. Depending on which firmware was installed before. Flashing uboot.frm first may help. But I’m always using the DFU flashing method as described in the README.txt.
– regarding double core activation and extended freq range , you are right, it’s not included in the full firmware (32MB). Usually I think it’s end-user responsability. But changed my mind ! so it’s added on the light version (21MB) I uploaded yesterday evening (permanent unlocking works after a SECOND reboot)
– about the plot, I checked here on both versions, it’s correct, so no idea at this moment.
rx_tools was not really made for pluto, and sometimes I’m not always happy with the result. Heatmap.py can’t be ported to pluto at this moment. Considering writing a specific tool for pluto to replace rx_power.
Hi, the “light version” of the firmware, working now for both revB boards (hw_model_variant 0 and 1) is available following the link on the article above, on the subfolder “light-version_for_all-revB-boards”.
Firmware size is reduced from 31MB to 21MB.
Please have a look to the README-light-pluto.txt for details on how to use and changes relative to the initial full-version (still available for revB “hw_model_variant 1” ).
FYI : AD provided a workaround a little bit risky for the 1st generation of pluto revB having flashing bug, but with a real risk of bricking the unit. Need to check.
Check his twitter:
“Update : seems there are two types of pluto revB boards, with different memory flash type. One is supporting 22MB firmware filesize, and the most recent 31MB. Using iio_info, check “hw_model_variant”. If set to 0 this firmware is not suitable for you at this moment, sorry ?“
Hope he will make smaller image for many owners of different RevB pluto…
Hey jovpov and John, I added a comment here yesterday to spread this information, however seems the captcha/antispam rejected my comment.
Yes, I got same report from other plutoer two days ago. We were finally able to found there are two differents models of Pluto for the revB board, depending on the manufacturing date.
The first batch of 1000 revB Plutos supports only firmware files up to 22.5 MB. Following batches can support up to 32MB. Since my Pluto is from the second batch I never known about this issue, and at the same time lot of people were thinking it is “normal” to flash a maximum size of 22MB.
This issue is escalated to AD, and I updated the readmetxt. I really apologize for this late discovery : the first 1000 pluto owners can’t use this firmware at this moment.
Thnx, if you get feedback from AD, please forward it? Maybe it is possible to make hardware mod to enable 32MB flash size? Or if you make smaller image (ommiting some large app), I would gladly try it…
Hi, hope AD will release a patch to gain access to the full 32MB range. And yes I’m working on a light version of this firmware, with a storage space reduced by 35% 🙁
– still there : LUAradio, rx_tools, csdr, SoapySDR + SoapyRemote, gnuplot, python support (removed numpy for the moment), cw-keyer, NTP and DHCP/fixed IP support.
– removing : openwebrx, retrogram, wifi support, multimon-ng, video sample for DATV (you have to download and transfer to USB storage).
Contact me via twitter or lama.bleu (on gmail servers) if you want to try, no problem.
Very good work!
Can you process signals with higher sampling rate (e.g. 20Msample??) if you dont’use graphics and?
DFU flash is failing at arround 72%
something is wrong here
Fails flashing at 70% (around 22MB), please make firmware for the other RevB (there are 2 revB versions as I understand)
Nice work, @lamableu!