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
51/*============================ MACROFIED FUNCTIONS ===========================*/
52/*============================ TYPES =========================================*/
53
54typedef enum vsf_i2c_mode_t {
55 VSF_I2C_MODE_MASTER = (0x1ul << 0) | (0x1ul << 6),
56 VSF_I2C_MODE_SLAVE = (0x0ul << 0),
57
58 // TODO: Ultra Fast-mode I2C-bus protocol
59 VSF_I2C_SPEED_STANDARD_MODE = (0x1ul << 1), // up to 100 kbit/s
60 VSF_I2C_SPEED_FAST_MODE = (0x2ul << 1), // up to 400 kbit/s
61 VSF_I2C_SPEED_FAST_MODE_PLUS = (0x2ul << 1), // up to 1 Mbit/s
62 VSF_I2C_SPEED_HIGH_SPEED_MODE = (0x3ul << 1), // up to 3.4 Mbit/s
63
64 VSF_I2C_ADDR_7_BITS = (0x0ul << 3),
65 VSF_I2C_ADDR_10_BITS = (0x3ul << 3),
66
71
72typedef enum vsf_i2c_cmd_t {
73 VSF_I2C_CMD_WRITE = (0x00ul << 8),
74 VSF_I2C_CMD_READ = (0x01ul << 8),
75
76 VSF_I2C_CMD_START = (0x01ul << 16), // virtual
77 VSF_I2C_CMD_RESTART = (0x01ul << 10),
78 VSF_I2C_CMD_STOP = (0x01ul << 9),
79
80 VSF_I2C_CMD_7_BITS = (0x00ul << 17),
81 VSF_I2C_CMD_10_BITS = (0x01ul << 17),
82
87
88 VSF_I2C_CMD_NO_START = (0x01ul << 24),
91
92typedef enum vsf_i2c_irq_mask_t {
93 // 0..15 are hardware IRQs, 16..23 are virtually supported IRQs, 24.. are unsupported IRQs
94 VSF_I2C_IRQ_MASK_MASTER_STARTED = (0x01ul << 16), // virtual, issued in vsf_dw_apb_i2c_master_request if VSF_I2C_CMD_START is set in cmd
95 VSF_I2C_IRQ_MASK_MASTER_STOPPED = (0x01ul << 17), // virtual, issued in vsf_dw_apb_i2c_irqhandler if VSF_I2C_CMD_STOP is set in cmd
96 VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT = (0x01ul << 9), // INTR.STOP_DET
97 VSF_I2C_IRQ_MASK_MASTER_NACK_DETECT = (0x01ul << 3), // TX_ABRT.ABRT_TXDATA_NOACK
98 VSF_I2C_IRQ_MASK_MASTER_TX_EMPTY = (0x01ul << 4), // INTR.TX_EMPTY
99
100 VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST = (0x01ul << 12), // TX_ABRT.ARB_LOST
101 VSF_I2C_IRQ_MASK_MASTER_ERROR = (0x01ul << 24), // virtual, not supported
102
103 VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE = (0x01ul << 18), // virtual
104 VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK = ((0x01ul << 0) | (0x01ul << 1) | (0x01ul << 2)),
105 // TX_ABRT.ABRT_7B_ADDR_NOACK | TX_ABRT.ABRT_10ADDR1_NOACK | TX_ABRT.ABRT_10ADDR2_NOACK
106
126
127/*============================ INCLUDES ======================================*/
128
129// IP cores which will export class(es), need to include template before definition
130// of the class. Because the class member(s) maybe depend on the template.
132
133/*============================ TYPES =========================================*/
134
136#if VSF_DW_APB_I2C_CFG_MULTI_CLASS == ENABLED
137 public_member(
138 vsf_i2c_t vsf_i2c;
140#endif
141 public_member(
144 private_member(
147 uint8_t *ptr;
148 uint16_t count;
149 uint16_t rx_req_count;
150 uint16_t is_master : 1;
151 uint16_t is_read : 1;
152 uint16_t need_stop : 1;
153 )
154};
155
156/*============================ PROTOTYPES ======================================*/
157
159 vsf_i2c_cfg_t *cfg_ptr, uint_fast32_t ic_clk_hz);
160extern void vsf_dw_apb_i2c_fini(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
168extern void vsf_dw_apb_i2c_isrhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
170 uint16_t address, vsf_i2c_cmd_t cmd, uint16_t count, uint8_t *buffer);
173extern void vsf_dw_apb_i2c_irqhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr);
174
175#ifdef __cplusplus
176}
177#endif
178
179#endif // VSF_HAL_USE_I2C == ENABLED
180#endif
181/* EOF */
vsf_err_t
Definition __type.h:42
Definition vsf_dw_apb_i2c.h:135
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 char uint8_t
Definition stdint.h:5
Definition vsf_dw_apb_i2c_reg.h:62
Definition vsf_template_i2c.h:231
i2c configuration
Definition vsf_template_i2c.h:314
i2c interrupt configuration
Definition vsf_template_i2c.h:298
Definition vsf_template_i2c.h:222
Definition vsf_template_i2c.h:334
class vsf_$ * reg
vsf_adc_isr_t isr
Definition adc.h:83
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_i2c_mode_t
Definition vsf_dw_apb_i2c.h:54
@ __VSF_DW_APB_I2C_MODE_MASK
Definition vsf_dw_apb_i2c.h:67
@ VSF_I2C_MODE_MASTER
Definition vsf_dw_apb_i2c.h:55
@ VSF_I2C_SPEED_HIGH_SPEED_MODE
Definition vsf_dw_apb_i2c.h:62
@ VSF_I2C_MODE_SLAVE
Definition vsf_dw_apb_i2c.h:56
@ VSF_I2C_SPEED_STANDARD_MODE
Definition vsf_dw_apb_i2c.h:59
@ VSF_I2C_ADDR_7_BITS
Definition vsf_dw_apb_i2c.h:64
@ VSF_I2C_SPEED_FAST_MODE_PLUS
Definition vsf_dw_apb_i2c.h:61
@ VSF_I2C_SPEED_FAST_MODE
Definition vsf_dw_apb_i2c.h:60
@ VSF_I2C_ADDR_10_BITS
Definition vsf_dw_apb_i2c.h:65
vsf_i2c_capability_t vsf_dw_apb_i2c_capability(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, uint16_t count, uint8_t *buffer)
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)
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:72
@ VSF_I2C_CMD_10_BITS
Definition vsf_dw_apb_i2c.h:81
@ VSF_I2C_CMD_7_BITS
Definition vsf_dw_apb_i2c.h:80
@ VSF_I2C_CMD_NO_START
Definition vsf_dw_apb_i2c.h:88
@ VSF_I2C_CMD_STOP
Definition vsf_dw_apb_i2c.h:78
@ VSF_I2C_CMD_NO_STOP_RESTART
Definition vsf_dw_apb_i2c.h:89
@ __VSF_DW_APB_I2C_CMD_MASK
Definition vsf_dw_apb_i2c.h:83
@ VSF_I2C_CMD_RESTART
Definition vsf_dw_apb_i2c.h:77
@ VSF_I2C_CMD_WRITE
Definition vsf_dw_apb_i2c.h:73
@ VSF_I2C_CMD_READ
Definition vsf_dw_apb_i2c.h:74
@ VSF_I2C_CMD_START
Definition vsf_dw_apb_i2c.h:76
vsf_i2c_irq_mask_t
Definition vsf_dw_apb_i2c.h:92
@ VSF_I2C_IRQ_MASK_MASTER_STOP_DETECT
Definition vsf_dw_apb_i2c.h:96
@ VSF_I2C_IRQ_MASK_MASTER_ERROR
Definition vsf_dw_apb_i2c.h:101
@ VSF_DW_APB_I2C_IRQ_MASK_ALL
Definition vsf_dw_apb_i2c.h:107
@ VSF_I2C_IRQ_MASK_MASTER_TRANSFER_COMPLETE
Definition vsf_dw_apb_i2c.h:103
@ __VSF_DW_APB_I2C_ERROR_MASK
Definition vsf_dw_apb_i2c.h:121
@ VSF_I2C_IRQ_MASK_MASTER_TX_EMPTY
Definition vsf_dw_apb_i2c.h:98
@ __VSF_DW_APB_I2C_ABRT_MASK
Definition vsf_dw_apb_i2c.h:117
@ VSF_I2C_IRQ_MASK_MASTER_NACK_DETECT
Definition vsf_dw_apb_i2c.h:97
@ __VSF_DW_APB_I2C_IRQ_MASK
Definition vsf_dw_apb_i2c.h:115
@ VSF_I2C_IRQ_MASK_MASTER_STOPPED
Definition vsf_dw_apb_i2c.h:95
@ VSF_I2C_IRQ_MASK_MASTER_ADDRESS_NACK
Definition vsf_dw_apb_i2c.h:104
@ VSF_I2C_IRQ_MASK_MASTER_ARBITRATION_LOST
Definition vsf_dw_apb_i2c.h:100
@ VSF_I2C_IRQ_MASK_MASTER_STARTED
Definition vsf_dw_apb_i2c.h:94
void vsf_dw_apb_i2c_isrhandler(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
uint_fast32_t vsf_dw_apb_i2c_get_transferred_count(vsf_dw_apb_i2c_t *dw_apb_i2c_ptr)
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
Definition vsf_template_i2c.h:116
vsf_i2c_irq_mask_t
Definition vsf_template_i2c.h:194