xref: /nrf52832-nimble/rt-thread/components/drivers/i2c/i2c_core.c (revision 104654410c56c573564690304ae786df310c91fc)
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