Software APIs
dt_i2c.h
Go to the documentation of this file.
1// Copyright lowRISC contributors (OpenTitan project).
2// Licensed under the Apache License, Version 2.0, see LICENSE for details.
3// SPDX-License-Identifier: Apache-2.0
4//
5// Device table API auto-generated by `dtgen`
6
7#ifndef OPENTITAN_DT_I2C_H_
8#define OPENTITAN_DT_I2C_H_
9
10#ifdef __cplusplus
11extern "C" {
12#endif // __cplusplus
13
14/**
15 * @file
16 * @brief Device Tables (DT) for IP i2c and top darjeeling.
17 *
18 * This file contains the type definitions and global functions of the i2c.
19 */
20
21#include "dt_api.h"
22#include <stdint.h>
23
24
25
26/**
27 * List of instances.
28 */
29typedef enum dt_i2c {
30 kDtI2c0 = 0, /**< i2c0 */
31 kDtI2cFirst = 0, /**< \internal First instance */
32 kDtI2cCount = 1, /**< \internal Number of instances */
34
35/**
36 * List of register blocks.
37 *
38 * Register blocks are guaranteed to start at 0 and to be consecutively numbered.
39 */
40typedef enum dt_i2c_reg_block {
41 kDtI2cRegBlockCore = 0, /**< */
42 kDtI2cRegBlockCount = 1, /**< \internal Number of register blocks */
44
45/** Primary register block (associated with the "primary" set of registers that control the IP). */
46static const dt_i2c_reg_block_t kDtI2cRegBlockPrimary = kDtI2cRegBlockCore;
47
48/**
49 * List of IRQs.
50 *
51 * IRQs are guaranteed to be numbered consecutively from 0.
52 */
53typedef enum dt_i2c_irq {
54 kDtI2cIrqFmtThreshold = 0, /**< host mode interrupt: asserted whilst the FMT FIFO level is below the low threshold. This is a level status interrupt. */
55 kDtI2cIrqRxThreshold = 1, /**< host mode interrupt: asserted whilst the RX FIFO level is above the high threshold. This is a level status interrupt. */
56 kDtI2cIrqAcqThreshold = 2, /**< target mode interrupt: asserted whilst the ACQ FIFO level is above the high threshold. This is a level status interrupt. */
57 kDtI2cIrqRxOverflow = 3, /**< host mode interrupt: raised if the RX FIFO has overflowed. */
58 kDtI2cIrqControllerHalt = 4, /**< host mode interrupt: raised if the controller FSM is halted, such as on an unexpected NACK or lost arbitration.
59Check !!CONTROLLER_EVENTS for the reason.
60The interrupt will be released when the bits in !!CONTROLLER_EVENTS are cleared. */
61 kDtI2cIrqSclInterference = 5, /**< host mode interrupt: raised if the SCL line drops early (not supported without clock synchronization). */
62 kDtI2cIrqSdaInterference = 6, /**< host mode interrupt: raised if the SDA line goes low when host is trying to assert high */
63 kDtI2cIrqStretchTimeout = 7, /**< host mode interrupt: raised if target stretches the clock beyond the allowed timeout period */
64 kDtI2cIrqSdaUnstable = 8, /**< host mode interrupt: raised if the target does not assert a constant value of SDA during transmission. */
65 kDtI2cIrqCmdComplete = 9, /**< host and target mode interrupt.
66In host mode, raised if the host issues a repeated START or terminates the transaction by issuing STOP.
67In target mode, raised if the external host issues a STOP or repeated START. */
68 kDtI2cIrqTxStretch = 10, /**< target mode interrupt: raised if the target is stretching clocks for a read command. This is a level status interrupt. */
69 kDtI2cIrqTxThreshold = 11, /**< target mode interrupt: asserted whilst the TX FIFO level is below the low threshold. This is a level status interrupt. */
70 kDtI2cIrqAcqStretch = 12, /**< target mode interrupt: raised if the target is stretching clocks due to full ACQ FIFO or zero count in !!TARGET_ACK_CTRL.NBYTES (if enabled). This is a level status interrupt. */
71 kDtI2cIrqUnexpStop = 13, /**< target mode interrupt: raised if STOP is received without a preceding NACK during an external host read. */
72 kDtI2cIrqHostTimeout = 14, /**< target mode interrupt: raised if the host stops sending the clock during an ongoing transaction. */
73 kDtI2cIrqCount = 15, /**< \internal Number of IRQs */
75
76/**
77 * List of Alerts.
78 *
79 * Alerts are guaranteed to be numbered consecutively from 0.
80 */
81typedef enum dt_i2c_alert {
82 kDtI2cAlertFatalFault = 0, /**< This fatal alert is triggered when a fatal TL-UL bus integrity fault is detected. */
83 kDtI2cAlertCount = 1, /**< \internal Number of Alerts */
85
86/**
87 * List of clock ports.
88 *
89 * Clock ports are guaranteed to be numbered consecutively from 0.
90 */
91typedef enum dt_i2c_clock {
92 kDtI2cClockClk = 0, /**< Clock port clk_i */
93 kDtI2cClockCount = 1, /**< \internal Number of clock ports */
95
96/**
97 * List of reset ports.
98 *
99 * Reset ports are guaranteed to be numbered consecutively from 0.
100 */
101typedef enum dt_i2c_reset {
102 kDtI2cResetRst = 0, /**< Reset port rst_ni */
103 kDtI2cResetCount = 1, /**< \internal Number of reset ports */
105
106/**
107 * List of peripheral I/O.
108 *
109 * Peripheral I/O are guaranteed to be numbered consecutively from 0.
110 */
111typedef enum dt_i2c_periph_io {
112 kDtI2cPeriphIoSda = 0, /**< */
113 kDtI2cPeriphIoScl = 1, /**< */
114 kDtI2cPeriphIoCount = 2, /**< \internal Number of peripheral I/O */
116
117/**
118 * List of supported hardware features.
119 */
120#define OPENTITAN_I2C_HAS_MODE_HOST 1
121#define OPENTITAN_I2C_HAS_MODE_TARGET 1
122#define OPENTITAN_I2C_HAS_MODE_ACKCONTROL 1
123#define OPENTITAN_I2C_HAS_SPEED_STANDARD 1
124#define OPENTITAN_I2C_HAS_SPEED_FAST 1
125#define OPENTITAN_I2C_HAS_SPEED_FASTPLUS 1
126#define OPENTITAN_I2C_HAS_OVERRIDE 1
127#define OPENTITAN_I2C_HAS_OPERATION_READ 1
128#define OPENTITAN_I2C_HAS_OPERATION_WRITE 1
129#define OPENTITAN_I2C_HAS_PROTOCOL_CLOCKSTRETCHING 1
130#define OPENTITAN_I2C_HAS_PROTOCOL_NACK 1
131#define OPENTITAN_I2C_HAS_PROTOCOL_REPEATEDSTART 1
132
133
134
135/**
136 * Get the i2c instance from an instance ID
137 *
138 * For example, `dt_uart_from_instance_id(kDtInstanceIdUart3) == kDtUart3`.
139 *
140 * @param inst_id Instance ID.
141 * @return A i2c instance.
142 *
143 * **Note:** This function only makes sense if the instance ID has device type i2c,
144 * otherwise the returned value is unspecified.
145 */
147
148/**
149 * Get the instance ID of an instance.
150 *
151 * @param dt Instance of i2c.
152 * @return The instance ID of that instance.
153 */
155
156/**
157 * Get the register base address of an instance.
158 *
159 * @param dt Instance of i2c.
160 * @param reg_block The register block requested.
161 * @return The register base address of the requested block.
162 */
163uint32_t dt_i2c_reg_block(
164 dt_i2c_t dt,
165 dt_i2c_reg_block_t reg_block);
166
167/**
168 * Get the primary register base address of an instance.
169 *
170 * This is just a convenience function, equivalent to
171 * `dt_i2c_reg_block(dt, kDtI2cRegBlockCore)`
172 *
173 * @param dt Instance of i2c.
174 * @return The register base address of the primary register block.
175 */
176static inline uint32_t dt_i2c_primary_reg_block(
177 dt_i2c_t dt) {
178 return dt_i2c_reg_block(dt, kDtI2cRegBlockCore);
179}
180
181/**
182 * Get the PLIC ID of a i2c IRQ for a given instance.
183 *
184 * If the instance is not connected to the PLIC, this function
185 * will return `kDtPlicIrqIdNone`.
186 *
187 * @param dt Instance of i2c.
188 * @param irq A i2c IRQ.
189 * @return The PLIC ID of the IRQ of this instance.
190 */
192 dt_i2c_t dt,
193 dt_i2c_irq_t irq);
194
195/**
196 * Convert a global IRQ ID to a local i2c IRQ type.
197 *
198 * @param dt Instance of i2c.
199 * @param irq A PLIC ID that belongs to this instance.
200 * @return The i2c IRQ, or `kDtI2cIrqCount`.
201 *
202 * **Note:** This function assumes that the PLIC ID belongs to the instance
203 * of i2c passed in parameter. In other words, it must be the case that
204 * `dt_i2c_instance_id(dt) == dt_plic_id_to_instance_id(irq)`. Otherwise, this function
205 * will return `kDtI2cIrqCount`.
206 */
208 dt_i2c_t dt,
209 dt_plic_irq_id_t irq);
210
211
212/**
213 * Get the alert ID of a i2c alert for a given instance.
214 *
215 * **Note:** This function only makes sense if the instance is connected to the Alert Handler. For any
216 * instances where the instance is not connected, the return value is unspecified.
217 *
218 * @param dt Instance of i2c.
219 * @param alert A i2c alert.
220 * @return The Alert Handler alert ID of the alert of this instance.
221 */
223 dt_i2c_t dt,
224 dt_i2c_alert_t alert);
225
226/**
227 * Convert a global alert ID to a local i2c alert type.
228 *
229 * @param dt Instance of i2c.
230 * @param alert A global alert ID that belongs to this instance.
231 * @return The i2c alert, or `kDtI2cAlertCount`.
232 *
233 * **Note:** This function assumes that the global alert ID belongs to the
234 * instance of i2c passed in parameter. In other words, it must be the case
235 * that `dt_i2c_instance_id(dt) == dt_alert_id_to_instance_id(alert)`. Otherwise,
236 * this function will return `kDtI2cAlertCount`.
237 */
239 dt_i2c_t dt,
240 dt_alert_id_t alert);
241
242
243/**
244 * Get the peripheral I/O description of an instance.
245 *
246 * @param dt Instance of i2c.
247 * @param sig Requested peripheral I/O.
248 * @return Description of the requested peripheral I/O for this instance.
249 */
251 dt_i2c_t dt,
253
254/**
255 * Get the clock signal connected to a clock port of an instance.
256 *
257 * @param dt Instance of i2c.
258 * @param clk Clock port.
259 * @return Clock signal.
260 */
262 dt_i2c_t dt,
263 dt_i2c_clock_t clk);
264
265/**
266 * Get the reset signal connected to a reset port of an instance.
267 *
268 * @param dt Instance of i2c.
269 * @param rst Reset port.
270 * @return Reset signal.
271 */
273 dt_i2c_t dt,
274 dt_i2c_reset_t rst);
275
276
277
278#ifdef __cplusplus
279} // extern "C"
280#endif // __cplusplus
281
282#endif // OPENTITAN_DT_I2C_H_