VSF Documented
spi_template.inc
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
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/*============================ INCLUDES ======================================*/
19/*============================ MACROS ========================================*/
20
21#if VSF_HAL_USE_SPI == ENABLED
22
23#if defined(VSF_SPI_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_SPI_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
24# define vsf_real_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_DEVICE_PREFIX, _t)
25# define vsf_real_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_DEVICE_PREFIX, _capability)
26# define vsf_real_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_DEVICE_PREFIX, _ctrl)
27# define vsf_real_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_DEVICE_PREFIX, _get_configuration)
28# define vsf_real_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_DEVICE_PREFIX, _irq_clear)
29#else
30# define vsf_real_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_t)
31# define vsf_real_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_capability)
32# define vsf_real_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_ctrl)
33# define vsf_real_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_get_configuration)
34# define vsf_real_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_clear)
35#endif
36
37#ifndef VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY
38# define VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
39#endif
40
41#ifndef VSF_SPI_CFG_REIMPLEMENT_API_CTRL
42# define VSF_SPI_CFG_REIMPLEMENT_API_CTRL DISABLED
43#endif
44
45#ifndef VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION
46# define VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
47#endif
48
49#ifndef VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR
50# define VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR DISABLED
51#endif
52
53#ifdef VSF_SPI_CFG_IMP_REMAP_PREFIX
54# undef VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY
55# undef VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION
56# undef VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR
57# define VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
58# define VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
59# define VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR ENABLED
60#endif
61
62#if VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
63# ifndef VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS
64# define VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS 1
65# endif
66# ifndef VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS
67# define VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS 1
68# endif
69# ifndef VSF_SPI_CFG_CAPABILITY_CS_COUNT
70# define VSF_SPI_CFG_CAPABILITY_CS_COUNT 1
71# endif
72# ifndef VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ
73# define VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ 0xFFFFFFFF
74# endif
75# ifndef VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ
76# define VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ 1
77# endif
78#endif
79
80/*============================ MACROFIED FUNCTIONS ===========================*/
81
82#if VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
83vsf_spi_capability_t vsf_real_spi_capability(vsf_real_spi_t *spi_ptr)
84{
85 vsf_spi_capability_t spi_capability = {
86 .support_hardware_cs = VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS,
87 .support_software_cs = VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS,
88 .cs_count = VSF_SPI_CFG_CAPABILITY_CS_COUNT,
89 .max_clock_hz = VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ,
90 .min_clock_hz = VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ,
91 };
92
93 return spi_capability;
94}
95#endif
96
97#if VSF_SPI_CFG_REIMPLEMENT_API_CTRL == DISABLED
98vsf_err_t vsf_real_spi_ctrl(vsf_real_spi_t *spi_ptr, vsf_spi_ctrl_t ctrl, void *param)
99{
100 VSF_HAL_ASSERT(NULL != spi_ptr);
101
102 // Default implementation: not supported, trigger assertion
104
105 return VSF_ERR_NOT_SUPPORT;
106}
107#endif
108
109#if VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
110vsf_err_t vsf_real_spi_get_configuration(vsf_real_spi_t *spi_ptr, vsf_spi_cfg_t *cfg_ptr)
111{
112 VSF_HAL_ASSERT(NULL != spi_ptr);
113 VSF_HAL_ASSERT(NULL != cfg_ptr);
114
115 // Default implementation: not supported, trigger assertion
117
118 return VSF_ERR_NOT_SUPPORT;
119}
120#endif
121
122#if VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR == DISABLED
123vsf_spi_irq_mask_t vsf_real_spi_irq_clear(vsf_real_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask)
124{
125 VSF_HAL_ASSERT(NULL != spi_ptr);
126
127 // Default implementation: not supported, trigger assertion
129
130 return 0;
131}
132#endif
133
134/*============================ MACROS ========================================*/
135
136#undef VSF_SPI_CFG_REIMPLEMENT_TYPE_CAPABILITY
137#undef VSF_SPI_CFG_REIMPLEMENT_TYPE_CFG
138#undef VSF_SPI_CFG_REIMPLEMENT_TYPE_CTRL
139#undef VSF_SPI_CFG_REIMPLEMENT_TYPE_IRQ_MASK
140#undef VSF_SPI_CFG_REIMPLEMENT_TYPE_MODE
141#undef VSF_SPI_CFG_REIMPLEMENT_TYPE_STATUS
142#undef VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS
143#undef VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS
144#undef VSF_SPI_CFG_CAPABILITY_CS_COUNT
145#undef VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ
146#undef VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ
147#undef vsf_real_spi_t
148#undef vsf_real_spi_capability
149#undef vsf_real_spi_ctrl
150#undef vsf_real_spi_get_configuration
151#undef vsf_real_spi_irq_clear
152
153/*============================ PROTOTYPES ====================================*/
154/*============================ LOCAL VARIABLES ===============================*/
155/*============================ MACROS ========================================*/
156/*============================ MACROS ========================================*/
157
158#ifdef VSF_SPI_CFG_IMP_REMAP_PREFIX
159
160# define vsf_imp_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_t)
161# define vsf_imp_spi_init VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_init)
162# define vsf_imp_spi_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_enable)
163# define vsf_imp_spi_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_disable)
164# define vsf_imp_spi_irq_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_enable)
165# define vsf_imp_spi_irq_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_disable)
166# define vsf_imp_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_clear)
167# define vsf_imp_spi_status VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_status)
168# define vsf_imp_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_capability)
169# define vsf_imp_spi_cs_active VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_cs_active)
170# define vsf_imp_spi_cs_inactive VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_cs_inactive)
171# define vsf_imp_spi_fifo_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_fifo_transfer)
172# define vsf_imp_spi_request_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_request_transfer)
173# define vsf_imp_spi_cancel_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_cancel_transfer)
174# define vsf_imp_spi_get_transferred_count VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_get_transferred_count)
175# define vsf_imp_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_ctrl)
176# define vsf_imp_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_get_configuration)
177
178# define vsf_remap_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_t)
179# define vsf_remap_spi_init VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_init)
180# define vsf_remap_spi_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_enable)
181# define vsf_remap_spi_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_disable)
182# define vsf_remap_spi_irq_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_irq_enable)
183# define vsf_remap_spi_irq_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_irq_disable)
184# define vsf_remap_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_irq_clear)
185# define vsf_remap_spi_status VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_status)
186# define vsf_remap_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_capability)
187# define vsf_remap_spi_cs_active VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_cs_active)
188# define vsf_remap_spi_cs_inactive VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_cs_inactive)
189# define vsf_remap_spi_fifo_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_fifo_transfer)
190# define vsf_remap_spi_request_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_request_transfer)
191# define vsf_remap_spi_cancel_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_cancel_transfer)
192# define vsf_remap_spi_get_transferred_count VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_get_transferred_count)
193# define vsf_remap_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_ctrl)
194# define vsf_remap_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_get_configuration)
195
196# define VSF_SPI_CFG_IMP_REMAP_FUNCTIONS \
197 vsf_err_t vsf_imp_spi_init(vsf_imp_spi_t *spi_ptr, vsf_spi_cfg_t *cfg_ptr) \
198 { \
199 VSF_HAL_ASSERT(spi_ptr != NULL); \
200 return vsf_remap_spi_init(spi_ptr, cfg_ptr); \
201 } \
202 void vsf_imp_spi_fini(vsf_imp_spi_t *spi_ptr) \
203 { \
204 VSF_HAL_ASSERT(spi_ptr != NULL); \
205 vsf_remap_spi_fini(spi_ptr); \
206 } \
207 fsm_rt_t vsf_imp_spi_enable(vsf_imp_spi_t *spi_ptr) \
208 { \
209 VSF_HAL_ASSERT(spi_ptr != NULL); \
210 return vsf_remap_spi_enable(spi_ptr); \
211 } \
212 fsm_rt_t vsf_imp_spi_disable(vsf_imp_spi_t *spi_ptr) \
213 { \
214 VSF_HAL_ASSERT(spi_ptr != NULL); \
215 return vsf_remap_spi_disable(spi_ptr); \
216 } \
217 void vsf_imp_spi_irq_enable(vsf_imp_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask) \
218 { \
219 VSF_HAL_ASSERT(spi_ptr != NULL); \
220 vsf_remap_spi_irq_enable(spi_ptr, irq_mask); \
221 } \
222 void vsf_imp_spi_irq_disable(vsf_imp_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask) \
223 { \
224 VSF_HAL_ASSERT(spi_ptr != NULL); \
225 vsf_remap_spi_irq_disable(spi_ptr, irq_mask); \
226 } \
227 vsf_spi_irq_mask_t vsf_imp_spi_irq_clear(vsf_imp_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask) \
228 { \
229 VSF_HAL_ASSERT(spi_ptr != NULL); \
230 return vsf_remap_spi_irq_clear(spi_ptr, irq_mask); \
231 } \
232 vsf_spi_status_t vsf_imp_spi_status(vsf_imp_spi_t *spi_ptr) \
233 { \
234 VSF_HAL_ASSERT(spi_ptr != NULL); \
235 return vsf_remap_spi_status(spi_ptr); \
236 } \
237 vsf_err_t vsf_imp_spi_cs_active(vsf_imp_spi_t *spi_ptr, uint_fast8_t index) \
238 { \
239 VSF_HAL_ASSERT(spi_ptr != NULL); \
240 return vsf_remap_spi_cs_active(spi_ptr, index); \
241 } \
242 vsf_err_t vsf_imp_spi_cs_inactive(vsf_imp_spi_t *spi_ptr, uint_fast8_t index) \
243 { \
244 VSF_HAL_ASSERT(spi_ptr != NULL); \
245 return vsf_remap_spi_cs_inactive(spi_ptr, index); \
246 } \
247 void vsf_imp_spi_fifo_transfer(vsf_imp_spi_t *spi_ptr, \
248 void *out_buffer_ptr, \
249 uint_fast32_t* out_offset_ptr, \
250 void *in_buffer_ptr, \
251 uint_fast32_t* in_offset_ptr, \
252 uint_fast32_t cnt) \
253 { \
254 VSF_HAL_ASSERT(spi_ptr != NULL); \
255 vsf_remap_spi_fifo_transfer(spi_ptr, \
256 out_buffer_ptr, out_offset_ptr, \
257 in_buffer_ptr, in_offset_ptr, \
258 cnt); \
259 } \
260 vsf_err_t vsf_imp_spi_request_transfer(vsf_imp_spi_t *spi_ptr, void *out_buffer_ptr, \
261 void *in_buffer_ptr, uint_fast32_t count) \
262 { \
263 VSF_HAL_ASSERT(spi_ptr != NULL); \
264 return vsf_remap_spi_request_transfer(spi_ptr, out_buffer_ptr, \
265 in_buffer_ptr, count); \
266 } \
267 vsf_err_t vsf_imp_spi_cancel_transfer(vsf_imp_spi_t *spi_ptr) \
268 { \
269 VSF_HAL_ASSERT(spi_ptr != NULL); \
270 return vsf_remap_spi_cancel_transfer(spi_ptr); \
271 } \
272 void vsf_imp_spi_get_transferred_count(vsf_imp_spi_t *spi_ptr, \
273 uint_fast32_t * tx_count, uint_fast32_t *rx_count) \
274 { \
275 VSF_HAL_ASSERT(spi_ptr != NULL); \
276 vsf_remap_spi_get_transferred_count(spi_ptr, tx_count, rx_count); \
277 } \
278 vsf_spi_capability_t vsf_imp_spi_capability(vsf_imp_spi_t *spi_ptr) \
279 { \
280 VSF_HAL_ASSERT(spi_ptr != NULL); \
281 return vsf_remap_spi_capability(spi_ptr); \
282 } \
283 vsf_err_t vsf_imp_spi_ctrl(vsf_imp_spi_t *spi_ptr, vsf_spi_ctrl_t ctrl, void *param) \
284 { \
285 VSF_HAL_ASSERT(spi_ptr != NULL); \
286 return vsf_remap_spi_ctrl(spi_ptr, ctrl, param); \
287 } \
288 vsf_err_t vsf_imp_spi_get_configuration(vsf_imp_spi_t *spi_ptr, vsf_spi_cfg_t *cfg_ptr) \
289 { \
290 VSF_HAL_ASSERT(spi_ptr != NULL); \
291 VSF_HAL_ASSERT(cfg_ptr != NULL); \
292 return vsf_remap_spi_get_configuration(spi_ptr, cfg_ptr); \
293 }
294#endif
295
296/*============================ IMPLEMENTATION ================================*/
297/*============================ GLOBAL VARIABLES ==============================*/
298
299#define VSF_HAL_TEMPLATE_IMP_NAME _spi
300#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _SPI
301
302#if !defined(VSF_SPI_CFG_IMP_PREFIX) && !defined(VSF_SPI_CFG_IMP_DEVICE_PREFIX)
303# error "Please define VSF_SPI_CFG_IMP_PREFIX in spi driver"
304#endif
305
306#if !defined(VSF_SPI_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_SPI_CFG_IMP_DEVICE_UPCASE_PREFIX)
307# error "Please define VSF_SPI_CFG_IMP_UPCASE_PREFIX in spi driver"
308#endif
309
310#ifndef VSF_SPI_CFG_IMP_COUNT_MASK_PREFIX
311# define VSF_SPI_CFG_IMP_COUNT_MASK_PREFIX VSF_SPI_CFG_IMP_UPCASE_PREFIX
312#endif
313
314#ifdef VSF_SPI_CFG_IMP_REMAP_FUNCTIONS
315# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_SPI_CFG_IMP_REMAP_FUNCTIONS
316#endif
317
319
320#undef VSF_SPI_CFG_IMP_PREFIX
321#undef VSF_SPI_CFG_IMP_COUNT_MASK_PREFIX
322#undef VSF_SPI_CFG_IMP_UPCASE_PREFIX
323#undef VSF_SPI_CFG_IMP_DEVICE_PREFIX
324#undef VSF_SPI_CFG_IMP_DEVICE_UPCASE_PREFIX
325#undef VSF_SPI_CFG_IMP_LV0
326#undef VSF_SPI_CFG_IMP_REMAP_FUNCTIONS
327#undef VSF_SPI_CFG_IMP_HAS_OP
328#undef VSF_SPI_CFG_IMP_EXTERN_OP
329#undef VSF_SPI_CFG_IMP_RENAME_DEVICE_PREFIX
330
331#undef vsf_imp_spi_t
332#undef vsf_imp_spi_init
333#undef vsf_imp_spi_enable
334#undef vsf_imp_spi_disable
335#undef vsf_imp_spi_irq_enable
336#undef vsf_imp_spi_irq_disable
337#undef vsf_imp_spi_irq_clear
338#undef vsf_imp_spi_status
339#undef vsf_imp_spi_capability
340#undef vsf_imp_spi_cs_active
341#undef vsf_imp_spi_cs_inactive
342#undef vsf_imp_spi_fifo_transfer
343#undef vsf_imp_spi_request_transfer
344#undef vsf_imp_spi_cancel_transfer
345#undef vsf_imp_spi_get_transferred_count
346#undef vsf_imp_spi_ctrl
347#undef vsf_imp_spi_get_configuration
348
349#undef vsf_remap_spi_t
350#undef vsf_remap_spi_init
351#undef vsf_remap_spi_enable
352#undef vsf_remap_spi_disable
353#undef vsf_remap_spi_irq_enable
354#undef vsf_remap_spi_irq_disable
355#undef vsf_remap_spi_irq_clear
356#undef vsf_remap_spi_status
357#undef vsf_remap_spi_capability
358#undef vsf_remap_spi_cs_active
359#undef vsf_remap_spi_cs_inactive
360#undef vsf_remap_spi_fifo_transfer
361#undef vsf_remap_spi_request_transfer
362#undef vsf_remap_spi_cancel_transfer
363#undef vsf_remap_spi_get_transferred_count
364#undef vsf_remap_spi_ctrl
365#undef vsf_remap_spi_get_configuration
366
367#undef VSF_HAL_TEMPLATE_IMP_NAME
368#undef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
369
370/*============================ STATIC ASSERTIONS ==============================*/
371
372/* User-extensible macros for custom mode and IRQ mask values
373 * Users can define these macros before including this template to append
374 * their custom enum values to the uniqueness checks.
375 *
376 * Check modes for custom values:
377 * VSF_SPI_CFG_MODE_CHECK_UNIQUE - Check mode for custom mode values
378 * Default: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
379 * Can be set to: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
380 * VSF_SPI_CFG_IRQ_MASK_CHECK_UNIQUE - Check mode for custom IRQ mask values
381 * Default: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
382 * Can be set to: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
383 *
384 * Example usage in vendor driver:
385 * #define VSF_SPI_CUSTOM_MODE_VALUES MY_CUSTOM_MODE1, MY_CUSTOM_MODE2
386 * #define VSF_SPI_CFG_MODE_CHECK_UNIQUE VSF_HAL_CHECK_MODE_LOOSE
387 * #define VSF_SPI_CUSTOM_IRQ_MASK_VALUES MY_CUSTOM_IRQ1, MY_CUSTOM_IRQ2
388 * #define VSF_SPI_CFG_IRQ_MASK_CHECK_UNIQUE VSF_HAL_CHECK_MODE_STRICT
389 * #include "hal/driver/common/spi/spi_template.inc"
390 */
391
392
393#ifdef VSF_SPI_CFG_MODE_CHECK_UNIQUE
394/* Default mode lists - can be redefined by users before including this file */
395#ifndef VSF_SPI_CHECK_UNIQUE_DIR_MODES
396# define VSF_SPI_CHECK_UNIQUE_DIR_MODES \
397 VSF_SPI_MASTER, \
398 VSF_SPI_SLAVE
399#endif
400
401#ifndef VSF_SPI_CHECK_UNIQUE_BIT_ORDER_MODES
402# define VSF_SPI_CHECK_UNIQUE_BIT_ORDER_MODES \
403 VSF_SPI_MSB_FIRST, \
404 VSF_SPI_LSB_FIRST
405#endif
406
407#ifndef VSF_SPI_CHECK_UNIQUE_MODE_MODES
408# define VSF_SPI_CHECK_UNIQUE_MODE_MODES \
409 VSF_SPI_MODE_0, \
410 VSF_SPI_MODE_1, \
411 VSF_SPI_MODE_2, \
412 VSF_SPI_MODE_3
413#endif
414
415#ifndef VSF_SPI_CHECK_UNIQUE_CS_MODES
416# define VSF_SPI_CHECK_UNIQUE_CS_MODES \
417 VSF_SPI_CS_SOFTWARE_MODE, \
418 VSF_SPI_CS_HARDWARE_MODE
419#endif
420
421#ifndef VSF_SPI_CHECK_UNIQUE_DATASIZE_MODES
422# define VSF_SPI_CHECK_UNIQUE_DATASIZE_MODES \
423 VSF_SPI_DATASIZE_8, \
424 VSF_SPI_DATASIZE_16, \
425 VSF_SPI_DATASIZE_32
426#endif
427
428/* ==================== GROUP INTERNAL UNIQUENESS CHECKS ==================== */
429/* Check uniqueness within each functional group */
430
431/* Check direction mode uniqueness - all direction modes should have different values
432 * Mandatory: VSF_SPI_MASTER, VSF_SPI_SLAVE
433 */
434VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_SPI_CFG_MODE_CHECK_UNIQUE, VSF_SPI_CHECK_UNIQUE_DIR_MODES);
435
436/* Check bit order uniqueness - all bit order modes should have different values
437 * Mandatory: VSF_SPI_MSB_FIRST, VSF_SPI_LSB_FIRST
438 */
439VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_SPI_CFG_MODE_CHECK_UNIQUE, VSF_SPI_CHECK_UNIQUE_BIT_ORDER_MODES);
440
441/* Check SPI mode uniqueness - all SPI modes should have different values
442 * Mandatory: VSF_SPI_MODE_0, VSF_SPI_MODE_1, VSF_SPI_MODE_2, VSF_SPI_MODE_3
443 */
444VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_SPI_CFG_MODE_CHECK_UNIQUE, VSF_SPI_CHECK_UNIQUE_MODE_MODES);
445
446/* Check chip select mode uniqueness - all CS modes should have different values
447 * Mandatory: VSF_SPI_CS_SOFTWARE_MODE, VSF_SPI_CS_HARDWARE_MODE
448 * Implementation Required: VSF_SPI_CS_HARDWARE_INPUT_MODE
449 */
452 VSF_SPI_CHECK_UNIQUE_CS_MODES
453#ifdef VSF_SPI_CS_HARDWARE_INPUT_MODE
454 , VSF_SPI_CS_HARDWARE_INPUT_MODE
455#endif
456);
457
458/* Check data size uniqueness - all data size modes should have different values
459 * Mandatory: VSF_SPI_DATASIZE_8, VSF_SPI_DATASIZE_16, VSF_SPI_DATASIZE_32
460 */
461VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_SPI_CFG_MODE_CHECK_UNIQUE, VSF_SPI_CHECK_UNIQUE_DATASIZE_MODES);
462
463#ifdef VSF_SPI_CUSTOM_MODE_VALUES
464/* Check uniqueness among custom mode values using user-specified check mode */
466#endif
467
470 /* Mandatory modes - always included */
476 /* Implementation Required modes - conditionally included */
477#ifdef VSF_SPI_CS_HARDWARE_INPUT_MODE
478 , VSF_SPI_CS_HARDWARE_INPUT_MODE
479#endif
480 /* Standard Optional modes - only included when __VSF_SPI_CFG_SUPPORT_STANDARD_OPTIONAL is enabled */
482#ifdef VSF_SPI_CPOL_LOW
484#endif
487#endif
488#ifdef VSF_SPI_CPHA_LOW
490#endif
493#endif
496#endif
497#ifdef VSF_SPI_TI_MODE
499#endif
502#endif
505#endif
506#ifdef VSF_SPI_CLOCK_PRESCALER_2
507 , VSF_SPI_CLOCK_PRESCALER_2
508#endif
509#ifdef VSF_SPI_CLOCK_PRESCALER_4
510 , VSF_SPI_CLOCK_PRESCALER_4
511#endif
512#ifdef VSF_SPI_CLOCK_PRESCALER_8
513 , VSF_SPI_CLOCK_PRESCALER_8
514#endif
515#ifdef VSF_SPI_CLOCK_PRESCALER_16
516 , VSF_SPI_CLOCK_PRESCALER_16
517#endif
518#ifdef VSF_SPI_CLOCK_PRESCALER_32
519 , VSF_SPI_CLOCK_PRESCALER_32
520#endif
521#ifdef VSF_SPI_CLOCK_PRESCALER_64
522 , VSF_SPI_CLOCK_PRESCALER_64
523#endif
524#ifdef VSF_SPI_CLOCK_PRESCALER_128
525 , VSF_SPI_CLOCK_PRESCALER_128
526#endif
527#ifdef VSF_SPI_CLOCK_PRESCALER_256
528 , VSF_SPI_CLOCK_PRESCALER_256
529#endif
532#endif
535#endif
536#ifdef VSF_SPI_DATALINE_2_LINE_TX_ONLY
537 , VSF_SPI_DATALINE_2_LINE_TX_ONLY
538#endif
541#endif
542#ifdef VSF_SPI_DATALINE_2_LINE_HALF_DUPLEX
543 , VSF_SPI_DATALINE_2_LINE_HALF_DUPLEX
544#endif
545#ifdef VSF_SPI_DATALINE_4_LINE_HALF_DUPLEX
546 , VSF_SPI_DATALINE_4_LINE_HALF_DUPLEX
547#endif
548#ifdef VSF_SPI_DATALINE_8_LINE_HALF_DUPLEX
549 , VSF_SPI_DATALINE_8_LINE_HALF_DUPLEX
550#endif
551#ifdef VSF_SPI_DATALINE_16_LINE_HALF_DUPLEX
552 , VSF_SPI_DATALINE_16_LINE_HALF_DUPLEX
553#endif
554#endif
555 /* User-defined modes - appended by user configuration */
556#ifdef VSF_SPI_CUSTOM_MODE_VALUES
557 , VSF_SPI_CUSTOM_MODE_VALUES
558#endif
559);
560
561#undef VSF_SPI_CHECK_UNIQUE_DIR_MODES
562#undef VSF_SPI_CHECK_UNIQUE_BIT_ORDER_MODES
563#undef VSF_SPI_CHECK_UNIQUE_MODE_MODES
564#undef VSF_SPI_CHECK_UNIQUE_CS_MODES
565#undef VSF_SPI_CHECK_UNIQUE_DATASIZE_MODES
566#endif /* VSF_SPI_CFG_MODE_CHECK_UNIQUE */
567
568/* ==================== IRQ MASK UNIQUENESS CHECKS ==================== */
569
570#ifdef VSF_SPI_CFG_IRQ_MASK_CHECK_UNIQUE
571
572#ifdef VSF_SPI_CUSTOM_IRQ_MASK_VALUES
573/* Check uniqueness among custom IRQ mask values using user-specified check mode */
575#endif
576
577/* Check uniqueness within vsf_spi_irq_mask_t enum */
578
579/* Check IRQ mask uniqueness - all IRQ mask bits should have different values
580 * Mandatory: VSF_SPI_IRQ_MASK_TX, VSF_SPI_IRQ_MASK_RX,
581 * VSF_SPI_IRQ_MASK_TX_CPL, VSF_SPI_IRQ_MASK_RX_CPL,
582 * VSF_SPI_IRQ_MASK_RX_OVERFLOW_ERR
583 * Standard Optional: VSF_SPI_IRQ_MASK_CRC_ERR, VSF_SPI_IRQ_MASK_FRAME_ERR
584 */
587 /* Mandatory IRQ masks - always included */
593 /* Standard Optional IRQ masks - only included when __VSF_SPI_CFG_SUPPORT_STANDARD_OPTIONAL is enabled */
597#endif
598#ifdef VSF_SPI_IRQ_MASK_FRAME_ERR
599 , VSF_SPI_IRQ_MASK_FRAME_ERR
600#endif
601#endif
602 /* User-defined IRQ masks - appended by user configuration */
603#ifdef VSF_SPI_CUSTOM_IRQ_MASK_VALUES
604 , VSF_SPI_CUSTOM_IRQ_MASK_VALUES
605#endif
606);
607#endif /* VSF_SPI_CFG_IRQ_MASK_CHECK_UNIQUE */
608
609/* ==================== CTRL UNIQUENESS CHECKS ==================== */
610
611#ifdef VSF_SPI_CFG_CTRL_CHECK_UNIQUE
612
613#ifdef VSF_SPI_CUSTOM_CTRL_VALUES
614/* Check uniqueness among custom ctrl values using user-specified check mode */
615VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_SPI_CFG_CTRL_CHECK_UNIQUE, VSF_SPI_CUSTOM_CTRL_VALUES);
616#endif
617
618/* Check ctrl uniqueness - all ctrl values should have different values
619 * Placeholder: __VSF_SPI_CTRL_DUMMY
620 */
622 VSF_SPI_CFG_CTRL_CHECK_UNIQUE,
623 /* Placeholder ctrl - always included */
625 /* User-defined ctrls - appended by user configuration */
626#ifdef VSF_SPI_CUSTOM_CTRL_VALUES
627 , VSF_SPI_CUSTOM_CTRL_VALUES
628#endif
629);
630#endif /* VSF_SPI_CFG_CTRL_CHECK_UNIQUE */
631
632#undef VSF_SPI_CFG_MODE_CHECK_UNIQUE
633#undef VSF_SPI_CFG_IRQ_MASK_CHECK_UNIQUE
634#undef VSF_SPI_CFG_CTRL_CHECK_UNIQUE
635#undef VSF_SPI_CUSTOM_MODE_VALUES
636#undef VSF_SPI_CUSTOM_IRQ_MASK_VALUES
637#undef VSF_SPI_CUSTOM_CTRL_VALUES
638
639#endif /* VSF_HAL_USE_SPI */
640
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
@ VSF_SPI_SLAVE
Definition spi.h:34
@ VSF_SPI_LSB_FIRST
Definition spi.h:86
@ VSF_SPI_MODE_1
Definition spi.h:41
@ VSF_SPI_DATASIZE_8
datasize is 8 bits
Definition spi.h:49
@ VSF_SPI_MASTER
Definition spi.h:35
@ VSF_SPI_MSB_FIRST
Definition spi.h:85
@ VSF_SPI_DATASIZE_32
Definition spi.h:73
@ VSF_SPI_CS_SOFTWARE_MODE
Definition spi.h:82
@ VSF_SPI_MODE_0
Definition spi.h:39
@ VSF_SPI_CS_HARDWARE_MODE
Definition spi.h:83
@ VSF_SPI_MODE_3
Definition spi.h:45
@ VSF_SPI_MODE_2
Definition spi.h:43
#define VSF_SPI_CPOL_HIGH
Definition spi.h:123
vsf_spi_irq_mask_t
Definition spi.h:159
@ VSF_SPI_IRQ_MASK_RX_OVERFLOW_ERR
Definition spi.h:169
@ VSF_SPI_IRQ_MASK_RX_CPL
Definition spi.h:167
@ VSF_SPI_IRQ_MASK_CRC_ERR
Definition spi.h:171
@ VSF_SPI_IRQ_MASK_RX
Definition spi.h:163
@ VSF_SPI_IRQ_MASK_TX
Definition spi.h:161
@ VSF_SPI_IRQ_MASK_TX_CPL
Definition spi.h:165
#define VSF_SPI_DATASIZE_16
Definition spi.h:101
#define VSF_SPI_TI_MODE
Definition spi.h:95
#define VSF_SPI_CPHA_HIGH
Definition spi.h:128
#define VSF_SPI_DATALINE_2_LINE_FULL_DUPLEX
Definition spi.h:110
@ VSF_SPI_CRC_ENABLED
Definition spi.h:116
@ VSF_SPI_CRC_DISABLED
Definition spi.h:115
#define VSF_SPI_DATALINE_1_LINE_HALF_DUPLEX
Definition spi.h:112
#define VSF_SPI_DATALINE_2_LINE_RX_ONLY
Definition spi.h:111
#define VSF_SPI_CPHA_LOW
Definition spi.h:126
#define VSF_SPI_CPOL_LOW
Definition spi.h:121
#define VSF_SPI_MOTOROLA_MODE
Definition spi.h:94
#define NULL
Definition lvgl.h:26
const i_spi_t vsf_spi_irq_mask_t irq_mask
Definition spi_interface.h:38
Predefined VSF SPI capability that can be reimplemented in specific HAL drivers. Even if the hardware...
Definition vsf_template_spi.h:739
uint8_t support_hardware_cs
Supported interrupt masks for SPI operations.
Definition vsf_template_spi.h:745
Configuration structure for SPI.
Definition vsf_template_spi.h:797
#define VSF_SPI_CFG_IRQ_MASK_CHECK_UNIQUE
Definition spi.c:300
#define VSF_SPI_CFG_MODE_CHECK_UNIQUE
Definition spi.c:299
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
#define __VSF_SPI_CFG_SUPPORT_STANDARD_OPTIONAL
Enable standard optional features support.
Definition vsf_template_spi.h:260
vsf_spi_ctrl_t
Predefined VSF SPI control commands that can be reimplemented in specific HAL drivers.
Definition vsf_template_spi.h:842
@ __VSF_SPI_CTRL_DUMMY
Dummy value for compilation, required when no actual control commands are defined.
Definition vsf_template_spi.h:860
#define VSF_HAL_CHECK_UNIQUE_CUSTOM(__CHECK_FUNC,...)
Definition vsf_template_static_assert_unique.h:2426
Generated from commit: vsfteam/vsf@b2e9e8a