1 #include <stdint.h>
2 #include <stddef.h>
3 #include <aos/errno.h>
4 #include <vfsdev/i2c_dev.h>
5 #include "ulog/ulog.h"
6
7 #define EDU_MAX_I2C_PORT 4
8 static int g_i2c_fd[EDU_MAX_I2C_PORT] = {-1, -1, -1, -1};
9
sensor_i2c_open(uint32_t port,uint16_t dev_addr,uint32_t freq,uint32_t address_width)10 int32_t sensor_i2c_open(uint32_t port, uint16_t dev_addr, uint32_t freq, uint32_t address_width)
11 {
12 int ret = 0;
13 int *p_fd = NULL;
14 char name[16] = {0};
15 io_i2c_control_u c;
16
17 if (port >= EDU_MAX_I2C_PORT)
18 return -EINVAL;
19
20 p_fd = &g_i2c_fd[port];
21
22 if (*p_fd >= 0) {
23 LOGE("SENSOR", "i2c%d is already opened\r\n", port, *p_fd);
24 return -EALREADY;
25 }
26 memset(&c, 0, sizeof(io_i2c_control_u));
27
28 snprintf(name, sizeof(name), "/dev/i2c%d", port);
29
30 *p_fd = open(name, 0);
31
32 if (*p_fd < 0) {
33 LOGE("SENSOR", "open %s failed, fd:%d\r\n", name, *p_fd);
34 return -EIO;
35 }
36 c.c.addr = dev_addr; /* sensor's address */
37 c.c.addr_width = address_width; /* 7-bit address */
38 c.c.role = 1; /* master mode */
39 ret = ioctl(*p_fd, IOC_I2C_SET_CONFIG, (unsigned long)&c);
40
41 c.freq = freq;
42 ret += ioctl(*p_fd, IOC_I2C_SET_FREQ, (unsigned long)&c);
43
44 if (ret) {
45 LOGE("SENSOR", "IOC_I2C_SET_CONFIG or IOC_I2C_SET_FREQ on %s failed, ret:%d\r\n", name, ret);
46 close(*p_fd);
47 *p_fd = -1;
48 }
49 return ret;
50 }
51
sensor_i2c_master_send(uint32_t port,uint16_t dev_addr,const uint8_t * data,uint16_t size,uint32_t timeout)52 int32_t sensor_i2c_master_send(uint32_t port, uint16_t dev_addr, const uint8_t *data,
53 uint16_t size, uint32_t timeout)
54 {
55 int *p_fd = NULL;
56 int ret = -1;
57 io_i2c_data_t d;
58
59 p_fd = &g_i2c_fd[port];
60 if ((port >= EDU_MAX_I2C_PORT) || (*p_fd < 0))
61 return -EINVAL;
62
63 memset(&d, 0, sizeof(io_i2c_data_t));
64
65 d.addr = dev_addr;
66 d.data = data;
67 d.length = size;
68 d.maddr = 0;
69 d.mlength = 0;
70 d.timeout = timeout;
71
72 ret = ioctl(*p_fd, IOC_I2C_MASTER_TX, (unsigned long)&d);
73
74 return ret;
75 }
76
sensor_i2c_master_recv(uint32_t port,uint16_t dev_addr,uint8_t * data,uint16_t size,uint32_t timeout)77 int32_t sensor_i2c_master_recv(uint32_t port, uint16_t dev_addr, uint8_t *data,
78 uint16_t size, uint32_t timeout)
79 {
80 int *p_fd = NULL;
81 int ret = -1;
82 io_i2c_data_t d;
83
84 p_fd = &g_i2c_fd[port];
85 if ((port >= EDU_MAX_I2C_PORT) || (*p_fd < 0))
86 return -EINVAL;
87
88 memset(&d, 0, sizeof(io_i2c_data_t));
89 d.addr = dev_addr;
90 d.data = data;
91 d.length = size;
92 d.maddr = 0;
93 d.mlength = 0;
94 d.timeout = timeout;
95
96 ret = ioctl(*p_fd, IOC_I2C_MASTER_RX, (unsigned long)&d);
97
98 return ret;
99 }
100
sensor_i2c_mem_write(uint32_t port,uint16_t dev_addr,uint16_t mem_addr,uint16_t mem_addr_size,const uint8_t * data,uint16_t size,uint32_t timeout)101 int32_t sensor_i2c_mem_write(uint32_t port, uint16_t dev_addr, uint16_t mem_addr,
102 uint16_t mem_addr_size, const uint8_t *data, uint16_t size,
103 uint32_t timeout)
104 {
105 int *p_fd = NULL;
106 int ret = -1;
107 io_i2c_data_t d;
108
109 p_fd = &g_i2c_fd[port];
110 if ((port >= EDU_MAX_I2C_PORT) || (*p_fd < 0))
111 return -EIO;
112
113 memset(&d, 0, sizeof(io_i2c_data_t));
114 d.addr = dev_addr;
115 d.data = data;
116 d.length = size;
117 d.maddr = mem_addr;
118 d.mlength = mem_addr_size;
119 d.timeout = timeout;
120
121 ret = ioctl(*p_fd, IOC_I2C_MEM_TX, (unsigned long)&d);
122 return ret;
123 }
124
sensor_i2c_mem_read(uint32_t port,uint16_t dev_addr,uint16_t mem_addr,uint16_t mem_addr_size,uint8_t * data,uint16_t size,uint32_t timeout)125 int32_t sensor_i2c_mem_read(uint32_t port, uint16_t dev_addr, uint16_t mem_addr,
126 uint16_t mem_addr_size, uint8_t *data, uint16_t size,
127 uint32_t timeout)
128 {
129 int *p_fd = NULL;
130 int ret = -1;
131 io_i2c_data_t d;
132
133 p_fd = &g_i2c_fd[port];
134 if ((port >= EDU_MAX_I2C_PORT) || (*p_fd < 0))
135 return -EIO;
136
137 memset(&d, 0, sizeof(io_i2c_data_t));
138
139 d.addr = dev_addr;
140 d.data = data;
141 d.length = size;
142 d.maddr = mem_addr;
143 d.mlength = mem_addr_size;
144 d.timeout = timeout;
145
146 ret = ioctl(*p_fd, IOC_I2C_MEM_RX, (unsigned long)&d);
147 return ret;
148 }
149
sensor_i2c_close(uint32_t port)150 int32_t sensor_i2c_close(uint32_t port)
151 {
152 int *p_fd = NULL;
153
154 p_fd = &g_i2c_fd[port];
155 if ((port >= EDU_MAX_I2C_PORT) || (*p_fd < 0)) {
156 LOGE("SENSOR", "invalid port:%d or fd:%d\r\n", port, *p_fd);
157 return -EIO;
158 }
159
160 close(*p_fd);
161
162 *p_fd = -1;
163
164 return 0;
165 }
166