diff options
Diffstat (limited to 'lib/chibios-contrib/os/hal/ports/MSP430X/hal_serial_lld.h')
-rw-r--r-- | lib/chibios-contrib/os/hal/ports/MSP430X/hal_serial_lld.h | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/lib/chibios-contrib/os/hal/ports/MSP430X/hal_serial_lld.h b/lib/chibios-contrib/os/hal/ports/MSP430X/hal_serial_lld.h new file mode 100644 index 000000000..3de94d796 --- /dev/null +++ b/lib/chibios-contrib/os/hal/ports/MSP430X/hal_serial_lld.h | |||
@@ -0,0 +1,320 @@ | |||
1 | /* | ||
2 | ChibiOS - Copyright (C) 2016 Andrew Wygle aka awygle | ||
3 | |||
4 | Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | you may not use this file except in compliance with the License. | ||
6 | You may obtain a copy of the License at | ||
7 | |||
8 | http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | |||
10 | Unless required by applicable law or agreed to in writing, software | ||
11 | distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | See the License for the specific language governing permissions and | ||
14 | limitations under the License. | ||
15 | */ | ||
16 | |||
17 | /** | ||
18 | * @file MSP430X/hal_serial_lld.h | ||
19 | * @brief MSP430X serial subsystem low level driver header. | ||
20 | * | ||
21 | * @addtogroup SERIAL | ||
22 | * @{ | ||
23 | */ | ||
24 | |||
25 | #ifndef _SERIAL_LLD_H_ | ||
26 | #define _SERIAL_LLD_H_ | ||
27 | |||
28 | #if (HAL_USE_SERIAL == TRUE) || defined(__DOXYGEN__) | ||
29 | |||
30 | /*===========================================================================*/ | ||
31 | /* Driver constants. */ | ||
32 | /*===========================================================================*/ | ||
33 | |||
34 | #define NONE 0 | ||
35 | #define ODD 2 | ||
36 | #define EVEN 3 | ||
37 | |||
38 | #define MSB 1 | ||
39 | #define LSB 0 | ||
40 | |||
41 | #define SEVEN 1 | ||
42 | #define EIGHT 0 | ||
43 | |||
44 | #define ONE 0 | ||
45 | #define TWO 1 | ||
46 | |||
47 | #define MSP430X_SERIAL_SMCLK UCSSEL__SMCLK | ||
48 | #define MSP430X_SERIAL_UCLK UCSSEL__UCLK | ||
49 | #define MSP430X_SERIAL_ACLK UCSSEL__ACLK | ||
50 | |||
51 | /*===========================================================================*/ | ||
52 | /* Driver pre-compile time settings. */ | ||
53 | /*===========================================================================*/ | ||
54 | |||
55 | /** | ||
56 | * @name USART0 configuration options | ||
57 | * @{ | ||
58 | */ | ||
59 | /** | ||
60 | * @brief USART0 driver enable switch. | ||
61 | * @details If set to @p TRUE the support for USART1 is included. | ||
62 | * @note The default is @p FALSE. | ||
63 | */ | ||
64 | #if !defined(MSP430X_SERIAL_USE_USART0) || defined(__DOXYGEN__) | ||
65 | #define MSP430X_SERIAL_USE_USART0 FALSE | ||
66 | #endif | ||
67 | /** @} */ | ||
68 | |||
69 | /** | ||
70 | * @name USART1 configuration options | ||
71 | * @{ | ||
72 | */ | ||
73 | /** | ||
74 | * @brief USART1 driver enable switch. | ||
75 | * @details If set to @p TRUE the support for USART1 is included. | ||
76 | * @note The default is @p FALSE. | ||
77 | */ | ||
78 | #if !defined(MSP430X_SERIAL_USE_USART1) || defined(__DOXYGEN__) | ||
79 | #define MSP430X_SERIAL_USE_USART1 FALSE | ||
80 | #endif | ||
81 | /** @} */ | ||
82 | |||
83 | /** | ||
84 | * @name USART2 configuration options | ||
85 | * @{ | ||
86 | */ | ||
87 | /** | ||
88 | * @brief USART2 driver enable switch. | ||
89 | * @details If set to @p TRUE the support for USART1 is included. | ||
90 | * @note The default is @p FALSE. | ||
91 | */ | ||
92 | #if !defined(MSP430X_SERIAL_USE_USART2) || defined(__DOXYGEN__) | ||
93 | #define MSP430X_SERIAL_USE_USART2 FALSE | ||
94 | #endif | ||
95 | /** @} */ | ||
96 | |||
97 | /** | ||
98 | * @name USART3 configuration options | ||
99 | * @{ | ||
100 | */ | ||
101 | /** | ||
102 | * @brief USART3 driver enable switch. | ||
103 | * @details If set to @p TRUE the support for USART1 is included. | ||
104 | * @note The default is @p FALSE. | ||
105 | */ | ||
106 | #if !defined(MSP430X_SERIAL_USE_USART3) || defined(__DOXYGEN__) | ||
107 | #define MSP430X_SERIAL_USE_USART3 FALSE | ||
108 | #endif | ||
109 | |||
110 | #if MSP430X_SERIAL_USE_USART0 | ||
111 | #if !defined(MSP430X_USART0_PARITY) | ||
112 | #define MSP430X_USART0_PARITY NONE | ||
113 | #endif | ||
114 | #if !defined(MSP430X_USART0_ORDER) | ||
115 | #define MSP430X_USART0_ORDER LSB | ||
116 | #endif | ||
117 | #if !defined(MSP430X_USART0_SIZE) | ||
118 | #define MSP430X_USART0_SIZE EIGHT | ||
119 | #endif | ||
120 | #if !defined(MSP430X_USART0_STOP) | ||
121 | #define MSP430X_USART0_STOP ONE | ||
122 | #endif | ||
123 | #if !defined(MSP430X_USART0_CLK_SRC) | ||
124 | #define MSP430X_USART0_CLK_SRC MSP430X_UCLK_SRC | ||
125 | #ifndef MSP430X_USART0_CLK_FREQ | ||
126 | #error "Requested external UART0 clock but no frequency given" | ||
127 | #endif | ||
128 | #define MSP430X_USART0_UCSSEL UCSSEL__UCLK | ||
129 | #elif MSP430X_USART0_CLK_SRC == MSP430X_ACLK_SRC | ||
130 | #define MSP430X_USART0_CLK_SRC MSP430X_ACLK_SRC | ||
131 | #define MSP430X_USART0_CLK_FREQ MSP430X_ACLK_FREQ | ||
132 | #define MSP430X_USART0_UCSSEL UCSSEL__ACLK | ||
133 | #elif MSP430X_USART0_CLK_SRC == MSP430X_SMCLK_SRC | ||
134 | #define MSP430X_USART0_CLK_SRC MSP430X_SMCLK_SRC | ||
135 | #define MSP430X_USART0_CLK_FREQ MSP430X_SMCLK_FREQ | ||
136 | #define MSP430X_USART0_UCSSEL UCSSEL__SMCLK | ||
137 | #else | ||
138 | #error "MSP430X_USART0_CLK_SRC invalid" | ||
139 | #endif | ||
140 | #endif | ||
141 | |||
142 | #if MSP430X_SERIAL_USE_USART1 | ||
143 | #if !defined(MSP430X_USART1_PARITY) | ||
144 | #define MSP430X_USART1_PARITY NONE | ||
145 | #endif | ||
146 | #if !defined(MSP430X_USART1_ORDER) | ||
147 | #define MSP430X_USART1_ORDER LSB | ||
148 | #endif | ||
149 | #if !defined(MSP430X_USART1_SIZE) | ||
150 | #define MSP430X_USART1_SIZE EIGHT | ||
151 | #endif | ||
152 | #if !defined(MSP430X_USART1_STOP) | ||
153 | #define MSP430X_USART1_STOP ONE | ||
154 | #endif | ||
155 | #if !defined(MSP430X_USART1_CLK_SRC) | ||
156 | #define MSP430X_USART1_CLK_SRC MSP430X_UCLK_SRC | ||
157 | #ifndef MSP430X_USART1_CLK_FREQ | ||
158 | #error "Requested external UART0 clock but no frequency given" | ||
159 | #endif | ||
160 | #define MSP430X_USART1_UCSSEL UCSSEL__UCLK | ||
161 | #elif MSP430X_USART1_CLK_SRC == MSP430X_ACLK_SRC | ||
162 | #define MSP430X_USART1_CLK_SRC MSP430X_ACLK_SRC | ||
163 | #define MSP430X_USART1_CLK_FREQ MSP430X_ACLK_FREQ | ||
164 | #define MSP430X_USART1_UCSSEL UCSSEL__ACLK | ||
165 | #elif MSP430X_USART1_CLK_SRC == MSP430X_SMCLK_SRC | ||
166 | #define MSP430X_USART1_CLK_SRC MSP430X_SMCLK_SRC | ||
167 | #define MSP430X_USART1_CLK_FREQ MSP430X_SMCLK_FREQ | ||
168 | #define MSP430X_USART1_UCSSEL UCSSEL__SMCLK | ||
169 | #else | ||
170 | #error "MSP430X_USART1_CLK_SRC invalid" | ||
171 | #endif | ||
172 | #endif | ||
173 | |||
174 | #if MSP430X_SERIAL_USE_USART2 | ||
175 | #if !defined(MSP430X_USART2_PARITY) | ||
176 | #define MSP430X_USART2_PARITY NONE | ||
177 | #endif | ||
178 | #if !defined(MSP430X_USART2_ORDER) | ||
179 | #define MSP430X_USART2_ORDER LSB | ||
180 | #endif | ||
181 | #if !defined(MSP430X_USART2_SIZE) | ||
182 | #define MSP430X_USART2_SIZE EIGHT | ||
183 | #endif | ||
184 | #if !defined(MSP430X_USART2_STOP) | ||
185 | #define MSP430X_USART2_STOP ONE | ||
186 | #endif | ||
187 | #if !defined(MSP430X_USART2_CLK_SRC) | ||
188 | #define MSP430X_USART2_CLK_SRC MSP430X_UCLK_SRC | ||
189 | #ifndef MSP430X_USART2_CLK_FREQ | ||
190 | #error "Requested external UART0 clock but no frequency given" | ||
191 | #endif | ||
192 | #define MSP430X_USART2_UCSSEL UCSSEL__UCLK | ||
193 | #elif MSP430X_USART2_CLK_SRC == MSP430X_ACLK_SRC | ||
194 | #define MSP430X_USART2_CLK_SRC MSP430X_ACLK_SRC | ||
195 | #define MSP430X_USART2_CLK_FREQ MSP430X_ACLK_FREQ | ||
196 | #define MSP430X_USART2_UCSSEL UCSSEL__ACLK | ||
197 | #elif MSP430X_USART2_CLK_SRC == MSP430X_SMCLK_SRC | ||
198 | #define MSP430X_USART2_CLK_SRC MSP430X_SMCLK_SRC | ||
199 | #define MSP430X_USART2_CLK_FREQ MSP430X_SMCLK_FREQ | ||
200 | #define MSP430X_USART2_UCSSEL UCSSEL__SMCLK | ||
201 | #else | ||
202 | #error "MSP430X_USART2_CLK_SRC invalid" | ||
203 | #endif | ||
204 | #endif | ||
205 | |||
206 | #if MSP430X_SERIAL_USE_USART3 | ||
207 | #if !defined(MSP430X_USART3_PARITY) | ||
208 | #define MSP430X_USART3_PARITY NONE | ||
209 | #endif | ||
210 | #if !defined(MSP430X_USART3_ORDER) | ||
211 | #define MSP430X_USART3_ORDER LSB | ||
212 | #endif | ||
213 | #if !defined(MSP430X_USART3_SIZE) | ||
214 | #define MSP430X_USART3_SIZE EIGHT | ||
215 | #endif | ||
216 | #if !defined(MSP430X_USART3_STOP) | ||
217 | #define MSP430X_USART3_STOP ONE | ||
218 | #endif | ||
219 | #if !defined(MSP430X_USART3_CLK_SRC) | ||
220 | #define MSP430X_USART3_CLK_SRC MSP430X_UCLK_SRC | ||
221 | #ifndef MSP430X_USART3_CLK_FREQ | ||
222 | #error "Requested external UART0 clock but no frequency given" | ||
223 | #endif | ||
224 | #define MSP430X_USART3_UCSSEL UCSSEL__UCLK | ||
225 | #elif MSP430X_USART3_CLK_SRC == MSP430X_ACLK_SRC | ||
226 | #define MSP430X_USART3_CLK_SRC MSP430X_ACLK_SRC | ||
227 | #define MSP430X_USART3_CLK_FREQ MSP430X_ACLK_FREQ | ||
228 | #define MSP430X_USART3_UCSSEL UCSSEL__ACLK | ||
229 | #elif MSP430X_USART3_CLK_SRC == MSP430X_SMCLK_SRC | ||
230 | #define MSP430X_USART3_CLK_SRC MSP430X_SMCLK_SRC | ||
231 | #define MSP430X_USART3_CLK_FREQ MSP430X_SMCLK_FREQ | ||
232 | #define MSP430X_USART3_UCSSEL UCSSEL__SMCLK | ||
233 | #else | ||
234 | #error "MSP430X_USART3_CLK_SRC invalid" | ||
235 | #endif | ||
236 | #endif | ||
237 | |||
238 | /** @} */ | ||
239 | |||
240 | /*===========================================================================*/ | ||
241 | /* Derived constants and error checks. */ | ||
242 | /*===========================================================================*/ | ||
243 | |||
244 | /*===========================================================================*/ | ||
245 | /* Driver data structures and types. */ | ||
246 | /*===========================================================================*/ | ||
247 | |||
248 | /** | ||
249 | * @brief MSP430X Serial Driver configuration structure. | ||
250 | * @details An insance of this structure must be passed to @p sdStart() | ||
251 | * in order to configure and start a serial driver operations. | ||
252 | * @note This structure content is architecture dependent, each driver | ||
253 | * implementation defines its own version and the custom static | ||
254 | * initializers. | ||
255 | */ | ||
256 | typedef struct { | ||
257 | /** | ||
258 | * @brief Bit rate. | ||
259 | */ | ||
260 | uint32_t sc_bitrate; | ||
261 | |||
262 | /* End of the mandatory fields.*/ | ||
263 | } SerialConfig; | ||
264 | |||
265 | /** | ||
266 | * @brief @p SerialDriver specific data. | ||
267 | */ | ||
268 | #define _serial_driver_data \ | ||
269 | _base_asynchronous_channel_data \ | ||
270 | /* Driver state.*/ \ | ||
271 | sdstate_t state; \ | ||
272 | /* Input queue.*/ \ | ||
273 | input_queue_t iqueue; \ | ||
274 | /* Output queue.*/ \ | ||
275 | output_queue_t oqueue; \ | ||
276 | /* Input circular buffer.*/ \ | ||
277 | uint8_t ib[SERIAL_BUFFERS_SIZE]; \ | ||
278 | /* Output circular buffer.*/ \ | ||
279 | uint8_t ob[SERIAL_BUFFERS_SIZE]; \ | ||
280 | /* End of the mandatory fields.*/ | ||
281 | |||
282 | /*===========================================================================*/ | ||
283 | /* Driver macros. */ | ||
284 | /*===========================================================================*/ | ||
285 | |||
286 | /*===========================================================================*/ | ||
287 | /* External declarations. */ | ||
288 | /*===========================================================================*/ | ||
289 | |||
290 | #if (MSP430X_SERIAL_USE_USART0 == TRUE) && !defined(__DOXYGEN__) | ||
291 | extern SerialDriver SD0; | ||
292 | #endif | ||
293 | |||
294 | #if (MSP430X_SERIAL_USE_USART1 == TRUE) && !defined(__DOXYGEN__) | ||
295 | extern SerialDriver SD1; | ||
296 | #endif | ||
297 | |||
298 | #if (MSP430X_SERIAL_USE_USART2 == TRUE) && !defined(__DOXYGEN__) | ||
299 | extern SerialDriver SD2; | ||
300 | #endif | ||
301 | |||
302 | #if (MSP430X_SERIAL_USE_USART3 == TRUE) && !defined(__DOXYGEN__) | ||
303 | extern SerialDriver SD3; | ||
304 | #endif | ||
305 | |||
306 | #ifdef __cplusplus | ||
307 | extern "C" { | ||
308 | #endif | ||
309 | void sd_lld_init(void); | ||
310 | void sd_lld_start(SerialDriver *sdp, const SerialConfig *config); | ||
311 | void sd_lld_stop(SerialDriver *sdp); | ||
312 | #ifdef __cplusplus | ||
313 | } | ||
314 | #endif | ||
315 | |||
316 | #endif /* HAL_USE_SERIAL == TRUE */ | ||
317 | |||
318 | #endif /* _SERIAL_LLD_H_ */ | ||
319 | |||
320 | /** @} */ | ||