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