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#define vsf_real_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_t)
24#define vsf_real_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_capability)
25#define vsf_real_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_ctrl)
26#define vsf_real_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_get_configuration)
27#define vsf_real_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_clear)
28
29#ifndef VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY
30# define VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
31#endif
32
33#ifndef VSF_SPI_CFG_REIMPLEMENT_API_CTRL
34# define VSF_SPI_CFG_REIMPLEMENT_API_CTRL DISABLED
35#endif
36
37#ifndef VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION
38# define VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
39#endif
40
41#ifndef VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR
42# define VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR DISABLED
43#endif
44
45#ifdef VSF_SPI_CFG_IMP_REMAP_PREFIX
46# undef VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY
47# undef VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION
48# undef VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR
49# define VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
50# define VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
51# define VSF_SPI_CFG_REIMPLEMENT_API_IRQ_CLEAR ENABLED
52#endif
53
54#if VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
55# ifndef VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS
56# define VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS 1
57# endif
58# ifndef VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS
59# define VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS 1
60# endif
61# ifndef VSF_SPI_CFG_CAPABILITY_CS_COUNT
62# define VSF_SPI_CFG_CAPABILITY_CS_COUNT 1
63# endif
64# ifndef VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ
65# define VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ 0xFFFFFFFF
66# endif
67# ifndef VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ
68# define VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ 1
69# endif
70#endif
71
72/*============================ MACROFIED FUNCTIONS ===========================*/
73
74#if VSF_SPI_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
75vsf_spi_capability_t vsf_real_spi_capability(vsf_real_spi_t *spi_ptr)
76{
77 vsf_spi_capability_t spi_capability = {
78 .support_hardware_cs = VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS,
79 .support_software_cs = VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS,
80 .cs_count = VSF_SPI_CFG_CAPABILITY_CS_COUNT,
81 .max_clock_hz = VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ,
82 .min_clock_hz = VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ,
83 };
84
85 return spi_capability;
86}
87#endif
88
89#if VSF_SPI_CFG_REIMPLEMENT_API_CTRL == DISABLED
90vsf_err_t vsf_real_spi_ctrl(vsf_real_spi_t *spi_ptr, vsf_spi_ctrl_t ctrl, void *param)
91{
93}
94#endif
95
96#if VSF_SPI_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
97vsf_err_t vsf_real_spi_get_configuration(vsf_real_spi_t *spi_ptr, vsf_spi_cfg_t *cfg_ptr)
98{
99 VSF_HAL_ASSERT(NULL != spi_ptr);
100 VSF_HAL_ASSERT(NULL != cfg_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_IRQ_CLEAR == DISABLED
110vsf_spi_irq_mask_t vsf_real_spi_irq_clear(vsf_real_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask)
111{
112 VSF_HAL_ASSERT(NULL != spi_ptr);
113
114 // Default implementation: not supported, trigger assertion
116
117 return 0;
118}
119#endif
120
121/*============================ MACROS ========================================*/
122
123#undef VSF_SPI_CFG_CAPABILITY_SUPPORT_AUTO_CS
124#undef VSF_SPI_CFG_CAPABILITY_SUPPORT_MANUAL_CS
125#undef VSF_SPI_CFG_CAPABILITY_CS_COUNT
126#undef VSF_SPI_CFG_CAPABILITY_MAX_CLOCK_HZ
127#undef VSF_SPI_CFG_CAPABILITY_MIN_CLOCK_HZ
128#undef vsf_real_spi_t
129#undef vsf_real_spi_capability
130#undef vsf_real_spi_ctrl
131#undef vsf_real_spi_get_configuration
132#undef vsf_real_spi_irq_clear
133
134/*============================ PROTOTYPES ====================================*/
135/*============================ LOCAL VARIABLES ===============================*/
136/*============================ MACROS ========================================*/
137/*============================ MACROS ========================================*/
138
139#ifdef VSF_SPI_CFG_IMP_REMAP_PREFIX
140
141# define vsf_imp_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_t)
142# define vsf_imp_spi_init VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_init)
143# define vsf_imp_spi_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_enable)
144# define vsf_imp_spi_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_disable)
145# define vsf_imp_spi_irq_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_enable)
146# define vsf_imp_spi_irq_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_disable)
147# define vsf_imp_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_irq_clear)
148# define vsf_imp_spi_status VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_status)
149# define vsf_imp_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_capability)
150# define vsf_imp_spi_cs_active VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_cs_active)
151# define vsf_imp_spi_cs_inactive VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_cs_inactive)
152# define vsf_imp_spi_fifo_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_fifo_transfer)
153# define vsf_imp_spi_request_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_request_transfer)
154# define vsf_imp_spi_cancel_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_cancel_transfer)
155# define vsf_imp_spi_get_transferred_count VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_get_transferred_count)
156# define vsf_imp_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_ctrl)
157# define vsf_imp_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_PREFIX, _spi_get_configuration)
158
159# define vsf_remap_spi_t VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_t)
160# define vsf_remap_spi_init VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_init)
161# define vsf_remap_spi_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_enable)
162# define vsf_remap_spi_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_disable)
163# define vsf_remap_spi_irq_enable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_irq_enable)
164# define vsf_remap_spi_irq_disable VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_irq_disable)
165# define vsf_remap_spi_irq_clear VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_irq_clear)
166# define vsf_remap_spi_status VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_status)
167# define vsf_remap_spi_capability VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_capability)
168# define vsf_remap_spi_cs_active VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_cs_active)
169# define vsf_remap_spi_cs_inactive VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_cs_inactive)
170# define vsf_remap_spi_fifo_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_fifo_transfer)
171# define vsf_remap_spi_request_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_request_transfer)
172# define vsf_remap_spi_cancel_transfer VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_cancel_transfer)
173# define vsf_remap_spi_get_transferred_count VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_get_transferred_count)
174# define vsf_remap_spi_ctrl VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_ctrl)
175# define vsf_remap_spi_get_configuration VSF_MCONNECT(VSF_SPI_CFG_IMP_REMAP_PREFIX, _spi_get_configuration)
176
177# define VSF_SPI_CFG_IMP_REMAP_FUNCTIONS \
178 vsf_err_t vsf_imp_spi_init(vsf_imp_spi_t *spi_ptr, vsf_spi_cfg_t *cfg_ptr) \
179 { \
180 VSF_HAL_ASSERT(spi_ptr != NULL); \
181 return vsf_remap_spi_init(spi_ptr, cfg_ptr); \
182 } \
183 void vsf_imp_spi_fini(vsf_imp_spi_t *spi_ptr) \
184 { \
185 VSF_HAL_ASSERT(spi_ptr != NULL); \
186 vsf_remap_spi_fini(spi_ptr); \
187 } \
188 fsm_rt_t vsf_imp_spi_enable(vsf_imp_spi_t *spi_ptr) \
189 { \
190 VSF_HAL_ASSERT(spi_ptr != NULL); \
191 return vsf_remap_spi_enable(spi_ptr); \
192 } \
193 fsm_rt_t vsf_imp_spi_disable(vsf_imp_spi_t *spi_ptr) \
194 { \
195 VSF_HAL_ASSERT(spi_ptr != NULL); \
196 return vsf_remap_spi_disable(spi_ptr); \
197 } \
198 void vsf_imp_spi_irq_enable(vsf_imp_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask) \
199 { \
200 VSF_HAL_ASSERT(spi_ptr != NULL); \
201 vsf_remap_spi_irq_enable(spi_ptr, irq_mask); \
202 } \
203 void vsf_imp_spi_irq_disable(vsf_imp_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask) \
204 { \
205 VSF_HAL_ASSERT(spi_ptr != NULL); \
206 vsf_remap_spi_irq_disable(spi_ptr, irq_mask); \
207 } \
208 vsf_spi_irq_mask_t vsf_imp_spi_irq_clear(vsf_imp_spi_t *spi_ptr, vsf_spi_irq_mask_t irq_mask) \
209 { \
210 VSF_HAL_ASSERT(spi_ptr != NULL); \
211 return vsf_remap_spi_irq_clear(spi_ptr, irq_mask); \
212 } \
213 vsf_spi_status_t vsf_imp_spi_status(vsf_imp_spi_t *spi_ptr) \
214 { \
215 VSF_HAL_ASSERT(spi_ptr != NULL); \
216 return vsf_remap_spi_status(spi_ptr); \
217 } \
218 vsf_err_t vsf_imp_spi_cs_active(vsf_imp_spi_t *spi_ptr, uint_fast8_t index) \
219 { \
220 VSF_HAL_ASSERT(spi_ptr != NULL); \
221 return vsf_remap_spi_cs_active(spi_ptr, index); \
222 } \
223 vsf_err_t vsf_imp_spi_cs_inactive(vsf_imp_spi_t *spi_ptr, uint_fast8_t index) \
224 { \
225 VSF_HAL_ASSERT(spi_ptr != NULL); \
226 return vsf_remap_spi_cs_inactive(spi_ptr, index); \
227 } \
228 void vsf_imp_spi_fifo_transfer(vsf_imp_spi_t *spi_ptr, \
229 void *out_buffer_ptr, \
230 uint_fast32_t* out_offset_ptr, \
231 void *in_buffer_ptr, \
232 uint_fast32_t* in_offset_ptr, \
233 uint_fast32_t cnt) \
234 { \
235 VSF_HAL_ASSERT(spi_ptr != NULL); \
236 vsf_remap_spi_fifo_transfer(spi_ptr, \
237 out_buffer_ptr, out_offset_ptr, \
238 in_buffer_ptr, in_offset_ptr, \
239 cnt); \
240 } \
241 vsf_err_t vsf_imp_spi_request_transfer(vsf_imp_spi_t *spi_ptr, void *out_buffer_ptr, \
242 void *in_buffer_ptr, uint_fast32_t count) \
243 { \
244 VSF_HAL_ASSERT(spi_ptr != NULL); \
245 return vsf_remap_spi_request_transfer(spi_ptr, out_buffer_ptr, \
246 in_buffer_ptr, count); \
247 } \
248 vsf_err_t vsf_imp_spi_cancel_transfer(vsf_imp_spi_t *spi_ptr) \
249 { \
250 VSF_HAL_ASSERT(spi_ptr != NULL); \
251 return vsf_remap_spi_cancel_transfer(spi_ptr); \
252 } \
253 void vsf_imp_spi_get_transferred_count(vsf_imp_spi_t *spi_ptr, \
254 uint_fast32_t * tx_count, uint_fast32_t *rx_count) \
255 { \
256 VSF_HAL_ASSERT(spi_ptr != NULL); \
257 vsf_remap_spi_get_transferred_count(spi_ptr, tx_count, rx_count); \
258 } \
259 vsf_spi_capability_t vsf_imp_spi_capability(vsf_imp_spi_t *spi_ptr) \
260 { \
261 VSF_HAL_ASSERT(spi_ptr != NULL); \
262 return vsf_remap_spi_capability(spi_ptr); \
263 } \
264 vsf_err_t vsf_imp_spi_ctrl(vsf_imp_spi_t *spi_ptr, vsf_spi_ctrl_t ctrl, void *param) \
265 { \
266 VSF_HAL_ASSERT(spi_ptr != NULL); \
267 return vsf_remap_spi_ctrl(spi_ptr, ctrl, param); \
268 } \
269 vsf_err_t vsf_imp_spi_get_configuration(vsf_imp_spi_t *spi_ptr, vsf_spi_cfg_t *cfg_ptr) \
270 { \
271 VSF_HAL_ASSERT(spi_ptr != NULL); \
272 VSF_HAL_ASSERT(cfg_ptr != NULL); \
273 return vsf_remap_spi_get_configuration(spi_ptr, cfg_ptr); \
274 }
275#endif
276
277/*============================ IMPLEMENTATION ================================*/
278/*============================ GLOBAL VARIABLES ==============================*/
279
280#define VSF_HAL_TEMPLATE_IMP_NAME _spi
281#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _SPI
282
283#if !defined(VSF_SPI_CFG_IMP_PREFIX) && !defined(VSF_SPI_CFG_IMP_DEVICE_PREFIX)
284# error "Please define VSF_SPI_CFG_IMP_PREFIX in spi driver"
285#endif
286
287#if !defined(VSF_SPI_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_SPI_CFG_IMP_DEVICE_UPCASE_PREFIX)
288# error "Please define VSF_SPI_CFG_IMP_UPCASE_PREFIX in spi driver"
289#endif
290
291#ifndef VSF_SPI_CFG_IMP_COUNT_MASK_PREFIX
292# define VSF_SPI_CFG_IMP_COUNT_MASK_PREFIX VSF_SPI_CFG_IMP_UPCASE_PREFIX
293#endif
294
295#ifdef VSF_SPI_CFG_IMP_REMAP_FUNCTIONS
296# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_SPI_CFG_IMP_REMAP_FUNCTIONS
297#endif
298
300
301#undef VSF_SPI_CFG_IMP_PREFIX
302#undef VSF_SPI_CFG_IMP_COUNT_MASK_PREFIX
303#undef VSF_SPI_CFG_IMP_UPCASE_PREFIX
304#undef VSF_SPI_CFG_IMP_DEVICE_PREFIX
305#undef VSF_SPI_CFG_IMP_DEVICE_UPCASE_PREFIX
306#undef VSF_SPI_CFG_IMP_LV0
307#undef VSF_SPI_CFG_IMP_REMAP_FUNCTIONS
308#undef VSF_SPI_CFG_IMP_HAS_OP
309#undef VSF_SPI_CFG_IMP_EXTERN_OP
310
311#undef vsf_imp_spi_t
312#undef vsf_imp_spi_init
313#undef vsf_imp_spi_enable
314#undef vsf_imp_spi_disable
315#undef vsf_imp_spi_irq_enable
316#undef vsf_imp_spi_irq_disable
317#undef vsf_imp_spi_irq_clear
318#undef vsf_imp_spi_status
319#undef vsf_imp_spi_capability
320#undef vsf_imp_spi_cs_active
321#undef vsf_imp_spi_cs_inactive
322#undef vsf_imp_spi_fifo_transfer
323#undef vsf_imp_spi_request_transfer
324#undef vsf_imp_spi_cancel_transfer
325#undef vsf_imp_spi_get_transferred_count
326#undef vsf_imp_spi_ctrl
327#undef vsf_imp_spi_get_configuration
328
329#undef vsf_remap_spi_t
330#undef vsf_remap_spi_init
331#undef vsf_remap_spi_enable
332#undef vsf_remap_spi_disable
333#undef vsf_remap_spi_irq_enable
334#undef vsf_remap_spi_irq_disable
335#undef vsf_remap_spi_irq_clear
336#undef vsf_remap_spi_status
337#undef vsf_remap_spi_capability
338#undef vsf_remap_spi_cs_active
339#undef vsf_remap_spi_cs_inactive
340#undef vsf_remap_spi_fifo_transfer
341#undef vsf_remap_spi_request_transfer
342#undef vsf_remap_spi_cancel_transfer
343#undef vsf_remap_spi_get_transferred_count
344#undef vsf_remap_spi_ctrl
345#undef vsf_remap_spi_get_configuration
346
347#endif /* VSF_HAL_USE_SPI */
348
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
#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:726
uint8_t support_hardware_cs
Supported interrupt masks for SPI operations.
Definition vsf_template_spi.h:732
Configuration structure for SPI.
Definition vsf_template_spi.h:784
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
vsf_spi_irq_mask_t
Predefined VSF SPI interrupt masks that can be reimplemented in specific HAL drivers....
Definition vsf_template_spi.h:620
vsf_spi_ctrl_t
Predefined VSF SPI control commands that can be reimplemented in specific HAL drivers.
Definition vsf_template_spi.h:816
Generated from commit: vsfteam/vsf@3f091ef