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