Overview
Key Characteristics
- Bidirectional 2-wire serial bus (SDA + SCL)
- 7-bit or 10-bit target addressing
- Multi-controller mode support
Operating Modes
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
Interface Components
Device Tree Sources
APIs
Software Device Tree Configuration
Linux Device Tree Example
QUPAC Access Control
Ensure the correct protocol is set inQUPAC_Access.c:
Configuration Steps
1
Enable kernel configurations
Edit
kernel_platform/kernel/arch/arm64/configs/qcom_defconfig:2
Enable I2C node in device tree
3
Compile and flash
Compile the kernel and device tree changes, then load images to the device.
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.

