Skip to main content
This guide describes the low-speed and high-speed I/O peripheral interface subsystems used in the Qualcomm Dragonwing IQ-9075 SoC. Low-speed interfaces (via QUP v3 serial engine):
  • UART, SPI, I2C, I3C
High-speed interfaces:
  • PCIe, USB

IQ-9075 Interface Overview

2× QUP v3 Serial EngineQUP0_V3QUP1_V3QUP2_V3
Application processor serial engine instances771
3× USB Controller0xa6000000xa8000000xa400000
Maximum speedUSB 3.x SuperSpeedUSB 3.x SuperSpeedUSB 2.0 High Speed
2× PCIe ControllerRC1RC0
SpeedGen4 2L (8 GT/s)Gen4 4L (8 GT/s)
Config space0x40100000 (1 MB)0x60100000 (1 MB)
BAR space0x40300000 (509 MB)0x60300000 (509 MB)
Power managementASPM (L1/L1ss, L0s)ASPM (L1/L1ss, L0s)

QUP v3 Protocol and GPIO Mapping

QUP0 (SE0–SE5)

QUP_SE (addr)SPI-MI2C-MUARTHS UARTGPIO mapping
qup0_se0 (0x980000)spi0i2c0uart020, 21, 22, 23
qup0_se1 (0x984000)spi1i2c1uart124, 25, 26, 27
qup0_se2 (0x988000)spi2i2c2uart2uart236, 37, 38, 39
qup0_se3 (0x98c000)spi3i2c3uart3uart328, 29, 30, 31
qup0_se4 (0x990000)spi4i2c4uart432, 33, 34, 35
qup0_se5 (0x994000)spi5i2c5uart536, 37, 38, 39

QUP1 (SE0–SE6)

QUP_SE (addr)SPI-MI2C-MUARTHS UARTGPIO mapping
qup1_se0 (0xa80000)spi7i2c7uart740, 41, 42, 43
qup1_se1 (0xa84000)spi8i2c8uart842, 43, 40, 41
qup1_se2 (0xa88000)spi9i2c9uart9uart946, 47, 44, 45
qup1_se3 (0xa8c000)spi10i2c10uart10uart1044, 45, 46, 47
qup1_se4 (0xa90000)spi11i2c11uart1148, 49, 50, 51
qup1_se5 (0xa94000)spi12i2c12uart1252, 53, 54, 55
qup1_se6 (0xa9c000)i2c13uart1356, 57, 56, 57

QUP2 (SE0–SE6)

QUP_SE (addr)SPI-MI2C-MUARTHS UARTGPIO mapping
qup2_se0 (0x880000)spi14i2c14uart1480, 81, 82, 83
qup2_se1 (0x884000)spi15i2c15uart1584, 85, 99, 100
qup2_se2 (0x888000)spi16i2c16uart16uart1686, 87, 88, 89, 90
qup2_se3 (0x88c000)spi17i2c17uart17uart1791, 92, 93, 94
qup2_se4 (0x890000)spi18i2c18uart1895, 96, 97, 98
qup2_se5 (0x894000)spi19i2c19uart1999, 100, 95, 96
qup2_se6 (0x898000)spi20i2c20uart2097, 98, 95, 96

QUP3 (SE0)

QUP_SE (addr)SPI-MI2C-MUARTGPIO mapping
qup3_se0 (0xb80000)spi21i2c21uart2113, 14, 15, 16, 17, 18, 19
SPI-M = SPI Master

QUP Lane to Function Mapping

InterfaceL0L1L2L3L4L5
UARTCTSRFRTxRx
HS UARTCTSRFRTxRx
I2CSDASCL
SPI masterMISOMOSISCLKCS_0CS_1CS_2

Set Up the Device Interface

Obtain Boot Logs

# SSH to device, then:
dmesg

List Enabled Interfaces

# UART
ls /dev/tty*

# I2C
ls /dev/i2c*
# Expected: /dev/i2c-18  /dev/i2c-19  /dev/i2c-20  /dev/i2c-21  /dev/i2c-22

Load QUP v3 Firmware

The Application Processor serial engines are managed by the Linux kernel. Firmware files are at:
/lib/firmware/qcom/<target-name>/qupv3fw.elf
Enable in kernel config:
CONFIG_QCOM_QUP_FW_LOAD=y   # in qcom_defconfig
CONFIG_QCOM_QUP_FW_LOAD=m   # in qcom_vm_defconfig

Device Tree Configuration

IQ-9075 EVK reference device tree: arch/arm64/boot/dts/qcom/sa8775p.dtsi

Sample Configurations

i2c10: i2c@a8c000 {
  compatible = "qcom,geni-i2c";
  reg = <0x0 0xa8c000 0x0 0x4000>;
  interrupts = <GIC_SPI 356 IRQ_TYPE_LEVEL_HIGH>;
  clocks = <&gcc GCC_QUPV3_WRAP1_S3_CLK>;
  clock-names = "se";
  pinctrl-0 = <&qup_i2c10_default>;
  pinctrl-names = "default";
  power-domains = <&rpmhpd SA8775P_CX>;
  dmas = <&gpi_dma1 0 3 QCOM_GPI_I2C>,
         <&gpi_dma1 1 3 QCOM_GPI_I2C>;
  dma-names = "tx", "rx";
  status = "disabled";
};

Device Tree Properties

PropertyTypeDescriptionRequired
statusstringokay or disabledYes
clock-frequencyu32I2C clock frequency (Hz)Optional
spi-max-frequencyu32SPI max frequency (Hz)Optional
pinctrl-namesstring arrayPin control state namesRecommended
pinctrl-0phandleDefault pin configurationRecommended

Modify Serial Engine Node

To enable or change a serial engine, modify the device tree and rebuild the kernel.
As a first step, refer to the “How to build the linux-qcom kernel for Qualcomm platform?” section from Ubuntu Qualcomm IOT Platform Support.
1

Set up host machine

sudo apt update && sudo apt build-dep -y linux
sudo apt install build-essential gcc-aarch64-linux-gnu debhelper crossbuild-essential-amd64 dwarves
sudo snap install rustup --classic && rustup install stable
2

Identify kernel version on device

uname -a
# Example: Linux ubuntu 6.8.0-1064-qcom ...
3

Download and checkout kernel

git clone https://git.launchpad.net/~canonical-kernel/ubuntu/+source/linux-qcom/+git/noble
cd noble
git checkout 6.8.0-1064-qcom
4

Enable the interface in device tree

Device tree files for IQ-9075 EVK:
  • qcs9075-addons-iq-9075-evk.dts
  • qcs9075-iq-9075-evk.dts
  • sa8775p.dtsi
Example — enable UART12:
&uart12 {
    status = "okay";
};
Example — enable I2C4:
&i2c4 {
    status = "okay";
};
5

Build the kernel

cd noble
export ARCH=arm64
export $(dpkg-architecture -aarm64)
export CROSS_COMPILE=aarch64-linux-gnu-
fakeroot debian/rules clean
fakeroot debian/rules binary
6

Extract and deploy DTB

mkdir out
dpkg-deb -x linux-modules-6.8.0-1064-qcom_6.8.0-1064.65_arm64.deb ./out

scp out/lib/firmware/6.8.0-1012-qcom/device-tree/qcom/qcs9075-iq-9075-evk.dtb \
  ubuntu@<ip>:/home/ubuntu/

ssh ubuntu@<ip>
sudo mv /home/ubuntu/qcs9075-iq-9075-evk.dtb \
  /usr/lib/firmware/6.8.0-1064-qcom/device-tree/qcom/
sudo reboot

Switch Serial Engine Protocol

To convert a serial engine from one protocol to another (e.g., SPI10 → I2C10):
# In qcs9075-iq-9075-evk.dts:

# Disable SPI
&spi10 {
    status = "disabled";
};

# Enable I2C
&i2c10 {
    status = "okay";
};

Troubleshooting

# List I2C buses
ls -la /sys/bus/i2c/devices/

# List SPI buses
ls -la /sys/bus/spi/devices/

# Check UART devices
ls -la /dev/ttyHS*

# QUP-related kernel messages
dmesg | grep -i qup
dmesg | grep -i geni
dmesg | grep -i firmware

# Check compiled device tree
dtc -I fs /sys/firmware/devicetree/base | grep -A 20 qupv3
Symptom: qcom-geni-se: firmware request failed
ls -la /lib/firmware/qcom/
# Verify CONFIG_FW_LOADER=y in kernel config
Symptom: No device node created; driver not loading.Verify device tree: status = "okay"; (not "ok" or "enable")
dmesg | grep -i qup
dmesg | grep -i geni
Symptom: qcom-geni-se: serial engine is already in useEnsure only one protocol is enabled per serial engine:
# WRONG — both enabled
&qupv3_se5_i2c { status = "okay"; };
&qupv3_se5_spi { status = "okay"; };

# CORRECT — only one enabled
&qupv3_se5_i2c { status = "okay"; };
&qupv3_se5_spi { status = "disabled"; };

Enable Required Interfaces