VSF Documented
i2c_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
21
22/*============================ MACROS ========================================*/
23#if VSF_HAL_USE_I2C == ENABLED
24
25#ifndef VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY
26# define VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
27#endif
28
29#ifndef VSF_I2C_CFG_REIMPLEMENT_API_CTRL
30# define VSF_I2C_CFG_REIMPLEMENT_API_CTRL DISABLED
31#endif
32
33#ifndef VSF_I2C_CFG_REIMPLEMENT_API_GET_CONFIGURATION
34# define VSF_I2C_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
35#endif
36
37#ifndef VSF_I2C_CFG_REIMPLEMENT_API_IRQ_CLEAR
38# define VSF_I2C_CFG_REIMPLEMENT_API_IRQ_CLEAR DISABLED
39#endif
40
41#ifdef VSF_I2C_CFG_IMP_REMAP_PREFIX
42# undef VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY
43# undef VSF_I2C_CFG_REIMPLEMENT_API_CTRL
44# undef VSF_I2C_CFG_REIMPLEMENT_API_GET_CONFIGURATION
45# undef VSF_I2C_CFG_REIMPLEMENT_API_IRQ_CLEAR
46# define VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
47# define VSF_I2C_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
48# define VSF_I2C_CFG_REIMPLEMENT_API_CTRL ENABLED
49# define VSF_I2C_CFG_REIMPLEMENT_API_IRQ_CLEAR ENABLED
50#endif
51
52#if VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
53# ifndef VSF_I2C_CFG_CAPABILITY_IRQ_MASK
54# define VSF_I2C_CFG_CAPABILITY_IRQ_MASK VSF_I2C_IRQ_ALL_BITS_MASK
55# endif
56# ifndef VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_START
57# define VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_START 1
58# endif
59# ifndef VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_STOP_RESTART
60# define VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_STOP_RESTART 1
61# endif
62# ifndef VSF_I2C_CFG_CAPABILITY_SUPPORT_RESTART
63# define VSF_I2C_CFG_CAPABILITY_SUPPORT_RESTART 1
64# endif
65# ifndef VSF_I2C_CFG_CAPABILITY_MAX_TRANSFER_SIZE
66# define VSF_I2C_CFG_CAPABILITY_MAX_TRANSFER_SIZE 0xFFFF
67# endif
68# ifndef VSF_I2C_CFG_CAPABILITY_MIN_TRANSFER_SIZE
69# define VSF_I2C_CFG_CAPABILITY_MIN_TRANSFER_SIZE 0
70# endif
71#endif
72
73#if defined(VSF_I2C_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_I2C_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
74# define vsf_real_i2c_t VSF_MCONNECT(VSF_I2C_CFG_IMP_DEVICE_PREFIX, _t)
75# define vsf_real_master_request VSF_MCONNECT(VSF_I2C_CFG_IMP_DEVICE_PREFIX, _master_request)
76# define vsf_real_i2c_capability VSF_MCONNECT(VSF_I2C_CFG_IMP_DEVICE_PREFIX, _capability)
77# define vsf_real_i2c_ctrl VSF_MCONNECT(VSF_I2C_CFG_IMP_DEVICE_PREFIX, _ctrl)
78# define vsf_real_i2c_get_configuration VSF_MCONNECT(VSF_I2C_CFG_IMP_DEVICE_PREFIX, _get_configuration)
79# define vsf_real_i2c_irq_clear VSF_MCONNECT(VSF_I2C_CFG_IMP_DEVICE_PREFIX, _irq_clear)
80#else
81# define vsf_real_i2c_t VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_t)
82# define vsf_real_master_request VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_master_request)
83# define vsf_real_i2c_capability VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_capability)
84# define vsf_real_i2c_ctrl VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_ctrl)
85# define vsf_real_i2c_get_configuration VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_get_configuration)
86# define vsf_real_i2c_irq_clear VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_irq_clear)
87#endif
88
89/*============================ MACROFIED FUNCTIONS ===========================*/
90/*============================ LOCAL VARIABLES ===============================*/
91/*============================ IMPLEMENTATION ================================*/
92
93#if VSF_I2C_CFG_REQUEST_TEMPLATE == ENABLED
94vsf_err_t vsf_real_i2c_master_request(vsf_real_i2c_t *i2c_ptr, uint16_t address, vsf_i2c_cmd_t cmd, uint16_t count, uint8_t *buffer_ptr)
95{
96 vsf_real_i2c_t * i2c_type_ptr = (vsf_real_i2c_t *)i2c_ptr;
97 return vsf_i2c_request_master_request(i2c_ptr, &i2c_type_ptr->request, address, cmd, count, buffer_ptr);
98}
99#endif
100
101#if VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
102vsf_i2c_capability_t vsf_real_i2c_capability(vsf_real_i2c_t *i2c_ptr)
103{
104 vsf_i2c_capability_t i2c_capability = {
105 .irq_mask = VSF_I2C_CFG_CAPABILITY_IRQ_MASK,
106 .support_no_start = VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_START,
107 .support_no_stop_restart = VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_STOP_RESTART,
108 .support_restart = VSF_I2C_CFG_CAPABILITY_SUPPORT_RESTART,
109 .max_transfer_size = VSF_I2C_CFG_CAPABILITY_MAX_TRANSFER_SIZE,
110 .min_transfer_size = VSF_I2C_CFG_CAPABILITY_MIN_TRANSFER_SIZE,
111 };
112
113 return i2c_capability;
114}
115#endif
116
117#if VSF_I2C_CFG_REIMPLEMENT_API_CTRL == DISABLED
118vsf_err_t vsf_real_i2c_ctrl(vsf_real_i2c_t *i2c_ptr, vsf_i2c_ctrl_t ctrl, void *param)
119{
120 VSF_HAL_ASSERT(NULL != i2c_ptr);
121 return VSF_ERR_NOT_SUPPORT;
122}
123#endif
124
125#if VSF_I2C_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
126vsf_err_t vsf_real_i2c_get_configuration(vsf_real_i2c_t *i2c_ptr, vsf_i2c_cfg_t *cfg_ptr)
127{
128 VSF_HAL_ASSERT(NULL != i2c_ptr);
129 VSF_HAL_ASSERT(NULL != cfg_ptr);
130
131 // Default implementation: not supported, trigger assertion
133
134 return VSF_ERR_NOT_SUPPORT;
135}
136#endif
137
138#if VSF_I2C_CFG_REIMPLEMENT_API_IRQ_CLEAR == DISABLED
139vsf_i2c_irq_mask_t vsf_real_i2c_irq_clear(vsf_real_i2c_t *i2c_ptr, vsf_i2c_irq_mask_t irq_mask)
140{
141 VSF_HAL_ASSERT(NULL != i2c_ptr);
142
143 // Default implementation: not supported, trigger assertion
145
146 return 0;
147}
148#endif
149
150/*============================ MACROS ========================================*/
151
152#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_CAPABILITY
153#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_CFG
154#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_CMD
155#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_CTRL
156#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_IRQ_MASK
157#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_MODE
158#undef VSF_I2C_CFG_REIMPLEMENT_TYPE_STATUS
159#undef VSF_I2C_CFG_REIMPLEMENT_API_CAPABILITY
160#undef VSF_I2C_CFG_REIMPLEMENT_API_CTRL
161#undef VSF_I2C_CFG_REIMPLEMENT_API_GET_CONFIGURATION
162#undef VSF_I2C_CFG_REIMPLEMENT_API_IRQ_CLEAR
163#undef VSF_I2C_CFG_CAPABILITY_IRQ_MASK
164#undef VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_START
165#undef VSF_I2C_CFG_CAPABILITY_SUPPORT_NO_STOP_RESTART
166#undef VSF_I2C_CFG_CAPABILITY_SUPPORT_RESTART
167#undef VSF_I2C_CFG_CAPABILITY_MAX_TRANSFER_SIZE
168#undef VSF_I2C_CFG_CAPABILITY_MIN_TRANSFER_SIZE
169
170#undef vsf_real_i2c_t
171#undef vsf_real_master_request
172#undef vsf_real_i2c_capability
173#undef vsf_real_i2c_ctrl
174#undef vsf_real_i2c_get_configuration
175#undef vsf_real_i2c_irq_clear
176
177/*============================ MACROS ========================================*/
178
179#ifdef VSF_I2C_CFG_IMP_REMAP_PREFIX
180# define vsf_imp_i2c_t VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_t)
181# define vsf_imp_i2c_init VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_init)
182# define vsf_imp_i2c_fini VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_fini)
183# define vsf_imp_i2c_enable VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_enable)
184# define vsf_imp_i2c_disable VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_disable)
185# define vsf_imp_i2c_irq_enable VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_irq_enable)
186# define vsf_imp_i2c_irq_disable VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_irq_disable)
187# define vsf_imp_i2c_status VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_status)
188# define vsf_imp_i2c_capability VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_capability)
189# define vsf_imp_i2c_master_fifo_transfer VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_master_fifo_transfer)
190# define vsf_imp_i2c_master_request VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_master_request)
191# define vsf_imp_i2c_get_transferred_count VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_get_transferred_count)
192# define vsf_imp_i2c_ctrl VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_ctrl)
193# define vsf_imp_i2c_get_configuration VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_get_configuration)
194# define vsf_imp_i2c_irq_clear VSF_MCONNECT(VSF_I2C_CFG_IMP_PREFIX, _i2c_irq_clear)
195
196# define vsf_remap_i2c_t VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_t)
197# define vsf_remap_i2c_init VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_init)
198# define vsf_remap_i2c_fini VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_fini)
199# define vsf_remap_i2c_enable VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_enable)
200# define vsf_remap_i2c_disable VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_disable)
201# define vsf_remap_i2c_irq_enable VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_irq_enable)
202# define vsf_remap_i2c_irq_disable VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_irq_disable)
203# define vsf_remap_i2c_status VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_status)
204# define vsf_remap_i2c_capability VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_capability)
205# define vsf_remap_i2c_master_fifo_transfer VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_master_fifo_transfer)
206# define vsf_remap_i2c_master_request VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_master_request)
207# define vsf_remap_i2c_get_transferred_count VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_get_transferred_count)
208# define vsf_remap_i2c_ctrl VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_ctrl)
209# define vsf_remap_i2c_get_configuration VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_get_configuration)
210# define vsf_remap_i2c_irq_clear VSF_MCONNECT(VSF_I2C_CFG_IMP_REMAP_PREFIX, _i2c_irq_clear)
211
212# define VSF_I2C_CFG_IMP_REMAP_FUNCTIONS \
213 vsf_err_t vsf_imp_i2c_init(vsf_imp_i2c_t *i2c_ptr, vsf_i2c_cfg_t *cfg_ptr) \
214 { \
215 VSF_HAL_ASSERT(i2c_ptr != NULL); \
216 return vsf_remap_i2c_init(i2c_ptr, cfg_ptr); \
217 } \
218 void vsf_imp_i2c_fini(vsf_imp_i2c_t *i2c_ptr) \
219 { \
220 VSF_HAL_ASSERT(i2c_ptr != NULL); \
221 vsf_remap_i2c_fini(i2c_ptr); \
222 } \
223 fsm_rt_t vsf_imp_i2c_enable(vsf_imp_i2c_t *i2c_ptr) \
224 { \
225 VSF_HAL_ASSERT(i2c_ptr != NULL); \
226 return vsf_remap_i2c_enable(i2c_ptr); \
227 } \
228 fsm_rt_t vsf_imp_i2c_disable(vsf_imp_i2c_t *i2c_ptr) \
229 { \
230 VSF_HAL_ASSERT(i2c_ptr != NULL); \
231 return vsf_remap_i2c_disable(i2c_ptr); \
232 } \
233 void vsf_imp_i2c_irq_enable(vsf_imp_i2c_t *i2c_ptr, vsf_i2c_irq_mask_t irq_mask) \
234 { \
235 VSF_HAL_ASSERT(i2c_ptr != NULL); \
236 vsf_remap_i2c_irq_enable(i2c_ptr, irq_mask); \
237 } \
238 void vsf_imp_i2c_irq_disable(vsf_imp_i2c_t *i2c_ptr, vsf_i2c_irq_mask_t irq_mask) \
239 { \
240 VSF_HAL_ASSERT(i2c_ptr != NULL); \
241 vsf_remap_i2c_irq_disable(i2c_ptr, irq_mask); \
242 } \
243 vsf_i2c_status_t vsf_imp_i2c_status(vsf_imp_i2c_t *i2c_ptr) \
244 { \
245 VSF_HAL_ASSERT(i2c_ptr != NULL); \
246 return vsf_remap_i2c_status(i2c_ptr); \
247 } \
248 vsf_i2c_capability_t vsf_imp_i2c_capability(vsf_imp_i2c_t *i2c_ptr) \
249 { \
250 VSF_HAL_ASSERT(i2c_ptr != NULL); \
251 return vsf_remap_i2c_capability(i2c_ptr); \
252 } \
253 fsm_rt_t vsf_imp_i2c_master_fifo_transfer(vsf_imp_i2c_t *i2c_ptr, \
254 uint16_t address, \
255 vsf_i2c_cmd_t cmd, \
256 uint_fast16_t count, \
257 uint8_t *buffer_ptr, \
258 vsf_i2c_cmd_t *cur_cmd_ptr, \
259 uint_fast16_t *offset_ptr) \
260 { \
261 VSF_HAL_ASSERT(i2c_ptr != NULL); \
262 return vsf_remap_i2c_master_fifo_transfer(i2c_ptr, address, cmd, count, buffer_ptr, \
263 cur_cmd_ptr, offset_ptr); \
264 } \
265 vsf_err_t vsf_imp_i2c_master_request(vsf_imp_i2c_t *i2c_ptr, \
266 uint16_t address, \
267 vsf_imp_i2c_cmd_t cmd, \
268 uint16_t count, \
269 uint8_t *buffer_ptr) \
270 { \
271 VSF_HAL_ASSERT(i2c_ptr != NULL); \
272 return vsf_remap_i2c_master_request(i2c_ptr, address, cmd, count, buffer_ptr); \
273 } \
274 uint_fast32_t vsf_imp_i2c_get_transferred_count(vsf_imp_i2c_t *i2c_ptr) \
275 { \
276 VSF_HAL_ASSERT(i2c_ptr != NULL); \
277 VSF_HAL_ASSERT(vsf_remap_i2c_get_transferred_count!= NULL); \
278 return vsf_remap_i2c_get_transferred_count(i2c_ptr); \
279 } \
280 vsf_err_t vsf_imp_i2c_ctrl(vsf_imp_i2c_t *i2c_ptr, vsf_i2c_ctrl_t ctrl, void *param) \
281 { \
282 VSF_HAL_ASSERT(i2c_ptr != NULL); \
283 return vsf_remap_i2c_ctrl(i2c_ptr, ctrl, param); \
284 } \
285 vsf_err_t vsf_imp_i2c_get_configuration(vsf_imp_i2c_t *i2c_ptr, vsf_i2c_cfg_t *cfg_ptr) \
286 { \
287 VSF_HAL_ASSERT(i2c_ptr != NULL); \
288 return vsf_remap_i2c_get_configuration(i2c_ptr, cfg_ptr); \
289 } \
290 vsf_i2c_irq_mask_t vsf_imp_i2c_irq_clear(vsf_imp_i2c_t *i2c_ptr, vsf_i2c_irq_mask_t irq_mask) \
291 { \
292 VSF_HAL_ASSERT(i2c_ptr != NULL); \
293 return vsf_remap_i2c_irq_clear(i2c_ptr, irq_mask); \
294 }
295#endif
296
297/*============================ GLOBAL VARIABLES ==============================*/
298
299#define VSF_HAL_TEMPLATE_IMP_NAME _i2c
300#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _I2C
301
302#if !defined(VSF_I2C_CFG_IMP_PREFIX) && !defined(VSF_I2C_CFG_IMP_DEVICE_PREFIX)
303# error "Please define VSF_I2C_CFG_IMP_PREFIX in i2c driver"
304#endif
305
306#if !defined(VSF_I2C_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_I2C_CFG_IMP_DEVICE_UPCASE_PREFIX)
307# error "Please define VSF_I2C_CFG_IMP_UPCASE_PREFIX in i2c driver"
308#endif
309
310#ifndef VSF_I2C_CFG_IMP_COUNT_MASK_PREFIX
311# define VSF_I2C_CFG_IMP_COUNT_MASK_PREFIX VSF_I2C_CFG_IMP_UPCASE_PREFIX
312#endif
313
314#ifdef VSF_I2C_CFG_IMP_REMAP_FUNCTIONS
315# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_I2C_CFG_IMP_REMAP_FUNCTIONS
316#endif
317
319
320#undef VSF_I2C_CFG_IMP_PREFIX
321#undef VSF_I2C_CFG_IMP_COUNT_MASK_PREFIX
322#undef VSF_I2C_CFG_IMP_UPCASE_PREFIX
323#undef VSF_I2C_CFG_IMP_DEVICE_PREFIX
324#undef VSF_I2C_CFG_IMP_DEVICE_UPCASE_PREFIX
325#undef VSF_I2C_CFG_IMP_LV0
326#undef VSF_I2C_CFG_IMP_REMAP_FUNCTIONS
327#undef VSF_I2C_CFG_IMP_HAS_OP
328#undef VSF_I2C_CFG_IMP_EXTERN_OP
329#undef VSF_I2C_CFG_IMP_RENAME_DEVICE_PREFIX
330
331#undef vsf_imp_i2c_t
332#undef vsf_imp_i2c_init
333#undef vsf_imp_i2c_fini
334#undef vsf_imp_i2c_enable
335#undef vsf_imp_i2c_disable
336#undef vsf_imp_i2c_irq_enable
337#undef vsf_imp_i2c_irq_disable
338#undef vsf_imp_i2c_status
339#undef vsf_imp_i2c_capability
340#undef vsf_imp_i2c_master_request
341#undef vsf_imp_i2c_get_transferred_count
342#undef vsf_imp_i2c_ctrl
343#undef vsf_imp_i2c_get_configuration
344#undef vsf_imp_i2c_irq_clear
345
346#undef vsf_remap_i2c_t
347#undef vsf_remap_i2c_init
348#undef vsf_remap_i2c_fini
349#undef vsf_remap_i2c_enable
350#undef vsf_remap_i2c_disable
351#undef vsf_remap_i2c_irq_enable
352#undef vsf_remap_i2c_irq_disable
353#undef vsf_remap_i2c_status
354#undef vsf_remap_i2c_capability
355#undef vsf_remap_i2c_master_request
356#undef vsf_remap_i2c_get_transferred_count
357#undef vsf_remap_i2c_ctrl
358#undef vsf_remap_i2c_get_configuration
359#undef vsf_remap_i2c_irq_clear
360
361#undef VSF_HAL_TEMPLATE_IMP_NAME
362#undef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
363
364/*============================ STATIC ASSERTIONS ==============================*/
365
366/* User-extensible macros for custom mode and IRQ mask values
367 * Users can define these macros before including this template to append
368 * their custom enum values to the uniqueness checks.
369 *
370 * Check modes for custom values:
371 * VSF_I2C_CFG_MODE_CHECK_UNIQUE - Check mode for custom mode values
372 * Default: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
373 * Can be set to: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
374 * VSF_I2C_CFG_IRQ_MASK_CHECK_UNIQUE - Check mode for custom IRQ mask values
375 * Default: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
376 * Can be set to: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
377 *
378 * Example usage in vendor driver:
379 * #define VSF_I2C_CUSTOM_MODE_VALUES MY_CUSTOM_MODE1, MY_CUSTOM_MODE2
380 * #define VSF_I2C_CFG_MODE_CHECK_UNIQUE VSF_HAL_CHECK_MODE_LOOSE
381 * #define VSF_I2C_CUSTOM_IRQ_MASK_VALUES MY_CUSTOM_IRQ1, MY_CUSTOM_IRQ2
382 * #define VSF_I2C_CFG_IRQ_MASK_CHECK_UNIQUE VSF_HAL_CHECK_MODE_STRICT
383 * #include "hal/driver/common/i2c/i2c_template.inc"
384 */
385
386
387#ifdef VSF_I2C_CFG_MODE_CHECK_UNIQUE
388/* Default mode lists - can be redefined by users before including this file */
389#ifndef VSF_I2C_CHECK_UNIQUE_MODE_MODES
390# define VSF_I2C_CHECK_UNIQUE_MODE_MODES \
391 VSF_I2C_MODE_MASTER, \
392 VSF_I2C_MODE_SLAVE
393#endif
394
395#ifndef VSF_I2C_CHECK_UNIQUE_SPEED_MODES
396# define VSF_I2C_CHECK_UNIQUE_SPEED_MODES \
397 VSF_I2C_SPEED_STANDARD_MODE, \
398 VSF_I2C_SPEED_FAST_MODE, \
399 VSF_I2C_SPEED_FAST_MODE_PLUS, \
400 VSF_I2C_SPEED_HIGH_SPEED_MODE
401#endif
402
403#ifndef VSF_I2C_CHECK_UNIQUE_ADDR_MODES
404# define VSF_I2C_CHECK_UNIQUE_ADDR_MODES \
405 VSF_I2C_ADDR_7_BITS, \
406 VSF_I2C_ADDR_10_BITS
407#endif
408
409/* ==================== GROUP INTERNAL UNIQUENESS CHECKS ==================== */
410/* Check uniqueness within each functional group */
411
412/* Check mode uniqueness - all mode modes should have different values
413 * Mandatory: VSF_I2C_MODE_MASTER, VSF_I2C_MODE_SLAVE
414 */
419);
420
421/* Check speed mode uniqueness - all speed modes should have different values
422 * Mandatory: VSF_I2C_SPEED_STANDARD_MODE, VSF_I2C_SPEED_FAST_MODE,
423 * VSF_I2C_SPEED_FAST_MODE_PLUS, VSF_I2C_SPEED_HIGH_SPEED_MODE
424 */
431);
432
433/* Check address mode uniqueness - all address modes should have different values
434 * Mandatory: VSF_I2C_ADDR_7_BITS, VSF_I2C_ADDR_10_BITS
435 */
440);
441
442#ifdef VSF_I2C_CUSTOM_MODE_VALUES
443/* Check uniqueness among custom mode values using user-specified check mode */
445#endif
446
449 /* Mandatory modes - always included */
454 /* User-defined modes - appended by user configuration */
455#ifdef VSF_I2C_CUSTOM_MODE_VALUES
456 , VSF_I2C_CUSTOM_MODE_VALUES
457#endif
458);
459
460#undef VSF_I2C_CHECK_UNIQUE_MODE_MODES
461#undef VSF_I2C_CHECK_UNIQUE_SPEED_MODES
462#undef VSF_I2C_CHECK_UNIQUE_ADDR_MODES
463#endif /* VSF_I2C_CFG_MODE_CHECK_UNIQUE */
464
465/* ==================== CMD UNIQUENESS CHECKS ==================== */
466
467#ifdef VSF_I2C_CFG_CMD_CHECK_UNIQUE
468/* Default cmd lists - can be redefined by users before including this file */
469#ifndef VSF_I2C_CHECK_UNIQUE_CMD_RW_MODES
470# define VSF_I2C_CHECK_UNIQUE_CMD_RW_MODES \
471 VSF_I2C_CMD_WRITE, \
472 VSF_I2C_CMD_READ
473#endif
474
475#ifndef VSF_I2C_CHECK_UNIQUE_CMD_START_STOP_RESTART_MODES
476# define VSF_I2C_CHECK_UNIQUE_CMD_START_STOP_RESTART_MODES \
477 VSF_I2C_CMD_START, \
478 VSF_I2C_CMD_STOP, \
479 VSF_I2C_CMD_RESTART
480#endif
481
482#ifndef VSF_I2C_CHECK_UNIQUE_CMD_ADDR_MODES
483# define VSF_I2C_CHECK_UNIQUE_CMD_ADDR_MODES \
484 VSF_I2C_CMD_7_BITS, \
485 VSF_I2C_CMD_10_BITS
486#endif
487
488/* ==================== GROUP INTERNAL UNIQUENESS CHECKS ==================== */
489/* Check uniqueness within each functional group */
490
491/* Check read/write command uniqueness - all read/write commands should have different values
492 * Mandatory: VSF_I2C_CMD_WRITE, VSF_I2C_CMD_READ
493 */
494VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_I2C_CFG_CMD_CHECK_UNIQUE, VSF_I2C_CHECK_UNIQUE_CMD_RW_MODES);
495
496/* Check start/stop/restart command uniqueness - all start/stop/restart commands should have different values
497 * Mandatory: VSF_I2C_CMD_START, VSF_I2C_CMD_STOP, VSF_I2C_CMD_RESTART
498 * Optional: VSF_I2C_CMD_NO_START, VSF_I2C_CMD_NO_STOP, VSF_I2C_CMD_NO_RESTART
499 */
501 VSF_I2C_CFG_CMD_CHECK_UNIQUE,
502 VSF_I2C_CHECK_UNIQUE_CMD_START_STOP_RESTART_MODES
505#endif
508#endif
511#endif
512);
513
514/* Check address mode command uniqueness - all address mode commands should have different values
515 * Mandatory: VSF_I2C_CMD_7_BITS, VSF_I2C_CMD_10_BITS
516 */
517VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_I2C_CFG_CMD_CHECK_UNIQUE, VSF_I2C_CHECK_UNIQUE_CMD_ADDR_MODES);
518
519#ifdef VSF_I2C_CUSTOM_CMD_VALUES
520/* Check uniqueness among custom cmd values using user-specified check mode */
521VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_I2C_CFG_CMD_CHECK_UNIQUE, VSF_I2C_CUSTOM_CMD_VALUES);
522#endif
523
525 VSF_I2C_CFG_CMD_CHECK_UNIQUE,
526 /* Mandatory commands - always included */
530 /* Optional commands - conditionally included */
533#endif
536#endif
539#endif
540 /* User-defined commands - appended by user configuration */
541#ifdef VSF_I2C_CUSTOM_CMD_VALUES
542 , VSF_I2C_CUSTOM_CMD_VALUES
543#endif
544);
545
546#undef VSF_I2C_CHECK_UNIQUE_CMD_RW_MODES
547#undef VSF_I2C_CHECK_UNIQUE_CMD_START_STOP_RESTART_MODES
548#undef VSF_I2C_CHECK_UNIQUE_CMD_ADDR_MODES
549#endif /* VSF_I2C_CFG_CMD_CHECK_UNIQUE */
550
551/* ==================== IRQ MASK UNIQUENESS CHECKS ==================== */
552
553#ifdef VSF_I2C_CFG_IRQ_MASK_CHECK_UNIQUE
554
555#ifdef VSF_I2C_CUSTOM_IRQ_MASK_VALUES
556/* Check uniqueness among custom IRQ mask values using user-specified check mode */
558#endif
559
560/* Check uniqueness within vsf_i2c_irq_mask_t enum */
561
562/* Check IRQ mask uniqueness - all IRQ mask bits should have different values
563 * Mandatory: VSF_I2C_IRQ_MASK_MASTER_TX, VSF_I2C_IRQ_MASK_MASTER_RX,
564 * VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE, VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST,
565 * VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK, VSF_I2C_IRQ_MASK_MASTER_TX_NACK_DETECT,
566 * VSF_I2C_IRQ_MASK_MASTER_START_OR_RESTART_DETECT,
567 * VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT, VSF_I2C_IRQ_MASK_SLAVE_START_OR_RESTART_DETECT,
568 * VSF_I2C_IRQ_MASK_SLAVE_STOP_DETECT, VSF_I2C_IRQ_MASK_SLAVE_TX,
569 * VSF_I2C_IRQ_MASK_SLAVE_RX, VSF_I2C_IRQ_MASK_SLAVE_TRANSFER_COMPLETE,
570 * VSF_I2C_IRQ_MASK_SLAVE_RX_OVERFLOW_ERR
571 * Note: VSF_I2C_IRQ_MASK_MASTER_ERR and VSF_I2C_IRQ_MASK_SLAVE_ERR are combined error masks
572 * (OR of other error masks) and should not be included in uniqueness checks
573 */
576 /* Mandatory IRQ masks - always included */
583 /* Note: VSF_I2C_IRQ_MASK_MASTER_ERR is excluded - it's a combined mask (OR of above error masks) */
591 /* Note: VSF_I2C_IRQ_MASK_SLAVE_ERR is excluded - it's a combined mask (OR of above error mask) */
592 /* Implementation Required IRQ masks - conditionally included */
593 /* User-defined IRQ masks - appended by user configuration */
594#ifdef VSF_I2C_CUSTOM_IRQ_MASK_VALUES
595 , VSF_I2C_CUSTOM_IRQ_MASK_VALUES
596#endif
597);
598#endif /* VSF_I2C_CFG_IRQ_MASK_CHECK_UNIQUE */
599
600/* ==================== CTRL UNIQUENESS CHECKS ==================== */
601
602#ifdef VSF_I2C_CFG_CTRL_CHECK_UNIQUE
603
604#ifdef VSF_I2C_CUSTOM_CTRL_VALUES
605/* Check uniqueness among custom ctrl values using user-specified check mode */
606VSF_HAL_CHECK_UNIQUE_CUSTOM(VSF_I2C_CFG_CTRL_CHECK_UNIQUE, VSF_I2C_CUSTOM_CTRL_VALUES);
607#endif
608
609/* Check ctrl uniqueness - all ctrl values should have different values
610 * Placeholder: __VSF_I2C_CTRL_DUMMP
611 */
613 VSF_I2C_CFG_CTRL_CHECK_UNIQUE,
614 /* Placeholder ctrl - always included */
616 /* User-defined ctrls - appended by user configuration */
617#ifdef VSF_I2C_CUSTOM_CTRL_VALUES
618 , VSF_I2C_CUSTOM_CTRL_VALUES
619#endif
620);
621#endif /* VSF_I2C_CFG_CTRL_CHECK_UNIQUE */
622
623#undef VSF_I2C_CFG_MODE_CHECK_UNIQUE
624#undef VSF_I2C_CFG_CMD_CHECK_UNIQUE
625#undef VSF_I2C_CFG_IRQ_MASK_CHECK_UNIQUE
626#undef VSF_I2C_CFG_CTRL_CHECK_UNIQUE
627#undef VSF_I2C_CUSTOM_MODE_VALUES
628#undef VSF_I2C_CUSTOM_CMD_VALUES
629#undef VSF_I2C_CUSTOM_IRQ_MASK_VALUES
630#undef VSF_I2C_CUSTOM_CTRL_VALUES
631
632#endif /* VSF_HAL_USE_I2C */
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
#define VSF_I2C_CFG_CAPABILITY_MAX_TRANSFER_SIZE
Definition i2c.c:40
vsf_i2c_cmd_t
Definition i2c.h:32
@ VSF_I2C_CMD_NO_STOP
Definition i2c.h:51
@ VSF_I2C_CMD_NO_RESTART
Definition i2c.h:40
@ VSF_I2C_CMD_10_BITS
Definition i2c.h:43
@ VSF_I2C_CMD_7_BITS
Definition i2c.h:42
@ VSF_I2C_CMD_NO_START
Definition i2c.h:37
@ VSF_I2C_CMD_STOP
Definition i2c.h:50
@ VSF_I2C_CMD_RESTART
Definition i2c.h:39
@ VSF_I2C_CMD_WRITE
Definition i2c.h:33
@ VSF_I2C_CMD_READ
Definition i2c.h:34
@ VSF_I2C_CMD_START
Definition i2c.h:36
vsf_i2c_irq_mask_t
Definition i2c.h:103
@ VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT
Definition i2c.h:119
@ VSF_I2C_IRQ_MASK_SLAVE_TX
Definition i2c.h:127
@ VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE
Definition i2c.h:109
@ VSF_I2C_IRQ_MASK_SLAVE_START_OR_RESTART_DETECT
Definition i2c.h:122
@ VSF_I2C_IRQ_MASK_MASTER_TX
Definition i2c.h:105
@ VSF_I2C_IRQ_MASK_MASTER_RX
Definition i2c.h:107
@ VSF_I2C_IRQ_MASK_SLAVE_TRANSFER_COMPLETE
Definition i2c.h:130
@ VSF_I2C_IRQ_MASK_MASTER_START_OR_RESTART_DETECT
Definition i2c.h:118
@ VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK
Definition i2c.h:113
@ VSF_I2C_IRQ_MASK_SLAVE_STOP_DETECT
Definition i2c.h:124
@ VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST
Definition i2c.h:111
@ VSF_I2C_IRQ_MASK_MASTER_TX_NACK_DETECT
Definition i2c.h:115
@ VSF_I2C_IRQ_MASK_SLAVE_RX
Definition i2c.h:128
vsf_err_t vsf_i2c_request_master_request(vsf_i2c_t *i2c_ptr, vsf_i2c_request_t *i2c_request_ptr, uint16_t address, vsf_i2c_cmd_t cmd, uint16_t count, uint8_t *buffer_ptr)
Definition i2c_request.c:87
#define NULL
Definition lvgl.h:26
const i_spi_t vsf_spi_irq_mask_t irq_mask
Definition spi_interface.h:38
unsigned short uint16_t
Definition stdint.h:7
unsigned char uint8_t
Definition stdint.h:5
Predefined I2C capability structure that can be reimplemented in specific HAL drivers.
Definition vsf_template_i2c.h:857
uint8_t support_no_start
Definition vsf_template_i2c.h:867
I2C configuration.
Definition vsf_template_i2c.h:961
#define VSF_I2C_CFG_MODE_CHECK_UNIQUE
Definition i2c.c:288
#define VSF_I2C_CFG_IRQ_MASK_CHECK_UNIQUE
Definition i2c.c:289
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
@ VSF_I2C_MODE_MASTER
Select master mode for I2C operation. The device initiates and controls the I2C bus communication.
Definition vsf_template_i2c.h:261
@ VSF_I2C_SPEED_HIGH_SPEED_MODE
High speed mode, up to 3.4 Mbit/s. Highest specified I2C speed for performance-critical applications.
Definition vsf_template_i2c.h:311
@ VSF_I2C_MODE_SLAVE
Select slave mode for I2C operation. The device responds to I2C bus commands from master devices.
Definition vsf_template_i2c.h:271
@ VSF_I2C_SPEED_STANDARD_MODE
Standard mode, up to 100 kbit/s. The lowest I2C speed specification, compatible with most devices.
Definition vsf_template_i2c.h:281
@ VSF_I2C_ADDR_7_BITS
7-bit address mode. Standard addressing mode supporting up to 128 unique devices.
Definition vsf_template_i2c.h:321
@ VSF_I2C_SPEED_FAST_MODE_PLUS
Fast mode plus, up to 1 Mbit/s. Enhanced fast mode for higher throughput applications.
Definition vsf_template_i2c.h:301
@ VSF_I2C_SPEED_FAST_MODE
Fast mode, up to 400 kbit/s. Commonly used medium speed I2C mode.
Definition vsf_template_i2c.h:291
@ VSF_I2C_ADDR_10_BITS
10-bit address mode. Extended addressing mode supporting up to 1024 unique devices.
Definition vsf_template_i2c.h:331
vsf_i2c_ctrl_t
I2C control commands for hardware-specific operations.
Definition vsf_template_i2c.h:989
@ __VSF_I2C_CTRL_DUMMP
Definition vsf_template_i2c.h:1028
#define VSF_HAL_CHECK_UNIQUE_CUSTOM(__CHECK_FUNC,...)
Definition vsf_template_static_assert_unique.h:2426
Generated from commit: vsfteam/vsf@b2e9e8a