Skip to main content
Inter-Integrated Circuit (I²C) is a bidirectional, two-wire serial bus for short-distance communication between integrated circuits, where devices communicate using assigned bus addresses.

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

Packet structure: Start → Address frame (7/10-bit) → R/W bit → ACK/NACK → Data frames (8-bit) → Stop Signal rules:
  • 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 in QUPAC_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

Troubleshooting

Causes: No pull-up resistors, slave not responding, wrong clock frequency, bus stuck low.Add 4.7 kΩ pull-ups on SDA/SCL; adjust clock-frequency in device tree.
Symptom: geni_i2c a94000.i2c: Invalid proto 1Verify QUPAC_Access.c sets QUPV3_PROTOCOL_I2C, AC_HLOS, bAllowFifo=TRUE, bLoad=TRUE.
Verify CONFIG_QCOM_GPI_DMA=m; check dmas and dma-names in device tree.To test without DMA:

Quick Diagnostic Commands

Resources