1 /*
2  * Copyright (C) 2015-2017 Alibaba Group Holding Limited
3  *
4  *
5  */
6 
7 /* Includes ------------------------------------------------------------------*/
8 #include <string.h>
9 
10 #include "vl53l0x/vl53l0x_def.h"
11 #include "vl53l0x/vl53l0x_api.h"
12 #include "vl53l0x_platform.h"
13 #include "sensor_drv_api.h"
14 
15 
16 /* Private typedef -----------------------------------------------------------*/
17 /* Private define ------------------------------------------------------------*/
18 #define I2C_TIME_OUT_BASE 30
19 #define I2C_TIME_OUT_BYTE 5
20 #define AOS_WAIT_TIMEOUT 100
21 //#define VL53L0X_OsDelay(...) HAL_Delay(2)
22 #define VL53L0X_OsDelay(...) aos_msleep(2)
23 /* Private macro -------------------------------------------------------------*/
24 /* Private variables ---------------------------------------------------------*/
25 /* Private function prototypes -----------------------------------------------*/
26 /* Exported functions --------------------------------------------------------*/
27 extern i2c_dev_t vl53l0x_ctx_i2c;
28 
VL53L0X_RdByte(VL53L0X_DEV Dev,uint8_t index,uint8_t * data)29 VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data)
30 {
31     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
32     int32_t       status_int;
33     int           i2c_time_out = I2C_TIME_OUT_BASE + I2C_TIME_OUT_BYTE;
34     status_int =
35       sensor_i2c_read(&vl53l0x_ctx_i2c, index, data, 1, i2c_time_out);
36     if (status_int < 0) {
37         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
38         goto done;
39     }
40 done:
41     return Status;
42 }
43 
44 
45 // the ranging_sensor_comms.dll will take care of the page selection
VL53L0X_WriteMulti(VL53L0X_DEV Dev,uint8_t index,uint8_t * pdata,uint32_t count)46 VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata,
47                                  uint32_t count)
48 {
49     int           status_int;
50     VL53L0X_Error Status       = VL53L0X_ERROR_NONE;
51     int           i2c_time_out = I2C_TIME_OUT_BASE + count * I2C_TIME_OUT_BYTE;
52     status_int =
53       sensor_i2c_write(&vl53l0x_ctx_i2c, index, pdata, count, i2c_time_out);
54     if (status_int < 0) {
55         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
56     }
57 
58     return Status;
59 }
60 
61 // the ranging_sensor_comms.dll will take care of the page selection
VL53L0X_ReadMulti(VL53L0X_DEV Dev,uint8_t index,uint8_t * pdata,uint32_t count)62 VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata,
63                                 uint32_t count)
64 {
65     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
66     int32_t       status_int;
67     int           i2c_time_out = I2C_TIME_OUT_BASE + count * I2C_TIME_OUT_BYTE;
68     status_int =
69       sensor_i2c_read(&vl53l0x_ctx_i2c, index, pdata, count, i2c_time_out);
70     if (status_int < 0) {
71         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
72         goto done;
73     }
74 done:
75     return Status;
76 }
77 
78 
VL53L0X_RdWord(VL53L0X_DEV Dev,uint8_t index,uint16_t * data)79 VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data)
80 {
81     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
82     int32_t       status_int;
83     uint8_t       mdata[2]     = { 0 };
84     int           i2c_time_out = I2C_TIME_OUT_BASE + 2 * I2C_TIME_OUT_BYTE;
85     status_int =
86       sensor_i2c_read(&vl53l0x_ctx_i2c, index, &mdata[0], 2, i2c_time_out);
87     if (status_int < 0) {
88         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
89         goto done;
90     }
91 
92     *data = ((uint16_t)mdata[0] << 8) + (uint16_t)mdata[1];
93 done:
94     return Status;
95 }
96 
VL53L0X_RdDWord(VL53L0X_DEV Dev,uint8_t index,uint32_t * data)97 VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data)
98 {
99     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
100     int32_t       status_int;
101     uint8_t       mdata[4]     = { 0 };
102     int           i2c_time_out = I2C_TIME_OUT_BASE + 4 * I2C_TIME_OUT_BYTE;
103     status_int =
104       sensor_i2c_read(&vl53l0x_ctx_i2c, index, &mdata[0], 4, i2c_time_out);
105     if (status_int < 0) {
106         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
107         goto done;
108     }
109 
110     *data = ((uint32_t)mdata[0] << 24) + ((uint32_t)mdata[1] << 16) +
111             ((uint32_t)mdata[2] << 8) + (uint32_t)mdata[3];
112 
113 done:
114     return Status;
115 }
116 
VL53L0X_WrByte(VL53L0X_DEV Dev,uint8_t index,uint8_t data)117 VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data)
118 {
119     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
120     int32_t       status_int;
121     uint8_t       mdata        = data;
122     int           i2c_time_out = I2C_TIME_OUT_BASE + I2C_TIME_OUT_BYTE;
123     status_int =
124       sensor_i2c_write(&vl53l0x_ctx_i2c, index, &mdata, 1, i2c_time_out);
125     if (status_int < 0) {
126         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
127     }
128 
129     return Status;
130 }
131 
VL53L0X_WrWord(VL53L0X_DEV Dev,uint8_t index,uint16_t data)132 VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data)
133 {
134     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
135     int32_t       status_int;
136     int           i2c_time_out = I2C_TIME_OUT_BASE + 2 * I2C_TIME_OUT_BYTE;
137     uint8_t       mdata[2]     = { 0 };
138     mdata[0]                   = data >> 8;
139     mdata[1]                   = data & 0x00FF;
140     status_int =
141       sensor_i2c_write(&vl53l0x_ctx_i2c, index, &mdata[0], 2, i2c_time_out);
142     if (status_int < 0) {
143         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
144     }
145 
146     return Status;
147 }
148 
VL53L0X_WrDWord(VL53L0X_DEV Dev,uint8_t index,uint32_t data)149 VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data)
150 {
151     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
152     int32_t       status_int;
153     int           i2c_time_out = I2C_TIME_OUT_BASE + 4 * I2C_TIME_OUT_BYTE;
154     uint8_t       mdata[4]     = { 0 };
155     mdata[0]                   = (data >> 24) & 0xFF;
156     mdata[1]                   = (data >> 16) & 0xFF;
157     mdata[2]                   = (data >> 8) & 0xFF;
158     mdata[3]                   = (data >> 0) & 0xFF;
159     status_int =
160       sensor_i2c_write(&vl53l0x_ctx_i2c, index, &mdata[0], 4, i2c_time_out);
161     if (status_int < 0) {
162         Status = VL53L0X_ERROR_CONTROL_INTERFACE;
163     }
164 
165     return Status;
166 }
167 
VL53L0X_UpdateByte(VL53L0X_DEV Dev,uint8_t index,uint8_t AndData,uint8_t OrData)168 VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index,
169                                  uint8_t AndData, uint8_t OrData)
170 {
171     VL53L0X_Error Status = VL53L0X_ERROR_NONE;
172     uint8_t       data;
173 
174     Status = VL53L0X_RdByte(Dev, index, &data);
175 
176     if (Status) {
177         goto done;
178     }
179 
180     data   = (data & AndData) | OrData;
181     Status = VL53L0X_WrByte(Dev, index, data);
182 done:
183     return Status;
184 }
185 
VL53L0X_PollingDelay(VL53L0X_DEV Dev)186 VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev)
187 {
188     VL53L0X_Error status = VL53L0X_ERROR_NONE;
189 
190     // do nothing
191     VL53L0X_OsDelay();
192     return status;
193 }
194 
195 
196 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
197