Overview
Key Characteristics
- Bidirectional 2-wire serial bus (SDA + SCL)
- 7-bit or 10-bit target addressing
- Multi-controller mode support
Operating Modes
| Mode | Speed |
|---|---|
| Standard mode | 100 kbps |
| Fast mode | 400 kbps |
| Fast mode plus | 1 Mbps (maximum supported) |
| High-speed mode | 3.4 MHz (not supported) |
Communication Sequence


- SCL HIGH: SDA must remain stable
- SCL LOW: SDA may change
- Exception: START and STOP sequences may change SDA when SCL is HIGH
Transfer Modes by Subsystem
| Subsystem | Transfer Mode | Bus Speeds |
|---|---|---|
| Linux | FIFO, CPU DMA, GSI | 100 kHz, 400 kHz, 1000 kHz |
| Boot | FIFO | 100 kHz, 400 kHz, 1000 kHz |
| aDSP / Qualcomm TEE / SDC | FIFO | Standard |
Interface Components
Device Tree Sources
| Platform | Device Tree File |
|---|---|
| Dragonwing IQ-9075 | arch/arm64/boot/dts/qcom/lemans.dtsi |
APIs
| Subsystem | Header |
|---|---|
| Linux | include/linux/i2c.h, include/linux/i2c-dev.h |
| Boot | boot_images/boot/QcomPkg/Include/i2c_api.h |
| aDSP | adsp_proc/core/api/buses/i2c_api.h |
| Qualcomm TEE | trustzone_images/core/buses/api/i2c/qupv3/i2c_api.h |
Software Device Tree Configuration
Linux Device Tree Example
QUPAC Access Control
Ensure the correct protocol is set inQUPAC_Access.c:
Configuration Steps
Verification
Check Device Nodes
Use i2c-tools
Debugging
Enable Debug Logs
Enable I2C Tracing
Check Clock and GPIO
Troubleshooting
I2C Device Not Detected
I2C Device Not Detected
Symptoms: Check kernel module:Check clock:Check GPIO pinmux:
i2cdetect shows no devices; /dev/i2c-X not present.Check device tree status:I2C Transfer Timeout
I2C Transfer Timeout
Symptoms:Causes and fixes:
- No pull-up resistors — Add 4.7 kΩ pull-ups on SDA/SCL
- Slave not responding — Verify slave power and reset; check initialization sequence
- Wrong clock frequency — Adjust
clock-frequencyin device tree - Bus stuck low — Power cycle devices or send clock pulses to release bus
Invalid Protocol Error
Invalid Protocol Error
Symptoms:Steps:
- Identify board type:
dmesg | grep "CDT Version" - Locate platform ID in
QUPAC_Access.xml - Verify
QUPAC_Access.csetsQUPV3_PROTOCOL_I2C,AC_HLOS,bAllowFifo=TRUE,bLoad=TRUE - Rebuild TEE firmware if changes were made
Data Corruption
Data Corruption
Symptoms: Incorrect data read; intermittent failures.Fixes:
- Reduce bus speed
- Shorten wire length; add 22–100 Ω series resistors
- Add decoupling capacitors near devices
- Verify setup and hold times with oscilloscope
DMA Transfer Failures
DMA Transfer Failures
Symptoms:Fixes: Verify
CONFIG_QCOM_GPI_DMA=m; check DMA channel assignment; ensure DMA-safe memory alignment.To test without DMA:Clock Stretching / Slow Slave Timeouts
Clock Stretching / Slow Slave Timeouts
I2C Works Initially but Fails After Suspend/Resume
I2C Works Initially but Fails After Suspend/Resume
Check runtime PM configuration, verify power domain dependencies, and add proper suspend/resume handlers.

