> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Flash Qualcomm Linux using QDL

> Use the Qualcomm Device Loader (QDL) command-line tool to flash Qualcomm Linux onto the IQ-9075 EVK from Ubuntu, Windows, or macOS hosts.

**Qualcomm Device Loader (QDL)** is a cross-platform command-line flashing tool for Qualcomm devices. Use this method when you need full control over the flash process, are running in a headless environment, or want to script automated flashing.

For a GUI-based alternative, see [**Flash Qualcomm Linux using Qualcomm Launcher**](./flash-using-qualcomm-launcher).

<Warning>
  Flashing erases all data on the device. Back up anything important before you begin.
</Warning>

## What you need

* IQ-9075 EVK with 12 V power supply
* USB Type-C cable (USB0 port on the EVK → host computer)
* Host computer running Ubuntu, Windows, or macOS

## Select your host OS and follow the complete path

Download QDL for your host OS from the [**Qualcomm Software Center**](https://softwarecenter.qualcomm.com/catalog/item/Qualcomm_Device_Loader).

<Tabs>
  <Tab title="Ubuntu">
    ### Download the Qualcomm Linux image

    1. Download the [**Qualcomm Linux image**](https://artifacts.codelinaro.org/artifactory/qli-ci/flashable-binaries/meta-qcom/qcom-distro-sota/iq-9075-evk/qli-2.0-qcom-multimedia-proprietary-image.zip).

    2. Extract the zip file. The flashable artifacts are in:
       ```text theme={null}
       <path-to-image>/images/iq-9075-evk/qcom-multimedia-proprietary-image-iq-9075-evk/
       ```
       Where `<path-to-image>` is the folder created when you extracted the image zip.

    ### Download QDL

    1. Download the [QDL tool for Linux (x64)](https://softwarecenter.qualcomm.com/catalog/item/Qualcomm_Device_Loader) and unzip it. The unzipped folder contains the `qdl` binary — referred to as `<qdl_dir>` below.

    2. Install the required libraries (skip if already installed):

       ```shell theme={null}
       sudo apt-get install libxml2-dev libudev-dev libusb-1.0-0-dev
       ```

           <Note>
             We recommend extracting both the image and QDL into the same parent folder. This keeps all paths under one root and simplifies navigation between the provision, SAIL, and image folders.
           </Note>

    ### Set up QDL driver

    Ubuntu requires a udev rule so the kernel grants your user permission to communicate with the device when it enters EDL mode.

    1. Check whether the rule already exists:
       ```shell theme={null}
       ls /etc/udev/rules.d/51-qcom-usb.rules
       ```

    2. If the file is **not** present, create it in one command:
       ```shell theme={null}
       echo 'SUBSYSTEMS=="usb", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="9008", MODE="0664", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-qcom-usb.rules
       ```
       If the file **already exists**, verify the rule is present:
       ```shell theme={null}
       cat /etc/udev/rules.d/51-qcom-usb.rules
       ```

    3. Reload udev to apply the rule:
       ```shell theme={null}
       sudo systemctl restart udev
       ```
       If the USB cable was already connected, disconnect and reconnect it.

    ### Set up QDL path

    1. Make QDL executable:
       ```shell theme={null}
       chmod +x <qdl_dir>/qdl
       ```

    2. Verify QDL is working:
       ```shell theme={null}
       <qdl_dir>/qdl --help
       ```
       You should see the QDL usage output. If you get an error, check the path.

    ### Put the device in EDL mode

    1. **Turn on** the SW2-3 DIP switch — push it up.

           <img src="https://mintcdn.com/qualcomm-prod/jy6NQT2Y7J_sAxdX/Linux/images/update-software/EDL_mode_dipSwitch.png?fit=max&auto=format&n=jy6NQT2Y7J_sAxdX&q=85&s=6de979ba0cbd239bd475db7e4d470fe4" alt="SW2-3 DIP switch location" width="1131" height="318" data-path="Linux/images/update-software/EDL_mode_dipSwitch.png" />

    2. Connect the **12 V power supply** to the EVK.

    3. Connect the **USB Type-C cable** from **USB0** on the EVK to your host.

           <img src="https://mintcdn.com/qualcomm-prod/ZhwPHeig5GFrMRIg/Linux/images/update-software/iq9075-flashsetup.png?fit=max&auto=format&n=ZhwPHeig5GFrMRIg&q=85&s=10f1fada572b2d0ac2592cf1da9b2292" alt="Flash setup — USB and power connections" width="926" height="672" data-path="Linux/images/update-software/iq9075-flashsetup.png" />

    4. Toggle the **power switch** to turn on the device.

    5. Confirm the device is in EDL mode:
       ```shell theme={null}
       lsusb
       ```
       **Expected output:**
       ```text theme={null}
       Bus 002 Device 014: ID 05c6:9008 Qualcomm, Inc. Gobi Wireless Modem (QDL mode)
       ```
       If the device doesn't appear, recheck SW2-3 and the USB-C cable.

    ### Provision UFS

    UFS (Universal Flash Storage) provisioning divides the internal storage into separate logical unit numbers (LUNs), each dedicated to a specific type of data (boot, system, user data, etc.). This improves access efficiency and keeps the partition layout consistent across flashes.

    Run UFS provisioning if any of the following apply:

    * This is a **brand-new board** that has never been flashed.
    * You are **upgrading to a new image version**.
    * You are **switching distributions** (Qualcomm Linux ↔ Ubuntu).

    1. Download and unzip the provision file:
       ```shell theme={null}
       wget https://artifacts.codelinaro.org/artifactory/codelinaro-le/Qualcomm_Linux/QCS9100/provision.zip
       unzip provision.zip
       ```

    2. Provision UFS from the unzipped provision directory:
       ```shell theme={null}
       cd provision
       <qdl_dir>/qdl --storage ufs prog_firehose_ddr.elf provision_1_2.xml
       ```
       **Expected output:**
       ```text theme={null}
       UFS provisioning succeeded
       ```

    <Note>
      After UFS provisioning completes, the device disconnects from USB. Toggle the power switch off and on to reboot it back into EDL mode before continuing.
    </Note>

    ### Flash SAIL firmware

    The Safety Island (SAIL) is a separate, isolated processor on the IQ-9075 EVK that handles safety-critical functions independently from the main application processor. Its firmware lives on a dedicated **spinor** flash partition and must be flashed separately before the main OS image.

    1. Navigate to the `sail_nor` subfolder inside the extracted image:
       ```shell theme={null}
       cd <path-to-image>/images/iq-9075-evk/qcom-multimedia-proprietary-image-iq-9075-evk/sail_nor
       ```

    2. Flash the SAIL firmware:
       ```shell theme={null}
       <qdl_dir>/qdl --storage spinor prog_firehose_ddr.elf rawprogram0.xml patch0.xml
       ```
       **Expected output:**
       ```text theme={null}
       flashed "SAIL_HYP" successfully
       flashed "SAIL_SW1" successfully
       flashed "SAIL_HYP_BKUP" successfully
       flashed "SAIL_SW1_BKUP" successfully
       11 patches applied
       ```

    ### Flash Qualcomm Linux

    1. Navigate to the main image folder:
       ```shell theme={null}
       cd <path-to-image>/images/iq-9075-evk/qcom-multimedia-proprietary-image-iq-9075-evk
       ```

    2. Flash the image:
       ```shell theme={null}
       <qdl_dir>/qdl --storage ufs prog_firehose_ddr.elf rawprogram*.xml patch*.xml
       ```
       The flash is complete when the final line reads:
       ```text theme={null}
       partition 1 is now bootable
       ```
       Any sector-truncation warnings during flashing are harmless.
  </Tab>

  <Tab title="Windows">
    ### Download the Qualcomm Linux image

    1. Download the [**Qualcomm Linux image**](https://artifacts.codelinaro.org/artifactory/qli-ci/flashable-binaries/meta-qcom/qcom-distro-sota/iq-9075-evk/qli-2.0-qcom-multimedia-proprietary-image.zip)

    2. Extract the zip file. The flashable artifacts are in:
       ```text theme={null}
       <path-to-image>\images\iq-9075-evk\qcom-multimedia-proprietary-image-iq-9075-evk\
       ```
       Where `<path-to-image>` is the folder created when you extracted the image zip.

    ### Download QDL

    1. Download the [QDL tool for Windows](https://softwarecenter.qualcomm.com/#/catalog/item/Qualcomm_Device_Loader) and extract it.

           <Note>
             We recommend extracting both the image and QDL into the same parent folder (for example `C:\Users\you\Downloads\qualcomm-flash\`). This keeps all paths under one root and simplifies navigation between the provision, SAIL, and image folders.
           </Note>

    ### Set up QDL driver

    1. Uninstall any existing Qualcomm USB drivers (QUD) — they conflict with the QDL driver. Open **Device Manager**, find your device, and uninstall any existing drivers. The device should **not** appear under COM Ports.

    2. Run `install_driver.bat` from the unzipped QDL folder to install the WinUSB driver.

           <img src="https://mintcdn.com/qualcomm-prod/ZhwPHeig5GFrMRIg/Linux/images/update-software/win_bat.png?fit=max&auto=format&n=ZhwPHeig5GFrMRIg&q=85&s=2bebedf1f96bd2071e002bb01f5efb80" alt="Running install_driver.bat" width="979" height="512" data-path="Linux/images/update-software/win_bat.png" />

    ### Put the device in EDL mode

    1. **Turn on** the SW2-3 DIP switch — push it up.

           <img src="https://mintcdn.com/qualcomm-prod/jy6NQT2Y7J_sAxdX/Linux/images/update-software/EDL_mode_dipSwitch.png?fit=max&auto=format&n=jy6NQT2Y7J_sAxdX&q=85&s=6de979ba0cbd239bd475db7e4d470fe4" alt="SW2-3 DIP switch location" width="1131" height="318" data-path="Linux/images/update-software/EDL_mode_dipSwitch.png" />

    2. Connect the **12 V power supply** to the EVK.

    3. Connect the **USB Type-C cable** from **USB0** on the EVK to your host.

           <img src="https://mintcdn.com/qualcomm-prod/ZhwPHeig5GFrMRIg/Linux/images/update-software/iq9075-flashsetup.png?fit=max&auto=format&n=ZhwPHeig5GFrMRIg&q=85&s=10f1fada572b2d0ac2592cf1da9b2292" alt="Flash setup — USB and power connections" width="926" height="672" data-path="Linux/images/update-software/iq9075-flashsetup.png" />

    4. Toggle the **power switch** to turn on the device.

    5. Open **Device Manager** and confirm a Qualcomm USB device appears (not under COM Ports).

           <img src="https://mintcdn.com/qualcomm-prod/jy6NQT2Y7J_sAxdX/Linux/images/update-software/dm_IQ9075_enum.jpg?fit=max&auto=format&n=jy6NQT2Y7J_sAxdX&q=85&s=cfebf4138de0900ce7260454f94b976a" alt="Device Manager — EDL mode confirmed" width="1027" height="848" data-path="Linux/images/update-software/dm_IQ9075_enum.jpg" />

    ### Provision UFS

    UFS (Universal Flash Storage) provisioning divides the internal storage into separate logical unit numbers (LUNs), each dedicated to a specific type of data (boot, system, user data, etc.). This improves access efficiency and keeps the partition layout consistent across flashes.

    Run UFS provisioning if any of the following apply:

    * This is a **brand-new board** that has never been flashed.
    * You are **upgrading to a new image version**.
    * You are **switching distributions** (Qualcomm Linux ↔ Ubuntu).

    1. Download [**provision.zip**](https://artifacts.codelinaro.org/artifactory/codelinaro-le/Qualcomm_Linux/QCS9100/provision.zip) and extract it.

    2. Navigate to the extracted provision folder:
       ```shell theme={null}
       cd <path-to-provision>
       ```

    3. Provision UFS (replace `<qdl_dir>` with your QDL folder path):

       **Command Prompt:**

       ```shell theme={null}
       "<qdl_dir>\qdl.exe" --storage ufs prog_firehose_ddr.elf provision_1_2.xml
       ```

       **PowerShell:**

       ```shell theme={null}
       & "<qdl_dir>\qdl.exe" --storage ufs prog_firehose_ddr.elf provision_1_2.xml
       ```

       **Expected output:**

       ```text theme={null}
       UFS provisioning succeeded
       ```

    <Note>
      After UFS provisioning completes, the device disconnects from USB. Toggle the power switch off and on to reboot it back into EDL mode before continuing.
    </Note>

    ### Flash SAIL firmware

    The Safety Island (SAIL) is a separate, isolated processor on the IQ-9075 EVK that handles safety-critical functions independently from the main application processor. Its firmware lives on a dedicated **spinor** flash partition and must be flashed separately before the main OS image.

    1. Navigate to the `sail_nor` subfolder inside the image directory:
       ```shell theme={null}
       cd <path-to-image>\images\iq-9075-evk\qcom-multimedia-proprietary-image-iq-9075-evk\sail_nor
       ```

    2. Flash the SAIL firmware (replace `<qdl_dir>` with your QDL folder path):

       **Command Prompt:**

       ```shell theme={null}
       "<qdl_dir>\qdl.exe" --storage spinor prog_firehose_ddr.elf rawprogram0.xml patch0.xml
       ```

       **PowerShell:**

       ```shell theme={null}
       & "<qdl_dir>\qdl.exe" --storage spinor prog_firehose_ddr.elf rawprogram0.xml patch0.xml
       ```

       **Expected output:**

       ```text theme={null}
       flashed "SAIL_HYP" successfully
       flashed "SAIL_SW1" successfully
       flashed "SAIL_HYP_BKUP" successfully
       flashed "SAIL_SW1_BKUP" successfully
       11 patches applied
       ```

    ### Flash Qualcomm Linux

    1. Navigate to the main image folder:
       ```shell theme={null}
       cd <path-to-image>\images\iq-9075-evk\qcom-multimedia-proprietary-image-iq-9075-evk
       ```

    2. Flash the image (replace `<qdl_dir>` with your QDL folder path — Windows does not support wildcards, list all files explicitly):

       **Command Prompt:**

       ```shell theme={null}
       "<qdl_dir>\qdl.exe" prog_firehose_ddr.elf rawprogram0.xml rawprogram1.xml rawprogram2.xml rawprogram3.xml rawprogram4.xml rawprogram5.xml patch0.xml patch1.xml patch2.xml patch3.xml patch4.xml patch5.xml
       ```

       **PowerShell:**

       ```shell theme={null}
       & "<qdl_dir>\qdl.exe" prog_firehose_ddr.elf rawprogram0.xml rawprogram1.xml rawprogram2.xml rawprogram3.xml rawprogram4.xml rawprogram5.xml patch0.xml patch1.xml patch2.xml patch3.xml patch4.xml patch5.xml
       ```

       The flash is complete when the final line reads:

       ```text theme={null}
       partition 1 is now bootable
       ```
  </Tab>

  <Tab title="macOS">
    ### Download the Qualcomm Linux image

    1. Download the [**Qualcomm Linux image**](https://artifacts.codelinaro.org/artifactory/qli-ci/flashable-binaries/meta-qcom/qcom-distro-sota/iq-9075-evk/qli-2.0-qcom-multimedia-proprietary-image.zip).

    2. Extract the zip file. The flashable artifacts are in:
       ```text theme={null}
       <path-to-image>/images/iq-9075-evk/qcom-multimedia-proprietary-image-iq-9075-evk/
       ```
       Where `<path-to-image>` is the folder created when you extracted the image zip.

    ### Download QDL

    1. Download the [QDL tool for macOS (Apple Silicon)](https://softwarecenter.qualcomm.com/catalog/item/Qualcomm_Device_Loader) and unzip it. The unzipped folder contains the `qdl` binary — referred to as `<qdl_dir>` below. For tool usage details, see the **QDL\_User\_Guide** in that folder.

           <Note>
             We recommend extracting both the image and QDL into the same parent folder. This keeps all paths under one root and simplifies navigation between the provision, SAIL, and image folders.
           </Note>

    ### Set up QDL path

    1. Install required libraries via Homebrew (skip if already installed):
       ```shell theme={null}
       brew install libusb libxml2
       ```

    2. Make QDL executable and clear the macOS quarantine flag so Gatekeeper allows it to run:
       ```shell theme={null}
       chmod +x <qdl_dir>/qdl
       sudo xattr -dr com.apple.quarantine <qdl_dir>
       ```
           <Note>
             `sudo` is needed because some bundled libraries are read-only. If macOS still blocks the tool after this step, allow it under **System Settings → Privacy & Security**.
           </Note>

    3. Verify QDL is working:
       ```shell theme={null}
       <qdl_dir>/qdl --help
       ```
       You should see the QDL usage output. If you get an error, check the path.

    ### Put the device in EDL mode

    1. **Turn on** the SW2-3 DIP switch — push it up.

           <img src="https://mintcdn.com/qualcomm-prod/jy6NQT2Y7J_sAxdX/Linux/images/update-software/EDL_mode_dipSwitch.png?fit=max&auto=format&n=jy6NQT2Y7J_sAxdX&q=85&s=6de979ba0cbd239bd475db7e4d470fe4" alt="SW2-3 DIP switch location" width="1131" height="318" data-path="Linux/images/update-software/EDL_mode_dipSwitch.png" />

    2. Connect the **12 V power supply** to the EVK.

    3. Connect the **USB Type-C cable** from **USB0** on the EVK to your host.

           <img src="https://mintcdn.com/qualcomm-prod/ZhwPHeig5GFrMRIg/Linux/images/update-software/iq9075-flashsetup.png?fit=max&auto=format&n=ZhwPHeig5GFrMRIg&q=85&s=10f1fada572b2d0ac2592cf1da9b2292" alt="Flash setup — USB and power connections" width="926" height="672" data-path="Linux/images/update-software/iq9075-flashsetup.png" />

    4. Toggle the **power switch** to turn on the device.

    5. Confirm the device is in EDL mode:
       ```shell theme={null}
       system_profiler SPUSBDataType | grep -A4 -i qualcomm
       ```
       **Expected output:**
       ```text theme={null}
       Product ID: 0x9008
       Vendor ID: 0x05c6  (Qualcomm, Inc)
       Manufacturer: Qualcomm CDMA Technologies MSM
       ```
       `Product ID: 0x9008` confirms the device is in EDL mode. If it doesn't appear, recheck SW2-3 and the USB-C cable.

    ### Provision UFS

    UFS (Universal Flash Storage) provisioning divides the internal storage into separate logical unit numbers (LUNs), each dedicated to a specific type of data (boot, system, user data, etc.). This improves access efficiency and keeps the partition layout consistent across flashes.

    Run UFS provisioning if any of the following apply:

    * This is a **brand-new board** that has never been flashed.
    * You are **upgrading to a new image version**.
    * You are **switching distributions** (Qualcomm Linux ↔ Ubuntu).

    1. Download [**provision.zip**](https://artifacts.codelinaro.org/artifactory/codelinaro-le/Qualcomm_Linux/QCS9100/provision.zip) and unzip it:
       ```shell theme={null}
       unzip provision.zip
       ```

    2. Move the provision files and the QDL binary into the same folder, then run from there:

           <Note>
             On macOS, the `qdl` binary and its supporting libraries must be in the same directory as the provision files. Copy the provision files into `<qdl_dir>`, then run the command from there.
           </Note>

       ```shell theme={null}
       ./qdl --storage ufs prog_firehose_ddr.elf provision_1_2.xml
       ```

       **Expected output:**

       ```text theme={null}
       UFS provisioning succeeded
       ```

    <Note>
      After UFS provisioning completes, the device disconnects from USB. Toggle the power switch off and on to reboot it back into EDL mode before continuing.
    </Note>

    ### Flash SAIL firmware

    The Safety Island (SAIL) is a separate, isolated processor on the IQ-9075 EVK that handles safety-critical functions independently from the main application processor. Its firmware lives on a dedicated **spinor** flash partition and must be flashed separately before the main OS image.

    1. Navigate to the `sail_nor` subfolder inside the extracted image:
       ```shell theme={null}
       cd <path-to-image>/images/iq-9075-evk/qcom-multimedia-proprietary-image-iq-9075-evk/sail_nor
       ```

    2. Flash the SAIL firmware:
       ```shell theme={null}
       <qdl_dir>/qdl --storage spinor prog_firehose_ddr.elf rawprogram0.xml patch0.xml
       ```
       **Expected output:**
       ```text theme={null}
       flashed "SAIL_HYP" successfully
       flashed "SAIL_SW1" successfully
       flashed "SAIL_HYP_BKUP" successfully
       flashed "SAIL_SW1_BKUP" successfully
       11 patches applied
       ```

    ### Flash Qualcomm Linux

    1. Navigate to the main image folder:
       ```shell theme={null}
       cd <path-to-image>/images/iq-9075-evk/qcom-multimedia-proprietary-image-iq-9075-evk
       ```

    2. Flash the image:
       ```shell theme={null}
       <qdl_dir>/qdl --storage ufs prog_firehose_ddr.elf rawprogram*.xml patch*.xml
       ```
       The flash is complete when the final line reads:
       ```text theme={null}
       partition 1 is now bootable
       ```
       Any sector-truncation warnings during flashing are harmless.
  </Tab>
</Tabs>

<Note>
  If flashing fails at any point, disconnect the USB cable and power supply, reconnect them, and retry from the EDL mode step.
</Note>

## Finish

1. **Turn off** the SW2-3 DIP switch — push it down.
2. Power-cycle the device. It boots into the newly flashed Qualcomm Linux image.

## Next steps

Continue to [**Set up the device**](../set-up-the-device) to connect the debug UART, verify the software version, and bring up the network, SSH, and display.
