1 /*
2 * Copyright (c) 2006-2018, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 * 2012-04-25 weety first version
9 */
10
11 #include <rtdevice.h>
12
rt_i2c_bus_device_register(struct rt_i2c_bus_device * bus,const char * bus_name)13 rt_err_t rt_i2c_bus_device_register(struct rt_i2c_bus_device *bus,
14 const char *bus_name)
15 {
16 rt_err_t res = RT_EOK;
17
18 rt_mutex_init(&bus->lock, "i2c_bus_lock", RT_IPC_FLAG_FIFO);
19
20 if (bus->timeout == 0) bus->timeout = RT_TICK_PER_SECOND;
21
22 res = rt_i2c_bus_device_device_init(bus, bus_name);
23
24 i2c_dbg("I2C bus [%s] registered\n", bus_name);
25
26 return res;
27 }
28
rt_i2c_bus_device_find(const char * bus_name)29 struct rt_i2c_bus_device *rt_i2c_bus_device_find(const char *bus_name)
30 {
31 struct rt_i2c_bus_device *bus;
32 rt_device_t dev = rt_device_find(bus_name);
33 if (dev == RT_NULL || dev->type != RT_Device_Class_I2CBUS)
34 {
35 i2c_dbg("I2C bus %s not exist\n", bus_name);
36
37 return RT_NULL;
38 }
39
40 bus = (struct rt_i2c_bus_device *)dev->user_data;
41
42 return bus;
43 }
44
rt_i2c_transfer(struct rt_i2c_bus_device * bus,struct rt_i2c_msg msgs[],rt_uint32_t num)45 rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus,
46 struct rt_i2c_msg msgs[],
47 rt_uint32_t num)
48 {
49 rt_size_t ret;
50
51 if (bus->ops->master_xfer)
52 {
53 #ifdef RT_I2C_DEBUG
54 for (ret = 0; ret < num; ret++)
55 {
56 i2c_dbg("msgs[%d] %c, addr=0x%02x, len=%d\n", ret,
57 (msgs[ret].flags & RT_I2C_RD) ? 'R' : 'W',
58 msgs[ret].addr, msgs[ret].len);
59 }
60 #endif
61
62 rt_mutex_take(&bus->lock, RT_WAITING_FOREVER);
63 ret = bus->ops->master_xfer(bus, msgs, num);
64 rt_mutex_release(&bus->lock);
65
66 return ret;
67 }
68 else
69 {
70 i2c_dbg("I2C bus operation not supported\n");
71
72 return 0;
73 }
74 }
75
rt_i2c_master_send(struct rt_i2c_bus_device * bus,rt_uint16_t addr,rt_uint16_t flags,const rt_uint8_t * buf,rt_uint32_t count)76 rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus,
77 rt_uint16_t addr,
78 rt_uint16_t flags,
79 const rt_uint8_t *buf,
80 rt_uint32_t count)
81 {
82 rt_err_t ret;
83 struct rt_i2c_msg msg;
84
85 msg.addr = addr;
86 msg.flags = flags & RT_I2C_ADDR_10BIT;
87 msg.len = count;
88 msg.buf = (rt_uint8_t *)buf;
89
90 ret = rt_i2c_transfer(bus, &msg, 1);
91
92 return (ret > 0) ? count : ret;
93 }
94
rt_i2c_master_recv(struct rt_i2c_bus_device * bus,rt_uint16_t addr,rt_uint16_t flags,rt_uint8_t * buf,rt_uint32_t count)95 rt_size_t rt_i2c_master_recv(struct rt_i2c_bus_device *bus,
96 rt_uint16_t addr,
97 rt_uint16_t flags,
98 rt_uint8_t *buf,
99 rt_uint32_t count)
100 {
101 rt_err_t ret;
102 struct rt_i2c_msg msg;
103 RT_ASSERT(bus != RT_NULL);
104
105 msg.addr = addr;
106 msg.flags = flags & RT_I2C_ADDR_10BIT;
107 msg.flags |= RT_I2C_RD;
108 msg.len = count;
109 msg.buf = buf;
110
111 ret = rt_i2c_transfer(bus, &msg, 1);
112
113 return (ret > 0) ? count : ret;
114 }
115
rt_i2c_core_init(void)116 int rt_i2c_core_init(void)
117 {
118 return 0;
119 }
120 INIT_COMPONENT_EXPORT(rt_i2c_core_init);
121