]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso/NXP_Code/drivers/fsl_iocon.h
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso / NXP_Code / drivers / fsl_iocon.h
1 /*\r
2  * Copyright (c) 2016, Freescale Semiconductor, Inc.\r
3  * Copyright 2016-2019 NXP\r
4  * All rights reserved.\r
5  *\r
6  * SPDX-License-Identifier: BSD-3-Clause\r
7  */\r
8 \r
9 #ifndef _FSL_IOCON_H_\r
10 #define _FSL_IOCON_H_\r
11 \r
12 #include "fsl_common.h"\r
13 \r
14 /*!\r
15  * @addtogroup lpc_iocon\r
16  * @{\r
17  */\r
18 \r
19 /*! @file */\r
20 \r
21 /*******************************************************************************\r
22  * Definitions\r
23  ******************************************************************************/\r
24 \r
25 /* Component ID definition, used by tools. */\r
26 #ifndef FSL_COMPONENT_ID\r
27 #define FSL_COMPONENT_ID "platform.drivers.lpc_iocon"\r
28 #endif\r
29 \r
30 /*! @name Driver version */\r
31 /*@{*/\r
32 /*! @brief IOCON driver version 2.1.1. */\r
33 #define FSL_IOCON_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))\r
34 /*@}*/\r
35 \r
36 /**\r
37  * @brief Array of IOCON pin definitions passed to IOCON_SetPinMuxing() must be in this format\r
38  */\r
39 typedef struct _iocon_group\r
40 {\r
41     uint32_t port : 8;      /* Pin port */\r
42     uint32_t pin : 8;       /* Pin number */\r
43     uint32_t ionumber : 8;  /* IO number */\r
44     uint32_t modefunc : 16; /* Function and mode */\r
45 } iocon_group_t;\r
46 \r
47 /**\r
48  * @brief IOCON function and mode selection definitions\r
49  * @note See the User Manual for specific modes and functions supported by the various pins.\r
50  */\r
51 #if defined(FSL_FEATURE_IOCON_FUNC_FIELD_WIDTH) && (FSL_FEATURE_IOCON_FUNC_FIELD_WIDTH == 4)\r
52 #define IOCON_FUNC0 0x0  /*!< Selects pin function 0 */\r
53 #define IOCON_FUNC1 0x1  /*!< Selects pin function 1 */\r
54 #define IOCON_FUNC2 0x2  /*!< Selects pin function 2 */\r
55 #define IOCON_FUNC3 0x3  /*!< Selects pin function 3 */\r
56 #define IOCON_FUNC4 0x4  /*!< Selects pin function 4 */\r
57 #define IOCON_FUNC5 0x5  /*!< Selects pin function 5 */\r
58 #define IOCON_FUNC6 0x6  /*!< Selects pin function 6 */\r
59 #define IOCON_FUNC7 0x7  /*!< Selects pin function 7 */\r
60 #define IOCON_FUNC8 0x8  /*!< Selects pin function 8 */\r
61 #define IOCON_FUNC9 0x9  /*!< Selects pin function 9 */\r
62 #define IOCON_FUNC10 0xA /*!< Selects pin function 10 */\r
63 #define IOCON_FUNC11 0xB /*!< Selects pin function 11 */\r
64 #define IOCON_FUNC12 0xC /*!< Selects pin function 12 */\r
65 #define IOCON_FUNC13 0xD /*!< Selects pin function 13 */\r
66 #define IOCON_FUNC14 0xE /*!< Selects pin function 14 */\r
67 #define IOCON_FUNC15 0xF /*!< Selects pin function 15 */\r
68 #if defined(IOCON_PIO_MODE_SHIFT)\r
69 #define IOCON_MODE_INACT (0x0 << IOCON_PIO_MODE_SHIFT)    /*!< No addition pin function */\r
70 #define IOCON_MODE_PULLDOWN (0x1 << IOCON_PIO_MODE_SHIFT) /*!< Selects pull-down function */\r
71 #define IOCON_MODE_PULLUP (0x2 << IOCON_PIO_MODE_SHIFT)   /*!< Selects pull-up function */\r
72 #define IOCON_MODE_REPEATER (0x3 << IOCON_PIO_MODE_SHIFT) /*!< Selects pin repeater function */\r
73 #endif\r
74 \r
75 #if defined(IOCON_PIO_I2CSLEW_SHIFT)\r
76 #define IOCON_GPIO_MODE (0x1 << IOCON_PIO_I2CSLEW_SHIFT) /*!< GPIO Mode */\r
77 #define IOCON_I2C_SLEW (0x0 << IOCON_PIO_I2CSLEW_SHIFT)  /*!< I2C Slew Rate Control */\r
78 #endif\r
79 \r
80 #if defined(IOCON_PIO_EGP_SHIFT)\r
81 #define IOCON_GPIO_MODE (0x1 << IOCON_PIO_EGP_SHIFT) /*!< GPIO Mode */\r
82 #define IOCON_I2C_SLEW (0x0 << IOCON_PIO_EGP_SHIFT)  /*!< I2C Slew Rate Control */\r
83 #endif\r
84 \r
85 #if defined(IOCON_PIO_SLEW_SHIFT)\r
86 #define IOCON_SLEW_STANDARD (0x0 << IOCON_PIO_SLEW_SHIFT) /*!< Driver Slew Rate Control */\r
87 #define IOCON_SLEW_FAST (0x1 << IOCON_PIO_SLEW_SHIFT)     /*!< Driver Slew Rate Control */\r
88 #endif\r
89 \r
90 #if defined(IOCON_PIO_INVERT_SHIFT)\r
91 #define IOCON_INV_EN (0x1 << IOCON_PIO_INVERT_SHIFT) /*!< Enables invert function on input */\r
92 #endif\r
93 \r
94 #if defined(IOCON_PIO_DIGIMODE_SHIFT)\r
95 #define IOCON_ANALOG_EN (0x0 << IOCON_PIO_DIGIMODE_SHIFT) /*!< Enables analog function by setting 0 to bit 7 */\r
96 #define IOCON_DIGITAL_EN \\r
97     (0x1 << IOCON_PIO_DIGIMODE_SHIFT) /*!< Enables digital function by setting 1 to bit 7(default) */\r
98 #endif\r
99 \r
100 #if defined(IOCON_PIO_FILTEROFF_SHIFT)\r
101 #define IOCON_INPFILT_OFF (0x1 << IOCON_PIO_FILTEROFF_SHIFT) /*!< Input filter Off for GPIO pins */\r
102 #define IOCON_INPFILT_ON (0x0 << IOCON_PIO_FILTEROFF_SHIFT)  /*!< Input filter On for GPIO pins */\r
103 #endif\r
104 \r
105 #if defined(IOCON_PIO_I2CDRIVE_SHIFT)\r
106 #define IOCON_I2C_LOWDRIVER (0x0 << IOCON_PIO_I2CDRIVE_SHIFT)  /*!< Low drive, Output drive sink is 4 mA */\r
107 #define IOCON_I2C_HIGHDRIVER (0x1 << IOCON_PIO_I2CDRIVE_SHIFT) /*!< High drive, Output drive sink is 20 mA */\r
108 #endif\r
109 \r
110 #if defined(IOCON_PIO_OD_SHIFT)\r
111 #define IOCON_OPENDRAIN_EN (0x1 << IOCON_PIO_OD_SHIFT) /*!< Enables open-drain function */\r
112 #endif\r
113 \r
114 #if defined(IOCON_PIO_I2CFILTER_SHIFT)\r
115 #define IOCON_I2CFILTER_OFF (0x1 << IOCON_PIO_I2CFILTER_SHIFT) /*!<  I2C 50 ns glitch filter enabled */\r
116 #define IOCON_I2CFILTER_ON (0x0 << IOCON_PIO_I2CFILTER_SHIFT)  /*!<  I2C 50 ns glitch filter not enabled,  */\r
117 #endif\r
118 \r
119 #if defined(IOCON_PIO_ASW_SHIFT)\r
120 #define IOCON_AWS_EN (0x1 << IOCON_PIO_ASW_SHIFT) /*!< Enables analog switch function */\r
121 #endif\r
122 \r
123 #if defined(IOCON_PIO_SSEL_SHIFT)\r
124 #define IOCON_SSEL_3V3 (0x0 << IOCON_PIO_SSEL_SHIFT) /*!< 3V3 signaling in I2C mode */\r
125 #define IOCON_SSEL_1V8 (0x1 << IOCON_PIO_SSEL_SHIFT) /*!< 1V8 signaling in I2C mode */\r
126 #endif\r
127 \r
128 #if defined(IOCON_PIO_ECS_SHIFT)\r
129 #define IOCON_ECS_OFF (0x0 << IOCON_PIO_ECS_SHIFT) /*!< IO is an open drain cell */\r
130 #define IOCON_ECS_ON (0x1 << IOCON_PIO_ECS_SHIFT)  /*!< Pull-up resistor is connected */\r
131 #endif\r
132 \r
133 #if defined(IOCON_PIO_S_MODE_SHIFT)\r
134 #define IOCON_S_MODE_0CLK (0x0 << IOCON_PIO_S_MODE_SHIFT) /*!< Bypass input filter */\r
135 #define IOCON_S_MODE_1CLK                                                                              \\r
136     (0x1 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 1 filter clock are rejected \ \ \ \ \\r
137                                      */\r
138 #define IOCON_S_MODE_2CLK                                                                               \\r
139     (0x2 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 2 filter clock2 are rejected \ \ \ \ \\r
140                                      */\r
141 #define IOCON_S_MODE_3CLK                                                                               \\r
142     (0x3 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 3 filter clock2 are rejected \ \ \ \ \\r
143                                      */\r
144 #define IOCON_S_MODE(clks) ((clks) << IOCON_PIO_S_MODE_SHIFT) /*!< Select clocks for digital input filter mode */\r
145 #endif\r
146 \r
147 #if defined(IOCON_PIO_CLK_DIV_SHIFT)\r
148 #define IOCON_CLKDIV(div) \\r
149     ((div)                \\r
150      << IOCON_PIO_CLK_DIV_SHIFT) /*!< Select peripheral clock divider for input filter sampling clock, 2^n, n=0-6 */\r
151 #endif\r
152 \r
153 #else\r
154 #define IOCON_FUNC0 0x0 /*!< Selects pin function 0 */\r
155 #define IOCON_FUNC1 0x1 /*!< Selects pin function 1 */\r
156 #define IOCON_FUNC2 0x2 /*!< Selects pin function 2 */\r
157 #define IOCON_FUNC3 0x3 /*!< Selects pin function 3 */\r
158 #define IOCON_FUNC4 0x4 /*!< Selects pin function 4 */\r
159 #define IOCON_FUNC5 0x5 /*!< Selects pin function 5 */\r
160 #define IOCON_FUNC6 0x6 /*!< Selects pin function 6 */\r
161 #define IOCON_FUNC7 0x7 /*!< Selects pin function 7 */\r
162 \r
163 #if defined(IOCON_PIO_MODE_SHIFT)\r
164 #define IOCON_MODE_INACT (0x0 << IOCON_PIO_MODE_SHIFT)    /*!< No addition pin function */\r
165 #define IOCON_MODE_PULLDOWN (0x1 << IOCON_PIO_MODE_SHIFT) /*!< Selects pull-down function */\r
166 #define IOCON_MODE_PULLUP (0x2 << IOCON_PIO_MODE_SHIFT)   /*!< Selects pull-up function */\r
167 #define IOCON_MODE_REPEATER (0x3 << IOCON_PIO_MODE_SHIFT) /*!< Selects pin repeater function */\r
168 #endif\r
169 \r
170 #if defined(IOCON_PIO_I2CSLEW_SHIFT)\r
171 #define IOCON_GPIO_MODE (0x1 << IOCON_PIO_I2CSLEW_SHIFT) /*!< GPIO Mode */\r
172 #define IOCON_I2C_SLEW (0x0 << IOCON_PIO_I2CSLEW_SHIFT)  /*!< I2C Slew Rate Control */\r
173 #endif\r
174 \r
175 #if defined(IOCON_PIO_EGP_SHIFT)\r
176 #define IOCON_GPIO_MODE (0x1 << IOCON_PIO_EGP_SHIFT) /*!< GPIO Mode */\r
177 #define IOCON_I2C_SLEW (0x0 << IOCON_PIO_EGP_SHIFT)  /*!< I2C Slew Rate Control */\r
178 #endif\r
179 \r
180 #if defined(IOCON_PIO_INVERT_SHIFT)\r
181 #define IOCON_INV_EN (0x1 << IOCON_PIO_INVERT_SHIFT) /*!< Enables invert function on input */\r
182 #endif\r
183 \r
184 #if defined(IOCON_PIO_DIGIMODE_SHIFT)\r
185 #define IOCON_ANALOG_EN (0x0 << IOCON_PIO_DIGIMODE_SHIFT) /*!< Enables analog function by setting 0 to bit 7 */\r
186 #define IOCON_DIGITAL_EN \\r
187     (0x1 << IOCON_PIO_DIGIMODE_SHIFT) /*!< Enables digital function by setting 1 to bit 7(default) */\r
188 #endif\r
189 \r
190 #if defined(IOCON_PIO_FILTEROFF_SHIFT)\r
191 #define IOCON_INPFILT_OFF (0x1 << IOCON_PIO_FILTEROFF_SHIFT) /*!< Input filter Off for GPIO pins */\r
192 #define IOCON_INPFILT_ON (0x0 << IOCON_PIO_FILTEROFF_SHIFT)  /*!< Input filter On for GPIO pins */\r
193 #endif\r
194 \r
195 #if defined(IOCON_PIO_I2CDRIVE_SHIFT)\r
196 #define IOCON_I2C_LOWDRIVER (0x0 << IOCON_PIO_I2CDRIVE_SHIFT)  /*!< Low drive, Output drive sink is 4 mA */\r
197 #define IOCON_I2C_HIGHDRIVER (0x1 << IOCON_PIO_I2CDRIVE_SHIFT) /*!< High drive, Output drive sink is 20 mA */\r
198 #endif\r
199 \r
200 #if defined(IOCON_PIO_OD_SHIFT)\r
201 #define IOCON_OPENDRAIN_EN (0x1 << IOCON_PIO_OD_SHIFT) /*!< Enables open-drain function */\r
202 #endif\r
203 \r
204 #if defined(IOCON_PIO_I2CFILTER_SHIFT)\r
205 #define IOCON_I2CFILTER_OFF (0x1 << IOCON_PIO_I2CFILTER_SHIFT) /*!<  I2C 50 ns glitch filter enabled */\r
206 #define IOCON_I2CFILTER_ON (0x0 << IOCON_PIO_I2CFILTER_SHIFT)  /*!<  I2C 50 ns glitch filter not enabled */\r
207 #endif\r
208 \r
209 #if defined(IOCON_PIO_S_MODE_SHIFT)\r
210 #define IOCON_S_MODE_0CLK (0x0 << IOCON_PIO_S_MODE_SHIFT) /*!< Bypass input filter */\r
211 #define IOCON_S_MODE_1CLK                                                                              \\r
212     (0x1 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 1 filter clock are rejected \ \ \ \ \\r
213                                      */\r
214 #define IOCON_S_MODE_2CLK                                                                               \\r
215     (0x2 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 2 filter clock2 are rejected \ \ \ \ \\r
216                                      */\r
217 #define IOCON_S_MODE_3CLK                                                                               \\r
218     (0x3 << IOCON_PIO_S_MODE_SHIFT) /*!< Input pulses shorter than 3 filter clock2 are rejected \ \ \ \ \\r
219                                      */\r
220 #define IOCON_S_MODE(clks) ((clks) << IOCON_PIO_S_MODE_SHIFT) /*!< Select clocks for digital input filter mode */\r
221 #endif\r
222 \r
223 #if defined(IOCON_PIO_CLK_DIV_SHIFT)\r
224 #define IOCON_CLKDIV(div) \\r
225     ((div)                \\r
226      << IOCON_PIO_CLK_DIV_SHIFT) /*!< Select peripheral clock divider for input filter sampling clock, 2^n, n=0-6 */\r
227 #endif\r
228 \r
229 #endif\r
230 #if defined(__cplusplus)\r
231 extern "C" {\r
232 #endif\r
233 \r
234 #if (defined(FSL_FEATURE_IOCON_ONE_DIMENSION) && (FSL_FEATURE_IOCON_ONE_DIMENSION == 1))\r
235 /**\r
236  * @brief   Sets I/O Control pin mux\r
237  * @param   base        : The base of IOCON peripheral on the chip\r
238  * @param   ionumber    : GPIO number to mux\r
239  * @param   modefunc    : OR'ed values of type IOCON_*\r
240  * @return  Nothing\r
241  */\r
242 __STATIC_INLINE void IOCON_PinMuxSet(IOCON_Type *base, uint8_t ionumber, uint32_t modefunc)\r
243 {\r
244     base->PIO[ionumber] = modefunc;\r
245 }\r
246 #else\r
247 /**\r
248  * @brief   Sets I/O Control pin mux\r
249  * @param   base        : The base of IOCON peripheral on the chip\r
250  * @param   port        : GPIO port to mux\r
251  * @param   pin         : GPIO pin to mux\r
252  * @param   modefunc    : OR'ed values of type IOCON_*\r
253  * @return  Nothing\r
254  */\r
255 __STATIC_INLINE void IOCON_PinMuxSet(IOCON_Type *base, uint8_t port, uint8_t pin, uint32_t modefunc)\r
256 {\r
257     base->PIO[port][pin] = modefunc;\r
258 }\r
259 #endif\r
260 \r
261 /**\r
262  * @brief   Set all I/O Control pin muxing\r
263  * @param   base        : The base of IOCON peripheral on the chip\r
264  * @param   pinArray    : Pointer to array of pin mux selections\r
265  * @param   arrayLength : Number of entries in pinArray\r
266  * @return  Nothing\r
267  */\r
268 __STATIC_INLINE void IOCON_SetPinMuxing(IOCON_Type *base, const iocon_group_t *pinArray, uint32_t arrayLength)\r
269 {\r
270     uint32_t i;\r
271 \r
272     for (i = 0; i < arrayLength; i++)\r
273     {\r
274 #if (defined(FSL_FEATURE_IOCON_ONE_DIMENSION) && (FSL_FEATURE_IOCON_ONE_DIMENSION == 1))\r
275         IOCON_PinMuxSet(base, pinArray[i].ionumber, pinArray[i].modefunc);\r
276 #else\r
277         IOCON_PinMuxSet(base, pinArray[i].port, pinArray[i].pin, pinArray[i].modefunc);\r
278 #endif /* FSL_FEATURE_IOCON_ONE_DIMENSION */\r
279     }\r
280 }\r
281 \r
282 /* @} */\r
283 \r
284 #if defined(__cplusplus)\r
285 }\r
286 #endif\r
287 \r
288 #endif /* _FSL_IOCON_H_ */\r