VSF Documented
vsf_template_i2c.h
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#ifndef __VSF_TEMPLATE_I2C_H__
19#define __VSF_TEMPLATE_I2C_H__
20
21/*============================ INCLUDES ======================================*/
22
24#include "hal/arch/vsf_arch.h"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/*============================ MACROS ========================================*/
31
32// multi-class support enabled by default for maximum availability.
33#ifndef VSF_I2C_CFG_MULTI_CLASS
34# define VSF_I2C_CFG_MULTI_CLASS ENABLED
35#endif
36
37#if defined(VSF_HW_I2C_COUNT) && !defined(VSF_HW_I2C_MASK)
38# define VSF_HW_I2C_MASK VSF_HAL_COUNT_TO_MASK(VSF_HW_I2C_COUNT)
39#endif
40
41#if defined(VSF_HW_I2C_MASK) && !defined(VSF_HW_I2C_COUNT)
42# define VSF_HW_I2C_COUNT VSF_HAL_MASK_TO_COUNT(VSF_HW_I2C_MASK)
43#endif
44
45// application code can redefine it
46#ifndef VSF_I2C_CFG_PREFIX
47# if VSF_I2C_CFG_MULTI_CLASS == ENABLED
48# define VSF_I2C_CFG_PREFIX vsf
49# elif defined(VSF_HW_I2C_COUNT) && (VSF_HW_I2C_COUNT != 0)
50# define VSF_I2C_CFG_PREFIX vsf_hw
51# else
52# define VSF_I2C_CFG_PREFIX vsf
53# endif
54#endif
55
56#ifndef VSF_I2C_CFG_FUNCTION_RENAME
57# define VSF_I2C_CFG_FUNCTION_RENAME ENABLED
58#endif
59
60#ifndef VSF_I2C_CFG_REQUEST_TEMPLATE
61# define VSF_I2C_CFG_REQUEST_TEMPLATE DISABLED
62#endif
63
64#ifndef VSF_I2C_CFG_REIMPLEMENT_TYPE_MODE
65# define VSF_I2C_CFG_REIMPLEMENT_TYPE_MODE DISABLED
66#endif
67
68#ifndef VSF_I2C_CFG_REIMPLEMENT_TYPE_CMD
69# define VSF_I2C_CFG_REIMPLEMENT_TYPE_CMD DISABLED
70#endif
71
72#ifndef VSF_I2C_CFG_REIMPLEMENT_TYPE_IRQ_MASK
73# define VSF_I2C_CFG_REIMPLEMENT_TYPE_IRQ_MASK DISABLED
74#endif
75
76#ifndef VSF_I2C_CFG_REIMPLEMENT_TYPE_STATUS
77# define VSF_I2C_CFG_REIMPLEMENT_TYPE_STATUS DISABLED
78#endif
79
83#if VSF_I2C_CFG_REIMPLEMENT_TYPE_CFG == DISABLED
84# define VSF_I2C_CFG_REIMPLEMENT_TYPE_CFG DISABLED
85#endif
86
90#if VSF_I2C_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
91# define VSF_I2C_CFG_REIMPLEMENT_TYPE_CAPABILITY DISABLED
92#endif
93
94
95#ifndef VSF_I2C_CFG_INHERT_HAL_CAPABILITY
96# define VSF_I2C_CFG_INHERT_HAL_CAPABILITY ENABLED
97#endif
98
99/*============================ MACROFIED FUNCTIONS ===========================*/
100
101#define VSF_I2C_APIS(__PREFIX_NAME) \
102 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, vsf_err_t, i2c, init, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr, vsf_i2c_cfg_t *cfg_ptr) \
103 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, void, i2c, fini, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr) \
104 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, fsm_rt_t, i2c, enable, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr) \
105 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, fsm_rt_t, i2c, disable, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr) \
106 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, void, i2c, irq_enable, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr, vsf_i2c_irq_mask_t irq_mask) \
107 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, void, i2c, irq_disable, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr, vsf_i2c_irq_mask_t irq_mask) \
108 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, vsf_i2c_status_t, i2c, status, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr) \
109 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, vsf_i2c_capability_t, i2c, capability, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr) \
110 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, uint_fast32_t, i2c, get_transferred_count, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr) \
111 __VSF_HAL_TEMPLATE_API(__PREFIX_NAME, vsf_err_t, i2c, master_request, VSF_MCONNECT(__PREFIX_NAME, _i2c_t) *i2c_ptr, uint16_t address, vsf_i2c_cmd_t cmd, uint16_t count, uint8_t* buffer_ptr)
112
113/*============================ TYPES =========================================*/
114
115#if VSF_I2C_CFG_REIMPLEMENT_TYPE_MODE == DISABLED
116typedef enum vsf_i2c_mode_t {
117 VSF_I2C_MODE_MASTER = (0x1ul << 28), // select master mode
118 VSF_I2C_MODE_SLAVE = (0x0ul << 28), // select slave mode
119
120 // TODO: Ultra Fast-mode I2C-bus protocol
121 VSF_I2C_SPEED_STANDARD_MODE = (0x0ul << 29), // up to 100 kbit/s
122 VSF_I2C_SPEED_FAST_MODE = (0x1ul << 29), // up to 400 kbit/s
123 VSF_I2C_SPEED_FAST_MODE_PLUS = (0x2ul << 29), // up to 1 Mbit/s
124 VSF_I2C_SPEED_HIGH_SPEED_MODE = (0x3ul << 29), // up to 3.4 Mbit/s
125
126 VSF_I2C_ADDR_7_BITS = (0x0ul << 31),
127 VSF_I2C_ADDR_10_BITS = (0x1ul << 31),
129#endif
130
131enum {
135
141
145
150};
151
152#if VSF_I2C_CFG_REIMPLEMENT_TYPE_CMD == DISABLED
153typedef enum vsf_i2c_cmd_t {
154 VSF_I2C_CMD_WRITE = (0x00ul << 0),
155 VSF_I2C_CMD_READ = (0x01ul << 0),
156
157 VSF_I2C_CMD_START = (0x00ul << 28),
158 VSF_I2C_CMD_NO_START = (0x01ul << 28),
159
160 VSF_I2C_CMD_STOP = (0x00ul << 29),
161 VSF_I2C_CMD_RESTART = (0x01ul << 30),
163
164 VSF_I2C_CMD_7_BITS = (0x00ul << 31),
165 VSF_I2C_CMD_10_BITS = (0x01ul << 31),
167#endif
168
169enum {
172
176
179
184
191};
192
193#if VSF_I2C_CFG_REIMPLEMENT_TYPE_IRQ_MASK == DISABLED
194typedef enum vsf_i2c_irq_mask_t {
197 VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT = (0x1ul << 2), // for multi master
202
206#endif
207
208enum {
219};
220
221#if VSF_I2C_CFG_REIMPLEMENT_TYPE_STATUS == DISABLED
222typedef struct vsf_i2c_status_t {
223 union {
226 };
228#endif
229
230#if VSF_I2C_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
231typedef struct vsf_i2c_capability_t {
232#if VSF_I2C_CFG_INHERT_HAL_CAPABILITY == ENABLED
234#endif
236
237 // If manual control of the start/stop signal is not supported,
238 // then every transmission will generate a start/stop
242
243 // maximum transfer size
244 // specifically, 0 is not a legal value
246 // 0, there is no data, just send start condition
249#endif
250
251#if VSF_I2C_CFG_REIMPLEMENT_TYPE_CFG == DISABLED
252typedef struct vsf_i2c_t vsf_i2c_t;
253
287typedef void vsf_i2c_isr_handler_t(void *target_ptr,
288 vsf_i2c_t *i2c_ptr,
290
298typedef struct vsf_i2c_isr_t {
306
314typedef struct vsf_i2c_cfg_t {
324#endif
325
326typedef struct vsf_i2c_op_t {
327#undef __VSF_HAL_TEMPLATE_API
328#define __VSF_HAL_TEMPLATE_API VSF_HAL_TEMPLATE_API_FP
329
330 VSF_I2C_APIS(vsf)
332
333#if VSF_I2C_CFG_MULTI_CLASS == ENABLED
334struct vsf_i2c_t {
336};
337#endif
338
339/*============================ GLOBAL VARIABLES ==============================*/
340/*============================ PROTOTYPES ====================================*/
341
361extern vsf_err_t vsf_i2c_init(vsf_i2c_t *i2c_ptr, vsf_i2c_cfg_t *cfg_ptr);
362
374extern void vsf_i2c_fini(vsf_i2c_t *i2c_ptr);
375
392extern fsm_rt_t vsf_i2c_enable(vsf_i2c_t *i2c_ptr);
393
409extern fsm_rt_t vsf_i2c_disable(vsf_i2c_t *i2c_ptr);
410
427
442
455
468
491 uint16_t address,
492 vsf_i2c_cmd_t cmd,
493 uint16_t count,
494 uint8_t *buffer_ptr);
495
510
511/*============================ INCLUDES ======================================*/
512
514
515/*============================ MACROFIED FUNCTIONS ===========================*/
516
517#if VSF_I2C_CFG_FUNCTION_RENAME == ENABLED
518# define __vsf_i2c_t VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_t)
519# define vsf_i2c_init(__I2C, ...) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_init) ((__vsf_i2c_t *)(__I2C), ##__VA_ARGS__)
520# define vsf_i2c_fini(__I2C) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_fini) ((__vsf_i2c_t *)(__I2C))
521# define vsf_i2c_enable(__I2C) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_enable) ((__vsf_i2c_t *)(__I2C))
522# define vsf_i2c_disable(__I2C) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_disable) ((__vsf_i2c_t *)(__I2C))
523# define vsf_i2c_irq_enable(__I2C, ...) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_irq_enable) ((__vsf_i2c_t *)(__I2C), ##__VA_ARGS__)
524# define vsf_i2c_irq_disable(__I2C, ...) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_irq_disable) ((__vsf_i2c_t *)(__I2C), ##__VA_ARGS__)
525# define vsf_i2c_status(__I2C) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_status) ((__vsf_i2c_t *)(__I2C))
526# define vsf_i2c_capability(__I2C) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_capability) ((__vsf_i2c_t *)(__I2C))
527# define vsf_i2c_master_request(__I2C, ...) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_master_request) ((__vsf_i2c_t *)(__I2C), ##__VA_ARGS__)
528# define vsf_i2c_get_transferred_count(__I2C, ...) VSF_MCONNECT(VSF_I2C_CFG_PREFIX, _i2c_get_transferred_count) ((__vsf_i2c_t *)(__I2C), ##__VA_ARGS__)
529#endif
530
531#ifdef __cplusplus
532}
533#endif
534
535#endif /*__VSF_TEMPLATE_I2C_H__*/
vsf_err_t
Definition __type.h:42
vsf_arch_prio_t
Definition cortex_a_generic.h:88
vsf_i2c_cmd_t
Definition i2c.h:32
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 uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_template_i2c.h:231
uint8_t support_restart
Definition vsf_template_i2c.h:241
uint16_t min_transfer_size
Definition vsf_template_i2c.h:247
uint8_t support_no_stop_restart
Definition vsf_template_i2c.h:240
inherit(vsf_peripheral_capability_t) vsf_i2c_irq_mask_t irq_mask
uint16_t max_transfer_size
Definition vsf_template_i2c.h:245
uint8_t support_no_start
Definition vsf_template_i2c.h:239
i2c configuration
Definition vsf_template_i2c.h:314
uint16_t slave_addr
Definition vsf_template_i2c.h:321
vsf_i2c_mode_t mode
Definition vsf_template_i2c.h:315
vsf_i2c_isr_t isr
Definition vsf_template_i2c.h:319
uint32_t clock_hz
Definition vsf_template_i2c.h:317
i2c interrupt configuration
Definition vsf_template_i2c.h:298
vsf_i2c_isr_handler_t * handler_fn
Definition vsf_template_i2c.h:299
void * target_ptr
Definition vsf_template_i2c.h:301
vsf_arch_prio_t prio
Definition vsf_template_i2c.h:303
Definition vsf_template_i2c.h:326
Definition vsf_template_i2c.h:222
Definition vsf_template_i2c.h:334
const vsf_i2c_op_t * op
Definition vsf_template_i2c.h:335
Definition vsf_template_hal_driver.h:203
Definition vsf_template_hal_driver.h:196
vk_av_control_value_t value
Definition vsf_audio.h:171
fsm_rt_t
Definition vsf_fsm.h:315
#define vsf_i2c_fini(__I2C)
Definition vsf_template_i2c.h:520
#define vsf_i2c_master_request(__I2C,...)
Definition vsf_template_i2c.h:527
#define vsf_i2c_disable(__I2C)
Definition vsf_template_i2c.h:522
struct vsf_i2c_status_t vsf_i2c_status_t
#define vsf_i2c_irq_enable(__I2C,...)
Definition vsf_template_i2c.h:523
#define vsf_i2c_status(__I2C)
Definition vsf_template_i2c.h:525
vsf_i2c_mode_t
Definition vsf_template_i2c.h:116
@ VSF_I2C_MODE_MASTER
Definition vsf_template_i2c.h:117
@ VSF_I2C_SPEED_HIGH_SPEED_MODE
Definition vsf_template_i2c.h:124
@ VSF_I2C_MODE_SLAVE
Definition vsf_template_i2c.h:118
@ VSF_I2C_SPEED_STANDARD_MODE
Definition vsf_template_i2c.h:121
@ VSF_I2C_ADDR_7_BITS
Definition vsf_template_i2c.h:126
@ VSF_I2C_SPEED_FAST_MODE_PLUS
Definition vsf_template_i2c.h:123
@ VSF_I2C_SPEED_FAST_MODE
Definition vsf_template_i2c.h:122
@ VSF_I2C_ADDR_10_BITS
Definition vsf_template_i2c.h:127
#define vsf_i2c_irq_disable(__I2C,...)
Definition vsf_template_i2c.h:524
@ VSF_I2C_CMD_STOP_RESTART_MASK
Definition vsf_template_i2c.h:181
@ VSF_I2C_CMD_RW_MASK
Definition vsf_template_i2c.h:171
@ VSF_I2C_CMD_RW_COUNT
Definition vsf_template_i2c.h:170
@ VSF_I2C_CMD_STOP_RESTART_COUNT
Definition vsf_template_i2c.h:180
@ VSF_I2C_CMD_START_COUNT
Definition vsf_template_i2c.h:177
@ VSF_I2C_CMD_BITS_COUNT
Definition vsf_template_i2c.h:173
@ VSF_I2C_CMD_START_MASK
Definition vsf_template_i2c.h:178
@ VSF_I2C_CMD_BITS_MASK
Definition vsf_template_i2c.h:174
@ VSF_I2C_CMD_ALL_BITS_MASK
Definition vsf_template_i2c.h:186
@ VSF_I2C_CMD_MASK_COUNT
Definition vsf_template_i2c.h:185
@ VSF_I2C_IRQ_ALL_BITS_MASK
Definition vsf_template_i2c.h:210
@ VSF_I2C_IRQ_COUNT
Definition vsf_template_i2c.h:209
#define vsf_i2c_init(__I2C,...)
Definition vsf_template_i2c.h:519
@ VSF_I2C_MODE_MASK
Definition vsf_template_i2c.h:133
@ VSF_I2C_ADDR_MASK
Definition vsf_template_i2c.h:143
@ VSF_I2C_MODE_ALL_BITS_MASK
Definition vsf_template_i2c.h:147
@ VSF_I2C_ADDR_COUNT
Definition vsf_template_i2c.h:142
@ VSF_I2C_SPEED_MASK
Definition vsf_template_i2c.h:137
@ VSF_I2C_SPEED_COUNT
Definition vsf_template_i2c.h:136
@ VSF_I2C_MODE_MASK_COUNT
Definition vsf_template_i2c.h:146
@ VSF_I2C_MODE_COUNT
Definition vsf_template_i2c.h:132
vsf_i2c_cmd_t
Definition vsf_template_i2c.h:153
@ VSF_I2C_CMD_10_BITS
Definition vsf_template_i2c.h:165
@ VSF_I2C_CMD_7_BITS
Definition vsf_template_i2c.h:164
@ VSF_I2C_CMD_NO_START
Definition vsf_template_i2c.h:158
@ VSF_I2C_CMD_STOP
Definition vsf_template_i2c.h:160
@ VSF_I2C_CMD_NO_STOP_RESTART
Definition vsf_template_i2c.h:162
@ VSF_I2C_CMD_RESTART
Definition vsf_template_i2c.h:161
@ VSF_I2C_CMD_WRITE
Definition vsf_template_i2c.h:154
@ VSF_I2C_CMD_READ
Definition vsf_template_i2c.h:155
@ VSF_I2C_CMD_START
Definition vsf_template_i2c.h:157
#define vsf_i2c_enable(__I2C)
Definition vsf_template_i2c.h:521
vsf_i2c_irq_mask_t
Definition vsf_template_i2c.h:194
@ VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT
Definition vsf_template_i2c.h:197
@ VSF_I2C_IRQ_MASK_MASTER_ERROR
Definition vsf_template_i2c.h:201
@ VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE
Definition vsf_template_i2c.h:203
@ VSF_I2C_IRQ_MASK_MASTER_TX_EMPTY
Definition vsf_template_i2c.h:200
@ VSF_I2C_IRQ_MASK_MASTER_NACK_DETECT
Definition vsf_template_i2c.h:198
@ VSF_I2C_IRQ_MASK_MASTER_STOPPED
Definition vsf_template_i2c.h:196
@ VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK
Definition vsf_template_i2c.h:204
@ VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST
Definition vsf_template_i2c.h:199
@ VSF_I2C_IRQ_MASK_MASTER_STARTED
Definition vsf_template_i2c.h:195
#define vsf_i2c_get_transferred_count(__I2C,...)
Definition vsf_template_i2c.h:528
void vsf_i2c_isr_handler_t(void *target_ptr, vsf_i2c_t *i2c_ptr, vsf_i2c_irq_mask_t irq_mask)
i2c interrupt callback function prototype.
Definition vsf_template_i2c.h:287
#define vsf_i2c_capability(__I2C)
Definition vsf_template_i2c.h:526
#define VSF_I2C_APIS(__PREFIX_NAME)
Definition vsf_template_i2c.h:101