VSF Documented
vsf_dw_apb_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 __HAL_DRIVER_DW_APB_I2C_H__
19#define __HAL_DRIVER_DW_APB_I2C_H__
20
21/*============================ INCLUDES ======================================*/
22
23#include "hal/vsf_hal_cfg.h"
24
25#if VSF_HAL_USE_I2C == ENABLED
26
28
29#if defined(__VSF_HAL_DW_APB_I2C_CLASS_IMPLEMENT)
30# define __VSF_CLASS_IMPLEMENT__
31#elif defined(__VSF_HAL_DW_APB_I2C_CLASS_INHERIT__)
32# define __VSF_CLASS_INHERIT__
33#endif
34
35#include "utilities/ooc_class.h"
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41/*============================ MACROS ========================================*/
42
43#ifndef VSF_DW_APB_I2C_CFG_MULTI_CLASS
44# define VSF_DW_APB_I2C_CFG_MULTI_CLASS VSF_I2C_CFG_MULTI_CLASS
45#endif
46
47#define VSF_I2C_CFG_REIMPLEMENT_TYPE_MODE ENABLED
48#define VSF_I2C_CFG_REIMPLEMENT_TYPE_CMD ENABLED
49#define VSF_I2C_CFG_REIMPLEMENT_TYPE_IRQ_MASK ENABLED
50#define VSF_I2C_CFG_REIMPLEMENT_TYPE_CTRL ENABLED
51
52/*============================ MACROFIED FUNCTIONS ===========================*/
53/*============================ TYPES =========================================*/
54
55typedef enum vsf_i2c_mode_t {
56 VSF_I2C_MODE_MASTER = (0x1ul << 0) | (0x1ul << 6),
57 VSF_I2C_MODE_SLAVE = (0x0ul << 0),
58
59 // TODO: Ultra Fast-mode I2C-bus protocol
60 VSF_I2C_SPEED_STANDARD_MODE = (0x1ul << 1), // up to 100 kbit/s
61 VSF_I2C_SPEED_FAST_MODE = (0x2ul << 1), // up to 400 kbit/s
62 VSF_I2C_SPEED_FAST_MODE_PLUS = (0x2ul << 1), // up to 1 Mbit/s
63 VSF_I2C_SPEED_HIGH_SPEED_MODE = (0x3ul << 1), // up to 3.4 Mbit/s
64
65 VSF_I2C_ADDR_7_BITS = (0x0ul << 3),
66 VSF_I2C_ADDR_10_BITS = (0x3ul << 3),
67
72
73typedef enum vsf_i2c_cmd_t {
74 VSF_I2C_CMD_WRITE = (0x00ul << 8),
75 VSF_I2C_CMD_READ = (0x01ul << 8),
76
77 VSF_I2C_CMD_START = (0x01ul << 16), // virtual
78 VSF_I2C_CMD_NO_START = (0x01ul << 24),
79
80 VSF_I2C_CMD_RESTART = (0x01ul << 10),
81 VSF_I2C_CMD_NO_RESTART = (0x00ul << 10),
82
83 VSF_I2C_CMD_STOP = (0x01ul << 9),
84 VSF_I2C_CMD_NO_STOP = (0x00ul << 9),
85
86 VSF_I2C_CMD_7_BITS = (0x00ul << 17),
87 VSF_I2C_CMD_10_BITS = (0x01ul << 17),
88
94
95typedef enum vsf_i2c_irq_mask_t {
96 // 0..14 are hardware IRQs, 16..26 are virtually supported IRQs, 27~28 are unsupported IRQs
97 VSF_I2C_IRQ_MASK_RX_UNDER = (0x01ul << 0), // INTR.RX_UNDER
98 VSF_I2C_IRQ_MASK_RX_OVER = (0x01ul << 1), // INTR.RX_OVER
99 VSF_I2C_IRQ_MASK_RX_FULL = (0x01ul << 2), // INTR.RX_FULL
100 VSF_I2C_IRQ_MASK_TX_OVER = (0x01ul << 3), // INTR.RX_OVER
101 VSF_I2C_IRQ_MASK_TX_EMPTY = (0x01ul << 4), // INTR.TX_EMPTY
102 VSF_I2C_IRQ_MASK_SLAVE_RD_REQ = (0x01ul << 5), // INTR.RD_REQ
103 VSF_I2C_IRQ_MASK_TX_ABORT = (0x01ul << 6), // INTR.TX_ABORT
104 VSF_I2C_IRQ_MASK_RX_DONE = (0x01ul << 7), // INTR.RX_DONE
105 VSF_I2C_IRQ_MASK_ACTIVITY = (0x01ul << 8), // INTR.ACTIVITY
106 VSF_I2C_IRQ_MASK_STOP_DET = (0x01ul << 9), // INTR.STOP_DET
107 VSF_I2C_IRQ_MASK_START_DET = (0x01ul << 10), // INTR.START_DET
108 VSF_I2C_IRQ_MASK_GEN_CALL = (0x01ul << 11), // INTR.GEN_CALL
109 VSF_I2C_IRQ_MASK_RESTART_DET = (0x01ul << 12), // INTR.RESTART_DET
110 VSF_I2C_IRQ_MASK_MST_ON_HOLD = (0x01ul << 13), // INTR.MST_ON_HOLD
111 VSF_I2C_IRQ_MASK_SCL_STUCK_AT_LOW = (0x01ul << 14), // INTR.SCL_STUCK_AT_LOW
112
113 // bit 4
115 // bit 2
120
121
124 // bit 18
125 //VSF_I2C_IRQ_MASK_SLAVE_TX = VSF_I2C_IRQ_MASK_TX_EMPTY << __VSF_DW_APB_I2C_SLAVE_OFFSET,
126 // bit 20
128 // bit 25
130 // bit 26
133
134
135 VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE = (0x01ul << 19), // virtual
136 VSF_I2C_IRQ_MASK_SLAVE_TRANSFER_COMPLETE = (0x01ul << 21), // virtual
137
138 // TX_ABRT.ABRT_7B_ADDR_NOACK (bit 0) | TX_ABRT.ABRT_10ADDR1_NOACK (bit 1) | TX_ABRT.ABRT_10ADDR2_NOACK (bit 2)
140 // TX_ABRT.ABRT_TXDATA_NOACK (bit 3)
142 // TX_ABRT.ARB_LOST (bit 12)
144
166
167typedef enum vsf_i2c_ctrl_t {
169 #define VSF_I2C_CTRL_GET_MODE VSF_I2C_CTRL_GET_MODE
170
172 #define VSF_I2C_CTRL_SET_MODE VSF_I2C_CTRL_SET_MODE
173
175 #define VSF_I2C_CTRL_SLAVE_GET_ADDRESS VSF_I2C_CTRL_SLAVE_GET_ADDRESS
176
178 #define VSF_I2C_CTRL_SLAVE_SET_ADDRESS VSF_I2C_CTRL_SLAVE_SET_ADDRESS
180
181/*============================ INCLUDES ======================================*/
182
183// IP cores which will export class(es), need to include template before definition
184// of the class. Because the class member(s) maybe depend on the template.
185//#include "hal/driver/common/template/vsf_template_i2c.h"
187
188/*============================ TYPES =========================================*/
189
191#if VSF_DW_APB_I2C_CFG_MULTI_CLASS == ENABLED
192 public_member(
193 vsf_i2c_t vsf_i2c;
195#endif
196 public_member(
199 private_member(
202 uint8_t *ptr;
203 uint_fast16_t master_request_count;
204 uint_fast16_t slave_request_count;
205 uint_fast16_t rx_req_count;
206 uint_fast16_t rx_fifo_count;
207
208 uint16_t is_master : 1;
209 uint16_t is_master_request : 1;
210 uint16_t is_slave_request : 1;
211 uint16_t master_fifo_started : 1;
212 uint16_t is_read : 1;
213 uint16_t need_stop : 1;
214 uint16_t stop_detect : 1;
215 )
216};
217
218/*============================ PROTOTYPES ======================================*/
219
221 vsf_i2c_cfg_t *cfg_ptr, uint_fast32_t ic_clk_hz);
222extern void vsf_dw_apb_i2c_fini(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
230extern void vsf_dw_apb_i2c_isrhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
232 uint16_t address, vsf_i2c_cmd_t cmd, uint_fast16_t count, uint8_t *buffer_ptr,
233 vsf_i2c_cmd_t *cur_cmd_ptr, uint_fast16_t *offset_ptr);
235 bool transmit_or_receive, uint_fast16_t count, uint8_t *buffer_ptr);
237 uint16_t address, vsf_i2c_cmd_t cmd, uint_fast16_t count, uint8_t *buffer);
239 bool transmit_or_receive, uint_fast16_t count, uint8_t *buffer_ptr);
242extern vsf_err_t vsf_dw_apb_i2c_ctrl(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, vsf_i2c_ctrl_t ctrl, void * param);
244extern void vsf_dw_apb_i2c_irqhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
245
246
247#ifdef __cplusplus
248}
249#endif
250
251#endif // VSF_HAL_USE_I2C == ENABLED
252#endif
253/* EOF */
vsf_err_t
Definition __type.h:42
Definition vsf_dw_apb_i2c.h:190
vsf_i2c_cmd_t
Definition i2c.h:32
vsf_i2c_irq_mask_t
Definition i2c.h:103
#define vsf_class(__name)
Definition ooc_class.h:52
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 int uint_fast32_t
Definition stdint.h:27
unsigned short uint_fast16_t
Definition stdint.h:25
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_dw_apb_i2c_reg.h:62
Predefined I2C capability structure that can be reimplemented in specific HAL drivers.
Definition vsf_template_i2c.h:857
I2C configuration.
Definition vsf_template_i2c.h:961
I2C interrupt configuration.
Definition vsf_template_i2c.h:940
Predefined VSF I2C status that can be reimplemented in specific hal drivers.
Definition vsf_template_i2c.h:837
I2C instance structure for multi-class support.
Definition vsf_template_i2c.h:1056
class vsf_$ * reg
vsf_adc_isr_t isr
Definition adc.h:113
vsf_err_t vsf_dw_apb_i2c_slave_request(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, bool transmit_or_receive, uint_fast16_t count, uint8_t *buffer_ptr)
fsm_rt_t vsf_dw_apb_i2c_enable(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
fsm_rt_t vsf_dw_apb_i2c_disable(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
vsf_err_t vsf_dw_apb_i2c_master_request(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, uint16_t address, vsf_i2c_cmd_t cmd, uint_fast16_t count, uint8_t *buffer)
#define VSF_I2C_CTRL_SLAVE_GET_ADDRESS
Definition vsf_dw_apb_i2c.h:175
vsf_i2c_mode_t
Definition vsf_dw_apb_i2c.h:55
@ __VSF_DW_APB_I2C_MODE_MASK
Definition vsf_dw_apb_i2c.h:68
@ VSF_I2C_MODE_MASTER
Definition vsf_dw_apb_i2c.h:56
@ VSF_I2C_SPEED_HIGH_SPEED_MODE
Definition vsf_dw_apb_i2c.h:63
@ VSF_I2C_MODE_SLAVE
Definition vsf_dw_apb_i2c.h:57
@ VSF_I2C_SPEED_STANDARD_MODE
Definition vsf_dw_apb_i2c.h:60
@ VSF_I2C_ADDR_7_BITS
Definition vsf_dw_apb_i2c.h:65
@ VSF_I2C_SPEED_FAST_MODE_PLUS
Definition vsf_dw_apb_i2c.h:62
@ VSF_I2C_SPEED_FAST_MODE
Definition vsf_dw_apb_i2c.h:61
@ VSF_I2C_ADDR_10_BITS
Definition vsf_dw_apb_i2c.h:66
vsf_i2c_capability_t vsf_dw_apb_i2c_capability(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
vsf_i2c_irq_mask_t vsf_dw_apb_i2c_irq_enable(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, vsf_i2c_irq_mask_t irq_mask)
vsf_i2c_status_t vsf_dw_apb_i2c_status(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
vsf_err_t vsf_dw_apb_i2c_init(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, vsf_i2c_cfg_t *cfg_ptr, uint_fast32_t ic_clk_hz)
uint_fast16_t vsf_dw_apb_i2c_slave_fifo_transfer(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, bool transmit_or_receive, uint_fast16_t count, uint8_t *buffer_ptr)
uint_fast32_t vsf_dw_apb_i2c_slave_get_transferred_count(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
vsf_i2c_irq_mask_t vsf_dw_apb_i2c_irq_disable(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, vsf_i2c_irq_mask_t irq_mask)
void vsf_dw_apb_i2c_irqhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
vsf_i2c_cmd_t
Definition vsf_dw_apb_i2c.h:73
@ VSF_I2C_CMD_NO_STOP
Definition vsf_dw_apb_i2c.h:84
@ VSF_I2C_CMD_NO_RESTART
Definition vsf_dw_apb_i2c.h:81
@ VSF_I2C_CMD_10_BITS
Definition vsf_dw_apb_i2c.h:87
@ VSF_I2C_CMD_7_BITS
Definition vsf_dw_apb_i2c.h:86
@ VSF_I2C_CMD_NO_START
Definition vsf_dw_apb_i2c.h:78
@ VSF_I2C_CMD_STOP
Definition vsf_dw_apb_i2c.h:83
@ __VSF_DW_APB_I2C_CMD_MASK
Definition vsf_dw_apb_i2c.h:89
@ VSF_I2C_CMD_RESTART
Definition vsf_dw_apb_i2c.h:80
@ VSF_I2C_CMD_WRITE
Definition vsf_dw_apb_i2c.h:74
@ VSF_I2C_CMD_READ
Definition vsf_dw_apb_i2c.h:75
@ VSF_I2C_CMD_START
Definition vsf_dw_apb_i2c.h:77
vsf_i2c_ctrl_t
Definition vsf_dw_apb_i2c.h:167
#define VSF_I2C_CTRL_GET_MODE
Definition vsf_dw_apb_i2c.h:169
#define VSF_I2C_CTRL_SET_MODE
Definition vsf_dw_apb_i2c.h:172
vsf_i2c_irq_mask_t
Definition vsf_dw_apb_i2c.h:95
@ __VSF_DW_APB_I2C_SLAVE_OFFSET
Definition vsf_dw_apb_i2c.h:123
@ VSF_I2C_IRQ_MASK_RX_FULL
Definition vsf_dw_apb_i2c.h:99
@ VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT
Definition vsf_dw_apb_i2c.h:119
@ VSF_I2C_IRQ_MASK_RX_DONE
Definition vsf_dw_apb_i2c.h:104
@ VSF_I2C_IRQ_MASK_TX_EMPTY
Definition vsf_dw_apb_i2c.h:101
@ VSF_DW_APB_I2C_IRQ_MASK_ALL
Definition vsf_dw_apb_i2c.h:145
@ VSF_I2C_IRQ_MASK_SLAVE_TX
Definition vsf_dw_apb_i2c.h:122
@ VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE
Definition vsf_dw_apb_i2c.h:135
@ VSF_I2C_IRQ_MASK_SLAVE_START_OR_RESTART_DETECT
Definition vsf_dw_apb_i2c.h:131
@ VSF_I2C_IRQ_MASK_MASTER_TX
Definition vsf_dw_apb_i2c.h:114
@ VSF_I2C_IRQ_MASK_GEN_CALL
Definition vsf_dw_apb_i2c.h:108
@ __VSF_DW_APB_I2C_ERROR_MASK
Definition vsf_dw_apb_i2c.h:162
@ VSF_I2C_IRQ_MASK_TX_ABORT
Definition vsf_dw_apb_i2c.h:103
@ VSF_I2C_IRQ_MASK_TX_OVER
Definition vsf_dw_apb_i2c.h:100
@ VSF_I2C_IRQ_MASK_RX_UNDER
Definition vsf_dw_apb_i2c.h:97
@ VSF_I2C_IRQ_MASK_RX_OVER
Definition vsf_dw_apb_i2c.h:98
@ VSF_I2C_IRQ_MASK_MASTER_RX
Definition vsf_dw_apb_i2c.h:116
@ VSF_I2C_IRQ_MASK_START_DET
Definition vsf_dw_apb_i2c.h:107
@ VSF_I2C_IRQ_MASK_SCL_STUCK_AT_LOW
Definition vsf_dw_apb_i2c.h:111
@ VSF_I2C_IRQ_MASK_STOP_DET
Definition vsf_dw_apb_i2c.h:106
@ VSF_I2C_IRQ_MASK_SLAVE_TRANSFER_COMPLETE
Definition vsf_dw_apb_i2c.h:136
@ VSF_I2C_IRQ_MASK_MST_ON_HOLD
Definition vsf_dw_apb_i2c.h:110
@ VSF_I2C_IRQ_MASK_SLAVE_RD_REQ
Definition vsf_dw_apb_i2c.h:102
@ VSF_I2C_IRQ_MASK_RESTART_DET
Definition vsf_dw_apb_i2c.h:109
@ __VSF_DW_APB_I2C_IRQ_MASK
Definition vsf_dw_apb_i2c.h:161
@ VSF_I2C_IRQ_MASK_MASTER_START_OR_RESTART_DETECT
Definition vsf_dw_apb_i2c.h:117
@ VSF_I2C_IRQ_MASK_ACTIVITY
Definition vsf_dw_apb_i2c.h:105
@ VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK
Definition vsf_dw_apb_i2c.h:139
@ VSF_I2C_IRQ_MASK_SLAVE_STOP_DETECT
Definition vsf_dw_apb_i2c.h:129
@ VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST
Definition vsf_dw_apb_i2c.h:143
@ __VSF_DW_APB_I2C_SLAVE_IRQ_MASK
Definition vsf_dw_apb_i2c.h:158
@ VSF_I2C_IRQ_MASK_MASTER_TX_NACK_DETECT
Definition vsf_dw_apb_i2c.h:141
@ VSF_I2C_IRQ_MASK_SLAVE_RX
Definition vsf_dw_apb_i2c.h:127
vsf_err_t vsf_dw_apb_i2c_ctrl(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, vsf_i2c_ctrl_t ctrl, void *param)
void vsf_dw_apb_i2c_isrhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
uint_fast32_t vsf_dw_apb_i2c_master_get_transferred_count(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
#define VSF_I2C_CTRL_SLAVE_SET_ADDRESS
Definition vsf_dw_apb_i2c.h:178
void vsf_dw_apb_i2c_fini(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
fsm_rt_t vsf_dw_apb_i2c_master_fifo_transfer(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, uint16_t address, vsf_i2c_cmd_t cmd, uint_fast16_t count, uint8_t *buffer_ptr, vsf_i2c_cmd_t *cur_cmd_ptr, uint_fast16_t *offset_ptr)
fsm_rt_t
Definition vsf_fsm.h:315
vsf_i2c_mode_t
Predefined VSF I2C modes that can be reimplemented in specific HAL drivers.If we want to add optional...
Definition vsf_template_i2c.h:252
vsf_i2c_ctrl_t
I2C control commands for hardware-specific operations.
Definition vsf_template_i2c.h:989
Generated from commit: vsfteam/vsf@b2e9e8a