Hardware Abstraction Layer for FreeRTOS
i2c.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
2 /*
3  * Author: Andreas Werner <kernel@andy89.org>
4  * Date: 2020
5  */
6 #ifndef I2C_H_
7 #define I2C_H_
8 #include <stdint.h>
9 #include <stdbool.h>
10 #include <system.h>
11 #include <FreeRTOS.h>
12 #include <semphr.h>
13 #include <hal.h>
27 struct i2c;
31 enum i2c_mode {
52 };
53 #ifdef CONFIG_I2C_MULTI
54 
57 struct i2c_ops {
58  struct i2c *(*i2c_init)(uint32_t index, enum i2c_mode mode);
59  int32_t (*i2c_deinit)(struct i2c *i2c);
60  int32_t (*i2c_send)(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime);
61  int32_t (*i2c_recv)(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime);
62  int32_t (*i2c_transfer)(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen, TickType_t waittime);
63  int32_t (*i2c_sendISR)(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len);
64  int32_t (*i2c_recvISR)(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len);
65  int32_t (*i2c_transferISR)(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen);
66 };
67 #endif
68 
71 struct i2c_generic {
76  bool init;
77 #ifdef CONFIG_INSTANCE_NAME
78 
81  const char *name;
82 #endif
83 #ifdef CONFIG_I2C_THREAD_SAVE
84 
88 #endif
89 #ifdef CONFIG_I2C_MULTI
90 
93  const struct i2c_ops *ops;
94 #endif
95 };
96 #ifndef CONFIG_I2C_MULTI
97 
103 struct i2c *i2c_init(uint32_t index, enum i2c_mode mode);
104 
110 int32_t i2c_deinit(struct i2c *i2c);
120 int32_t i2c_send(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime);
130 int32_t i2c_recv(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime);
143 int32_t i2c_transfer(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen, TickType_t waittime);
152 int32_t i2c_sendISR(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len);
161 int32_t i2c_recvISR(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len);
173 int32_t i2c_transferISR(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen);
174 
175 #else
176 inline struct i2c *i2c_init(uint32_t index, enum i2c_mode mode) {
178  struct i2c_generic *a = (struct i2c_generic *) HAL_GET_DEV(i2c, index);
179  if (a == NULL) {
180  return NULL;
181  }
182  return a->ops->i2c_init(index, mode);
183 }
184 inline int32_t i2c_deinit(struct i2c *i2c) {
185  struct i2c_generic *a = (struct i2c_generic *) i2c;
186  return a->ops->i2c_deinit(i2c);
187 }
188 inline int32_t i2c_send(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime) {
189  struct i2c_generic *a = (struct i2c_generic *) i2c;
190  return a->ops->i2c_send(i2c, id, data, len, waittime);
191 }
192 inline int32_t i2c_recv(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime) {
193  struct i2c_generic *a = (struct i2c_generic *) i2c;
194  return a->ops->i2c_recv(i2c, id, data, len, waittime);
195 }
196 inline int32_t i2c_transfer(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen, TickType_t waittime) {
197  struct i2c_generic *a = (struct i2c_generic *) i2c;
198  return a->ops->i2c_transfer(i2c, id, sendData, sendLen, recvData, recvLen, waittime);
199 }
200 inline int32_t i2c_sendISR(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len) {
201  struct i2c_generic *a = (struct i2c_generic *) i2c;
202  return a->ops->i2c_sendISR(i2c, id, data, len);
203 }
204 inline int32_t i2c_recvISR(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len) {
205  struct i2c_generic *a = (struct i2c_generic *) i2c;
206  return a->ops->i2c_recvISR(i2c, id, data, len);
207 }
208 inline int32_t i2c_transferISR(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen) {
209  struct i2c_generic *a = (struct i2c_generic *) i2c;
210  return a->ops->i2c_transferISR(i2c, id, sendData, sendLen, recvData, recvLen);
211 }
212 #endif
213 
214 #endif
215 
i2c_sendISR
int32_t i2c_sendISR(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len)
i2C_UFM
@ i2C_UFM
Definition: i2c.h:51
i2c_transferISR
int32_t i2c_transferISR(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen)
i2c_recv
int32_t i2c_recv(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime)
i2c_generic
Definition: i2c.h:71
I2C_HSM
@ I2C_HSM
Definition: i2c.h:47
i2c_generic::init
bool init
Definition: i2c.h:76
i2c_deinit
int32_t i2c_deinit(struct i2c *i2c)
I2C_FM
@ I2C_FM
Definition: i2c.h:39
OS_DEFINE_MUTEX_RECURSIVE
#define OS_DEFINE_MUTEX_RECURSIVE(name)
Definition: os.h:59
i2c_init
struct i2c * i2c_init(uint32_t index, enum i2c_mode mode)
hal.h
HAL_DEFINE_GLOBAL_ARRAY
#define HAL_DEFINE_GLOBAL_ARRAY(gns)
Definition: hal.h:149
i2c_mode
i2c_mode
Definition: i2c.h:31
i2c_send
int32_t i2c_send(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len, TickType_t waittime)
I2C_SM
@ I2C_SM
Definition: i2c.h:35
HAL_GET_DEV
#define HAL_GET_DEV(gns, index)
Definition: hal.h:182
I2C_FMP
@ I2C_FMP
Definition: i2c.h:43
i2c_recvISR
int32_t i2c_recvISR(struct i2c *i2c, uint16_t id, uint8_t *data, uint32_t len)
system.h
i2c_transfer
int32_t i2c_transfer(struct i2c *i2c, uint16_t id, uint8_t *sendData, uint32_t sendLen, uint8_t *recvData, uint32_t recvLen, TickType_t waittime)