Software APIs
dt_gpio.c
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/**
8 * @file
9 * @brief Device Tables (DT) for IP gpio and top englishbreakfast.
10 */
11
12#include "dt/dt_gpio.h"
13
14
15
16/**
17 * Description of instances.
18 */
19typedef struct dt_desc_gpio {
20 dt_instance_id_t inst_id; /**< Instance ID */
21 uint32_t base_addr[kDtGpioRegBlockCount]; /**< Base address of each register block */
22 /**
23 * PLIC ID of the first IRQ of this instance
24 *
25 * This can be `kDtPlicIrqIdNone` if the block is not connected to the PLIC.
26 */
28 dt_clock_t clock[kDtGpioClockCount]; /**< Clock signal connected to each clock port */
29 dt_reset_t reset[kDtGpioResetCount]; /**< Reset signal connected to each reset port */
30 dt_periph_io_t periph_io[kDtGpioPeriphIoCount]; /**< Description of each peripheral I/O */
32
33
34
35
36static const dt_desc_gpio_t gpio_desc[kDtGpioCount] = {
37 [kDtGpio] = {
38 .inst_id = kDtInstanceIdGpio,
39 .base_addr = {
40 [kDtGpioRegBlockCore] = 0x40040000,
41 },
43 .clock = {
45 },
46 .reset = {
48 },
49 .periph_io = {
50 [kDtGpioPeriphIoGpio0] = {
51 .__internal = {
52 .type = kDtPeriphIoTypeMio,
54 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio0,
56 },
57 },
58 [kDtGpioPeriphIoGpio1] = {
59 .__internal = {
60 .type = kDtPeriphIoTypeMio,
62 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio1,
64 },
65 },
66 [kDtGpioPeriphIoGpio2] = {
67 .__internal = {
68 .type = kDtPeriphIoTypeMio,
70 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio2,
72 },
73 },
74 [kDtGpioPeriphIoGpio3] = {
75 .__internal = {
76 .type = kDtPeriphIoTypeMio,
78 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio3,
80 },
81 },
82 [kDtGpioPeriphIoGpio4] = {
83 .__internal = {
84 .type = kDtPeriphIoTypeMio,
86 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio4,
88 },
89 },
90 [kDtGpioPeriphIoGpio5] = {
91 .__internal = {
92 .type = kDtPeriphIoTypeMio,
94 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio5,
96 },
97 },
98 [kDtGpioPeriphIoGpio6] = {
99 .__internal = {
100 .type = kDtPeriphIoTypeMio,
101 .dir = kDtPeriphIoDirInout,
102 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio6,
104 },
105 },
106 [kDtGpioPeriphIoGpio7] = {
107 .__internal = {
108 .type = kDtPeriphIoTypeMio,
109 .dir = kDtPeriphIoDirInout,
110 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio7,
112 },
113 },
114 [kDtGpioPeriphIoGpio8] = {
115 .__internal = {
116 .type = kDtPeriphIoTypeMio,
117 .dir = kDtPeriphIoDirInout,
118 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio8,
120 },
121 },
122 [kDtGpioPeriphIoGpio9] = {
123 .__internal = {
124 .type = kDtPeriphIoTypeMio,
125 .dir = kDtPeriphIoDirInout,
126 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio9,
128 },
129 },
130 [kDtGpioPeriphIoGpio10] = {
131 .__internal = {
132 .type = kDtPeriphIoTypeMio,
133 .dir = kDtPeriphIoDirInout,
134 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio10,
136 },
137 },
138 [kDtGpioPeriphIoGpio11] = {
139 .__internal = {
140 .type = kDtPeriphIoTypeMio,
141 .dir = kDtPeriphIoDirInout,
142 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio11,
144 },
145 },
146 [kDtGpioPeriphIoGpio12] = {
147 .__internal = {
148 .type = kDtPeriphIoTypeMio,
149 .dir = kDtPeriphIoDirInout,
150 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio12,
152 },
153 },
154 [kDtGpioPeriphIoGpio13] = {
155 .__internal = {
156 .type = kDtPeriphIoTypeMio,
157 .dir = kDtPeriphIoDirInout,
158 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio13,
160 },
161 },
162 [kDtGpioPeriphIoGpio14] = {
163 .__internal = {
164 .type = kDtPeriphIoTypeMio,
165 .dir = kDtPeriphIoDirInout,
166 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio14,
168 },
169 },
170 [kDtGpioPeriphIoGpio15] = {
171 .__internal = {
172 .type = kDtPeriphIoTypeMio,
173 .dir = kDtPeriphIoDirInout,
174 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio15,
176 },
177 },
178 [kDtGpioPeriphIoGpio16] = {
179 .__internal = {
180 .type = kDtPeriphIoTypeMio,
181 .dir = kDtPeriphIoDirInout,
182 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio16,
184 },
185 },
186 [kDtGpioPeriphIoGpio17] = {
187 .__internal = {
188 .type = kDtPeriphIoTypeMio,
189 .dir = kDtPeriphIoDirInout,
190 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio17,
192 },
193 },
194 [kDtGpioPeriphIoGpio18] = {
195 .__internal = {
196 .type = kDtPeriphIoTypeMio,
197 .dir = kDtPeriphIoDirInout,
198 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio18,
200 },
201 },
202 [kDtGpioPeriphIoGpio19] = {
203 .__internal = {
204 .type = kDtPeriphIoTypeMio,
205 .dir = kDtPeriphIoDirInout,
206 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio19,
208 },
209 },
210 [kDtGpioPeriphIoGpio20] = {
211 .__internal = {
212 .type = kDtPeriphIoTypeMio,
213 .dir = kDtPeriphIoDirInout,
214 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio20,
216 },
217 },
218 [kDtGpioPeriphIoGpio21] = {
219 .__internal = {
220 .type = kDtPeriphIoTypeMio,
221 .dir = kDtPeriphIoDirInout,
222 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio21,
224 },
225 },
226 [kDtGpioPeriphIoGpio22] = {
227 .__internal = {
228 .type = kDtPeriphIoTypeMio,
229 .dir = kDtPeriphIoDirInout,
230 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio22,
232 },
233 },
234 [kDtGpioPeriphIoGpio23] = {
235 .__internal = {
236 .type = kDtPeriphIoTypeMio,
237 .dir = kDtPeriphIoDirInout,
238 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio23,
240 },
241 },
242 [kDtGpioPeriphIoGpio24] = {
243 .__internal = {
244 .type = kDtPeriphIoTypeMio,
245 .dir = kDtPeriphIoDirInout,
246 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio24,
248 },
249 },
250 [kDtGpioPeriphIoGpio25] = {
251 .__internal = {
252 .type = kDtPeriphIoTypeMio,
253 .dir = kDtPeriphIoDirInout,
254 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio25,
256 },
257 },
258 [kDtGpioPeriphIoGpio26] = {
259 .__internal = {
260 .type = kDtPeriphIoTypeMio,
261 .dir = kDtPeriphIoDirInout,
262 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio26,
264 },
265 },
266 [kDtGpioPeriphIoGpio27] = {
267 .__internal = {
268 .type = kDtPeriphIoTypeMio,
269 .dir = kDtPeriphIoDirInout,
270 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio27,
272 },
273 },
274 [kDtGpioPeriphIoGpio28] = {
275 .__internal = {
276 .type = kDtPeriphIoTypeMio,
277 .dir = kDtPeriphIoDirInout,
278 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio28,
280 },
281 },
282 [kDtGpioPeriphIoGpio29] = {
283 .__internal = {
284 .type = kDtPeriphIoTypeMio,
285 .dir = kDtPeriphIoDirInout,
286 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio29,
288 },
289 },
290 [kDtGpioPeriphIoGpio30] = {
291 .__internal = {
292 .type = kDtPeriphIoTypeMio,
293 .dir = kDtPeriphIoDirInout,
294 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio30,
296 },
297 },
298 [kDtGpioPeriphIoGpio31] = {
299 .__internal = {
300 .type = kDtPeriphIoTypeMio,
301 .dir = kDtPeriphIoDirInout,
302 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio31,
304 },
305 },
306 },
307 },
308};
309
310/**
311 * Return a pointer to the `dt_gpio_desc_t` structure of the requested
312 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
313 * the function) with the provided default value.
314 */
315#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_gpio_t)0 || (dt) >= kDtGpioCount) return (default); &gpio_desc[dt]; })
316
318 if (inst_id >= kDtInstanceIdGpio && inst_id <= kDtInstanceIdGpio) {
319 return (dt_gpio_t)(inst_id - kDtInstanceIdGpio);
320 }
321 return (dt_gpio_t)0;
322}
323
328
330 dt_gpio_t dt,
331 dt_gpio_reg_block_t reg_block) {
332 // Return a recognizable address in case of wrong argument.
333 return TRY_GET_DT(dt, 0xdeadbeef)->base_addr[reg_block];
334}
335
337 dt_gpio_t dt,
338 dt_gpio_irq_t irq) {
339 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, kDtPlicIrqIdNone)->first_irq;
340 if (first_irq == kDtPlicIrqIdNone) {
341 return kDtPlicIrqIdNone;
342 }
343 return (dt_plic_irq_id_t)((uint32_t)first_irq + (uint32_t)irq);
344}
345
347 dt_gpio_t dt,
348 dt_plic_irq_id_t irq) {
349 dt_gpio_irq_t count = kDtGpioIrqCount;
350 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, count)->first_irq;
351 if (first_irq == kDtPlicIrqIdNone) {
352 return count;
353 }
354 if (irq < first_irq || irq >= first_irq + (dt_plic_irq_id_t)count) {
355 return count;
356 }
357 return (dt_gpio_irq_t)(irq - first_irq);
358}
359
360
361
363 dt_gpio_t dt,
365 // Return a harmless value in case of wrong argument.
366 return TRY_GET_DT(dt, kDtPeriphIoConstantHighZ)->periph_io[sig];
367}
368
370 dt_gpio_t dt,
371 dt_gpio_clock_t clk) {
372 // Return the first clock in case of invalid argument.
373 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
374}
375
377 dt_gpio_t dt,
378 dt_gpio_reset_t rst) {
379 const dt_gpio_reset_t count = kDtGpioResetCount;
380 if (rst >= count) {
381 return kDtResetUnknown;
382 }
383 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
384}
385
386