1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 /*******************************************************************************************************************//**
8 * @defgroup BSP_IO BSP I/O access
9 * @ingroup RENESAS_COMMON
10 * @brief This module provides basic read/write access to port pins.
11 *
12 * @{
13 **********************************************************************************************************************/
14
15 #ifndef BSP_IO_H
16 #define BSP_IO_H
17
18 /* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */
19 FSP_HEADER
20
21 /***********************************************************************************************************************
22 * Macro definitions
23 **********************************************************************************************************************/
24
25 /* Private definition to set enumeration values. */
26 #define BSP_IO_PRV_8BIT_MASK (0xFF)
27 #define BSP_IO_PRV_PIN_MASK (1U)
28 #define BSP_IO_PRV_PORT_OFFSET (8U)
29 #define BSP_IO_PRV_PFCWE_MASK (0xFFFFFFBF)
30 #define BSP_IO_PRV_OENWE_MASK (0xFFFFFFDF)
31 #define BSP_IO_PRV_SET_OEN_ENABLE (0U)
32 #define BSP_IO_PRV_SET_SSEL0_SELCTL2 (0x1000U)
33 #define BSP_IO_PRV_SET_SSEL1_SELCTL0 (0x0100U)
34 #define BSP_IO_PWPR_B0WI_OFFSET (7U)
35 #define BSP_IO_PWPR_PFSWE_OFFSET (6U)
36 #define BSP_IO_PWPR_OENWE_OFFSET (5U)
37 #define BSP_IO_PM_PM_OUTPUT (3U)
38
39 #define BSP_IO_PRV_P_REG_BASE_SET(base) BSP_IO_PRV_P_REG_BASE(base)
40 #define BSP_IO_PRV_P_REG_BASE(base) (&R_GPIO->P ## base)
41 #define BSP_IO_PRV_PM_REG_BASE_SET(base) BSP_IO_PRV_PM_REG_BASE(base)
42 #define BSP_IO_PRV_PM_REG_BASE(base) (&R_GPIO->PM ## base)
43 #define BSP_IO_PRV_PIN_REG_BASE_SET(base) BSP_IO_PRV_PIN_REG_BASE(base)
44 #define BSP_IO_PRV_PIN_REG_BASE(base) (&R_GPIO->PIN ## base)
45
46 /***********************************************************************************************************************
47 * Typedef definitions
48 **********************************************************************************************************************/
49
50 /** Levels that can be set and read for individual pins */
51 typedef enum e_bsp_io_level
52 {
53 BSP_IO_LEVEL_LOW = 0, ///< Low
54 BSP_IO_LEVEL_HIGH ///< High
55 } bsp_io_level_t;
56
57 /** Direction of individual pins */
58 typedef enum e_bsp_io_dir
59 {
60 BSP_IO_DIRECTION_HIZ = 0x0, ///< Hi-Z
61 BSP_IO_DIRECTION_INPUT = 0x4, ///< Input
62 BSP_IO_DIRECTION_OUTPUT = 0x8, ///< Output (Input disable)
63 BSP_IO_DIRECTION_OUTPUT_WITH_INPUT_ENABLE = 0xC ///< Output (Input enable)
64 } bsp_io_direction_t;
65
66 #ifndef BSP_OVERRIDE_BSP_PORT_T
67
68 /** Superset list of all possible IO ports. */
69 typedef enum e_bsp_io_port
70 {
71 BSP_IO_PORT_00 = 0x0000, ///< IO port 0
72 BSP_IO_PORT_01 = 0x0100, ///< IO port 1
73 BSP_IO_PORT_02 = 0x0200, ///< IO port 2
74 BSP_IO_PORT_03 = 0x0300, ///< IO port 3
75 BSP_IO_PORT_04 = 0x0400, ///< IO port 4
76 BSP_IO_PORT_05 = 0x0500, ///< IO port 5
77 BSP_IO_PORT_06 = 0x0600, ///< IO port 6
78 BSP_IO_PORT_07 = 0x0700, ///< IO port 7
79 BSP_IO_PORT_08 = 0x0800, ///< IO port 8
80 BSP_IO_PORT_09 = 0x0900, ///< IO port 9
81 BSP_IO_PORT_10 = 0x0A00, ///< IO port 10
82 BSP_IO_PORT_11 = 0x0B00, ///< IO port 11
83 BSP_IO_PORT_12 = 0x0C00, ///< IO port 12
84 BSP_IO_PORT_13 = 0x0D00, ///< IO port 13
85 BSP_IO_PORT_14 = 0x0E00, ///< IO port 14
86 BSP_IO_PORT_15 = 0x0F00, ///< IO port 15
87 BSP_IO_PORT_16 = 0x1000, ///< IO port 16
88 BSP_IO_PORT_17 = 0x1100, ///< IO port 17
89 BSP_IO_PORT_18 = 0x1200, ///< IO port 18
90 BSP_IO_PORT_19 = 0x1300, ///< IO port 19
91 BSP_IO_PORT_20 = 0x1400, ///< IO port 20
92 BSP_IO_PORT_21 = 0x1500, ///< IO port 21
93 BSP_IO_PORT_22 = 0x1600, ///< IO port 22
94 BSP_IO_PORT_23 = 0x1700, ///< IO port 23
95 BSP_IO_PORT_24 = 0x1800, ///< IO port 24
96 BSP_IO_PORT_25 = 0x1900, ///< IO port 25
97 BSP_IO_PORT_26 = 0x1A00, ///< IO port 26
98 BSP_IO_PORT_27 = 0x1B00, ///< IO port 27
99 BSP_IO_PORT_28 = 0x1C00, ///< IO port 28
100 BSP_IO_PORT_29 = 0x1D00, ///< IO port 29
101 BSP_IO_PORT_30 = 0x1E00, ///< IO port 30
102 BSP_IO_PORT_31 = 0x1F00, ///< IO port 31
103 BSP_IO_PORT_32 = 0x2000, ///< IO port 32
104 BSP_IO_PORT_33 = 0x2100, ///< IO port 33
105 BSP_IO_PORT_34 = 0x2200, ///< IO port 34
106 BSP_IO_PORT_35 = 0x2300, ///< IO port 35
107 BSP_IO_PORT_36 = 0x2400, ///< IO port 36
108 BSP_IO_PORT_37 = 0x2500, ///< IO port 37
109 BSP_IO_PORT_38 = 0x2600, ///< IO port 38
110 BSP_IO_PORT_39 = 0x2700, ///< IO port 39
111 BSP_IO_PORT_40 = 0x2800, ///< IO port 40
112 BSP_IO_PORT_41 = 0x2900, ///< IO port 41
113 BSP_IO_PORT_42 = 0x2A00, ///< IO port 42
114 BSP_IO_PORT_43 = 0x2B00, ///< IO port 43
115 BSP_IO_PORT_44 = 0x2C00, ///< IO port 44
116 BSP_IO_PORT_45 = 0x2D00, ///< IO port 45
117 BSP_IO_PORT_46 = 0x2E00, ///< IO port 46
118 BSP_IO_PORT_47 = 0x2F00, ///< IO port 47
119 BSP_IO_PORT_48 = 0x3000, ///< IO port 48
120 } bsp_io_port_t;
121
122 #endif
123
124 #ifndef BSP_OVERRIDE_BSP_PIN_T
125
126 /** Superset list of all possible IO port pins. */
127 typedef enum e_bsp_io_port_pin_t
128 {
129 BSP_IO_PORT_00_PIN_00 = 0x0000, ///< IO port 0 pin 0
130 BSP_IO_PORT_00_PIN_01 = 0x0001, ///< IO port 0 pin 1
131
132 BSP_IO_PORT_01_PIN_00 = 0x0100, ///< IO port 1 pin 0
133 BSP_IO_PORT_01_PIN_01 = 0x0101, ///< IO port 1 pin 1
134
135 BSP_IO_PORT_02_PIN_00 = 0x0200, ///< IO port 2 pin 0
136 BSP_IO_PORT_02_PIN_01 = 0x0201, ///< IO port 2 pin 1
137
138 BSP_IO_PORT_03_PIN_00 = 0x0300, ///< IO port 3 pin 0
139 BSP_IO_PORT_03_PIN_01 = 0x0301, ///< IO port 3 pin 1
140
141 BSP_IO_PORT_04_PIN_00 = 0x0400, ///< IO port 4 pin 0
142 BSP_IO_PORT_04_PIN_01 = 0x0401, ///< IO port 4 pin 1
143
144 BSP_IO_PORT_05_PIN_00 = 0x0500, ///< IO port 5 pin 0
145 BSP_IO_PORT_05_PIN_01 = 0x0501, ///< IO port 5 pin 1
146 BSP_IO_PORT_05_PIN_02 = 0x0502, ///< IO port 5 pin 2
147
148 BSP_IO_PORT_06_PIN_00 = 0x0600, ///< IO port 6 pin 0
149 BSP_IO_PORT_06_PIN_01 = 0x0601, ///< IO port 6 pin 1
150
151 BSP_IO_PORT_07_PIN_00 = 0x0700, ///< IO port 7 pin 0
152 BSP_IO_PORT_07_PIN_01 = 0x0701, ///< IO port 7 pin 1
153 BSP_IO_PORT_07_PIN_02 = 0x0702, ///< IO port 7 pin 2
154
155 BSP_IO_PORT_08_PIN_00 = 0x0800, ///< IO port 8 pin 0
156 BSP_IO_PORT_08_PIN_01 = 0x0801, ///< IO port 8 pin 1
157 BSP_IO_PORT_08_PIN_02 = 0x0802, ///< IO port 8 pin 2
158
159 BSP_IO_PORT_09_PIN_00 = 0x0900, ///< IO port 9 pin 0
160 BSP_IO_PORT_09_PIN_01 = 0x0901, ///< IO port 9 pin 1
161
162 BSP_IO_PORT_10_PIN_00 = 0x0A00, ///< IO port 10 pin 0
163 BSP_IO_PORT_10_PIN_01 = 0x0A01, ///< IO port 10 pin 1
164
165 BSP_IO_PORT_11_PIN_00 = 0x0B00, ///< IO port 11 pin 0
166 BSP_IO_PORT_11_PIN_01 = 0x0B01, ///< IO port 11 pin 1
167
168 BSP_IO_PORT_12_PIN_00 = 0x0C00, ///< IO port 12 pin 0
169 BSP_IO_PORT_12_PIN_01 = 0x0C01, ///< IO port 12 pin 1
170
171 BSP_IO_PORT_13_PIN_00 = 0x0D00, ///< IO port 13 pin 0
172 BSP_IO_PORT_13_PIN_01 = 0x0D01, ///< IO port 13 pin 1
173 BSP_IO_PORT_13_PIN_02 = 0x0D02, ///< IO port 13 pin 2
174
175 BSP_IO_PORT_14_PIN_00 = 0x0E00, ///< IO port 14 pin 0
176 BSP_IO_PORT_14_PIN_01 = 0x0E01, ///< IO port 14 pin 1
177
178 BSP_IO_PORT_15_PIN_00 = 0x0F00, ///< IO port 15 pin 0
179 BSP_IO_PORT_15_PIN_01 = 0x0F01, ///< IO port 15 pin 1
180
181 BSP_IO_PORT_16_PIN_00 = 0x1000, ///< IO port 16 pin 0
182 BSP_IO_PORT_16_PIN_01 = 0x1001, ///< IO port 16 pin 1
183
184 BSP_IO_PORT_17_PIN_00 = 0x1100, ///< IO port 17 pin 0
185 BSP_IO_PORT_17_PIN_01 = 0x1101, ///< IO port 17 pin 1
186 BSP_IO_PORT_17_PIN_02 = 0x1102, ///< IO port 17 pin 2
187
188 BSP_IO_PORT_18_PIN_00 = 0x1200, ///< IO port 18 pin 0
189 BSP_IO_PORT_18_PIN_01 = 0x1201, ///< IO port 18 pin 1
190
191 BSP_IO_PORT_19_PIN_00 = 0x1300, ///< IO port 19 pin 0
192 BSP_IO_PORT_19_PIN_01 = 0x1301, ///< IO port 19 pin 1
193
194 BSP_IO_PORT_20_PIN_00 = 0x1400, ///< IO port 20 pin 0
195 BSP_IO_PORT_20_PIN_01 = 0x1401, ///< IO port 20 pin 1
196 BSP_IO_PORT_20_PIN_02 = 0x1402, ///< IO port 20 pin 2
197
198 BSP_IO_PORT_21_PIN_00 = 0x1500, ///< IO port 21 pin 0
199 BSP_IO_PORT_21_PIN_01 = 0x1501, ///< IO port 21 pin 1
200
201 BSP_IO_PORT_22_PIN_00 = 0x1600, ///< IO port 22 pin 0
202 BSP_IO_PORT_22_PIN_01 = 0x1601, ///< IO port 22 pin 1
203
204 BSP_IO_PORT_23_PIN_00 = 0x1700, ///< IO port 23 pin 0
205 BSP_IO_PORT_23_PIN_01 = 0x1701, ///< IO port 23 pin 1
206
207 BSP_IO_PORT_24_PIN_00 = 0x1800, ///< IO port 24 pin 0
208 BSP_IO_PORT_24_PIN_01 = 0x1801, ///< IO port 24 pin 1
209
210 BSP_IO_PORT_25_PIN_00 = 0x1900, ///< IO port 25 pin 0
211 BSP_IO_PORT_25_PIN_01 = 0x1901, ///< IO port 25 pin 1
212
213 BSP_IO_PORT_26_PIN_00 = 0x1A00, ///< IO port 26 pin 0
214 BSP_IO_PORT_26_PIN_01 = 0x1A01, ///< IO port 26 pin 1
215
216 BSP_IO_PORT_27_PIN_00 = 0x1B00, ///< IO port 27 pin 0
217 BSP_IO_PORT_27_PIN_01 = 0x1B01, ///< IO port 27 pin 1
218
219 BSP_IO_PORT_28_PIN_00 = 0x1C00, ///< IO port 28 pin 0
220 BSP_IO_PORT_28_PIN_01 = 0x1C01, ///< IO port 28 pin 1
221
222 BSP_IO_PORT_29_PIN_00 = 0x1D00, ///< IO port 29 pin 0
223 BSP_IO_PORT_29_PIN_01 = 0x1D01, ///< IO port 29 pin 1
224
225 BSP_IO_PORT_30_PIN_00 = 0x1E00, ///< IO port 30 pin 0
226 BSP_IO_PORT_30_PIN_01 = 0x1E01, ///< IO port 30 pin 1
227
228 BSP_IO_PORT_31_PIN_00 = 0x1F00, ///< IO port 31 pin 0
229 BSP_IO_PORT_31_PIN_01 = 0x1F01, ///< IO port 31 pin 1
230
231 BSP_IO_PORT_32_PIN_00 = 0x2000, ///< IO port 32 pin 0
232 BSP_IO_PORT_32_PIN_01 = 0x2001, ///< IO port 32 pin 1
233
234 BSP_IO_PORT_33_PIN_00 = 0x2100, ///< IO port 33 pin 0
235 BSP_IO_PORT_33_PIN_01 = 0x2101, ///< IO port 33 pin 1
236
237 BSP_IO_PORT_34_PIN_00 = 0x2200, ///< IO port 34 pin 0
238 BSP_IO_PORT_34_PIN_01 = 0x2201, ///< IO port 34 pin 1
239
240 BSP_IO_PORT_35_PIN_00 = 0x2300, ///< IO port 35 pin 0
241 BSP_IO_PORT_35_PIN_01 = 0x2301, ///< IO port 35 pin 1
242
243 BSP_IO_PORT_36_PIN_00 = 0x2400, ///< IO port 36 pin 0
244 BSP_IO_PORT_36_PIN_01 = 0x2401, ///< IO port 36 pin 1
245
246 BSP_IO_PORT_37_PIN_00 = 0x2500, ///< IO port 37 pin 0
247 BSP_IO_PORT_37_PIN_01 = 0x2501, ///< IO port 37 pin 1
248 BSP_IO_PORT_37_PIN_02 = 0x2502, ///< IO port 37 pin 2
249
250 BSP_IO_PORT_38_PIN_00 = 0x2600, ///< IO port 38 pin 0
251 BSP_IO_PORT_38_PIN_01 = 0x2601, ///< IO port 38 pin 1
252
253 BSP_IO_PORT_39_PIN_00 = 0x2700, ///< IO port 39 pin 0
254 BSP_IO_PORT_39_PIN_01 = 0x2701, ///< IO port 39 pin 1
255 BSP_IO_PORT_39_PIN_02 = 0x2702, ///< IO port 39 pin 2
256
257 BSP_IO_PORT_40_PIN_00 = 0x2800, ///< IO port 40 pin 0
258 BSP_IO_PORT_40_PIN_01 = 0x2801, ///< IO port 40 pin 1
259 BSP_IO_PORT_40_PIN_02 = 0x2802, ///< IO port 40 pin 2
260
261 BSP_IO_PORT_41_PIN_00 = 0x2900, ///< IO port 41 pin 0
262 BSP_IO_PORT_41_PIN_01 = 0x2901, ///< IO port 41 pin 1
263
264 BSP_IO_PORT_42_PIN_00 = 0x2A00, ///< IO port 42 pin 0
265 BSP_IO_PORT_42_PIN_01 = 0x2A01, ///< IO port 42 pin 1
266 BSP_IO_PORT_42_PIN_02 = 0x2A02, ///< IO port 42 pin 2
267 BSP_IO_PORT_42_PIN_03 = 0x2A03, ///< IO port 42 pin 3
268 BSP_IO_PORT_42_PIN_04 = 0x2A04, ///< IO port 42 pin 4
269
270 BSP_IO_PORT_43_PIN_00 = 0x2B00, ///< IO port 43 pin 0
271 BSP_IO_PORT_43_PIN_01 = 0x2B01, ///< IO port 43 pin 1
272 BSP_IO_PORT_43_PIN_02 = 0x2B02, ///< IO port 43 pin 2
273 BSP_IO_PORT_43_PIN_03 = 0x2B03, ///< IO port 43 pin 3
274
275 BSP_IO_PORT_44_PIN_00 = 0x2C00, ///< IO port 44 pin 0
276 BSP_IO_PORT_44_PIN_01 = 0x2C01, ///< IO port 44 pin 1
277 BSP_IO_PORT_44_PIN_02 = 0x2C02, ///< IO port 44 pin 2
278 BSP_IO_PORT_44_PIN_03 = 0x2C03, ///< IO port 44 pin 3
279
280 BSP_IO_PORT_45_PIN_00 = 0x2D00, ///< IO port 45 pin 0
281 BSP_IO_PORT_45_PIN_01 = 0x2D01, ///< IO port 45 pin 1
282 BSP_IO_PORT_45_PIN_02 = 0x2D02, ///< IO port 45 pin 2
283 BSP_IO_PORT_45_PIN_03 = 0x2D03, ///< IO port 45 pin 3
284
285 BSP_IO_PORT_46_PIN_00 = 0x2E00, ///< IO port 46 pin 0
286 BSP_IO_PORT_46_PIN_01 = 0x2E01, ///< IO port 46 pin 1
287 BSP_IO_PORT_46_PIN_02 = 0x2E02, ///< IO port 46 pin 2
288 BSP_IO_PORT_46_PIN_03 = 0x2E03, ///< IO port 46 pin 3
289
290 BSP_IO_PORT_47_PIN_00 = 0x2F00, ///< IO port 47 pin 0
291 BSP_IO_PORT_47_PIN_01 = 0x2F01, ///< IO port 47 pin 1
292 BSP_IO_PORT_47_PIN_02 = 0x2F02, ///< IO port 47 pin 2
293 BSP_IO_PORT_47_PIN_03 = 0x2F03, ///< IO port 47 pin 3
294
295 BSP_IO_PORT_48_PIN_00 = 0x3000, ///< IO port 48 pin 0
296 BSP_IO_PORT_48_PIN_01 = 0x3001, ///< IO port 48 pin 1
297 BSP_IO_PORT_48_PIN_02 = 0x3002, ///< IO port 48 pin 2
298 BSP_IO_PORT_48_PIN_03 = 0x3003, ///< IO port 48 pin 3
299 BSP_IO_PORT_48_PIN_04 = 0x3004, ///< IO port 48 pin 4
300
301 /* Special purpose port */
302 BSP_IO_NMI = 0xFFFF0100, ///< NMI
303
304 BSP_IO_TMS_SWDIO = 0xFFFF0200, ///< TMS_SWDIO
305
306 BSP_IO_TDO = 0xFFFF0300, ///< TDO
307
308 BSP_IO_AUDIO_CLK1 = 0xFFFF0400, ///< AUDIO_CLK1
309 BSP_IO_AUDIO_CLK2 = 0xFFFF0401, ///< AUDIO_CLK2
310
311 BSP_IO_SD0_CLK = 0xFFFF0600, ///< CD0_CLK
312 BSP_IO_SD0_CMD = 0xFFFF0601, ///< CD0_CMD
313 BSP_IO_SD0_RST_N = 0xFFFF0602, ///< CD0_RST_N
314
315 BSP_IO_SD0_DATA0 = 0xFFFF0700, ///< SD0_DATA0
316 BSP_IO_SD0_DATA1 = 0xFFFF0701, ///< SD0_DATA1
317 BSP_IO_SD0_DATA2 = 0xFFFF0702, ///< SD0_DATA2
318 BSP_IO_SD0_DATA3 = 0xFFFF0703, ///< SD0_DATA3
319 BSP_IO_SD0_DATA4 = 0xFFFF0704, ///< SD0_DATA4
320 BSP_IO_SD0_DATA5 = 0xFFFF0705, ///< SD0_DATA5
321 BSP_IO_SD0_DATA6 = 0xFFFF0706, ///< SD0_DATA6
322 BSP_IO_SD0_DATA7 = 0xFFFF0707, ///< SD0_DATA7
323
324 BSP_IO_SD1_CLK = 0xFFFF0800, ///< SD1_CLK
325 BSP_IO_SD1_CMD = 0xFFFF0801, ///< SD1_CMD
326
327 BSP_IO_SD1_DATA0 = 0xFFFF0900, ///< SD1_DATA0
328 BSP_IO_SD1_DATA1 = 0xFFFF0901, ///< SD1_DATA1
329 BSP_IO_SD1_DATA2 = 0xFFFF0902, ///< SD1_DATA2
330 BSP_IO_SD1_DATA3 = 0xFFFF0903, ///< SD1_DATA3
331
332 BSP_IO_QSPI0_SPCLK = 0xFFFF0A00, ///< QSPI0_SPCLK
333 BSP_IO_QSPI0_IO0 = 0xFFFF0A01, ///< QSPI0_IO0
334 BSP_IO_QSPI0_IO1 = 0xFFFF0A02, ///< QSPI0_IO1
335 BSP_IO_QSPI0_IO2 = 0xFFFF0A03, ///< QSPI0_IO2
336 BSP_IO_QSPI0_IO3 = 0xFFFF0A04, ///< QSPI0_IO3
337 BSP_IO_QSPI0_SSL = 0xFFFF0A05, ///< QSPI0_SSL
338
339 BSP_IO_QSPI1_SPCLK = 0xFFFF0B00, ///< QSPI1_SPCLK
340 BSP_IO_QSPI1_IO0 = 0xFFFF0B01, ///< QSPI1_IO0
341 BSP_IO_QSPI1_IO1 = 0xFFFF0B02, ///< QSPI1_IO1
342 BSP_IO_QSPI1_IO2 = 0xFFFF0B03, ///< QSPI1_IO2
343 BSP_IO_QSPI1_IO3 = 0xFFFF0B04, ///< QSPI1_IO3
344 BSP_IO_QSPI1_SSL = 0xFFFF0B05, ///< QSPI1_SSL
345
346 BSP_IO_QSPI_RESET_N = 0xFFFF0C00, ///< QSPI_RESET_N
347 BSP_IO_QSPI_WP_N = 0xFFFF0C01, ///< QSPI_WP_N
348 BSP_IO_QSPI_INT_N = 0xFFFF0C02, ///< QSPI_INT_N
349
350 BSP_IO_WDTOVF_PERROUT_N = 0xFFFF0D00, ///< WDTOVF_PERROUT_N
351
352 BSP_IO_RIIC0_SDA = 0xFFFF0E00, ///< RIIC0_SDA
353 BSP_IO_RIIC0_SCL = 0xFFFF0E01, ///< RIIC0_SCL
354 BSP_IO_RIIC1_SDA = 0xFFFF0E02, ///< RIIC1_SDA
355 BSP_IO_RIIC1_SCL = 0xFFFF0E03, ///< RIIC1_SCL
356 } bsp_io_port_pin_t;
357
358 #endif
359
360 /** Superset of SD channels. */
361 typedef enum e_bsp_sd_ch
362 {
363 BSP_SD_CHANNEL_0 = 0x00, ///< Used to select SD channel 0
364 BSP_SD_CHANNEL_1 = 0x01, ///< Used to select SD channel 1
365 } bsp_sd_channel_t;
366
367 /** Superset of Ethernet channels. */
368 typedef enum e_bsp_eth_ch
369 {
370 BSP_ETHERNET_CHANNEL_0 = 0x00, ///< Used to select Ethernet channel 0
371 BSP_ETHERNET_CHANNEL_1 = 0x01, ///< Used to select Ethernet channel 1
372 } bsp_ethernet_channel_t;
373
374 /** Superset of SD voltages. */
375 typedef enum e_bsp_sd_voltage
376 {
377 BSP_SD_VOLTAGE_33 = 0x00, ///< SD voltage set to 3.3V
378 BSP_SD_VOLTAGE_18 = 0x01, ///< SD voltage set to 1.8V
379 } bsp_sd_voltage_t;
380
381 /** Superset of QSPI voltages. */
382 typedef enum e_bsp_qspi_voltage
383 {
384 BSP_QSPI_VOLTAGE_33 = 0x00, ///< QSPI voltage set to 3.3V
385 BSP_QSPI_VOLTAGE_18 = 0x01, ///< QSPI voltage set to 1.8V
386 } bsp_qspi_voltage_t;
387
388 /** Superset of XSPI voltages. */
389 typedef enum e_bsp_xspi_voltage
390 {
391 BSP_XSPI_VOLTAGE_33 = 0x00, ///< XSPI voltage set to 3.3V
392 BSP_XSPI_VOLTAGE_18 = 0x01, ///< XSPI voltage set to 1.8V
393 BSP_XSPI_VOLTAGE_25 = 0x02, ///< XSPI voltage set to 2.5V
394 } bsp_xspi_voltage_t;
395
396 /** Superset of Ethernet voltages. */
397 typedef enum e_bsp_eth_voltage
398 {
399 BSP_ETHERNET_VOLTAGE_33 = 0x00, ///< Ethernet voltage set to 3.3V
400 BSP_ETHERNET_VOLTAGE_18 = 0x01, ///< Ethernet voltage set to 1.8V
401 BSP_ETHERNET_VOLTAGE_25 = 0x02, ///< Ethernet voltage set to 2.5V
402 } bsp_ethernet_voltage_t;
403
404 /** Superset of I3C voltages. */
405 typedef enum e_bsp_i3c_voltage
406 {
407 BSP_I3C_VOLTAGE_18 = 0x00, ///< I3C voltage set to 1.8V
408 BSP_I3C_VOLTAGE_12 = 0x01, ///< I3C voltage set to 1.2V
409 } bsp_i3c_voltage_t;
410
411 /** Superset of Ethernet PHY modes. */
412 typedef enum e_bsp_eth_mode
413 {
414 BSP_ETHERNET_MODE_RMII = 0x00, ///< Ethernet PHY mode set to RMII
415 BSP_ETHERNET_MODE_MII = 0x01, ///< Ethernet PHY mode set to MII
416 } bsp_ethernet_mode_t;
417
418 /** Superset of Standby modes for I3C. */
419 typedef enum e_bsp_i3c_mode
420 {
421 BSP_I3C_MODE_STB = 0x00, ///< Standby mode set to Standby mode
422 BSP_I3C_MODE_NOR = 0x01, ///< Standby mode set to Normal mode
423 } bsp_i3c_mode_t;
424
425 /** Superset of oscillator for bypass mode. */
426 typedef enum e_bsp_bypass_oscillator
427 {
428 BSP_BYPASS_OSCILLATOR_RTC = 0x00, ///< Oscillator set to RTC
429 BSP_BYPASS_OSCILLATOR_AUDIO = 0x01, ///< Oscillator set to Audio
430 BSP_BYPASS_OSCILLATOR_EMCLK = 0x02, ///< Oscillator set to EMCLK
431 } bsp_bypass_oscillator_t;
432
433 /** Superset of bypass modes. */
434 typedef enum e_bsp_bypass_mode
435 {
436 BSP_BYPASS_MODE_CRYSTAL_OSC = 0x00, ///< Bypass mode set to Crystal oscillator
437 BSP_BYPASS_MODE_EXTERNAL_CLK = 0x01, ///< Bypass mode set to External clock receive
438 BSP_BYPASS_MODE_POWER_DOWN = 0x02, ///< Bypass mode set to Power-down
439 } bsp_bypass_mode_t;
440
441 /** Superset of frequency range for bypass mode. */
442 typedef enum e_bsp_bypass_freq_range
443 {
444 BSP_BYPASS_FREQ_RANGE_1MHZ = 0x00, ///< Frequency range set to 32KHz to 1MHz
445 BSP_BYPASS_FREQ_RANGE_12MHZ = 0x02, ///< Frequency range set to 1.1MHz to 12MHz
446 BSP_BYPASS_FREQ_RANGE_24MHZ = 0x01, ///< Frequency range set to 12.1MHz to 24MHz
447 BSP_BYPASS_FREQ_RANGE_48MHZ = 0x03, ///< Frequency range set to 24.1MHz to 48MHz
448 } bsp_bypass_freq_range_t;
449
450 /***********************************************************************************************************************
451 * Exported global variables
452 **********************************************************************************************************************/
453 extern volatile uint32_t g_protect_pfswe_counter;
454
455 /***********************************************************************************************************************
456 * Exported global functions (to be accessed by other files)
457 **********************************************************************************************************************/
458
459 /*******************************************************************************************************************//**
460 * Read the current input level of the pin.
461 *
462 * @param[in] pin The pin
463 *
464 * @retval Current input level
465 **********************************************************************************************************************/
R_BSP_PinRead(bsp_io_port_pin_t pin)466 __STATIC_INLINE uint32_t R_BSP_PinRead (bsp_io_port_pin_t pin)
467 {
468 /* Read pin level. */
469 volatile const uint8_t * p_pin;
470
471 p_pin = BSP_IO_PRV_PIN_REG_BASE_SET(BSP_FEATURE_IOPORT_GP_REG_BASE_NUM);
472 p_pin = &p_pin[pin >> BSP_IO_PRV_PORT_OFFSET];
473
474 return (uint32_t) ((*p_pin) >> (pin & BSP_IO_PRV_8BIT_MASK)) & BSP_IO_PRV_PIN_MASK;
475 }
476
477 /*******************************************************************************************************************//**
478 * Set a pin to output and set the output level to the level provided
479 *
480 * @param[in] pin The pin
481 * @param[in] level The level
482 **********************************************************************************************************************/
R_BSP_PinWrite(bsp_io_port_pin_t pin,bsp_io_level_t level)483 __STATIC_INLINE void R_BSP_PinWrite (bsp_io_port_pin_t pin, bsp_io_level_t level)
484 {
485 /* Set output level and pin direction to output. */
486 volatile uint16_t * p_pm;
487 volatile uint8_t * p_p;
488 uint16_t reg_value_pm;
489 uint8_t reg_value_p;
490 uint16_t mask_pm;
491 uint8_t mask_p;
492 uint16_t write_value_pm;
493 uint8_t write_value_p;
494
495 p_pm = BSP_IO_PRV_PM_REG_BASE_SET(BSP_FEATURE_IOPORT_GP_REG_BASE_NUM);
496 p_p = BSP_IO_PRV_P_REG_BASE_SET(BSP_FEATURE_IOPORT_GP_REG_BASE_NUM);
497
498 reg_value_pm = p_pm[pin >> BSP_IO_PRV_PORT_OFFSET];
499 reg_value_p = p_p[pin >> BSP_IO_PRV_PORT_OFFSET];
500
501 mask_pm = (uint16_t) (~(BSP_IO_PM_PM_OUTPUT << ((pin & BSP_IO_PRV_8BIT_MASK) * 2)));
502 mask_p = (uint8_t) (~(1 << (pin & BSP_IO_PRV_8BIT_MASK)));
503
504 write_value_pm = (uint16_t) (BSP_IO_PM_PM_OUTPUT << ((pin & BSP_IO_PRV_8BIT_MASK) * 2));
505 write_value_p = (uint8_t) (level << (pin & BSP_IO_PRV_8BIT_MASK));
506
507 p_pm[pin >> BSP_IO_PRV_PORT_OFFSET] = ((reg_value_pm & mask_pm) | write_value_pm);
508 p_p[pin >> BSP_IO_PRV_PORT_OFFSET] = ((reg_value_p & mask_p) | write_value_p);
509 }
510
511 /*******************************************************************************************************************//**
512 * Enable access to the PFS registers. Uses a reference counter to protect against interrupts that could occur
513 * via multiple threads or an ISR re-entering this code.
514 **********************************************************************************************************************/
R_BSP_PinAccessEnable(void)515 __STATIC_INLINE void R_BSP_PinAccessEnable (void)
516 {
517 #if BSP_CFG_PFS_PROTECT
518
519 /** Get the current state of interrupts */
520 FSP_CRITICAL_SECTION_DEFINE;
521 FSP_CRITICAL_SECTION_ENTER;
522
523 /** If this is first entry then allow writing of PFS. */
524 if (0 == g_protect_pfswe_counter)
525 {
526 #if BSP_FEATURE_BSP_SUPPORT_PFCWE_PROTECT
527 R_GPIO->PWPR = 0; ///< Clear BOWI bit - writing to PFSWE bit enabled
528 R_GPIO->PWPR = 1U << BSP_IO_PWPR_PFSWE_OFFSET; ///< Set PFSWE bit - writing to PFS register enabled
529 #else
530 R_GPIO->PWPR = (uint32_t) ((BSP_IO_PRV_PFCWE_MASK & R_GPIO->PWPR) | (1U << BSP_IO_PWPR_PFSWE_OFFSET));
531 #endif
532 }
533
534 /** Increment the protect counter */
535 g_protect_pfswe_counter++;
536
537 /** Restore the interrupt state */
538 FSP_CRITICAL_SECTION_EXIT;
539 #endif
540 }
541
542 /*******************************************************************************************************************//**
543 * Disable access to the PFS registers. Uses a reference counter to protect against interrupts that could occur via
544 * multiple threads or an ISR re-entering this code.
545 **********************************************************************************************************************/
R_BSP_PinAccessDisable(void)546 __STATIC_INLINE void R_BSP_PinAccessDisable (void)
547 {
548 #if BSP_CFG_PFS_PROTECT
549
550 /** Get the current state of interrupts */
551 FSP_CRITICAL_SECTION_DEFINE;
552 FSP_CRITICAL_SECTION_ENTER;
553
554 /** Is it safe to disable PFS register? */
555 if (0 != g_protect_pfswe_counter)
556 {
557 /* Decrement the protect counter */
558 g_protect_pfswe_counter--;
559 }
560
561 /** Is it safe to disable writing of PFS? */
562 if (0 == g_protect_pfswe_counter)
563 {
564 #if BSP_FEATURE_BSP_SUPPORT_PFCWE_PROTECT
565 R_GPIO->PWPR = 0; ///< Clear PFSWE bit - writing to PFS register disabled
566 R_GPIO->PWPR = 1U << BSP_IO_PWPR_B0WI_OFFSET; ///< Set BOWI bit - writing to PFSWE bit disabled
567 #else
568 R_GPIO->PWPR = (uint32_t) (BSP_IO_PRV_PFCWE_MASK & R_GPIO->PWPR);
569 #endif
570 }
571
572 /** Restore the interrupt state */
573 FSP_CRITICAL_SECTION_EXIT;
574 #endif
575 }
576
577 /*******************************************************************************************************************//**
578 * Enable access to the OEN registers.
579 **********************************************************************************************************************/
R_BSP_OENAccessEnable(void)580 __STATIC_INLINE void R_BSP_OENAccessEnable (void)
581 {
582 #if BSP_FEATURE_BSP_SUPPORT_OEN_PROTECT
583 #if BSP_CFG_PFS_PROTECT
584
585 /** Get the current state of interrupts */
586 FSP_CRITICAL_SECTION_DEFINE;
587 FSP_CRITICAL_SECTION_ENTER;
588
589 R_GPIO->PWPR = (uint32_t) ((BSP_IO_PRV_OENWE_MASK & R_GPIO->PWPR) | (1U << BSP_IO_PWPR_OENWE_OFFSET));
590
591 /** Restore the interrupt state */
592 FSP_CRITICAL_SECTION_EXIT;
593 #endif
594 #endif
595 }
596
597 /*******************************************************************************************************************//**
598 * Disable access to the OEN registers.
599 **********************************************************************************************************************/
R_BSP_OENAccessDisable(void)600 __STATIC_INLINE void R_BSP_OENAccessDisable (void)
601 {
602 #if BSP_FEATURE_BSP_SUPPORT_OEN_PROTECT
603 #if BSP_CFG_PFS_PROTECT
604
605 /** Get the current state of interrupts */
606 FSP_CRITICAL_SECTION_DEFINE;
607 FSP_CRITICAL_SECTION_ENTER;
608
609 R_GPIO->PWPR = (uint32_t) (BSP_IO_PRV_OENWE_MASK & R_GPIO->PWPR);
610
611 /** Restore the interrupt state */
612 FSP_CRITICAL_SECTION_EXIT;
613 #endif
614 #endif
615 }
616
617 /*******************************************************************************************************************//**
618 * Configures Ethernet channel PHY mode.
619 **********************************************************************************************************************/
R_BSP_EthernetModeCfg(bsp_ethernet_channel_t channel,bsp_ethernet_mode_t mode)620 __STATIC_INLINE void R_BSP_EthernetModeCfg (bsp_ethernet_channel_t channel, bsp_ethernet_mode_t mode)
621 {
622 #if BSP_FEATURE_BSP_SUPPORT_ETHER_MODE
623 #if BSP_FEATURE_BSP_HAS_PFC_OEN_REG
624 if (mode == BSP_ETHERNET_MODE_RMII)
625 {
626 if (channel == BSP_ETHERNET_CHANNEL_0)
627 {
628 R_CPG->CPG_SSEL0 |= BSP_IO_PRV_SET_SSEL0_SELCTL2;
629 }
630 else
631 {
632 R_CPG->CPG_SSEL1 |= BSP_IO_PRV_SET_SSEL1_SELCTL0;
633 }
634 }
635
636 R_BSP_OENAccessEnable();
637
638 if (BSP_ETHERNET_CHANNEL_0 == channel)
639 {
640 R_GPIO->PFC_OEN_b.OEN0 = mode;
641 }
642 else if (BSP_ETHERNET_CHANNEL_1 == channel)
643 {
644 R_GPIO->PFC_OEN_b.OEN1 = mode;
645 }
646
647 R_BSP_OENAccessDisable();
648 #elif BSP_FEATURE_BSP_HAS_ETHER_MODE_REG
649 uint32_t reg_value = R_GPIO->ETH_MODE;
650
651 reg_value = (uint32_t) ((reg_value & (uint32_t) (~(1 << channel))) | (mode << channel));
652
653 R_GPIO->ETH_MODE = reg_value;
654 #else
655 uint8_t reg_value = R_GPIO->ETH_MII_RGMII;
656
657 reg_value = (uint8_t) ((reg_value & (uint8_t) (~(1 << channel))) | (mode << channel));
658
659 R_GPIO->ETH_MII_RGMII = reg_value;
660 #endif
661 #else
662 FSP_PARAMETER_NOT_USED(channel);
663 FSP_PARAMETER_NOT_USED(mode);
664 #endif
665 }
666
667 /*******************************************************************************************************************//**
668 * Configures SD channel voltage mode.
669 **********************************************************************************************************************/
R_BSP_SDVoltageModeCfg(bsp_sd_channel_t channel,bsp_sd_voltage_t voltage)670 __STATIC_INLINE void R_BSP_SDVoltageModeCfg (bsp_sd_channel_t channel, bsp_sd_voltage_t voltage)
671 {
672 #if BSP_FEATURE_BSP_SUPPORT_SD_VOLT
673 if (BSP_SD_CHANNEL_0 == channel)
674 {
675 #if BSP_FEATURE_BSP_HAS_SD_CH_POC_REG
676 R_GPIO->SD_CH0_POC = voltage;
677 #else
678 R_GPIO->SD_ch0 = voltage;
679 #endif
680 }
681 else if (BSP_SD_CHANNEL_1 == channel)
682 {
683 #if BSP_FEATURE_BSP_HAS_SD_CH_POC_REG
684 R_GPIO->SD_CH1_POC = voltage;
685 #else
686 R_GPIO->SD_ch1 = voltage;
687 #endif
688 }
689 else
690 {
691 /* Do nothing. */
692 FSP_PARAMETER_NOT_USED(voltage);
693 }
694
695 #else
696 FSP_PARAMETER_NOT_USED(channel);
697 FSP_PARAMETER_NOT_USED(voltage);
698 #endif
699 }
700
701 /*******************************************************************************************************************//**
702 * Configures QSPI channel voltage mode.
703 **********************************************************************************************************************/
R_BSP_QSPIVoltageModeCfg(bsp_qspi_voltage_t voltage)704 __STATIC_INLINE void R_BSP_QSPIVoltageModeCfg (bsp_qspi_voltage_t voltage)
705 {
706 #if BSP_FEATURE_BSP_SUPPORT_QSPI_VOLT
707 R_GPIO->QSPI = voltage;
708 #else
709 FSP_PARAMETER_NOT_USED(voltage);
710 #endif
711 }
712
713 /*******************************************************************************************************************//**
714 * Configures XSPI channel voltage mode.
715 **********************************************************************************************************************/
R_BSP_XSPIVoltageModeCfg(bsp_xspi_voltage_t voltage)716 __STATIC_INLINE void R_BSP_XSPIVoltageModeCfg (bsp_xspi_voltage_t voltage)
717 {
718 #if BSP_FEATURE_BSP_SUPPORT_XSPI_VOLT
719 R_GPIO->XSPI_POC = voltage;
720 #else
721 FSP_PARAMETER_NOT_USED(voltage);
722 #endif
723 }
724
725 /*******************************************************************************************************************//**
726 * Configures Ethernet channel voltage mode.
727 **********************************************************************************************************************/
R_BSP_EthernetVoltageModeCfg(bsp_ethernet_channel_t channel,bsp_ethernet_voltage_t voltage)728 __STATIC_INLINE void R_BSP_EthernetVoltageModeCfg (bsp_ethernet_channel_t channel, bsp_ethernet_voltage_t voltage)
729 {
730 #if BSP_FEATURE_BSP_SUPPORT_ETHER_VOLT
731 if (BSP_ETHERNET_CHANNEL_0 == channel)
732 {
733 #if BSP_FEATURE_BSP_HAS_ETH_POC_REG
734 R_GPIO->ETH0_POC = voltage;
735 #else
736 R_GPIO->ETH_ch0 = voltage;
737 #endif
738 }
739 else if (BSP_ETHERNET_CHANNEL_1 == channel)
740 {
741 #if BSP_FEATURE_BSP_HAS_ETH_POC_REG
742 R_GPIO->ETH1_POC = voltage;
743 #else
744 R_GPIO->ETH_ch1 = voltage;
745 #endif
746 }
747 else
748 {
749 /* Do nothing. */
750 FSP_PARAMETER_NOT_USED(voltage);
751 }
752
753 #else
754 FSP_PARAMETER_NOT_USED(channel);
755 FSP_PARAMETER_NOT_USED(voltage);
756 #endif
757 }
758
759 /*******************************************************************************************************************//**
760 * Configures I3C control.
761 **********************************************************************************************************************/
R_BSP_I3CControlCfg(bsp_i3c_voltage_t voltage,bsp_i3c_mode_t mode)762 __STATIC_INLINE void R_BSP_I3CControlCfg (bsp_i3c_voltage_t voltage, bsp_i3c_mode_t mode)
763 {
764 #if BSP_FEATURE_BSP_SUPPORT_I3C
765 R_GPIO->I3C_SET_b.POC = voltage;
766 R_GPIO->I3C_SET_b.STBN = mode;
767 #else
768 FSP_PARAMETER_NOT_USED(voltage);
769 FSP_PARAMETER_NOT_USED(mode);
770 #endif
771 }
772
773 /*******************************************************************************************************************//**
774 * Configures bypass mode for RTC, Audio and EMCLK oscillator.
775 **********************************************************************************************************************/
R_BSP_BypassModeCfg(bsp_bypass_oscillator_t oscillator,bsp_bypass_mode_t mode,bsp_bypass_freq_range_t freq_range)776 __STATIC_INLINE void R_BSP_BypassModeCfg (bsp_bypass_oscillator_t oscillator,
777 bsp_bypass_mode_t mode,
778 bsp_bypass_freq_range_t freq_range)
779 {
780 #if BSP_FEATURE_BSP_SUPPORT_BYPASS
781 switch (oscillator)
782 {
783 case BSP_BYPASS_OSCILLATOR_AUDIO:
784 {
785 R_GPIO->PFC_OSCBYPS_b.OSCBYPS1 = mode & 1U;
786 R_GPIO->PFC_OSCBYPS_b.OSCPW1 = ((mode >> 1U) & 1U);
787 R_GPIO->PFC_OSCBYPS_b.OSCSF1 = freq_range;
788 break;
789 }
790
791 case BSP_BYPASS_OSCILLATOR_EMCLK:
792 {
793 R_GPIO->PFC_OSCBYPS_b.OSCBYPS2 = mode & 1U;
794 R_GPIO->PFC_OSCBYPS_b.OSCPW2 = ((mode >> 1U) & 1U);
795 R_GPIO->PFC_OSCBYPS_b.OSCSF2 = freq_range;
796 break;
797 }
798
799 case BSP_BYPASS_OSCILLATOR_RTC:
800 {
801 R_GPIO->PFC_OSCBYPS_b.OSCBYPS0 = mode & 1U;
802 R_GPIO->PFC_OSCBYPS_b.OSCPW0 = ((mode >> 1U) & 1U);
803 FSP_PARAMETER_NOT_USED(freq_range);
804 break;
805 }
806
807 default:
808
809 /* Do nothing. */
810 FSP_PARAMETER_NOT_USED(mode);
811 FSP_PARAMETER_NOT_USED(freq_range);
812 }
813
814 #else
815 FSP_PARAMETER_NOT_USED(oscillator);
816 FSP_PARAMETER_NOT_USED(mode);
817 FSP_PARAMETER_NOT_USED(freq_range);
818 #endif
819 }
820
821 /*******************************************************************************************************************//**
822 * Configures XSPI output Enable.
823 **********************************************************************************************************************/
R_BSP_XSPIOutputEnableCfg(void)824 __STATIC_INLINE void R_BSP_XSPIOutputEnableCfg (void)
825 {
826 #if BSP_FEATURE_BSP_SUPPORT_XSPI_OUTPUT
827 R_BSP_OENAccessEnable();
828 R_GPIO->PFC_OEN_b.OEN2 = BSP_IO_PRV_SET_OEN_ENABLE;
829 R_GPIO->PFC_OEN_b.OEN3 = BSP_IO_PRV_SET_OEN_ENABLE;
830 R_GPIO->PFC_OEN_b.OEN4 = BSP_IO_PRV_SET_OEN_ENABLE;
831 R_GPIO->PFC_OEN_b.OEN5 = BSP_IO_PRV_SET_OEN_ENABLE;
832 R_BSP_OENAccessDisable();
833 #endif
834 }
835
836 /** @} (end addtogroup BSP_IO) */
837
838 /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */
839 FSP_FOOTER
840
841 #endif
842