XFusion API v1.3.0
载入中...
搜索中...
未找到
xf_hal_i2c.c
浏览该文件的文档.
1
12/* ==================== [Includes] ========================================== */
13
14#include "xf_hal_i2c.h"
15
16#if XF_HAL_I2C_IS_ENABLE
17
18#include "../kernel/xf_hal_dev.h"
19
20/* ==================== [Defines] =========================================== */
21
22#define TAG "hal_i2c"
23#define XF_HAL_I2C_TYPE XF_HAL_I2C
24
25/* ==================== [Typedefs] ========================================== */
26
27typedef struct _xf_hal_i2c_t {
28 xf_hal_dev_t dev; // 一定要放到第一个,以便后续close一起free
31
32/* ==================== [Static Prototypes] ================================= */
33
35
36/* ==================== [Static Variables] ================================== */
37
38/* ==================== [Macros] ============================================ */
39
40#define XF_HAL_I2C_CHECK(condition, retval, format, ...) \
41 XF_CHECK(condition, retval, TAG, format, ##__VA_ARGS__)
42
43/* ==================== [Global Functions] ================================== */
44
49
51{
52 xf_err_t err = XF_OK;
53 UNUSED(err);
54
56 XF_HAL_I2C_CHECK(!dev, XF_ERR_NOT_FOUND, "i2c init failed!");
57
58 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
59
60#if XF_HAL_LOCK_IS_ENABLE
61 xf_lock_lock(dev_i2c->dev.mutex);
62#endif
63
64 dev_i2c->config.hosts = hosts;
65 dev_i2c->config.speed = speed;
66
67#if XF_HAL_LOCK_IS_ENABLE
68 xf_lock_unlock(dev_i2c->dev.mutex);
69#endif
70
72 XF_HAL_I2C_CHECK(err, err, "enable failed!");
73
74 return XF_OK;
75}
76
78{
79 xf_err_t err = XF_OK;
80 UNUSED(err);
81
83 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
84 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_NOT_FOUND, "i2c is not init!");
85
86 err = xf_hal_driver_close(dev);
87 XF_HAL_I2C_CHECK(err, err, "deinit failed!");
88
89 return XF_OK;
90}
91
93{
94 xf_err_t err = XF_OK;
95 UNUSED(err);
96
98 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
99 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
100
101#if XF_HAL_LOCK_IS_ENABLE
102 xf_lock_lock(dev_i2c->dev.mutex);
103#endif
104
105 dev_i2c->config.enable = true;
106
107#if XF_HAL_LOCK_IS_ENABLE
108 xf_lock_unlock(dev_i2c->dev.mutex);
109#endif
110
111 err = xf_hal_driver_ioctl(dev, XF_HAL_I2C_CMD_ENABLE, &dev_i2c->config);
112 XF_HAL_I2C_CHECK(err, err, "i2c enable failed!");
113
114 return XF_OK;
115}
116
118{
119 xf_err_t err = XF_OK;
120 UNUSED(err);
121
123 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
124 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
125
126#if XF_HAL_LOCK_IS_ENABLE
127 xf_lock_lock(dev_i2c->dev.mutex);
128#endif
129
130 dev_i2c->config.enable = false;
131
132#if XF_HAL_LOCK_IS_ENABLE
133 xf_lock_unlock(dev_i2c->dev.mutex);
134#endif
135
136 err = xf_hal_driver_ioctl(dev, XF_HAL_I2C_CMD_ENABLE, &dev_i2c->config);
137 XF_HAL_I2C_CHECK(err, err, "i2c disable failed!");
138
139 return XF_OK;
140}
141
143{
144 xf_err_t err = XF_OK;
145 UNUSED(err);
146
148 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
149 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
150
151#if XF_HAL_LOCK_IS_ENABLE
152 xf_lock_lock(dev_i2c->dev.mutex);
153#endif
154
155 dev_i2c->config.scl_num = scl_num;
156 dev_i2c->config.sda_num = sda_num;
157
158#if XF_HAL_LOCK_IS_ENABLE
159 xf_lock_unlock(dev_i2c->dev.mutex);
160#endif
161
163 XF_HAL_I2C_CHECK(err, err, "i2c set gpio failed!");
164
165 return XF_OK;
166
167}
168
170{
171 xf_err_t err = XF_OK;
172 UNUSED(err);
173
175 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
176 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
177
178#if XF_HAL_LOCK_IS_ENABLE
179 xf_lock_lock(dev_i2c->dev.mutex);
180#endif
181
182 dev_i2c->config.address_width = address_width;
183
184#if XF_HAL_LOCK_IS_ENABLE
185 xf_lock_unlock(dev_i2c->dev.mutex);
186#endif
187
189 XF_HAL_I2C_CHECK(err, err, "set address failed!");
190
191 return XF_OK;
192}
193
195{
196 xf_err_t err = XF_OK;
197 UNUSED(err);
198
200 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
201 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
202
203#if XF_HAL_LOCK_IS_ENABLE
204 xf_lock_lock(dev_i2c->dev.mutex);
205#endif
206
207 dev_i2c->config.address = address;
208
209#if XF_HAL_LOCK_IS_ENABLE
210 xf_lock_unlock(dev_i2c->dev.mutex);
211#endif
212
214 XF_HAL_I2C_CHECK(err, err, "set address failed!");
215
216 return XF_OK;
217}
218
220{
221 xf_err_t err = XF_OK;
222 UNUSED(err);
223
225 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
226 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
227
228#if XF_HAL_LOCK_IS_ENABLE
229 xf_lock_lock(dev_i2c->dev.mutex);
230#endif
231
232 dev_i2c->config.mem_addr_width = mem_addr_width;
233
234#if XF_HAL_LOCK_IS_ENABLE
235 xf_lock_unlock(dev_i2c->dev.mutex);
236#endif
237
239 XF_HAL_I2C_CHECK(err, err, "set address failed!");
240
241 return XF_OK;
242}
243
244int xf_hal_i2c_write_mem(xf_i2c_num_t i2c_num, uint32_t mem_addr, const uint8_t *buffer, uint32_t size,
245 uint32_t timeout_ms)
246{
247 xf_err_t err = XF_OK;
248 UNUSED(err);
249
251 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
252 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
253
254 if (dev_i2c->config.mem_addr != mem_addr || dev_i2c->config.mem_addr_en != true
255 || dev_i2c->config.timeout_ms != timeout_ms) {
256
257#if XF_HAL_LOCK_IS_ENABLE
258 xf_lock_lock(dev_i2c->dev.mutex);
259#endif
260
261 dev_i2c->config.mem_addr = mem_addr;
262 dev_i2c->config.mem_addr_en = true;
263 dev_i2c->config.timeout_ms = timeout_ms;
264
265#if XF_HAL_LOCK_IS_ENABLE
266 xf_lock_unlock(dev_i2c->dev.mutex);
267#endif
268
270 &dev_i2c->config);
271 XF_HAL_I2C_CHECK(err, err, "write memory address failed!");
272 }
273
274 err = xf_hal_driver_write(dev, buffer, size);
275 XF_HAL_I2C_CHECK(err < XF_OK, err, "write memory address failed!:%d!", -err);
276
277 return err;
278}
279
280int xf_hal_i2c_read_mem(xf_i2c_num_t i2c_num, uint32_t mem_addr, uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
281{
282 xf_err_t err = XF_OK;
283 UNUSED(err);
284
286 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
287 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
288
289 if (dev_i2c->config.mem_addr != mem_addr || dev_i2c->config.mem_addr_en != true
290 || dev_i2c->config.timeout_ms != timeout_ms) {
291
292#if XF_HAL_LOCK_IS_ENABLE
293 xf_lock_lock(dev_i2c->dev.mutex);
294#endif
295
296 dev_i2c->config.mem_addr = mem_addr;
297 dev_i2c->config.mem_addr_en = true;
298 dev_i2c->config.timeout_ms = timeout_ms;
299
300#if XF_HAL_LOCK_IS_ENABLE
301 xf_lock_unlock(dev_i2c->dev.mutex);
302#endif
303
305 &dev_i2c->config);
306 XF_HAL_I2C_CHECK(err, err, "read memory address failed!");
307 }
308
309 err = xf_hal_driver_read(dev, buffer, size);
310 XF_HAL_I2C_CHECK(err < XF_OK, err, "read memory address failed!:%d!", -err);
311
312 return err;
313}
314
315int xf_hal_i2c_write(xf_i2c_num_t i2c_num, const uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
316{
317 xf_err_t err = XF_OK;
318 UNUSED(err);
319
321 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
322 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
323
324 if (dev_i2c->config.mem_addr_en != false || dev_i2c->config.timeout_ms != timeout_ms) {
325
326#if XF_HAL_LOCK_IS_ENABLE
327 xf_lock_lock(dev_i2c->dev.mutex);
328#endif
329
330 dev_i2c->config.timeout_ms = timeout_ms;
331 dev_i2c->config.mem_addr_en = false;
332
333#if XF_HAL_LOCK_IS_ENABLE
334 xf_lock_unlock(dev_i2c->dev.mutex);
335#endif
336
338 XF_HAL_I2C_CHECK(err, err, "write address disable failed!");
339 }
340
341 err = xf_hal_driver_write(dev, buffer, size);
342 XF_HAL_I2C_CHECK(err < XF_OK, err, "write address failed!:%d!", -err);
343
344 return err;
345}
346
347int xf_hal_i2c_read(xf_i2c_num_t i2c_num, uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
348{
349 xf_err_t err = XF_OK;
350 UNUSED(err);
351
353 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)dev;
354 XF_HAL_I2C_CHECK(!dev_i2c, XF_ERR_UNINIT, "i2c is not init!");
355
356 if (dev_i2c->config.mem_addr_en != false || dev_i2c->config.timeout_ms != timeout_ms) {
357
358#if XF_HAL_LOCK_IS_ENABLE
359 xf_lock_lock(dev_i2c->dev.mutex);
360#endif
361
362 dev_i2c->config.timeout_ms = timeout_ms;
363 dev_i2c->config.mem_addr_en = false;
364
365#if XF_HAL_LOCK_IS_ENABLE
366 xf_lock_unlock(dev_i2c->dev.mutex);
367#endif
369 XF_HAL_I2C_CHECK(err, err, "read address disable failed!");
370 }
371
372 err = xf_hal_driver_read(dev, buffer, size);
373 XF_HAL_I2C_CHECK(err < XF_OK, err, "read address failed!:%d!", -err);
374
375 return err;
376}
377
378/* ==================== [Static Functions] ================================== */
379
381{
382 xf_err_t err = XF_OK;
383 UNUSED(err);
384 xf_hal_dev_t *dev = NULL;
385 xf_hal_i2c_t *dev_i2c = (xf_hal_i2c_t *)xf_malloc(sizeof(xf_hal_i2c_t));
386 XF_ASSERT(dev_i2c, NULL, TAG, "memory alloc failed!");
387
388 dev = (xf_hal_dev_t *)dev_i2c;
389
390 err = xf_hal_driver_open(dev, XF_HAL_I2C_TYPE, i2c_num);
391
392 if (err) {
393 XF_LOGE(TAG, "open failed!");
394 xf_free(dev);
395 dev = NULL;
396 }
397
398 return dev;
399}
400
401#endif
uint32_t xf_gpio_num_t
gpio 序号。
Definition xf_hal_gpio.h:44
xf_err_t xf_hal_i2c_set_gpio(xf_i2c_num_t i2c_num, xf_gpio_num_t scl_num, xf_gpio_num_t sda_num)
i2c 设置 gpio。
Definition xf_hal_i2c.c:142
xf_err_t xf_hal_i2c_set_address(xf_i2c_num_t i2c_num, uint16_t address)
i2c 设置 i2c 从机地址。
Definition xf_hal_i2c.c:194
xf_err_t xf_hal_i2c_set_mem_addr_width(xf_i2c_num_t i2c_num, xf_hal_i2c_mem_addr_width_t mem_addr_width)
i2c 设置 i2c 内存地址宽度。
Definition xf_hal_i2c.c:219
xf_err_t xf_hal_i2c_init(xf_i2c_num_t i2c_num, xf_hal_i2c_hosts_t hosts, uint32_t speed)
i2c 初始化函数。使用 i2c 之前必须要进行初始化。
Definition xf_hal_i2c.c:50
xf_err_t xf_hal_i2c_disable(xf_i2c_num_t i2c_num)
i2c 禁用函数。
Definition xf_hal_i2c.c:117
xf_err_t xf_hal_i2c_deinit(xf_i2c_num_t i2c_num)
i2c 反初始化函数,恢复到未初始化状态且回收相关资源。
Definition xf_hal_i2c.c:77
enum _xf_hal_i2c_hosts_t xf_hal_i2c_hosts_t
i2c 主从模式。
enum _xf_hal_i2c_address_width_t xf_hal_i2c_address_width_t
i2c 从机地址宽度。
int xf_hal_i2c_write_mem(xf_i2c_num_t i2c_num, uint32_t mem_addr, const uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
i2c 指定从机内存写入。
Definition xf_hal_i2c.c:244
enum _xf_hal_i2c_mem_addr_width_t xf_hal_i2c_mem_addr_width_t
i2c 从机内存地址宽度。
int xf_hal_i2c_write(xf_i2c_num_t i2c_num, const uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
i2c 写入数据。
Definition xf_hal_i2c.c:315
int xf_hal_i2c_read(xf_i2c_num_t i2c_num, uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
i2c 读取数据。
Definition xf_hal_i2c.c:347
xf_err_t xf_hal_i2c_set_address_width(xf_i2c_num_t i2c_num, xf_hal_i2c_address_width_t address_width)
i2c 设置地址宽度。
Definition xf_hal_i2c.c:169
uint32_t xf_i2c_num_t
i2c 序号。
Definition xf_hal_i2c.h:43
xf_err_t xf_hal_i2c_enable(xf_i2c_num_t i2c_num)
i2c 启用函数。i2c 配置好功能后,可以调用 i2c 启用函数进行激活。
Definition xf_hal_i2c.c:92
int xf_hal_i2c_read_mem(xf_i2c_num_t i2c_num, uint32_t mem_addr, uint8_t *buffer, uint32_t size, uint32_t timeout_ms)
i2c 指定从机内存读取。
Definition xf_hal_i2c.c:280
@ XF_HAL_I2C_CMD_SCL_NUM
Definition xf_hal_i2c.h:110
@ XF_HAL_I2C_CMD_SDA_NUM
Definition xf_hal_i2c.h:111
@ XF_HAL_I2C_CMD_TIMEOUT
Definition xf_hal_i2c.h:109
@ XF_HAL_I2C_CMD_ENABLE
Definition xf_hal_i2c.h:102
@ XF_HAL_I2C_CMD_MEM_ADDR_WIDTH
Definition xf_hal_i2c.h:106
@ XF_HAL_I2C_CMD_ADDRESS
Definition xf_hal_i2c.h:104
@ XF_HAL_I2C_CMD_ADDRESS_WIDTH
Definition xf_hal_i2c.h:103
@ XF_HAL_I2C_CMD_HOSTS
Definition xf_hal_i2c.h:101
@ XF_HAL_I2C_CMD_MEM_ADDR
Definition xf_hal_i2c.h:107
@ XF_HAL_I2C_CMD_MEM_ADDR_EN
Definition xf_hal_i2c.h:105
@ XF_HAL_I2C_CMD_SPEED
Definition xf_hal_i2c.h:108
#define XF_ASSERT(condition, retval, tag, format,...)
xfusion 断言宏(条件 不成立 时则输出日志后返回)。
Definition xf_check.h:150
int32_t xf_err_t
整形错误类型。 错误码具体值见 xf_err_code_t.
Definition xf_err.h:69
@ XF_OK
Definition xf_err.h:43
@ XF_ERR_NOT_FOUND
Definition xf_err.h:50
@ XF_ERR_UNINIT
Definition xf_err.h:54
int xf_lock_unlock(xf_lock_t lock)
解锁.
Definition xf_lock.c:88
int xf_lock_lock(xf_lock_t lock)
锁定直至成功.
Definition xf_lock.c:72
#define xf_malloc(x)
Definition xf_stdlib.h:38
#define xf_free(x)
Definition xf_stdlib.h:39
对移植者,用于对接 i2c 设置的参数。
Definition xf_hal_i2c.h:119
xf_gpio_num_t scl_num
Definition xf_hal_i2c.h:130
xf_gpio_num_t sda_num
Definition xf_hal_i2c.h:131
xf_hal_i2c_config_t config
Definition xf_hal_i2c.c:29
xf_hal_dev_t dev
Definition xf_hal_i2c.c:28
xf_err_t xf_hal_driver_close(xf_hal_dev_t *dev)
Definition xf_hal_dev.c:192
int xf_hal_driver_read(xf_hal_dev_t *dev, void *buf, size_t count)
Definition xf_hal_dev.c:168
xf_err_t xf_hal_driver_ioctl(xf_hal_dev_t *dev, uint32_t cmd, void *config)
Definition xf_hal_dev.c:154
xf_err_t xf_hal_driver_open(xf_hal_dev_t *dev, xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:118
int xf_hal_driver_write(xf_hal_dev_t *dev, const void *buf, size_t count)
Definition xf_hal_dev.c:180
xf_hal_dev_t * xf_hal_device_find(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:238
xf_err_t xf_hal_driver_register(xf_hal_type_t type, xf_hal_flag_t flag, xf_hal_dev_create_t constructor, const xf_driver_ops_t *driver_ops)
Definition xf_hal_dev.c:44
xf_hal_dev_t * xf_hal_driver_create(xf_hal_type_t type, uint32_t id)
Definition xf_hal_dev.c:93
@ XF_HAL_FLAG_READ_WRITE
Definition xf_hal_dev.h:54
#define XF_HAL_I2C_CHECK(condition, retval, format,...)
Definition xf_hal_i2c.c:40
struct _xf_hal_i2c_t xf_hal_i2c_t
static xf_hal_dev_t * i2c_constructor(xf_i2c_num_t i2c_num)
Definition xf_hal_i2c.c:380
#define XF_HAL_I2C_TYPE
Definition xf_hal_i2c.c:23
#define TAG
Definition xf_hal_i2c.c:22
xf_err_t xf_hal_i2c_register(const xf_driver_ops_t *driver_ops)
i2c 设备注册。
Definition xf_hal_i2c.c:45
xf_hal 的 i2c(同步半双工串行通信总线) 设备抽象。
#define XF_LOGE(tag, format,...)
#define UNUSED(_x)