> 
> 
> 

# Build and flash images

The QCC730 SDK includes the source code of several demo applications. Follow the instructions in the following sections to build the required images for QCLI Demo and flash them to the QCC730M EVK.

1. Build the required images for the demo application.
2. Flash images to QCC730M.
3. Program the Wi-Fi MAC address to QCC730M.

## Build QCC730 images

You can build QCC730 images by using one of the following methods:

- QCC IDE (Windows only)

    Use the QCC IDE to build images through a user-friendly graphical interface. For details about how to use the QCC IDE, see [QCC IDE for QCC730 User Guide (80-Y8730-9)](https://docs.qualcomm.com/bundle/publicresource/topics/80-Y8730-9).
- `qccsdk.py` script (Windows or Linux)

    Use the `qccsdk.py` script provided in the QCC730 SDK to build images from the command line. The following procedure shows how to use this script to build QCC730 images.

All images are prebuilt in the SDK. These images are in the `.\output` directory.

To prevent errors, make sure the path to the QCC730 SDK only contains English letters and doesn’t contain spaces.

### Build images using `qccsdk.py`

The following sections show how to build QCC730 images for the iPA version of QCC730M. To build images for the xPA version, use the `-b=mqm730x` parameter in the related commands. For details about how to use `qccsdk.py`, see [QCC730.FR.1.0 Programming Guide](https://docs.qualcomm.com/doc/80-Y8730-2/topic/sdk_tools_for_building_and_flashing_images.html#qccsdk_py).

#### Build the QCLI Demo image

Perform the following steps to build the QCLI Demo image for QCC730M:

1. Run the following command to set the board type:

python qccsdk.py set -b=mqm730i
        Copy to clipboard
2. Run the following command to set the demo to build:

python qccsdk.py set -S=demo/qcli_demo
        Copy to clipboard
3. Run the following command to build the image:

python qccsdk.py build --rebuild
        Copy to clipboard

Or, you can combine the above three commands into one:

python qccsdk.py set -S=demo/qcli_demo -b=mqm730i build
    Copy to clipboard

By default, the generated image is in the following directory:

`.\qccsdk\output\mqm730i\FERMION_IOE_QCLI_DEMO\DEBUG\bin`

#### Build the SBL image

Run the following command to build the SBL image for QCC730M:

python qccsdk.py set -S=sbl -b=mqm730i build
    Copy to clipboard

By default, the generated image is in the following directory:

`.\output\mqm730i\FERMION_SBL\DEBUG\bin`

#### Build the NVM Programmer image

Run the following command to build the NVM Programmer image for QCC730M:

python qccsdk.py set -S=prg -b=mqm730i build
    Copy to clipboard

By default, the generated image is in the following directory:

`.\output\mqm730i\FERMION_NVM_PROGRAMMER\DEBUG\bin`

## Flash QCC730 images

You can flash QCC730 images by using one of the following methods:

- QCC IDE (Windows only): Use the QCC IDE to flash images through a user-friendly graphical interface. For details about how to use the QCC IDE, see [QCC IDE for QCC730 User Guide (80-Y8730-9)](https://docs.qualcomm.com/bundle/publicresource/topics/80-Y8730-9).
- `qccsdk.py` or `nvm_programmer.py` script (Windows or Linux): Use the `qccsdk.py` or `nvm_programmer.py` script provided in the QCC730 SDK to flash images from the command line. For details about how to use them to flash QCC730 images, see [Flash images using qccsdk.py or nvm\_programmer.py](https://docs.qualcomm.com/doc/80-Y8730-251/topic/build_flash_images.html#flash-command-usage).

All images are prebuilt in the SDK and are available in the `.\output` directory.

To prevent errors, make sure the path to the QCC730 SDK only contains English letters and doesn’t contain spaces.

The QCC730 SDK includes the firmware description table (FDT), secondary boot loader (SBL), board data file (BDF), firmware descriptor (FWD), Factory Test Mode (FTM), and QCLI Demo images, which you can flash to the QCC730M EVK. See the following table for more information about image files:

Table: Image file path and offset

| Image name | NVM offset | NVM location | Description | File name |
| --- | --- | --- | --- | --- |
| FDT | 0x208000 | RRAM | Firmware description table | `frn_curr_age_default.bin` for demos<br><br><br>`frn_curr_age_with_app_bin.bin` for FTM |
| SBL\_A | 0x20a400 | RRAM | Secondary boot loader | `FERMION_SBL_HASHED.elf` |
| SBL\_B | 0x212400 | RRAM | Secondary boot loader | `FERMION_SBL_HASHED.elf` |
| FTM | 0x21A400 | RRAM | Factory Test Mode | `FERMION_FTM.bin` |
| BDF | 0x37A000 | RRAM | Board data file | `mqm730i.bin` for iPA QCC730M<br><br><br>`mqm730x.bin` for xPA QCC730M |
| FWD | 0x000000 | Flash | Firmware descriptor | `firmware_table.bin` |
| QCLI Demo | 0x043000<br>(default address) | Flash | Console image | `FERMION_IOE_QCLI_DEMO_HASHED.elf` |

### Flash images using `qccsdk.py` or `nvm_programmer.py`

This section describes how to use the `qccsdk.py` or `nvm_programmer.py` script to flash images to the QCC730M EVK.

#### Prerequisites

- Ensure that NVM Programmer, SBL, and one of the three demos (`hello_world`, `qcli_demo`, `posix_demo`) have been compiled successfully before flashing.
- If you use Linux, follow these steps to add rules for the USB interface that connects to the QCC730M EVK. You must complete these steps before you flash images using the `qccsdk.py` or `nvm_programmer.py` script.

    1. Check the device ID information (<cite>idVendor</cite> and <cite>idProduct</cite>) by running the following command:

lsusb
            Copy to clipboard

        In the following example output of the <cite>lsusb</cite> command, <cite>1a86</cite> is <cite>idVendor</cite> and <cite>55de</cite> is <cite>idProduct</cite>.

Bus 003 Device 004: ID 1a86:55de QinHeng Electronics UART+SPI+I2C+JTAG
            Copy to clipboard
    2. Create a new file named `99-usb.rules` in the `/etc/udev/rules.d/` directory and add the following lines into the file:

SUBSYSTEM=="usb", ATTR{idVendor}=="1a86", MODE="0666"
            SUBSYSTEM=="usb", ATTR{idVendor}=="1a86", ATTR{idProduct}=="55de", MODE="0666"
            Copy to clipboard

Note

<cite>1a86</cite> and <cite>55de</cite> are only example values; replace them with your actual <cite>idVendor</cite> and <cite>idProduct</cite> values.

#### Flash images using `qccsdk.py`

The `qccsdk.py` file is in the `.\qccsdk` folder. Use the following commands to flash QCC730 images to QCC730M:

- Flash all five images (FDT, SBL\_A, SBL\_B, FWD, QCLI Demo) to a QCC730 board by using the following command:

python qccsdk.py set -S=demo/qcli_demo flash --flash --reset
        Copy to clipboard
- Flash the board data file (BDF) into the board and reset (flash it only if the board doesn’t have the BDF):

python qccsdk.py flash --bdf --reset
        Copy to clipboard

Note

Before flashing the BDF into the board, check the BDF calibration protection flag `BDF_CALIBRATION_FLAG`.

    - If the flag is `0`, you can use this command to flash the BDF.
    - If the flag is `1`, you must use the `nvm_programmer.py` with the `--force` argument to flash the BDF.

For details, see [QCC730.FR.1.0 Programming Guide (80-Y8730-2)](https://docs.qualcomm.com/doc/80-Y8730-2/topic/sdk_tools_for_building_and_flashing_images.html#bdf_calibration_protection).
- OpenOCD is the default mode for flashing images. To use a separate JLINK adapter to flash boards, run the following command:

qccsdk.py set --jtag=jlink
        Copy to clipboard

#### Flash images using `nvm_programmer.py`

The `nvm_programmer.py` file is in the `.\qccsdk\tools\nvm_programmer\script` folder. The syntax for flashing an image is as follows:

python nvm_programmer.py -b <nvm_offset> -f <filepath> -s <jtag_option>
    Copy to clipboard

For details about how to use the `nvm_programmer.py` script, see [QCC730.FR.1.0 Programming Guide (80-Y8730-2)](https://docs.qualcomm.com/doc/80-Y8730-2/topic/sdk_tools_for_building_and_flashing_images.html#qcc730_nvm_programmer).

Image addresses are fixed and shouldn’t be changed, except for the QCLI Demo. You can modify the QCLI Demo address if your configuration is different.

**Command examples**

The following command examples show how to use the `nvm_programmer.py` script on Windows and Linux.

Tab Windows
Tab Linux

The following examples show how to use the `nvm_programmer.py` script to flash images on Windows. Each command flashes a single image. To prevent failures, make sure you flash all the mentioned images in either of the following groups. Image addresses (except for QCLI\_DEMO) are fixed. Don’t change these addresses. The QCLI\_DEMO address may be modified if the configuration is different.

**Command examples for flashing FDT, SBL\_A, SBL\_B, and QCLI Demo:**

Command examples for flashing FDT, SBL_A, SBL_B, and QCLI Demo

| Command | Description |
| --- | --- |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x208000 -f ..\..\storage\firmware_desc_table\curr_age_fdt\frn_curr_age_default.bin` | Program FDT image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x20a400 -f ..\..\..\output\mqm730i\FERMION_SBL\DEBUG\bin\FERMION_SBL_HASHED.elf` | Program SBL\_A image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x212400 -f ..\..\..\output\mqm730i\FERMION_SBL\DEBUG\bin\FERMION_SBL_HASHED.elf` | Program SBL\_B image |
| `python nvm_programmer.py -s ch347 --nvm-name flash -b 0x043000 -P -f ..\..\..\output\mqm730i\FERMION_IOE_QCLI_DEMO\DEBUG\bin\FERMION_IOE_QCLI_DEMO_HASHED.elf` | Program QCLI\_DEMO image |

Note

After you flash `FERMION_IOE_QCLI_DEMO_HASHED.elf`, power cycle or reset the board.

**Command examples for flashing FDT, SBL\_A, SBL\_B, and FTM:**

Command examples for flashing FDT, SBL_A, SBL_B, and FTM

| Command | Description |
| --- | --- |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x208000 -f ..\..\storage\firmware_desc_table\curr_age_fdt\frn_curr_age_with_app_bin.bin` | Program FDT image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x20a400 -f ..\..\..\output\mqm730i\FERMION_SBL\DEBUG\bin\FERMION_SBL_HASHED.elf` | Program SBL\_A image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x212400 -f ..\..\..\output\mqm730i\FERMION_SBL\DEBUG\bin\FERMION_SBL_HASHED.elf` | Program SBL\_B image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x21A400 -f ..\..\..\output\mqm730i\FERMION_FTM\DEBUG\bin\FERMION_FTM.bin` | Program FTM image |

The following examples show how to use the `nvm_programmer.py` script to flash images on Linux. Each command flashes a single image. To prevent failures, make sure you flash all the mentioned images. Image addresses (except for QCLI\_DEMO) are fixed. Don’t change these addresses. The QCLI\_DEMO address may be modified if the configuration is different.

Command examples for using the :file:`nvm_programmer.py` script to flash images on Linux

| Command | Description |
| --- | --- |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x208000 -f ../../storage/firmware_desc_table/curr_age_fdt/frn_curr_age_with_app_bin.bin` | Program FDT image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x37a000 -f ../../../modules/wifi/bin/mqm730i.bin` | Program BDF |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x20a400 -f ../../../output/mqm730i/FERMION_SBL/DEBUG/bin/FERMION_SBL_HASHED.elf` | Program SBL\_A image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x212400 -f ../../../output/mqm730i/FERMION_SBL/DEBUG/bin/FERMION_SBL_HASHED.elf` | Program SBL\_B image |
| `python nvm_programmer.py -s ch347 --nvm-name rram -b 0x21a400 -f ../../../output/mqm730i/FERMION_IOE_QCLI_DEMO/DEBUG/bin/FERMION_IOE_QCLI_DEMO.bin --reset` | Program QCLI\_DEMO image |

Note

After you flash `FERMION_IOE_QCLI_DEMO.bin`, power cycle or reset the board.

## Program Wi-Fi MAC address

Every QCC730 device that uses WLAN must be assigned a unique 6‑byte WLAN MAC address. The WLAN MAC address is stored in the One-Time Programmable (OTP) memory. You can program the MAC address by using the `nvm_programmer.py` tool.

### Prerequisites

- Prepare the `FERMION_NVM_PROGRAMMER.elf` file, which is required by the `nvm_programmer.py` script. The default location of this file is `..\bin\FERMION_NVM_PROGRAMMER.elf` (relative to the location of `nvm_programmer.py`).
- Prepare the `nvm_programmer.py` file. The default location of this file is `tools\nvm_programmer\script\`.

The following command examples show how to read and write the Wi-Fi MAC address by using the `nvm_programmer.py` tool.

Note

These examples assume that you connect the QCC730M EVK using CH347. If you connect the QCC730M EVK using J-Link, change the command parameter `-s ch347` to `-s jlink`.

- Set OTP by the `config.yaml` file:

python nvm_programmer.py -s ch347 --config config.yaml
        Copy to clipboard
- Set OTP by the key-value pair:

python nvm_programmer.py -s ch347 -n otp -k MAC_ADDRESSES=0x101010101010
        Copy to clipboard

Note

If you set `0x101010101010` to MAC\_ADDRESSES, then MAC\_ADDRESSES is `0x101010101010` for the SAP mode, and `0x101010101011` (+1) for the STA mode.
- Get OTP value by key:

python nvm_programmer.py -s ch347 -n otp -g MAC_ADDRESSES
        Copy to clipboard

Last Published: Jun 16, 2026

[Previous Topic
Set up the development environment](https://docs.qualcomm.com/bundle/publicresource/80-Y8730-251/topics/environment_setup.md) [Next Topic
Develop a sample application](https://docs.qualcomm.com/bundle/publicresource/80-Y8730-251/topics/dev_sample_app.md)