12enum class OpenTitanI2cInterrupt
92static constexpr uint32_t interrupt_bit(
const OpenTitanI2cInterrupt Interrupt)
94 return 1 <<
static_cast<uint32_t
>(Interrupt);
167 enum [[clang::flag_enum]] : uint32_t{
178 enum [[clang::flag_enum]] : uint32_t{
208 enum [[clang::flag_enum]] : uint32_t{
225 enum [[clang::flag_enum]] : uint32_t{
254 const uint32_t Res = ((a - 1) / b) + 1;
255 Debug::Assert(Res <= UINT16_MAX,
256 "Division result too large to fit in uint16_t.");
257 return static_cast<uint16_t
>(Res);
283 const uint16_t ClockPeriod = (1000 * 1000) / SystemClockKhz;
286 uint32_t mode = (SpeedKhz > 100u) + (SpeedKhz > 400u);
289 constexpr uint16_t MinimumFallTime = 20 * 3 / 5;
292 constexpr uint16_t MinimumTimeValues[5][2][3] = {
294 {4700u, 1300u, 150u},
299 {MinimumFallTime, MinimumFallTime, MinimumFallTime},
313 {4700u, 1300u, 500u},
318 for (uint32_t i = 0; i < 5; ++i)
327 void blocking_write_byte(
const uint32_t Fmt)
volatile
339 void blocking_write(
const uint8_t Addr7,
340 const uint8_t data[],
341 const uint32_t NumBytes,
342 const bool SkipStop)
volatile
349 for (uint32_t i = 0; i < NumBytes - 1; ++i)
351 blocking_write_byte(data[i]);
357 [[nodiscard]]
bool blocking_read(
const uint8_t Addr7,
359 const uint32_t NumBytes)
volatile
361 for (uint32_t idx = 0; idx < NumBytes; idx += UINT8_MAX)
370 uint32_t bytesRemaining = NumBytes - idx;
371 bool lastChunk = UINT8_MAX >= bytesRemaining;
373 lastChunk ?
static_cast<uint8_t
>(bytesRemaining) : UINT8_MAX;
379 for (uint32_t chunkIdx = 0; chunkIdx < chunkSize; ++chunkIdx)
416 uint16_t receiveThreshold)
volatile
419 (formatThreshold & 0xfff) << 16 | (receiveThreshold & 0xfff);
C++ APIs for assertions, invariants, and writing formatted debug messages to a UART.
Driver for the OpenTitan's I2C block.
uint32_t status
I2C Live Status Register for Host and Target modes.
uint32_t readData
I2C Read Data.
@ FormatDataNakOk
Do not signal an exception if the current byte is not ACK’d.
@ FormatDataStop
Issue a STOP condition after this operation.
@ FormatDataStart
Issue a START condition before transmitting BYTE.
@ FormatDataReadCount
Do not NACK the last byte read, let the read operation continue.
@ FormatDataReadBytes
Read BYTE bytes from I2C. (256 if BYTE==0).
uint32_t interruptState
Interrupt State Register.
uint32_t values
Oversampled Receive values.
uint32_t targetNackCount
Number of times the I2C target has NACK'ed a new transaction since the last read of this register.
void host_thresholds_set(uint16_t formatThreshold, uint16_t receiveThreshold) volatile
Sets the thresholds for the format and receive fifos.
uint32_t targetAckControl
Controls for mid-transfer (N)ACK phase handling.
uint32_t targetFifoConfiguration
Target mode FIFO configuration.
bool interrupt_is_asserted(OpenTitanI2cInterrupt interrupt) volatile
Returns true if the given interrupt is asserted.
uint32_t timing[5]
Detailed I2C Timings (directly corresponding to table 10 in the I2C Specification).
uint32_t formatData
I2C Host Format Data.
void interrupt_enable(OpenTitanI2cInterrupt interrupt) volatile
Enables the given interrupt.
uint32_t fifoCtrl
I2C FIFO control register.
void reset_fifos() volatile
Reset all of the fifos.
void interrupt_disable(OpenTitanI2cInterrupt interrupt) volatile
Disables the given interrupt.
@ ControlLineLoopback
Enable I2C line loopback test If line loopback is enabled, the internal design sees ACQ and RX data a...
@ ControlEnableTarget
Enable Target I2C functionality.
@ ControlEnableHost
Enable Host I2C functionality.
uint32_t hostFifoConfiguration
Host mode FIFO configuration.
uint32_t targetFifoStatus
Target mode FIFO status register.
bool format_is_empty() volatile
Returns true when the format fifo is empty.
static constexpr bool DebugOpenTitanI2c
Flag set when we're debugging this driver.
uint32_t acquiredData
I2C target acquired data.
uint32_t targetTimeoutControl
I2C target internal stretching timeout control.
@ FifoControlFormatReset
Format fifo reset. Write 1 to the register resets it. Read returns 0.
@ FifoControlTransmitReset
Transmit FIFO reset.
@ FifoControlReceiveReset
Receive fifo reset.
@ FifoControlAcquiredReset
Acquired FIFO reset.
static uint16_t round_up_divide(uint32_t a, uint32_t b)
Performs a 32-bit integer unsigned division, rounding up.
uint32_t timeoutControl
I2C clock stretching timeout control.
uint32_t hostFifoStatus
Host mode FIFO status register.
uint32_t control
I2C Control Register.
uint32_t hostTimeoutControl
I2C host clock generation timeout value (in units of input clock frequency).
@ StatusTransmitFull
Target mode Transmit FIFO is full.
@ StatusHostDisabledNackTimeout
A Host-Mode active transaction has been ended by the HostNackHandlerTimeout mechanism.
@ StatusReceiveFull
Host mode Receive FIFO is full.
@ StatusAcquiredFull
Target mode Acquired FIFO is full.
@ StatusFormatEmpty
Host mode Format FIFO is empty.
@ StatusTransmitEmpty
Target mode Transmit FIFO is empty.
@ StatusHostIdle
Host functionality is idle. No Host transaction is in progress.
@ StatusTargetIdle
Target functionality is idle. No Target transaction is in progress.
@ StatusAcquiredEmpty
Target mode Acquired FIFO is empty.
@ StatusFormatFull
Host mode Format FIFO is full.
@ SmatusReceiveEmpty
Host mode Receive FIFO is empty.
uint32_t interruptTest
Interrupt Test Register.
void speed_set(const uint32_t SpeedKhz) volatile
Set the I2C timing parameters appropriately for the given bit rate.
uint32_t alertTest
Alert Test Register (Unused in Sonata).
uint32_t transmitData
I2C target transmit data.
bool interrupt_is_asserted(Interrupt interrupt) volatile
Returns true if the given interrupt is asserted.
void interrupt_clear(Interrupt interrupt) volatile
Clears the given interrupt.
uint32_t interruptEnable
Interrupt Enable Register.
uint32_t targetId
I2C target address and mask pairs.
void host_mode_set() volatile
Configure the I2C block to be in host mode.
ConditionalDebug< DebugOpenTitanI2c, "OpenTitan I2C"> Debug
Helper for conditional debug logs and assertions.
void interrupt_clear(OpenTitanI2cInterrupt interrupt) volatile
Clears the given interrupt.