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_RESTART = (0x01ul << 10),
79 VSF_I2C_CMD_STOP = (0x01ul << 9),
80
81 VSF_I2C_CMD_7_BITS = (0x00ul << 17),
82 VSF_I2C_CMD_10_BITS = (0x01ul << 17),
83
88
89 VSF_I2C_CMD_NO_START = (0x01ul << 24),
92
93typedef enum vsf_i2c_irq_mask_t {
94 // 0..14 are hardware IRQs, 16..26 are virtually supported IRQs, 27~28 are unsupported IRQs
95 VSF_I2C_IRQ_MASK_RX_UNDER = (0x01ul << 0), // INTR.RX_UNDER
96 VSF_I2C_IRQ_MASK_RX_OVER = (0x01ul << 1), // INTR.RX_OVER
97 VSF_I2C_IRQ_MASK_RX_FULL = (0x01ul << 2), // INTR.RX_FULL
98 VSF_I2C_IRQ_MASK_TX_OVER = (0x01ul << 3), // INTR.RX_OVER
99 VSF_I2C_IRQ_MASK_TX_EMPTY = (0x01ul << 4), // INTR.TX_EMPTY
100 VSF_I2C_IRQ_MASK_SLAVE_RD_REQ = (0x01ul << 5), // INTR.RD_REQ
101 VSF_I2C_IRQ_MASK_TX_ABORT = (0x01ul << 6), // INTR.TX_ABORT
102 VSF_I2C_IRQ_MASK_RX_DONE = (0x01ul << 7), // INTR.RX_DONE
103 VSF_I2C_IRQ_MASK_ACTIVITY = (0x01ul << 8), // INTR.ACTIVITY
104 VSF_I2C_IRQ_MASK_STOP_DET = (0x01ul << 9), // INTR.STOP_DET
105 VSF_I2C_IRQ_MASK_START_DET = (0x01ul << 10), // INTR.START_DET
106 VSF_I2C_IRQ_MASK_GEN_CALL = (0x01ul << 11), // INTR.GEN_CALL
107 VSF_I2C_IRQ_MASK_RESTART_DET = (0x01ul << 12), // INTR.RESTART_DET
108 VSF_I2C_IRQ_MASK_MST_ON_HOLD = (0x01ul << 13), // INTR.MST_ON_HOLD
109 VSF_I2C_IRQ_MASK_SCL_STUCK_AT_LOW = (0x01ul << 14), // INTR.SCL_STUCK_AT_LOW
110
111 // bit 4
113 // bit 2
118
119
122 // bit 18
123 //VSF_I2C_IRQ_MASK_SLAVE_TX = VSF_I2C_IRQ_MASK_TX_EMPTY << __VSF_DW_APB_I2C_SLAVE_OFFSET,
124 // bit 20
126 // bit 25
128 // bit 26
131
132
133 VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE = (0x01ul << 19), // virtual
134 VSF_I2C_IRQ_MASK_SLAVE_TRANSFER_COMPLETE = (0x01ul << 21), // virtual
135
136 // TX_ABRT.ABRT_7B_ADDR_NOACK (bit 0) | TX_ABRT.ABRT_10ADDR1_NOACK (bit 1) | TX_ABRT.ABRT_10ADDR2_NOACK (bit 2)
138 // TX_ABRT.ABRT_TXDATA_NOACK (bit 3)
140 // TX_ABRT.ARB_LOST (bit 12)
142
143 VSF_I2C_IRQ_MASK_MASTER_ERR = (0x01ul << 27), // virtual, not supported
144 VSF_I2C_IRQ_MASK_SLAVE_ERR = (0x01ul << 28), // virtual, not supported
145
168
169typedef enum vsf_i2c_ctrl_t {
171 #define VSF_I2C_CTRL_GET_MODE VSF_I2C_CTRL_GET_MODE
172
174 #define VSF_I2C_CTRL_SET_MODE VSF_I2C_CTRL_SET_MODE
175
177 #define VSF_I2C_CTRL_SLAVE_GET_ADDRESS VSF_I2C_CTRL_SLAVE_GET_ADDRESS
178
180 #define VSF_I2C_CTRL_SLAVE_SET_ADDRESS VSF_I2C_CTRL_SLAVE_SET_ADDRESS
182
183/*============================ INCLUDES ======================================*/
184
185// IP cores which will export class(es), need to include template before definition
186// of the class. Because the class member(s) maybe depend on the template.
187//#include "hal/driver/common/template/vsf_template_i2c.h"
189
190/*============================ TYPES =========================================*/
191
193#if VSF_DW_APB_I2C_CFG_MULTI_CLASS == ENABLED
194 public_member(
195 vsf_i2c_t vsf_i2c;
197#endif
198 public_member(
201 private_member(
204 uint8_t *ptr;
205 uint_fast16_t master_request_count;
206 uint_fast16_t slave_request_count;
207 uint_fast16_t rx_req_count;
208 uint_fast16_t rx_fifo_count;
209
210 uint16_t is_master : 1;
211 uint16_t is_master_request : 1;
212 uint16_t is_slave_request : 1;
213 uint16_t master_fifo_started : 1;
214 uint16_t is_read : 1;
215 uint16_t need_stop : 1;
216 uint16_t stop_detect : 1;
217 )
218};
219
220/*============================ PROTOTYPES ======================================*/
221
223 vsf_i2c_cfg_t *cfg_ptr, uint_fast32_t ic_clk_hz);
224extern void vsf_dw_apb_i2c_fini(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
232extern void vsf_dw_apb_i2c_isrhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
234 uint16_t address, vsf_i2c_cmd_t cmd, uint_fast16_t count, uint8_t *buffer_ptr,
235 vsf_i2c_cmd_t *cur_cmd_ptr, uint_fast16_t *offset_ptr);
237 bool transmit_or_receive, uint_fast16_t count, uint8_t *buffer_ptr);
239 uint16_t address, vsf_i2c_cmd_t cmd, uint_fast16_t count, uint8_t *buffer);
241 bool transmit_or_receive, uint_fast16_t count, uint8_t *buffer_ptr);
244extern vsf_err_t vsf_dw_apb_i2c_ctrl(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr, vsf_i2c_ctrl_t ctrl, void * param);
246extern void vsf_dw_apb_i2c_irqhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
247
248
249#ifdef __cplusplus
250}
251#endif
252
253#endif // VSF_HAL_USE_I2C == ENABLED
254#endif
255/* EOF */
vsf_err_t
Definition __type.h:42
Definition vsf_dw_apb_i2c.h:192
vsf_i2c_cmd_t
Definition i2c.h:32
#define vsf_class(__name)
Definition ooc_class.h:48
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:777
I2C configuration.
Definition vsf_template_i2c.h:881
I2C interrupt configuration.
Definition vsf_template_i2c.h:860
Predefined VSF I2C status that can be reimplemented in specific hal drivers.
Definition vsf_template_i2c.h:757
I2C instance structure for multi-class support.
Definition vsf_template_i2c.h:976
class vsf_$ * reg
vsf_adc_isr_t isr
Definition adc.h:109
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:177
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_10_BITS
Definition vsf_dw_apb_i2c.h:82
@ VSF_I2C_CMD_7_BITS
Definition vsf_dw_apb_i2c.h:81
@ VSF_I2C_CMD_NO_START
Definition vsf_dw_apb_i2c.h:89
@ VSF_I2C_CMD_STOP
Definition vsf_dw_apb_i2c.h:79
@ VSF_I2C_CMD_NO_STOP_RESTART
Definition vsf_dw_apb_i2c.h:90
@ __VSF_DW_APB_I2C_CMD_MASK
Definition vsf_dw_apb_i2c.h:84
@ VSF_I2C_CMD_RESTART
Definition vsf_dw_apb_i2c.h:78
@ 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:169
void 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)
#define VSF_I2C_CTRL_GET_MODE
Definition vsf_dw_apb_i2c.h:171
#define VSF_I2C_CTRL_SET_MODE
Definition vsf_dw_apb_i2c.h:174
vsf_i2c_irq_mask_t
Definition vsf_dw_apb_i2c.h:93
@ __VSF_DW_APB_I2C_SLAVE_OFFSET
Definition vsf_dw_apb_i2c.h:121
@ VSF_I2C_IRQ_MASK_RX_FULL
Definition vsf_dw_apb_i2c.h:97
@ VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT
Definition vsf_dw_apb_i2c.h:117
@ VSF_I2C_IRQ_MASK_RX_DONE
Definition vsf_dw_apb_i2c.h:102
@ VSF_I2C_IRQ_MASK_TX_EMPTY
Definition vsf_dw_apb_i2c.h:99
@ VSF_DW_APB_I2C_IRQ_MASK_ALL
Definition vsf_dw_apb_i2c.h:146
@ VSF_I2C_IRQ_MASK_SLAVE_TX
Definition vsf_dw_apb_i2c.h:120
@ VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE
Definition vsf_dw_apb_i2c.h:133
@ VSF_I2C_IRQ_MASK_SLAVE_START_OR_RESTART_DETECT
Definition vsf_dw_apb_i2c.h:129
@ VSF_I2C_IRQ_MASK_MASTER_TX
Definition vsf_dw_apb_i2c.h:112
@ VSF_I2C_IRQ_MASK_GEN_CALL
Definition vsf_dw_apb_i2c.h:106
@ __VSF_DW_APB_I2C_ERROR_MASK
Definition vsf_dw_apb_i2c.h:163
@ VSF_I2C_IRQ_MASK_TX_ABORT
Definition vsf_dw_apb_i2c.h:101
@ VSF_I2C_IRQ_MASK_MASTER_ERR
Definition vsf_dw_apb_i2c.h:143
@ VSF_I2C_IRQ_MASK_TX_OVER
Definition vsf_dw_apb_i2c.h:98
@ VSF_I2C_IRQ_MASK_RX_UNDER
Definition vsf_dw_apb_i2c.h:95
@ VSF_I2C_IRQ_MASK_RX_OVER
Definition vsf_dw_apb_i2c.h:96
@ VSF_I2C_IRQ_MASK_MASTER_RX
Definition vsf_dw_apb_i2c.h:114
@ VSF_I2C_IRQ_MASK_START_DET
Definition vsf_dw_apb_i2c.h:105
@ VSF_I2C_IRQ_MASK_SCL_STUCK_AT_LOW
Definition vsf_dw_apb_i2c.h:109
@ VSF_I2C_IRQ_MASK_STOP_DET
Definition vsf_dw_apb_i2c.h:104
@ VSF_I2C_IRQ_MASK_SLAVE_TRANSFER_COMPLETE
Definition vsf_dw_apb_i2c.h:134
@ VSF_I2C_IRQ_MASK_MST_ON_HOLD
Definition vsf_dw_apb_i2c.h:108
@ VSF_I2C_IRQ_MASK_SLAVE_RD_REQ
Definition vsf_dw_apb_i2c.h:100
@ VSF_I2C_IRQ_MASK_RESTART_DET
Definition vsf_dw_apb_i2c.h:107
@ __VSF_DW_APB_I2C_IRQ_MASK
Definition vsf_dw_apb_i2c.h:162
@ VSF_I2C_IRQ_MASK_MASTER_START_OR_RESTART_DETECT
Definition vsf_dw_apb_i2c.h:115
@ VSF_I2C_IRQ_MASK_ACTIVITY
Definition vsf_dw_apb_i2c.h:103
@ VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK
Definition vsf_dw_apb_i2c.h:137
@ VSF_I2C_IRQ_MASK_SLAVE_ERR
Definition vsf_dw_apb_i2c.h:144
@ VSF_I2C_IRQ_MASK_SLAVE_STOP_DETECT
Definition vsf_dw_apb_i2c.h:127
@ VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST
Definition vsf_dw_apb_i2c.h:141
@ __VSF_DW_APB_I2C_SLAVE_IRQ_MASK
Definition vsf_dw_apb_i2c.h:159
@ VSF_I2C_IRQ_MASK_MASTER_TX_NACK_DETECT
Definition vsf_dw_apb_i2c.h:139
@ VSF_I2C_IRQ_MASK_SLAVE_RX
Definition vsf_dw_apb_i2c.h:125
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:180
void vsf_dw_apb_i2c_fini(vsf_dw_apb_i2c_t *dw_apb_i2c_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:237
vsf_i2c_ctrl_t
I2C control commands for hardware-specific operations.
Definition vsf_template_i2c.h:909
vsf_i2c_irq_mask_t
Predefined VSF I2C interrupt masks that can be reimplemented in specific HAL drivers....
Definition vsf_template_i2c.h:537
Generated from commit: vsfteam/vsf@2b286be