123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- .. SPDX-License-Identifier: GPL-2.0
- ============
- I3C protocol
- ============
- Disclaimer
- ==========
- This chapter will focus on aspects that matter to software developers. For
- everything hardware related (like how things are transmitted on the bus, how
- collisions are prevented, ...) please have a look at the I3C specification.
- This document is just a brief introduction to the I3C protocol and the concepts
- it brings to the table. If you need more information, please refer to the MIPI
- I3C specification (can be downloaded here
- https://resources.mipi.org/mipi-i3c-v1-download).
- Introduction
- ============
- The I3C (pronounced 'eye-three-see') is a MIPI standardized protocol designed
- to overcome I2C limitations (limited speed, external signals needed for
- interrupts, no automatic detection of the devices connected to the bus, ...)
- while remaining power-efficient.
- I3C Bus
- =======
- An I3C bus is made of several I3C devices and possibly some I2C devices as
- well, but let's focus on I3C devices for now.
- An I3C device on the I3C bus can have one of the following roles:
- * Master: the device is driving the bus. It's the one in charge of initiating
- transactions or deciding who is allowed to talk on the bus (slave generated
- events are possible in I3C, see below).
- * Slave: the device acts as a slave, and is not able to send frames to another
- slave on the bus. The device can still send events to the master on
- its own initiative if the master allowed it.
- I3C is a multi-master protocol, so there might be several masters on a bus,
- though only one device can act as a master at a given time. In order to gain
- bus ownership, a master has to follow a specific procedure.
- Each device on the I3C bus has to be assigned a dynamic address to be able to
- communicate. Until this is done, the device should only respond to a limited
- set of commands. If it has a static address (also called legacy I2C address),
- the device can reply to I2C transfers.
- In addition to these per-device addresses, the protocol defines a broadcast
- address in order to address all devices on the bus.
- Once a dynamic address has been assigned to a device, this address will be used
- for any direct communication with the device. Note that even after being
- assigned a dynamic address, the device should still process broadcast messages.
- I3C Device discovery
- ====================
- The I3C protocol defines a mechanism to automatically discover devices present
- on the bus, their capabilities and the functionalities they provide. In this
- regard I3C is closer to a discoverable bus like USB than it is to I2C or SPI.
- The discovery mechanism is called DAA (Dynamic Address Assignment), because it
- not only discovers devices but also assigns them a dynamic address.
- During DAA, each I3C device reports 3 important things:
- * BCR: Bus Characteristic Register. This 8-bit register describes the device bus
- related capabilities
- * DCR: Device Characteristic Register. This 8-bit register describes the
- functionalities provided by the device
- * Provisional ID: A 48-bit unique identifier. On a given bus there should be no
- Provisional ID collision, otherwise the discovery mechanism may fail.
- I3C slave events
- ================
- The I3C protocol allows slaves to generate events on their own, and thus allows
- them to take temporary control of the bus.
- This mechanism is called IBI for In Band Interrupts, and as stated in the name,
- it allows devices to generate interrupts without requiring an external signal.
- During DAA, each device on the bus has been assigned an address, and this
- address will serve as a priority identifier to determine who wins if 2 different
- devices are generating an interrupt at the same moment on the bus (the lower the
- dynamic address the higher the priority).
- Masters are allowed to inhibit interrupts if they want to. This inhibition
- request can be broadcast (applies to all devices) or sent to a specific
- device.
- I3C Hot-Join
- ============
- The Hot-Join mechanism is similar to USB hotplug. This mechanism allows
- slaves to join the bus after it has been initialized by the master.
- This covers the following use cases:
- * the device is not powered when the bus is probed
- * the device is hotplugged on the bus through an extension board
- This mechanism is relying on slave events to inform the master that a new
- device joined the bus and is waiting for a dynamic address.
- The master is then free to address the request as it wishes: ignore it or
- assign a dynamic address to the slave.
- I3C transfer types
- ==================
- If you omit SMBus (which is just a standardization on how to access registers
- exposed by I2C devices), I2C has only one transfer type.
- I3C defines 3 different classes of transfer in addition to I2C transfers which
- are here for backward compatibility with I2C devices.
- I3C CCC commands
- ----------------
- CCC (Common Command Code) commands are meant to be used for anything that is
- related to bus management and all features that are common to a set of devices.
- CCC commands contain an 8-bit CCC ID describing the command that is executed.
- The MSB of this ID specifies whether this is a broadcast command (bit7 = 0) or a
- unicast one (bit7 = 1).
- The command ID can be followed by a payload. Depending on the command, this
- payload is either sent by the master sending the command (write CCC command),
- or sent by the slave receiving the command (read CCC command). Of course, read
- accesses only apply to unicast commands.
- Note that, when sending a CCC command to a specific device, the device address
- is passed in the first byte of the payload.
- The payload length is not explicitly passed on the bus, and should be extracted
- from the CCC ID.
- Note that vendors can use a dedicated range of CCC IDs for their own commands
- (0x61-0x7f and 0xe0-0xef).
- I3C Private SDR transfers
- -------------------------
- Private SDR (Single Data Rate) transfers should be used for anything that is
- device specific and does not require high transfer speed.
- It is the equivalent of I2C transfers but in the I3C world. Each transfer is
- passed the device address (dynamic address assigned during DAA), a payload
- and a direction.
- The only difference with I2C is that the transfer is much faster (typical clock
- frequency is 12.5MHz).
- I3C HDR commands
- ----------------
- HDR commands should be used for anything that is device specific and requires
- high transfer speed.
- The first thing attached to an HDR command is the HDR mode. There are currently
- 3 different modes defined by the I3C specification (refer to the specification
- for more details):
- * HDR-DDR: Double Data Rate mode
- * HDR-TSP: Ternary Symbol Pure. Only usable on busses with no I2C devices
- * HDR-TSL: Ternary Symbol Legacy. Usable on busses with I2C devices
- When sending an HDR command, the whole bus has to enter HDR mode, which is done
- using a broadcast CCC command.
- Once the bus has entered a specific HDR mode, the master sends the HDR command.
- An HDR command is made of:
- * one 16-bits command word in big endian
- * N 16-bits data words in big endian
- Those words may be wrapped with specific preambles/post-ambles which depend on
- the chosen HDR mode and are detailed here (see the specification for more
- details).
- The 16-bits command word is made of:
- * bit[15]: direction bit, read is 1, write is 0
- * bit[14:8]: command code. Identifies the command being executed, the amount of
- data words and their meaning
- * bit[7:1]: I3C address of the device this command is addressed to
- * bit[0]: reserved/parity-bit
- Backward compatibility with I2C devices
- =======================================
- The I3C protocol has been designed to be backward compatible with I2C devices.
- This backward compatibility allows one to connect a mix of I2C and I3C devices
- on the same bus, though, in order to be really efficient, I2C devices should
- be equipped with 50 ns spike filters.
- I2C devices can't be discovered like I3C ones and have to be statically
- declared. In order to let the master know what these devices are capable of
- (both in terms of bus related limitations and functionalities), the software
- has to provide some information, which is done through the LVR (Legacy I2C
- Virtual Register).
|