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