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 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 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 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 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 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 116 int rt_i2c_core_init(void) 117 { 118 return 0; 119 } 120 INIT_COMPONENT_EXPORT(rt_i2c_core_init); 121