# DFU from host through SPI

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

QCC730 supports the device firmware upgrade (DFU) feature. This feature can replace the image in QCC730’s RRAM with the new image stored on the host.

This chapter introduces the procedures to perform DFU, but doesn't introduce how the host gets the new image.

## DFU from Linux host

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

Note: This feature is available since the QCC730.FR.1.0 Post-CS 2 release.

Apart from the upgrade methods mentioned in [QCC730 OTA upgrade](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade.html) and [QCC730 NVM Programmer](https://docs.qualcomm.com/doc/80-Y8730-2/topic/sdk_tools_for_building_and_flashing_images.html#qcc730_nvm_programmer), QCC730 also provides the device firmware upgrade (DFU) function and process to support firmware upgrade through SPI. For details about the hardware information of SPI on QCC730, see [Hosted mode over SPI](https://docs.qualcomm.com/doc/80-Y8730-2/topic/use_spi_for_hosted_mode.html). From the hardware perspective, the communication interface is an SPI device. Therefore, the common solution is using `spidev` under Linux for the host demo to start data transfer. [Figure : DFU block](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html#dfu_from_linux_host__fig_dfu_block) shows the overall block diagram for the DFU process.

Figure : DFU block
            
            <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export dfu_block.svg DFU_block -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" width="5.76302in" height="7.38021in" viewbox="0 0 414.937 531.375" xml:space="preserve" color-interpolation-filters="sRGB" class="st16"><style>.svg-1 .st1 { fill: #ffffff; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75; letter-spacing: normal }
.svg-1 .st2 { fill: #f7f8fa; stroke: #f7f8fa; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st3 { fill: #ffffff; stroke: #d8d8d8; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st4 { fill: #000000; font-family: Arial; font-size: 1.08334em; letter-spacing: normal }
.svg-1 .st5 { fill: #7ba0ff; stroke: #b0c6ff; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st6 { fill: #3253dc; stroke: #d8d8d8; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st7 { fill: #ffffff; font-family: Arial; font-size: 1.08334em; letter-spacing: normal }
.svg-1 .st8 { font-size: 1em; letter-spacing: normal; font-family: Arial }
.svg-1 .st9 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st10 { fill: #000000; font-family: Arial; font-size: 1.5em; letter-spacing: normal }
.svg-1 .st11 { stroke: #595959; stroke-dasharray: 3, 3; stroke-linecap: round; stroke-linejoin: round; stroke-width: 1 }
.svg-1 .st12 { fill: #acbacf; stroke: #acbacf; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st13 { fill: #000000; font-family: Arial; font-size: 1.16666em; letter-spacing: normal }
.svg-1 .st14 { marker-end: url("#1-mrkr4-73"); marker-start: url("#1-mrkr4-71"); stroke: #000000; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st15 { fill: #000000; fill-opacity: 1; stroke: #000000; stroke-opacity: 1; stroke-width: 0.22935779816514 }
.svg-1 .st16 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<defs id="Markers">	<g id="lend4">		<path d="M 2 1 L 0 0 L 2 -1 L 2 1 " style="stroke:none"></path>	</g>	<marker id="1-mrkr4-71" class="st15" refx="8.24" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(4.36) "></use>	</marker>	<marker id="1-mrkr4-73" class="st15" refx="-8.72" orient="auto" markerunits="strokeWidth" overflow="visible">		<use xlink:href="#lend4" transform="scale(-4.36,-4.36) "></use>	</marker></defs><g>	<title>DFU_block</title>	<g id="shape55-1" transform="translate(-4.50004,4.5)">		<title>Sheet.55</title>		<rect x="0" y="-8.62501" width="423" height="540" class="st1"></rect>	</g>	<g id="shape54-3" transform="translate(0,-0.375)">		<title>Sheet.54</title>		<rect x="0" y="288.375" width="414" height="243" rx="14.4" ry="14.4" class="st2"></rect>	</g>	<g id="shape52-5" transform="translate(0,-261.375)">		<title>Sheet.52</title>		<rect x="0" y="261.75" width="414" height="269.625" rx="14.4" ry="14.4" class="st2"></rect>	</g>	<g id="shape1-7" transform="translate(107.724,-491.792)">		<title>Sheet.1</title>		<desc>DFU demo</desc>		<rect x="0" y="504.648" width="130.017" height="26.7273" rx="3.6" ry="3.6" class="st3"></rect>		<text x="33.58" y="521.91" class="st4">DFU demo</text>		</g>	<g id="shape29-10" transform="translate(107.724,-445.715)">		<title>Sheet.29</title>		<desc>Host DFU protocol</desc>		<rect x="0" y="504.648" width="130.017" height="26.7273" rx="3.6" ry="3.6" class="st3"></rect>		<text x="11.55" y="521.91" class="st4">Host DFU protocol</text>		</g>	<g id="shape30-13" transform="translate(110.215,-398.865)">		<title>Sheet.30</title>		<desc>Ring buffer</desc>		<rect x="0" y="504.648" width="125.035" height="26.7273" rx="3.6" ry="3.6" class="st5"></rect>		<text x="30.72" y="521.91" class="st4">Ring buffer</text>		</g>	<g id="shape32-16" transform="translate(107.724,-325.019)">		<title>Sheet.32</title>		<desc>QCSPI device driver</desc>		<rect x="0" y="504.648" width="130.017" height="26.7273" rx="3.6" ry="3.6" class="st3"></rect>		<text x="6.13" y="521.91" class="st4">QCSPI device driver</text>		</g>	<g id="shape35-19" transform="translate(110.215,-202.831)">		<title>Sheet.35</title>		<desc>QCSPI interface</desc>		<rect x="0" y="504.648" width="125.035" height="26.7273" rx="3.6" ry="3.6" class="st5"></rect>		<text x="15.55" y="521.91" class="st4">QCSPI interface</text>		</g>	<g id="shape36-22" transform="translate(110.215,-166.558)">		<title>Sheet.36</title>		<desc>Ring buffer</desc>		<rect x="0" y="504.648" width="125.035" height="26.7273" rx="3.6" ry="3.6" class="st5"></rect>		<text x="30.72" y="521.91" class="st4">Ring buffer</text>		</g>	<g id="shape37-25" transform="translate(19.25,-127.409)">		<title>Sheet.37</title>		<desc>Firmware adapt layer</desc>		<rect x="0" y="501.772" width="153.483" height="29.6034" rx="3.6" ry="3.6" class="st3"></rect>		<text x="15.69" y="520.47" class="st4">Firmware adapt layer</text>		</g>	<g id="shape38-28" transform="translate(221.509,-126.765)">		<title>Sheet.38</title>		<desc>SBL DFU loader</desc>		<rect x="0" y="501.772" width="153.483" height="29.6034" rx="3.6" ry="3.6" class="st3"></rect>		<text x="29.42" y="520.47" class="st4">SBL DFU loader</text>		</g>	<g id="shape39-31" transform="translate(19.25,-70.5819)">		<title>Sheet.39</title>		<desc>Wi-Fi driver</desc>		<rect x="0" y="501.772" width="153.483" height="29.6034" rx="3.6" ry="3.6" class="st3"></rect>		<text x="43.52" y="520.47" class="st4">Wi-Fi driver</text>		</g>	<g id="shape40-34" transform="translate(266.991,-97.1616)">		<title>Sheet.40</title>		<desc>RRAM access</desc>		<rect x="0" y="501.772" width="108" height="29.6034" rx="3.6" ry="3.6" class="st6"></rect>		<text x="12.83" y="520.47" class="st7">RRAM access</text>		</g>	<g id="shape41-37" transform="translate(266.991,-67.5582)">		<title>Sheet.41</title>		<desc>cMEM access</desc>		<rect x="0" y="501.772" width="108" height="29.6034" rx="3.6" ry="3.6" class="st6"></rect>		<text x="13.55" y="520.47" class="st7">cMEM access</text>		</g>	<g id="shape42-40" transform="translate(19.25,-16.8147)">		<title>Sheet.42</title>		<desc>Firmware components/stack</desc>		<rect x="0" y="488.272" width="153.483" height="43.1034" rx="3.6" ry="3.6" class="st6"></rect>		<text x="49.66" y="505.92" class="st7">Firmware <tspan x="24.35" dy="1.2em" class="st8">components/stack</tspan></text>		</g>	<g id="shape44-44" transform="translate(35.9652,-275.656)">		<title>Sheet.44</title>		<desc>SPI bus</desc>		<rect x="0" y="504.648" width="273.535" height="26.7273" rx="3.6" ry="3.6" class="st5"></rect>		<text x="114" y="521.91" class="st4">SPI bus</text>		</g>	<g id="shape48-47" transform="translate(312.75,-275.656)">		<title>Sheet.48</title>		<desc>Linux</desc>		<rect x="0" y="511.375" width="90" height="20" class="st9"></rect>		<text x="42.97" y="526.78" class="st10">Linux</text>		</g>	<g id="shape49-50" transform="translate(312.75,-16.125)">		<title>Sheet.49</title>		<desc>QCC730</desc>		<rect x="0" y="511.375" width="90" height="20" class="st9"></rect>		<text x="15.97" y="526.78" class="st10">QCC730</text>		</g>	<g id="shape50-53" transform="translate(1.5,-379.019)">		<title>Dynamic connector.50</title>		<path d="M0 522.37 L411.75 522.37" class="st11"></path>	</g>	<g id="shape31-56" transform="translate(127.733,-352.019)">		<title>Sheet.31</title>		<desc>spidev 0</desc>		<rect x="0" y="508.289" width="90" height="23.086" rx="7.2" ry="7.2" class="st12"></rect>		<text x="20.79" y="523.73" class="st4">spidev 0</text>		</g>	<g id="shape56-59" transform="translate(282.635,-407.5)">		<title>Sheet.56</title>		<desc>User space</desc>		<rect x="0" y="511.375" width="124.615" height="20" class="st9"></rect>		<text x="49.81" y="525.58" class="st13">User space</text>		</g>	<g id="shape57-62" transform="translate(282.635,-353.927)">		<title>Sheet.57</title>		<desc>Kernel space</desc>		<rect x="0" y="511.375" width="124.615" height="20" class="st9"></rect>		<text x="38.9" y="525.58" class="st13">Kernel space</text>		</g>	<g id="shape59-65" transform="translate(163.733,-491.792)">		<title>Dynamic connector</title>		<path d="M9 537.55 L9 537.91 L9 544.18" class="st14"></path>	</g>	<g id="shape60-74" transform="translate(163.733,-445.715)">		<title>Dynamic connector.60</title>		<path d="M9 537.55 L9 537.91 L9 544.96" class="st14"></path>	</g>	<g id="shape62-81" transform="translate(163.733,-398.865)">		<title>Dynamic connector.62</title>		<path d="M9 537.55 L9 537.91 L9 548.59" class="st14"></path>	</g>	<g id="shape63-88" transform="translate(163.733,-325.019)">		<title>Dynamic connector.63</title>		<path d="M9 537.55 L9 537.91 L9 547.47" class="st14"></path>	</g>	<g id="shape64-95" transform="translate(163.733,-275.656)">		<title>Dynamic connector.64</title>		<path d="M9 537.55 L9 537.91 L9 570.93" class="st14"></path>	</g>	<g id="shape66-102" transform="translate(86.9913,-127.409)">		<title>Dynamic connector.66</title>		<path d="M9 537.55 L9 537.91 L9 552.06" class="st14"></path>	</g></g>
</svg>

### DFU from Raspberry Pi 4

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

The following demonstration uses Raspberry Pi 4 as the Linux host. QCC730 SDK provides a
            DFU host module for upgrading firmware via SPI using Raspberry Pi 4. [Figure : Pin layout of Raspberry Pi 4](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html#dfu_host_on_raspberry_pi_4__fig_rsp4_pins)
            shows the corresponding SPI pins (GPIO8, GPIO9, GPIO10, and GPIO11).

Figure : Pin layout of Raspberry Pi 4
            
            ![](data:image/png;base64,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)

The Linux DFU host demo codes are as follows:

    >-- comp
    |   >-- exhost
    |   >-- host_linux_dfu
    |       >--linux_app_dfu.c
    |       >--Makefile
    |       >--Service
    |          >--fermion_cmn_api.h
    |          >--fermion_dfu_api.h
    |          >--fermion_table_api.h
    |          >--qcspi_driver.c
    |          >--qcspi_driver.h
    |          >--qcspi_hal.c
    |          >--qcspi_hal.hCopy to clipboard

To compile the DFU host, copy the host\_linux\_dfu folder to the root
            directory of Raspberry Pi 4 and run the `make` command:

    cd  \<your_root_directory_on_raspberry_pi>\host_linux_dfu
    makeCopy to clipboard

The compiled output targets are as follows:

    >-- host_linux_dfu 
    |   >--output
    |        >--linux_app_dfu.o
    |        >--qcc730_main
    |        >--qcspi_driver.o
    |        >--qcspi_hal.oCopy to clipboard

### Prepare QCC730 hosted SBL image

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

Follow these steps to prepare an SBL image for the DFU process.

1. Build a hosted SBL image by using the following command:

        python build.py -i FERMION_HOSTED_SBL -b mqm730i -o output\mqm730iCopy to clipboard
2. Flash the image to the QCC730 board:

        python nvm_programmer.py -b 0x20a400 -f Z:\<your_local_repo> \output\mqm730i\FERMION_HOSTED_SBL\DEBUG\bin\FERMION_HOSTED_SBL_HASHED.elf -s ch347Copy to clipboard

### Upgrade, reset, and boot via SPI

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

Copy the image to be flashed to the
                host\_linux\_dfu\output\qcc730\_main folder and flash it by using
                output\qcc730\_main with the `-f` argument, as
            shown in the following examples:

- To flash an APP image:

        output\qcc730_main -f FERMION_IOE_QCLI_DEMO.binCopy to clipboard
- To flash a BDF file:

        output\qcc730_main -f bdwlan03.binCopy to clipboard

After the flashing is complete, boot the image with the `-b` argument:

    output\qcc730_main -bCopy to clipboard

Moreover, you can simply reset the QCC730 board with the `-r`
            argument:

    output\qcc730_main -rCopy to clipboard

## DFU from RTOS host

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

Note: This feature is available since the QCC730.FR.1.0 Post-CS 4 release.

This section explains how to perform DFU from an RTOS host. As an example, this section uses an STM32 board to demonstrate the process. You need the following software and hardware to perform the example DFU process in this section:

- The STM32CubeProgrammer software

    Follow the instructions on the following website to install the software:

    [https://www.st.com/en/development-tools/stm32cubeprog.html](https://www.st.com/en/development-tools/stm32cubeprog.html)
- An STM32 development board
- A QCC730M board

For more information about how to set up and connect the STM32 and QCC730M boards, see [Hosted mode over SPI](https://docs.qualcomm.com/doc/80-Y8730-2/topic/use_spi_for_hosted_mode.html).

### Flash DFU image to the STM32 board

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

Flash the new QCC730 image to the flash memory of the STM32 board by using the STM32CubeProgrammer. It's recommended to flash the image to the space starting from 0x08040000 to match the default DFU flow settings.

For details about how to flash image using STM32CubeProgrammer, see the software's documentation.

### Set up QCC730 hosted SBL for DFU

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

The DFU feature requires the hosted SBL on QCC730M. Follow these steps to build the hosted SBL and flash it to QCC730M.

1. Build a hosted SBL image.

        python build.py -i FERMION_HOSTED_SBL -b mqm730x -o output/mqm730xCopy to clipboard
2. Flash the hosted SBL image to QCC730M.

        py nvm_programmer.py -s ch347 --nvm-name rram -b 0x20a400 -f ..\..\..\output\mqm730x\FERMION_HOSTED_SBL\DEBUG\bin\FERMION_HOSTED_SBL_HASHED.elf
        py nvm_programmer.py -s ch347 --nvm-name rram -b 0x212400 -f  ..\..\..\output\mqm730x\FERMION_HOSTED_SBL\DEBUG\bin\FERMION_HOSTED_SBL_HASHED.elfCopy to clipboard
3. Verify if the hosted SBL image is flashed successfully. 
    The following message appears in the terminal upon a successful flash of the hosted SBL image:

        SBL SBL wait host CMDCopy to clipboard

### DFU flow for RTOS host

Source: [https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html](https://docs.qualcomm.com/doc/80-Y8730-2/topic/firmware_upgrade_via_spi.html)

To perform DFU for QCC730M from STM32, you can use the DFU AT commands. For details about how to use these DFU AT commands, see [QCC730 AT Commands User Guide (80-Y8730-10)](doc/80-Y8730-10).

### Customize the DFU flow

The DFU flow calls the following API to register the handler for reading image:

    void register_dfu_func(read_func_t func)Copy to clipboard

By default, the following function is registered:

    void read_flash(uint32_t address, uint8_t *buffer, uint32_t size)Copy to clipboard

You can also define and register your own image reading function. The prototype of the function is as follows:

    typedef void (*read_func_t)(uint32_t address, uint8_t *buffer, uint32_t size);Copy to clipboard

If you want to use a different space on STM32 to store the QCC730 image, specify the starting address by updating the `BIN_ADDR_AT_FLASH` setting in the dfu.c file. The following code shows the default setting:

    #define BIN_ADDR_AT_FLASH 0x08040000Copy to clipboard

Last Published: Jun 03, 2026

[Previous Topic
Power test demo](https://docs.qualcomm.com/bundle/publicresource/80-Y8730-2/topics/power_test_demo.md) [Next Topic
AT command](https://docs.qualcomm.com/bundle/publicresource/80-Y8730-2/topics/at_command.md)