1 /*
2 * Copyright (C) 2015-2017 Alibaba Group Holding Limited
3 */
4
5 #include "sensor_drv_api.h"
6 #include <aos/errno.h>
7 #include <vfsdev/i2c_dev.h>
8
9 static int g_i2c_fd[4] = {-1, -1, -1, -1};
10
vfs_i2c_init(i2c_dev_t * i2c)11 int32_t vfs_i2c_init(i2c_dev_t *i2c)
12 {
13 int32_t ret = 0;
14 int32_t port = 0;
15 int32_t *p_fd = NULL;
16 char name[16] = {0};
17 io_i2c_control_u i2c_ctrl;
18
19 if (!i2c) {
20 printf ("i2c is null\r\n");
21 return -EINVAL;
22 }
23
24 port = i2c->port;
25 // p_fd = (int32_t *)malloc(sizeof(int32_t));
26 // if (!p_fd)
27 // return -ENOMEM;
28 // *p_fd = -1;
29
30 p_fd = &g_i2c_fd[port];
31 if (*p_fd >= 0) {
32 printf ("i2c port[%d] isn't ready\r\n",port);
33 return -EALREADY;
34 }
35
36 snprintf(name, sizeof(name), "/dev/i2c%d", port);
37
38 *p_fd = open(name, 0);
39 if (*p_fd < 0) {
40 printf ("open %s failed, fd:%d\r\n", name, *p_fd);
41 ret = -EIO;
42 goto out;
43 }
44 // printf("p_fd is %d\r\n",*p_fd);
45 // printf("g_i2c_fd[%d] is %d\r\n",port,g_i2c_fd[port]);
46
47 i2c_ctrl.c.addr = i2c->config.dev_addr; /* sensor's address */
48 i2c_ctrl.c.addr_width = i2c->config.address_width; /* 7-bit address */
49 i2c_ctrl.c.role = 1; /* master mode */
50 ret = ioctl(*p_fd, IOC_I2C_SET_CONFIG, (unsigned long)&i2c_ctrl);
51 if (ret) {
52 printf ("set i2c config on %s failed\r\n", name);
53 goto out;
54 }
55
56 i2c_ctrl.freq = i2c->config.freq;
57 ret = ioctl(*p_fd, IOC_I2C_SET_FREQ, (unsigned long)&i2c_ctrl);
58 if (ret) {
59 printf ("set i2c config on %s failed\r\n", name);
60 goto out;
61 }
62 out:
63 if (!ret) {
64 i2c->priv = p_fd;
65 } else {
66 if (*p_fd >= 0)
67 close(*p_fd);
68 // free(p_fd);
69 // p_fd = NULL;
70 }
71 return ret;
72 }
73
vfs_i2c_master_send(i2c_dev_t * i2c,uint16_t dev_addr,const uint8_t * data,uint16_t size,uint32_t timeout)74 static int32_t vfs_i2c_master_send(i2c_dev_t *i2c, uint16_t dev_addr, const uint8_t *data,
75 uint16_t size, uint32_t timeout)
76 {
77 int32_t *p_fd = NULL;
78 int32_t ret = -1;
79 io_i2c_data_t i2c_data;
80
81 if (!i2c) {
82 return -EINVAL;
83 }
84
85 p_fd = &g_i2c_fd[i2c->port];
86 if (!p_fd || (*p_fd < 0)) {
87 printf ("i2c port[%d] has not been initialized\r\n",i2c->port);
88 return -EINVAL;
89 }
90
91 i2c_data.addr = dev_addr;
92 i2c_data.data = data;
93 i2c_data.length = size;
94 i2c_data.maddr = 0;
95 i2c_data.mlength = 0;
96 i2c_data.timeout = timeout;
97
98 ret = ioctl(*p_fd, IOC_I2C_MASTER_TX, (unsigned long)&i2c_data);
99
100 return ret;
101 }
102
vfs_i2c_master_recv(i2c_dev_t * i2c,uint16_t dev_addr,uint8_t * data,uint16_t size,uint32_t timeout)103 static int32_t vfs_i2c_master_recv(i2c_dev_t *i2c, uint16_t dev_addr, uint8_t *data,
104 uint16_t size, uint32_t timeout)
105 {
106 int32_t port = 0;
107 int32_t *p_fd = NULL;
108 int32_t ret = -1;
109 io_i2c_data_t i2c_data;
110
111 if (!i2c) {
112 printf ("i2c is null\r\n");
113 return -EINVAL;
114 }
115
116 p_fd = &g_i2c_fd[i2c->port];
117 if (!p_fd || (*p_fd < 0)) {
118 printf ("i2c port[%d] has not been initialized\r\n",i2c->port);
119 return -EINVAL;
120 }
121
122 i2c_data.addr = dev_addr;
123 i2c_data.data = data;
124 i2c_data.length = size;
125 i2c_data.maddr = 0;
126 i2c_data.mlength = 0;
127 i2c_data.timeout = timeout;
128
129 ret = ioctl(*p_fd, IOC_I2C_MASTER_RX, (unsigned long)&i2c_data);
130
131 return 0;
132 }
133
vfs_i2c_mem_write(i2c_dev_t * i2c,uint16_t dev_addr,uint16_t mem_addr,uint16_t mem_addr_size,const uint8_t * data,uint16_t size,uint32_t timeout)134 static int32_t vfs_i2c_mem_write(i2c_dev_t *i2c, uint16_t dev_addr, uint16_t mem_addr,
135 uint16_t mem_addr_size, const uint8_t *data, uint16_t size,
136 uint32_t timeout)
137 {
138 int32_t port = 0;
139 int32_t *p_fd = NULL;
140 int32_t ret = -1;
141 io_i2c_data_t i2c_data;
142
143 if (!i2c)
144 return -EINVAL;
145
146 p_fd = &g_i2c_fd[i2c->port];
147 if (!p_fd || (*p_fd < 0)) {
148 printf ("i2c port[%d] has not been initialized\r\n",i2c->port);
149 return -EINVAL;
150 }
151
152 i2c_data.addr = dev_addr;
153 i2c_data.data = data;
154 i2c_data.length = size;
155 i2c_data.maddr = mem_addr;
156 i2c_data.mlength = mem_addr_size;
157 i2c_data.timeout = timeout;
158
159
160 ret = ioctl(*p_fd, IOC_I2C_MEM_TX, (unsigned long)&i2c_data);
161 return 0;
162 }
163
vfs_i2c_mem_read(i2c_dev_t * i2c,uint16_t dev_addr,uint16_t mem_addr,uint16_t mem_addr_size,uint8_t * data,uint16_t size,uint32_t timeout)164 static int32_t vfs_i2c_mem_read(i2c_dev_t *i2c, uint16_t dev_addr, uint16_t mem_addr,
165 uint16_t mem_addr_size, uint8_t *data, uint16_t size,
166 uint32_t timeout)
167 {
168 int32_t port = 0;
169 int32_t *p_fd = NULL;
170 int32_t ret = -1;
171 io_i2c_data_t i2c_data;
172
173 if (!i2c)
174 return -EINVAL;
175
176 p_fd = &g_i2c_fd[i2c->port];
177 if (!p_fd || (*p_fd < 0)) {
178 printf ("i2c port[%d] has not been initialized\r\n",i2c->port);
179 return -EINVAL;
180 }
181
182 i2c_data.addr = dev_addr;
183 i2c_data.data = data;
184 i2c_data.length = size;
185 i2c_data.maddr = mem_addr;
186 i2c_data.mlength = mem_addr_size;
187 i2c_data.timeout = timeout;
188
189 ret = ioctl(*p_fd, IOC_I2C_MEM_RX, (unsigned long)&i2c_data);
190 return 0;
191 }
192
vfs_i2c_finalize(i2c_dev_t * i2c)193 static int32_t vfs_i2c_finalize(i2c_dev_t *i2c)
194 {
195 int32_t ret = 0;
196 int32_t port = 0;
197 int32_t *p_fd = NULL;
198
199 if (!i2c || !i2c->priv)
200 return -EINVAL;
201
202 // p_fd = (int32_t *)i2c->priv;
203 // if (*p_fd < 0)
204 // return -EIO;
205
206 p_fd = &g_i2c_fd[i2c->port];
207 if (!p_fd || (*p_fd < 0)) {
208 printf ("i2c port[%d] has not been initialized\r\n",i2c->port);
209 return -EINVAL;
210 }
211
212 if (*p_fd >= 0)
213 close(*p_fd);
214 else
215 ret = -EALREADY;
216
217 i2c->priv = NULL;
218
219 *p_fd = -1;
220 free(p_fd);
221
222 return ret;
223 }
224
225
sensor_i2c_init(i2c_dev_t * i2c)226 int32_t sensor_i2c_init(i2c_dev_t *i2c)
227 {
228 int32_t ret = 0;
229 if (i2c == NULL) {
230 return -1;
231 }
232
233 ret = vfs_i2c_init(i2c);
234
235 return ret;
236 }
237
sensor_i2c_read(i2c_dev_t * i2c,uint16_t reg,uint8_t * data,uint16_t size,uint32_t timeout)238 int32_t sensor_i2c_read(i2c_dev_t *i2c, uint16_t reg, uint8_t *data,
239 uint16_t size, uint32_t timeout)
240 {
241 int32_t ret = 0;
242 if (i2c == NULL) {
243 return -1;
244 }
245
246 #if SENSOR_CONFIG_I2C_ENABLE
247 ret = hal_i2c_mem_read(i2c, i2c->config.dev_addr, reg, I2C_REG_LEN, data,
248 size, timeout);
249 #else
250 ret = vfs_i2c_mem_read(i2c, i2c->config.dev_addr, reg, I2C_REG_LEN, data,
251 size, timeout);
252 #endif
253
254 return ret;
255 }
256
sensor_i2c_write(i2c_dev_t * i2c,uint16_t reg,uint8_t * data,uint16_t size,uint32_t timeout)257 int32_t sensor_i2c_write(i2c_dev_t *i2c, uint16_t reg, uint8_t *data,
258 uint16_t size, uint32_t timeout)
259 {
260 int32_t ret = 0;
261 if (i2c == NULL) {
262 return -1;
263 }
264 #if SENSOR_CONFIG_I2C_ENABLE
265 ret = hal_i2c_mem_write(i2c, i2c->config.dev_addr, reg, I2C_REG_LEN, data,
266 size, timeout);
267 #else
268 ret = vfs_i2c_mem_write(i2c, i2c->config.dev_addr, reg, I2C_REG_LEN, data,
269 size, timeout);
270 #endif
271 return ret;
272 }
273
sensor_drv_i2c_master_send(i2c_dev_t * i2c,uint8_t * data,uint16_t size,uint32_t timeout)274 int32_t sensor_drv_i2c_master_send(i2c_dev_t *i2c, uint8_t *data,
275 uint16_t size, uint32_t timeout)
276 {
277 int32_t ret = 0;
278 if (i2c == NULL) {
279 return -1;
280 }
281 #if SENSOR_CONFIG_I2C_ENABLE
282 ret = hal_i2c_master_send(i2c, i2c->config.dev_addr, data,
283 size, timeout);
284 #else
285 ret = vfs_i2c_master_send(i2c, i2c->config.dev_addr, data,
286 size, timeout);
287 #endif
288 return ret;
289 }
290
sensor_drv_i2c_master_recv(i2c_dev_t * i2c,uint8_t * data,uint16_t size,uint32_t timeout)291 int32_t sensor_drv_i2c_master_recv(i2c_dev_t *i2c, uint8_t *data,
292 uint16_t size, uint32_t timeout)
293 {
294 int32_t ret = 0;
295 if (i2c == NULL) {
296 return -1;
297 }
298 #if SENSOR_CONFIG_I2C_ENABLE
299 ret = hal_i2c_master_recv(i2c, i2c->config.dev_addr, data,
300 size, timeout);
301 #else
302 ret = vfs_i2c_master_recv(i2c, i2c->config.dev_addr, data,
303 size, timeout);
304 #endif
305 return ret;
306 }
307
sensor_spi_read(spi_dev_t * spi,uint8_t * tx,uint8_t * rx,uint16_t size,uint32_t timeout)308 int32_t sensor_spi_read(spi_dev_t *spi, uint8_t *tx, uint8_t *rx, uint16_t size,
309 uint32_t timeout)
310 {
311 int32_t ret = 0;
312 if (spi == NULL) {
313 return -1;
314 }
315 #if SENSOR_CONFIG_SPI_ENABLE
316 ret = hal_spi_send_recv(spi, tx, rx, size, timeout);
317 #endif
318 return ret;
319 }
sensor_spi_write(spi_dev_t * spi,uint8_t * data,uint16_t size,uint32_t timeout)320 int32_t sensor_spi_write(spi_dev_t *spi, uint8_t *data, uint16_t size,
321 uint32_t timeout)
322 {
323 int32_t ret = 0;
324 if (spi == NULL) {
325 return -1;
326 }
327 #if SENSOR_CONFIG_SPI_ENABLE
328 ret = hal_spi_send(spi, data, size, timeout);
329 #endif
330 return ret;
331 }
332
sensor_io_read(sensor_io_dev_t * dev,uint8_t * reg,uint8_t * data,uint16_t size,uint32_t timeout)333 int32_t sensor_io_read(sensor_io_dev_t* dev, uint8_t* reg, uint8_t* data, uint16_t size,uint32_t timeout)
334 {
335 int ret = -1;
336 if(NULL == dev){
337 return -1;
338 }
339
340 if(NULL == reg){
341 return -1;
342 }
343
344 if(NULL == data){
345 return -1;
346 }
347 switch(dev->io_port){
348 case I2C_PORT:{
349 uint16_t addr = *((uint16_t*)reg);
350 ret = sensor_i2c_read(&(dev->dev_i2c), addr, data, size, timeout);
351 break;
352 }
353
354 case SPI_PORT:{
355 ret = sensor_spi_read(&(dev->dev_spi), reg, data, size, timeout);
356 break;
357 }
358
359 default:
360 break;
361 }
362
363 return ret;
364 }
365
sensor_io_write(sensor_io_dev_t * dev,uint8_t * reg,uint8_t * data,uint16_t size,uint32_t timeout)366 int32_t sensor_io_write(sensor_io_dev_t* dev, uint8_t* reg, uint8_t *data, uint16_t size, uint32_t timeout)
367 {
368 int ret = -1;
369 if(NULL == dev){
370 return -1;
371 }
372 if(NULL == data){
373 return -1;
374 }
375
376 switch(dev->io_port){
377 case I2C_PORT:{
378 if(NULL == reg){
379 return -1;
380 }
381 uint16_t addr = *((uint16_t*)reg);
382
383 ret = sensor_i2c_write(&(dev->dev_i2c), addr, data, size, timeout);
384 break;
385 }
386
387 case SPI_PORT:{
388 ret = sensor_spi_write(&(dev->dev_spi), data, size, timeout);
389 break;
390 }
391
392 default:
393 break;
394 }
395
396 return ret;
397 }
398