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
18/**
19 * Description of instances.
20 */
21typedef struct dt_desc_gpio {
22 dt_instance_id_t inst_id; /**< Instance ID */
23 uint32_t base_addr[kDtGpioRegBlockCount]; /**< Base address of each register block */
24 /**
25 * PLIC ID of the first IRQ of this instance
26 *
27 * This can be `kDtPlicIrqIdNone` if the block is not connected to the PLIC.
28 */
30 dt_clock_t clock[kDtGpioClockCount]; /**< Clock signal connected to each clock port */
31 dt_reset_t reset[kDtGpioResetCount]; /**< Reset signal connected to each reset port */
32 dt_periph_io_t periph_io[kDtGpioPeriphIoCount]; /**< Description of each peripheral I/O */
33 struct {
34 uint8_t input_period_counter_count; /**< number of input period counters */
35 } ipgen_ext; /**< Extension */
37
38
39
40
41static const dt_desc_gpio_t gpio_desc[kDtGpioCount] = {
42 [kDtGpio] = {
43 .inst_id = kDtInstanceIdGpio,
44 .base_addr = {
45 [kDtGpioRegBlockCore] = 0x40040000,
46 },
48 .clock = {
50 },
51 .reset = {
53 },
54 .periph_io = {
55 [kDtGpioPeriphIoGpio0] = {
56 .__internal = {
57 .type = kDtPeriphIoTypeMio,
59 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio0,
61 },
62 },
63 [kDtGpioPeriphIoGpio1] = {
64 .__internal = {
65 .type = kDtPeriphIoTypeMio,
67 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio1,
69 },
70 },
71 [kDtGpioPeriphIoGpio2] = {
72 .__internal = {
73 .type = kDtPeriphIoTypeMio,
75 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio2,
77 },
78 },
79 [kDtGpioPeriphIoGpio3] = {
80 .__internal = {
81 .type = kDtPeriphIoTypeMio,
83 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio3,
85 },
86 },
87 [kDtGpioPeriphIoGpio4] = {
88 .__internal = {
89 .type = kDtPeriphIoTypeMio,
91 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio4,
93 },
94 },
95 [kDtGpioPeriphIoGpio5] = {
96 .__internal = {
97 .type = kDtPeriphIoTypeMio,
99 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio5,
101 },
102 },
103 [kDtGpioPeriphIoGpio6] = {
104 .__internal = {
105 .type = kDtPeriphIoTypeMio,
106 .dir = kDtPeriphIoDirInout,
107 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio6,
109 },
110 },
111 [kDtGpioPeriphIoGpio7] = {
112 .__internal = {
113 .type = kDtPeriphIoTypeMio,
114 .dir = kDtPeriphIoDirInout,
115 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio7,
117 },
118 },
119 [kDtGpioPeriphIoGpio8] = {
120 .__internal = {
121 .type = kDtPeriphIoTypeMio,
122 .dir = kDtPeriphIoDirInout,
123 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio8,
125 },
126 },
127 [kDtGpioPeriphIoGpio9] = {
128 .__internal = {
129 .type = kDtPeriphIoTypeMio,
130 .dir = kDtPeriphIoDirInout,
131 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio9,
133 },
134 },
135 [kDtGpioPeriphIoGpio10] = {
136 .__internal = {
137 .type = kDtPeriphIoTypeMio,
138 .dir = kDtPeriphIoDirInout,
139 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio10,
141 },
142 },
143 [kDtGpioPeriphIoGpio11] = {
144 .__internal = {
145 .type = kDtPeriphIoTypeMio,
146 .dir = kDtPeriphIoDirInout,
147 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio11,
149 },
150 },
151 [kDtGpioPeriphIoGpio12] = {
152 .__internal = {
153 .type = kDtPeriphIoTypeMio,
154 .dir = kDtPeriphIoDirInout,
155 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio12,
157 },
158 },
159 [kDtGpioPeriphIoGpio13] = {
160 .__internal = {
161 .type = kDtPeriphIoTypeMio,
162 .dir = kDtPeriphIoDirInout,
163 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio13,
165 },
166 },
167 [kDtGpioPeriphIoGpio14] = {
168 .__internal = {
169 .type = kDtPeriphIoTypeMio,
170 .dir = kDtPeriphIoDirInout,
171 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio14,
173 },
174 },
175 [kDtGpioPeriphIoGpio15] = {
176 .__internal = {
177 .type = kDtPeriphIoTypeMio,
178 .dir = kDtPeriphIoDirInout,
179 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio15,
181 },
182 },
183 [kDtGpioPeriphIoGpio16] = {
184 .__internal = {
185 .type = kDtPeriphIoTypeMio,
186 .dir = kDtPeriphIoDirInout,
187 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio16,
189 },
190 },
191 [kDtGpioPeriphIoGpio17] = {
192 .__internal = {
193 .type = kDtPeriphIoTypeMio,
194 .dir = kDtPeriphIoDirInout,
195 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio17,
197 },
198 },
199 [kDtGpioPeriphIoGpio18] = {
200 .__internal = {
201 .type = kDtPeriphIoTypeMio,
202 .dir = kDtPeriphIoDirInout,
203 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio18,
205 },
206 },
207 [kDtGpioPeriphIoGpio19] = {
208 .__internal = {
209 .type = kDtPeriphIoTypeMio,
210 .dir = kDtPeriphIoDirInout,
211 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio19,
213 },
214 },
215 [kDtGpioPeriphIoGpio20] = {
216 .__internal = {
217 .type = kDtPeriphIoTypeMio,
218 .dir = kDtPeriphIoDirInout,
219 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio20,
221 },
222 },
223 [kDtGpioPeriphIoGpio21] = {
224 .__internal = {
225 .type = kDtPeriphIoTypeMio,
226 .dir = kDtPeriphIoDirInout,
227 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio21,
229 },
230 },
231 [kDtGpioPeriphIoGpio22] = {
232 .__internal = {
233 .type = kDtPeriphIoTypeMio,
234 .dir = kDtPeriphIoDirInout,
235 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio22,
237 },
238 },
239 [kDtGpioPeriphIoGpio23] = {
240 .__internal = {
241 .type = kDtPeriphIoTypeMio,
242 .dir = kDtPeriphIoDirInout,
243 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio23,
245 },
246 },
247 [kDtGpioPeriphIoGpio24] = {
248 .__internal = {
249 .type = kDtPeriphIoTypeMio,
250 .dir = kDtPeriphIoDirInout,
251 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio24,
253 },
254 },
255 [kDtGpioPeriphIoGpio25] = {
256 .__internal = {
257 .type = kDtPeriphIoTypeMio,
258 .dir = kDtPeriphIoDirInout,
259 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio25,
261 },
262 },
263 [kDtGpioPeriphIoGpio26] = {
264 .__internal = {
265 .type = kDtPeriphIoTypeMio,
266 .dir = kDtPeriphIoDirInout,
267 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio26,
269 },
270 },
271 [kDtGpioPeriphIoGpio27] = {
272 .__internal = {
273 .type = kDtPeriphIoTypeMio,
274 .dir = kDtPeriphIoDirInout,
275 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio27,
277 },
278 },
279 [kDtGpioPeriphIoGpio28] = {
280 .__internal = {
281 .type = kDtPeriphIoTypeMio,
282 .dir = kDtPeriphIoDirInout,
283 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio28,
285 },
286 },
287 [kDtGpioPeriphIoGpio29] = {
288 .__internal = {
289 .type = kDtPeriphIoTypeMio,
290 .dir = kDtPeriphIoDirInout,
291 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio29,
293 },
294 },
295 [kDtGpioPeriphIoGpio30] = {
296 .__internal = {
297 .type = kDtPeriphIoTypeMio,
298 .dir = kDtPeriphIoDirInout,
299 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio30,
301 },
302 },
303 [kDtGpioPeriphIoGpio31] = {
304 .__internal = {
305 .type = kDtPeriphIoTypeMio,
306 .dir = kDtPeriphIoDirInout,
307 .periph_input_or_direct_pad = kTopEnglishbreakfastPinmuxPeripheralInGpioGpio31,
309 },
310 },
311 },
312 .ipgen_ext = {
313 .input_period_counter_count = 0,
314 },
315 },
316};
317
318/**
319 * Return a pointer to the `dt_gpio_desc_t` structure of the requested
320 * `dt` if it's a valid index. Otherwise, this macro will `return` (i.e. exit
321 * the function) with the provided default value.
322 */
323#define TRY_GET_DT(dt, default) ({ if ((dt) < (dt_gpio_t)0 || (dt) >= kDtGpioCount) return (default); &gpio_desc[dt]; })
324
326 if (inst_id >= kDtInstanceIdGpio && inst_id <= kDtInstanceIdGpio) {
327 return (dt_gpio_t)(inst_id - kDtInstanceIdGpio);
328 }
329 return (dt_gpio_t)0;
330}
331
336
338 dt_gpio_t dt,
339 dt_gpio_reg_block_t reg_block) {
340 // Return a recognizable address in case of wrong argument.
341 return TRY_GET_DT(dt, 0xdeadbeef)->base_addr[reg_block];
342}
343
345 dt_gpio_t dt,
346 dt_gpio_irq_t irq) {
347 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, kDtPlicIrqIdNone)->first_irq;
348 if (first_irq == kDtPlicIrqIdNone) {
349 return kDtPlicIrqIdNone;
350 }
351 return (dt_plic_irq_id_t)((uint32_t)first_irq + (uint32_t)irq);
352}
353
355 dt_gpio_t dt,
356 dt_plic_irq_id_t irq) {
357 dt_gpio_irq_t count = kDtGpioIrqCount;
358 dt_plic_irq_id_t first_irq = TRY_GET_DT(dt, count)->first_irq;
359 if (first_irq == kDtPlicIrqIdNone) {
360 return count;
361 }
362 if (irq < first_irq || irq >= first_irq + (dt_plic_irq_id_t)count) {
363 return count;
364 }
365 return (dt_gpio_irq_t)(irq - first_irq);
366}
367
368
369
371 dt_gpio_t dt,
373 // Return a harmless value in case of wrong argument.
374 return TRY_GET_DT(dt, kDtPeriphIoConstantHighZ)->periph_io[sig];
375}
376
378 dt_gpio_t dt,
379 dt_gpio_clock_t clk) {
380 // Return the first clock in case of invalid argument.
381 return TRY_GET_DT(dt, (dt_clock_t)0)->clock[clk];
382}
383
385 dt_gpio_t dt,
386 dt_gpio_reset_t rst) {
387 const dt_gpio_reset_t count = kDtGpioResetCount;
388 if (rst >= count) {
389 return kDtResetUnknown;
390 }
391 return TRY_GET_DT(dt, kDtResetUnknown)->reset[rst];
392}
393
394
395
397 return TRY_GET_DT(dt, 0)->ipgen_ext.input_period_counter_count;
398}
399
400