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 ArrowDigiKey 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:

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.

A spectrum scan completed on board a PlutoSDR running Lama Bleu's custom firmware.
A spectrum scan completed on board a PlutoSDR with rx_tools, running Lama Bleu's custom firmware.
GNU Plot running on the PlutoSDR with Lama Bleu's custom firmware.
GNU Plot running on the PlutoSDR with Lama Bleu's custom firmware.


  1. Val

    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.

    • Val

      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!

      • LamaBleu

        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 ( for audio streaming, lua scripts to record audio as wave). Explanation in the readme.txt

        • jovpov

          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 ?

        • Val

          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!

            • Val

              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?

              • Val

                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.

    • Val

      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!

    • jovpov

      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

  2. Ben

    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 are “inverted” so the lowest signal value is on the top. Any help on that ?

    Thanks for the nice firmware !

    • LamaBleu

      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. can’t be ported to pluto at this moment. Considering writing a specific tool for pluto to replace rx_power.

  3. LamaBleu

    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.

  4. jovpov

    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…

    • LamaBleu

      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.

      • jovpov

        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…

        • LamaBleu

          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.

          • Anonymous

            Hi LamaBleu,
            Very good work!
            Can you process signals with higher sampling rate (e.g. 20Msample??) if you dont’use graphics and?

  5. jovpov

    Fails flashing at 70% (around 22MB), please make firmware for the other RevB (there are 2 revB versions as I understand)

Post a comment

You may use the following HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

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