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