Post Go back to editing

Rev. B Pluto defies attempts to get it in dfu mode, even with JTAG

Hi, I am back again, I am afraid, this time with a friend's Rev. B Pluto. I offered to help as I now have the JTAG "stuff". I can get one solid LED with the paper clip switch press, but two PC's fail to see it with dfu-util.exe.

I then used JTAG on it and nothing changed afterwards, although the Xilinx session appeared to work correctly.

My confusion is I am not sure just what I am expected to see when I use the adalm-uart-jtag serial connection after the Xilinx  run.tcl session? It just goes to a v0.32 "dirty" screen, I was expecting the cited screen to have some sort of u-boot menu from the instructions, and the command run dfu_sf is not recognised there.

I don't know if it's any help, but from the adalm-uart-jtag serial connection I get the following with fw_printenv

My own Pluto, when seemingly bricked seemed to respond OK to a JTAG revival, any help much appreciated, thanks.

pluto login: root
Password:
Welcome to:
______ _       _        _________________
| ___ \ |     | |      /  ___|  _  \ ___ \
| |_/ / |_   _| |_ ___ \ `--.| | | | |_/ /
|  __/| | | | | __/ _ \ `--. \ | | |    /
| |   | | |_| | || (_) /\__/ / |/ /| |\ \
\_|   |_|\__,_|\__\___/\____/|___/ \_| \_|

v0.32-dirty
wiki.analog.com/.../pluto
# fw_printenv
adi_loadvals=fdt addr ${fit_load_address} && fdt get value fdt_choosen /configurations/${fit_config}/ fdt && fdt get addr fdtaddr /images/${fdt_choosen} data && fdt addr ${fdtaddr}; if test -n ${ad936x_ext_refclk} && test ! -n ${ad936x_skip_ext_refclk}; then fdt set /clocks/clock@0 clock-frequency ${ad936x_ext_refclk}; fi; fdt get value model / model; if test -n ${ad936x_ext_refclk_override} && test "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)"; then fdt set /clocks/clock@0 clock-frequency ${ad936x_ext_refclk_override}; fi; if test ${refclk_source} = internal || test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)" ; then fdt rm /amba/gpio@e000a000/clock_extern_en; fi; if test -n ${attr_name} && test -n ${attr_val}; then fdt set /amba/spi@e0006000/ad9361-phy@0 ${attr_name} ${attr_val}; fi; if test ${refclk_source} = external || test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)" ; then fdt rm /amba/gpio@e000a000/clock_internal_en; fi; if test -n ${compatible} && test ! ${compatible} = ad9361 && test ! ${compatible} = ad9363a && test ! ${compatible} = ad9364; then setenv compatible ad9363a; saveenv; fi; if test -n ${mode} && test ! ${mode} = 1r1t && test ! ${mode} = 2r2t; then setenv mode 1r1t; saveenv; fi; if test -n ${refclk_source} && test ! ${refclk_source} = internal && test ! ${refclk_source} = external; then setenv refclk_source internal; saveenv; fi; if test -n ${compatible}; then fdt set /amba/spi@e0006000/ad9361-phy@0 compatible ${compatible}; fi; if test  ${compatible} = ad9361 && test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)" ; then fdt set /amba/spi@e0006000/ad9361-phy@0 compatible ad9363a; compatible=ad9363a; fi; if test ${mode} = 1r1t || test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)"; then fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; fi; if test -n ${cs_gpio}; then fdt set /amba/axi_quad_spi@7C430000/ cs-gpios "<0x06 ${cs_gpio} 0>"; fi; if test ${compatible} = ad9364 || test -n ${attr_val} = ad9364; then fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; fdt set /fpga-axi/cf-ad9361-dds-core-lpc@79024000 compatible adi,axi-ad9364-dds-6.00.a; setenv mode 1r1t; saveenv; fi;
attr_name=compatible
attr_val=ad9364
baudrate=115200
bitstream_image=system.bit.bin
bitstream_size=0x400000
boot_image=BOOT.bin
boot_size=0xF00000
bootcmd=run $modeboot
bootdelay=0
bootenv=uEnv.txt
clear_reset_cause=mw f8000008 df0d && mw f8000258 00400000 && mw f8000004 767b
compatible=ad9364
datvset=callsign G8KOE;freq 2407.75;freqt 2407.75;harmonic off;channel 2407.75-333KS10;mode DVBS2;mod QPSK;sr 333;srselect 333;fec 23;pilots Off;frame LongFrame;power -6;rolloff 0.20;pcrpts 40;patperiod 100;h265box h265box;codec H264;sound On;audioinput line;remux 1;trvlo 0;trvloselect 0;provname P2.1-IS0GRB;tsinput udp://0.0.0.0:8282;offsetv +;freqoffset 0;bitaudio 48k;bitaudioselect 48k;sampleaudio 44100;audiochannels 2;maddress 192.168.1.76;maddressport 6789;lnbfreq 09750000;lnbvolts 18;antconnector A;modtype normal;bufferlatency;pttoffdelay off;pttoffdelaysec 8;;
devicetree_image=devicetree.dtb
devicetree_load_address=0x2000000
devicetree_size=0x20000
dfu_ram=echo Entering DFU RAM mode ... && run dfu_ram_info && dfu 0 ram 0
dfu_ram_info=set dfu_alt_info dummy.dfu ram 0 0\\;firmware.dfu ram ${fit_load_address} 0x1E00000
dfu_sf=gpio set 15;set stdout serial@e0001000;echo Entering DFU SF mode ... && run dfu_sf_info && dfu 0 sf 0:0:40000000:0 && if test -n ${dfu_alt_num} && test ${dfu_alt_num} = 1; then set fit_size ${filesize} && set dfu_alt_num && env save; fi;gpio clear 15;
dfu_sf_info=set dfu_alt_info boot.dfu raw 0x0 0x100000\\;firmware.dfu raw 0x200000 0x1E00000\\;uboot-extra-env.dfu raw 0xFF000 0x1000\\;uboot-env.dfu raw 0x100000 0x20000\\;spare.dfu raw 0x120000 0xE0000
ethaddr=00:0a:35:00:01:22
extraenv_load_address=0x207E000
fdt_choosen=fdt@2
fdt_high=0x20000000
fdtaddr=20841f4
fdtcontroladdr=1ff99f50
fit_config=config@9
fit_load_address=0x2080000
fit_size=1A5AFA3
importbootenv=echo Importing environment from SD ...; env import -t ${loadbootenv_addr} $filesize
initrd_high=0x20000000
ipaddr=192.168.2.1
ipaddr_host=192.168.2.10
jtagboot=env default -a;sf probe && sf protect unlock 0 100000 && run dfu_sf;
kernel_image=uImage
loadbit_addr=0x100000
loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}
loadbootenv_addr=0x2000000
mode=1r1t
modeboot=qspiboot
model=Analog Devices PlutoSDR Rev.B (Z7010/AD9363)
netmask=255.255.255.0
preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; then if env run loadbootenv; then env run importbootenv; fi; fi;
qspiboot=set stdout nulldev;adi_hwref;test -n $PlutoRevA || gpio input 14 && set stdout serial@e0001000 && sf probe && sf protect lock 0 100000 && run dfu_sf;  set stdout serial@e0001000;itest *f8000258 == 480003 && run clear_reset_cause && run dfu_sf; itest *f8000258 == 480007 && run clear_reset_cause && run ramboot_verbose; itest *f8000258 == 480006 && run clear_reset_cause && run qspiboot_verbose; itest *f8000258 == 480002 && run clear_reset_cause && exit; echo Booting silently && set stdout nulldev; run read_sf && run adi_loadvals; envversion;setenv bootargs console=ttyPS0,115200 maxcpus=${maxcpus} rootfstype=ramfs root=/dev/ram0 rw quiet loglevel=4 uboot="${uboot-version}" && bootm ${fit_load_address}#${fit_config} || set stdout serial@e0001000;echo BOOT failed entering DFU mode ... && sf protect lock 0 100000 && run dfu_sf
qspiboot_extraenv=sf read ${extraenv_load_address} 0xFF000 0x1000 && env import -c ${extraenv_load_address} 0x1000 || true
qspiboot_verbose=adi_hwref;echo Copying Linux from QSPI flash to RAM... && run read_sf && if run adi_loadvals; then echo Loaded AD936x refclk frequency and model into devicetree; fi; envversion;setenv bootargs console=ttyPS0,115200 maxcpus=${maxcpus} rootfstype=ramfs root=/dev/ram0 rw earlyprintk uboot="${uboot-version}" && bootm ${fit_load_address}#${fit_config} || echo BOOT failed entering DFU mode ... && run dfu_sf
ramboot_verbose=adi_hwref;echo Copying Linux from DFU to RAM... && run dfu_ram;if run adi_loadvals; then echo Loaded AD936x refclk frequency and model into devicetree; fi; envversion;setenv bootargs console=ttyPS0,115200 maxcpus=${maxcpus} rootfstype=ramfs root=/dev/ram0 rw earlyprintk uboot="${uboot-version}" && bootm ${fit_load_address}#${fit_config}
ramdisk_image=uramdisk.image.gz
ramdisk_load_address=0x4000000
ramdisk_size=0x400000
read_sf=sf probe 0:0 50000000 0 && run qspiboot_extraenv &&sf read ${fit_load_address} 0x200000 ${fit_size} && iminfo ${fit_load_address} || sf read ${fit_load_address} 0x200000  0x1E00000;
refclk_source=internal
run=dfu.sf
sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt
stderr=serial@e0001000
stdin=serial@e0001000
stdout=nulldev
thor_ram=run dfu_ram_info && thordown 0 ram 0
uenvboot=if run loadbootenv; then echo Loaded environment from ${bootenv}; run importbootenv; fi; if test -n $uenvcmd; then echo Running uenvcmd ...; run uenvcmd; fi
usbboot=if usb start; then run uenvboot; echo Copying Linux from USB to RAM... && load usb 0 ${fit_load_address} ${kernel_image} && load usb 0 ${devicetree_load_address} ${devicetree_image} && load usb 0 ${ramdisk_load_address} ${ramdisk_image} && bootm ${fit_load_address} ${ramdisk_load_address} ${devicetree_load_address}; fi
#

  • I have managed to get to a Pluto prompt from an adalm-uart-jtag serial connection, by commanding device_reboot sf  and as it's booting hitting the numeric zero key. Without doing that it just automatically cycles into another normal reboot.

    Now that I can get to a Pluto serial connection prompt, what should I do next please?

  • ,

    I'm no Pluto expert but I had a working rev C laying around with 0.32-dirty fw version and I attempted a firmware upgrade to 0.35 via ssh based on instructions available on our wiki.

    Looks like your Pluto reaches the welcome prompt which makes me believe it boots fine.

    In this case, the device will be visible to your PC (over the USB) as an additional network interface, and if you ssh root@192.168.2.1 with the default password, you can check whether you can connect via ssh to it.

    If this works, copy the latest firmware (0.35 as of date) to Pluto filesystem using scp (over ssh).

    and then just upgrade:

    Welcome to:
    ______ _       _        _________________
    | ___ \ |     | |      /  ___|  _  \ ___ \
    | |_/ / |_   _| |_ ___ \ `--.| | | | |_/ /
    |  __/| | | | | __/ _ \ `--. \ | | |    /
    | |   | | |_| | || (_) /\__/ / |/ /| |\ \
    \_|   |_|\__,_|\__\___/\____/|___/ \_| \_|
    
    v0.32-dirty
    # unzip plutosdr-fw-v0.35.zip 
    Archive:  plutosdr-fw-v0.35.zip
      inflating: pluto.dfu
      inflating: uboot-env.dfu
      inflating: pluto.frm
      inflating: boot.dfu
      inflating: boot.frm
    # update_frm.sh ./pluto.frm
    165+1 records in
    165+1 records out
    Done
    # 
    # reboot

    Worked for me, I now have:

    Welcome to:
    ______ _       _        _________________
    | ___ \ |     | |      /  ___|  _  \ ___ \
    | |_/ / |_   _| |_ ___ \ `--.| | | | |_/ /
    |  __/| | | | | __/ _ \ `--. \ | | |    /
    | |   | | |_| | || (_) /\__/ / |/ /| |\ \
    \_|   |_|\__,_|\__\___/\____/|___/ \_| \_|
    
    v0.35

  • Thank you very much for going to the time and trouble to try this. Unfortunately neither a normal USB connection, nor SCP will see the Pluto. The only way to access it all is via a JTAG connection. A serial JTAG connection will get me to a "Pluto" prompt. But if I try run dfu_sf from such a prompt it says it doesn't know what the dfu_sf command is. I am beginning to wonder if this particular Pluto has some sort of electro-mechanical issue?

    When Analog Devices speak of a uboot console, what EXACTLY am I supposed to be seeing on screen to know I am indeed at a uboot console prompt?

    At the Pluto> prompt, if I type printenv I get this, but to me it doesn't mean a great deal.

    Pluto> printenv
    adi_loadvals=fdt addr ${fit_load_address} && fdt get value fdt_choosen /configurations/${fit_config}/ fdt && fdt get addr fdtaddr /images/${fdt_choosen} data && fdt addr ${fdtaddr}; if test -n ${ad936x_ext_refclk} && test ! -n ${ad936x_skip_ext_refclk}; then fdt set /clocks/clock@0 clock-frequency ${ad936x_ext_refclk}; fi; fdt get value model / model; if test -n ${ad936x_ext_refclk_override} && test "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)"; then fdt set /clocks/clock@0 clock-frequency ${ad936x_ext_refclk_override}; fi; if test ${refclk_source} = internal || test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)" ; then fdt rm /amba/gpio@e000a000/clock_extern_en; fi; if test -n ${attr_name} && test -n ${attr_val}; then fdt set /amba/spi@e0006000/ad9361-phy@0 ${attr_name} ${attr_val}; fi; if test ${refclk_source} = external || test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)" ; then fdt rm /amba/gpio@e000a000/clock_internal_en; fi; if test -n ${compatible} && test ! ${compatible} = ad9361 && test ! ${compatible} = ad9363a && test ! ${compatible} = ad9364; then setenv compatible ad9363a; saveenv; fi; if test -n ${mode} && test ! ${mode} = 1r1t && test ! ${mode} = 2r2t; then setenv mode 1r1t; saveenv; fi; if test -n ${refclk_source} && test ! ${refclk_source} = internal && test ! ${refclk_source} = external; then setenv refclk_source internal; saveenv; fi; if test -n ${compatible}; then fdt set /amba/spi@e0006000/ad9361-phy@0 compatible ${compatible}; fi; if test  ${compatible} = ad9361 && test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)" ; then fdt set /amba/spi@e0006000/ad9361-phy@0 compatible ad9363a; compatible=ad9363a; fi; if test ${mode} = 1r1t || test ! "${model}" = "Analog Devices PlutoSDR Rev.C (Z7010/AD9363)"; then fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; fi; if test -n ${cs_gpio}; then fdt set /amba/axi_quad_spi@7C430000/ cs-gpios "<0x06 ${cs_gpio} 0>"; fi; if test ${compatible} = ad9364 || test -n ${attr_val} = ad9364; then fdt rm /amba/spi@e0006000/ad9361-phy@0 adi,2rx-2tx-mode-enable; fdt set /fpga-axi/cf-ad9361-dds-core-lpc@79024000 compatible adi,axi-ad9364-dds-6.00.a; setenv mode 1r1t; saveenv; fi;
    attr_name=compatible
    attr_val=ad9364
    autoboot=1
    autoreboot=1
    baudrate=115200
    bitstream_image=system.bit.bin
    bitstream_size=0x400000
    boot_image=BOOT.bin
    boot_size=0xF00000
    bootcmd=run $modeboot
    bootdelay=0
    bootenv=uEnv.txt
    clear_reset_cause=mw f8000008 df0d && mw f8000258 00400000 && mw f8000004 767b
    compatible=ad9364
    datvset=callsign G8KOE;freq 2407.75;freqt 2407.75;harmonic off;channel 2407.75-333KS10;mode DVBS2;mod QPSK;sr 333;srselect 333;fec 23;pilots Off;frame LongFrame;power -6;rolloff 0.20;pcrpts 40;patperiod 100;h265box h265box;codec H264;sound On;audioinput line;remux 1;trvlo 0;trvloselect 0;provname P2.1-IS0GRB;tsinput udp://0.0.0.0:8282;offsetv +;freqoffset 0;bitaudio 48k;bitaudioselect 48k;sampleaudio 44100;audiochannels 2;maddress 192.168.1.76;maddressport 6789;lnbfreq 09750000;lnbvolts 18;antconnector A;modtype normal;bufferlatency;pttoffdelay off;pttoffdelaysec 8;;
    devicetree_image=devicetree.dtb
    devicetree_load_address=0x2000000
    devicetree_size=0x20000
    dfu_ram=echo Entering DFU RAM mode ... && run dfu_ram_info && dfu 0 ram 0
    dfu_ram_info=set dfu_alt_info dummy.dfu ram 0 0\\;firmware.dfu ram ${fit_load_address} 0x1E00000
    dfu_sf_info=set dfu_alt_info boot.dfu raw 0x0 0x100000\\;firmware.dfu raw 0x200000 0x1E00000\\;uboot-extra-env.dfu raw 0xFF000 0x1000\\;uboot-env.dfu raw 0x100000 0x20000\\;spare.dfu raw 0x120000 0xE0000
    ethaddr=00:0a:35:00:01:22
    extraenv_load_address=0x207E000
    fdt_choosen=fdt@2
    fdt_high=0x20000000
    fdtaddr=20841f4
    fdtcontroladdr=1ff99f50
    fit_config=config@9
    fit_load_address=0x2080000
    fit_size=1A5AFA3
    importbootenv=echo Importing environment from SD ...; env import -t ${loadbootenv_addr} $filesize
    initrd_high=0x20000000
    ipaddr=192.168.2.1
    ipaddr_host=192.168.2.10
    jtagboot=env default -a;sf probe && sf protect unlock 0 100000 && run dfu_sf;
    kernel_image=uImage
    loadbit_addr=0x100000
    loadbootenv=load mmc 0 ${loadbootenv_addr} ${bootenv}
    loadbootenv_addr=0x2000000
    mode=1r1t
    modeboot=qspiboot
    model=Analog Devices PlutoSDR Rev.B (Z7010/AD9363)
    netmask=255.255.255.0
    preboot=if test $modeboot = sdboot && env run sd_uEnvtxt_existence_test; then if env run loadbootenv; then env run importbootenv; fi; fi;
    qspiboot=set stdout nulldev;adi_hwref;test -n $PlutoRevA || gpio input 14 && set stdout serial@e0001000 && sf probe && sf protect lock 0 100000 && run dfu_sf;  set stdout serial@e0001000;itest *f8000258 == 480003 && run clear_reset_cause && run dfu_sf; itest *f8000258 == 480007 && run clear_reset_cause && run ramboot_verbose; itest *f8000258 == 480006 && run clear_reset_cause && run qspiboot_verbose; itest *f8000258 == 480002 && run clear_reset_cause && exit; echo Booting silently && set stdout nulldev; run read_sf && run adi_loadvals; envversion;setenv bootargs console=ttyPS0,115200 maxcpus=${maxcpus} rootfstype=ramfs root=/dev/ram0 rw quiet loglevel=4 uboot="${uboot-version}" && bootm ${fit_load_address}#${fit_config} || set stdout serial@e0001000;echo BOOT failed entering DFU mode ... && sf protect lock 0 100000 && run dfu_sf
    qspiboot_extraenv=sf read ${extraenv_load_address} 0xFF000 0x1000 && env import -c ${extraenv_load_address} 0x1000 || true
    qspiboot_verbose=adi_hwref;echo Copying Linux from QSPI flash to RAM... && run read_sf && if run adi_loadvals; then echo Loaded AD936x refclk frequency and model into devicetree; fi; envversion;setenv bootargs console=ttyPS0,115200 maxcpus=${maxcpus} rootfstype=ramfs root=/dev/ram0 rw earlyprintk uboot="${uboot-version}" && bootm ${fit_load_address}#${fit_config} || echo BOOT failed entering DFU mode ... && run dfu_sf
    ramboot_verbose=adi_hwref;echo Copying Linux from DFU to RAM... && run dfu_ram;if run adi_loadvals; then echo Loaded AD936x refclk frequency and model into devicetree; fi; envversion;setenv bootargs console=ttyPS0,115200 maxcpus=${maxcpus} rootfstype=ramfs root=/dev/ram0 rw earlyprintk uboot="${uboot-version}" && bootm ${fit_load_address}#${fit_config}
    ramdisk_image=uramdisk.image.gz
    ramdisk_load_address=0x4000000
    ramdisk_size=0x400000
    read_sf=sf probe 0:0 50000000 0 && run qspiboot_extraenv &&sf read ${fit_load_address} 0x200000 ${fit_size} && iminfo ${fit_load_address} || sf read ${fit_load_address} 0x200000  0x1E00000;
    refclk_source=internal
    run=dfu.sf
    sd_uEnvtxt_existence_test=test -e mmc 0 /uEnv.txt
    stderr=serial@e0001000
    stdin=serial@e0001000
    stdout=serial@e0001000
    thor_ram=run dfu_ram_info && thordown 0 ram 0
    uenvboot=if run loadbootenv; then echo Loaded environment from ${bootenv}; run importbootenv; fi; if test -n $uenvcmd; then echo Running uenvcmd ...; run uenvcmd; fi
    usbboot=if usb start; then run uenvboot; echo Copying Linux from USB to RAM... && load usb 0 ${fit_load_address} ${kernel_image} && load usb 0 ${devicetree_load_address} ${devicetree_image} && load usb 0 ${ramdisk_load_address} ${ramdisk_image} && bootm ${fit_load_address} ${ramdisk_load_address} ${devicetree_load_address}; fi

    Environment size: 7240/131068 bytes
    Pluto>

    Thanks again, much appreciated, but sadly i am still stuck :(

  • Sorry to hear you are having issues.

    I added a little bit of text here:

    https://wiki.analog.com/university/tools/pluto/users/firmware

    1) make sure you have all the drivers installed - or nothing will work. What host are you on?

  • Hi Thanks for your reply. I am on Windows 10 64 bit and that sees my own two Plutos either on the LAN or via direct USB. I tried the faulty one of my friend on two other PC's both Win 7 64 bit, (all of them see my 2 Plutos), and neither USB nor a LAN connection will see it.

    The odd thing is a paper clip appears to put in dfu mode, but dfu-util -l doesn't see it and it is not showing in Device Manager. Just plugging into a USB port, and I have tried a few different cables, does not get it show as any sort of mass storage device.

    The ONLY way i can get a response from it is via JTAG, where Xilinx software sees it and a serial JTAG connection will both show the normal ascii Pluto log in and by using device_reboot break and hitting the numeric zero key a few times to stop it booting again in "normal" mode, I can get it to a Pluto> prompt

    I am not sure what to try at a Pluto> prompt as there seems no way of getting it to read anything off the host PC.

    I am wondering if the USB side of things is faulty, but I have checked continuit from the far end of a USB cable right through D1 and D2 and L6, but maybe whatever USB chip is used is damaged? I know my friend is an extremely careful and electronically very savvy guy, so would be surprised if he'd done anything daft. I resuurected one of my own Plutos from a similar state with JTAG - Xilinx - and fiddling at the Pluto> prompt, but probably good luck than good management! Slight smile

    Any further help much appreciated, thank you Robin (I think I have your name right, my apologies if not).