summaryrefslogtreecommitdiffstats
path: root/watch-library/hardware/hal/include/hpl_i2c_m_async.h
blob: 8a9491debb2f6f602725e150d56b553c59d6a348 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
/**
 * \file
 *
 * \brief I2C Master Hardware Proxy Layer(HPL) declaration.
 *
 * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
 *
 * \asf_license_start
 *
 * \page License
 *
 * Subject to your compliance with these terms, you may use Microchip
 * software and any derivatives exclusively with Microchip products.
 * It is your responsibility to comply with third party license terms applicable
 * to your use of third party software (including open source software) that
 * may accompany Microchip software.
 *
 * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
 * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
 * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
 * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
 * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
 * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
 * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
 * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT
 * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
 * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
 * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
 *
 * \asf_license_stop
 *
 */
#ifndef _HPL_I2C_M_ASYNC_H_INCLUDED
#define _HPL_I2C_M_ASYNC_H_INCLUDED

#include "hpl_i2c_m_sync.h"
#include "hpl_irq.h"
#include "utils.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \brief i2c master callback names
 */
enum _i2c_m_async_callback_type {
	I2C_M_ASYNC_DEVICE_ERROR,
	I2C_M_ASYNC_DEVICE_TX_COMPLETE,
	I2C_M_ASYNC_DEVICE_RX_COMPLETE
};

struct _i2c_m_async_device;

typedef void (*_i2c_complete_cb_t)(struct _i2c_m_async_device *i2c_dev);
typedef void (*_i2c_error_cb_t)(struct _i2c_m_async_device *i2c_dev, int32_t errcode);

/**
 * \brief i2c callback pointers structure
 */
struct _i2c_m_async_callback {
	_i2c_error_cb_t    error;
	_i2c_complete_cb_t tx_complete;
	_i2c_complete_cb_t rx_complete;
};

/**
 * \brief i2c device structure
 */
struct _i2c_m_async_device {
	struct _i2c_m_service        service;
	void *                       hw;
	struct _i2c_m_async_callback cb;
	struct _irq_descriptor       irq;
};

/**
 * \name HPL functions
 */

/**
 * \brief Initialize I2C in interrupt mode
 *
 * This function does low level I2C configuration.
 *
 * \param[in] i2c_dev The pointer to i2c interrupt device structure
 * \param[in] hw The pointer to hardware instance
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_init(struct _i2c_m_async_device *const i2c_dev, void *const hw);

/**
 * \brief Deinitialize I2C in interrupt mode
 *
 * \param[in] i2c_dev The pointer to i2c device structure
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_deinit(struct _i2c_m_async_device *const i2c_dev);

/**
 * \brief Enable I2C module
 *
 * This function does low level I2C enable.
 *
 * \param[in] i2c_dev The pointer to i2c device structure
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_enable(struct _i2c_m_async_device *const i2c_dev);

/**
 * \brief Disable I2C module
 *
 * This function does low level I2C disable.
 *
 * \param[in] i2c_dev The pointer to i2c device structure
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_disable(struct _i2c_m_async_device *const i2c_dev);

/**
 * \brief Transfer data by I2C
 *
 * This function does low level I2C data transfer.
 *
 * \param[in] i2c_dev The pointer to i2c device structure
 * \param[in] msg The pointer to i2c msg structure
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_transfer(struct _i2c_m_async_device *const i2c_dev, struct _i2c_m_msg *msg);

/**
 * \brief Set baud rate of I2C
 *
 * This function does low level I2C set baud rate.
 *
 * \param[in] i2c_dev The pointer to i2c device structure
 * \param[in] clkrate The clock rate(KHz) input to i2c module
 * \param[in] baudrate The demand baud rate(KHz) of i2c module
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_set_baudrate(struct _i2c_m_async_device *const i2c_dev, uint32_t clkrate, uint32_t baudrate);

/**
 * \brief Register callback to I2C
 *
 * This function does low level I2C callback register.
 *
 * \param[in] i2c_dev The pointer to i2c device structure
 * \param[in] cb_type The callback type request
 * \param[in] func The callback function pointer
 *
 * \return Return 0 for success and negative value for error
 */
int32_t _i2c_m_async_register_callback(struct _i2c_m_async_device *i2c_dev, enum _i2c_m_async_callback_type cb_type,
                                       FUNC_PTR func);

/**
 * \brief Generate stop condition on the I2C bus
 *
 * This function will generate a stop condition on the I2C bus
 *
 * \param[in] i2c_m_async_descriptor An i2c descriptor which is used to communicate through I2C
 *
 * \return Operation status
 * \retval 0 Operation executed successfully
 * \retval <0 Operation failed
 */
int32_t _i2c_m_async_send_stop(struct _i2c_m_async_device *const i2c_dev);

/**
 * \brief Returns the number of bytes left or not used in the I2C message buffer
 *
 * This function will return the number of bytes left (not written to the bus) or still free
 * (not received from the bus) in the message buffer, depending on direction of transmission.
 *
 * \param[in] i2c_m_async_descriptor An i2c descriptor which is used to communicate through I2C
 *
 * \return Number of bytes or error code
 * \retval >0 Positive number indicating bytes left
 * \retval 0  Buffer is full/empty depending on direction
 * \retval <0 Error code
 */
int32_t _i2c_m_async_get_bytes_left(struct _i2c_m_async_device *const i2c_dev);

/**
 * \brief Enable/disable I2C master interrupt
 *
 * param[in] device The pointer to I2C master device instance
 * param[in] type The type of interrupt to disable/enable if applicable
 * param[in] state Enable or disable
 */
void _i2c_m_async_set_irq_state(struct _i2c_m_async_device *const device, const enum _i2c_m_async_callback_type type,
                                const bool state);

#ifdef __cplusplus
}
#endif

#endif