1 /*
2 * Copyright (c) 2017, STMicroelectronics - All Rights Reserved
3 *
4 * This file is part of VL53L1 Core and is dual licensed,
5 * either 'STMicroelectronics
6 * Proprietary license'
7 * or 'BSD 3-clause "New" or "Revised" License' , at your option.
8 *
9 ********************************************************************************
10 *
11 * 'STMicroelectronics Proprietary license'
12 *
13 ********************************************************************************
14 *
15 * License terms: STMicroelectronics Proprietary in accordance with licensing
16 * terms at www.st.com/sla0081
17 *
18 * STMicroelectronics confidential
19 * Reproduction and Communication of this document is strictly prohibited unless
20 * specifically authorized in writing by STMicroelectronics.
21 *
22 *
23 ********************************************************************************
24 *
25 * Alternatively, VL53L1 Core may be distributed under the terms of
26 * 'BSD 3-clause "New" or "Revised" License', in which case the following
27 * provisions apply instead of the ones mentioned above :
28 *
29 ********************************************************************************
30 *
31 * License terms: BSD 3-clause "New" or "Revised" License.
32 *
33 * Redistribution and use in source and binary forms, with or without
34 * modification, are permitted provided that the following conditions are met:
35 *
36 * 1. Redistributions of source code must retain the above copyright notice, this
37 * list of conditions and the following disclaimer.
38 *
39 * 2. Redistributions in binary form must reproduce the above copyright notice,
40 * this list of conditions and the following disclaimer in the documentation
41 * and/or other materials provided with the distribution.
42 *
43 * 3. Neither the name of the copyright holder nor the names of its contributors
44 * may be used to endorse or promote products derived from this software
45 * without specific prior written permission.
46 *
47 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
48 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
49 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
50 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
51 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
52 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
53 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
54 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
55 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
56 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
57 *
58 *
59 ********************************************************************************
60 *
61 */
62
63 /**
64 * @file vl53l1_api_preset_modes.c
65 *
66 * @brief EwokPlus25 API Preset Modes definitions
67 */
68
69 #include "vl53l1_ll_def.h"
70 #include "vl53l1_platform_log.h"
71 #include "vl53l1_register_structs.h"
72 #include "vl53l1_register_settings.h"
73 #include "vl53l1_core.h"
74 #include "vl53l1_api_preset_modes.h"
75 #include "vl53l1_tuning_parm_defaults.h"
76
77
78 #define LOG_FUNCTION_START(fmt, ...) \
79 _LOG_FUNCTION_START(VL53L1_TRACE_MODULE_API, fmt, ##__VA_ARGS__)
80 #define LOG_FUNCTION_END(status, ...) \
81 _LOG_FUNCTION_END(VL53L1_TRACE_MODULE_API, status, ##__VA_ARGS__)
82 #define LOG_FUNCTION_END_FMT(status, fmt, ...) \
83 _LOG_FUNCTION_END_FMT(VL53L1_TRACE_MODULE_API, status, fmt, ##__VA_ARGS__)
84
85
86 #ifndef VL53L1_NOCALIB
VL53L1_init_refspadchar_config_struct(VL53L1_refspadchar_config_t * pdata)87 VL53L1_Error VL53L1_init_refspadchar_config_struct(
88 VL53L1_refspadchar_config_t *pdata)
89 {
90 /*
91 * Initializes Ref SPAD Char data structures preset mode
92 */
93
94 VL53L1_Error status = VL53L1_ERROR_NONE;
95
96 LOG_FUNCTION_START("");
97
98 /* Reference SPAD Char Configuration
99 *
100 * vcsel_period = 0x0B - 24 clock VCSEL period
101 * timeout_us = 1000 - Set 1000us phase cal timeout
102 * target_count_rate_mcps = 0x0A00 - 9.7 -> 20.0 Mcps
103 * min_count_rate_limit_mcps = 0x0500 - 9.7 -> 10.0 Mcps
104 * max_count_rate_limit_mcps = 0x1400 - 9.7 -> 40.0 Mcps
105 */
106
107 pdata->device_test_mode =
108 VL53L1_TUNINGPARM_REFSPADCHAR_DEVICE_TEST_MODE_DEFAULT;
109 pdata->vcsel_period =
110 VL53L1_TUNINGPARM_REFSPADCHAR_VCSEL_PERIOD_DEFAULT;
111 pdata->timeout_us =
112 VL53L1_TUNINGPARM_REFSPADCHAR_PHASECAL_TIMEOUT_US_DEFAULT;
113 pdata->target_count_rate_mcps =
114 VL53L1_TUNINGPARM_REFSPADCHAR_TARGET_COUNT_RATE_MCPS_DEFAULT;
115 pdata->min_count_rate_limit_mcps =
116 VL53L1_TUNINGPARM_REFSPADCHAR_MIN_COUNTRATE_LIMIT_MCPS_DEFAULT;
117 pdata->max_count_rate_limit_mcps =
118 VL53L1_TUNINGPARM_REFSPADCHAR_MAX_COUNTRATE_LIMIT_MCPS_DEFAULT;
119
120 LOG_FUNCTION_END(status);
121
122 return status;
123 }
124 #endif
125
126
127 #ifndef VL53L1_NOCALIB
VL53L1_init_ssc_config_struct(VL53L1_ssc_config_t * pdata)128 VL53L1_Error VL53L1_init_ssc_config_struct(
129 VL53L1_ssc_config_t *pdata)
130 {
131 /*
132 * Initializes SPAD Self Check (SSC) data structure
133 */
134
135 VL53L1_Error status = VL53L1_ERROR_NONE;
136
137 LOG_FUNCTION_START("");
138
139 /* SPAD Select Check Configuration */
140
141 /* 0 - store RTN count rates
142 * 1 - store REF count rates
143 */
144 pdata->array_select = VL53L1_DEVICESSCARRAY_RTN;
145
146 /* VCSEL period register value 0x12 (18) -> 38 VCSEL clocks */
147 pdata->vcsel_period =
148 VL53L1_TUNINGPARM_SPADMAP_VCSEL_PERIOD_DEFAULT;
149
150 /* VCSEL pulse start */
151 pdata->vcsel_start =
152 VL53L1_TUNINGPARM_SPADMAP_VCSEL_START_DEFAULT;
153
154 /* VCSEL pulse width */
155 pdata->vcsel_width = 0x02;
156
157 /* SSC timeout [us] */
158 pdata->timeout_us = 36000;
159
160 /* SSC rate limit [Mcps]
161 * - 9.7 for VCSEL ON
162 * - 1.15 for VCSEL OFF
163 */
164 pdata->rate_limit_mcps =
165 VL53L1_TUNINGPARM_SPADMAP_RATE_LIMIT_MCPS_DEFAULT;
166
167 LOG_FUNCTION_END(status);
168
169 return status;
170 }
171 #endif
172
173
VL53L1_init_xtalk_config_struct(VL53L1_customer_nvm_managed_t * pnvm,VL53L1_xtalk_config_t * pdata)174 VL53L1_Error VL53L1_init_xtalk_config_struct(
175 VL53L1_customer_nvm_managed_t *pnvm,
176 VL53L1_xtalk_config_t *pdata)
177 {
178 /*
179 * Initializes Xtalk Config structure
180 */
181
182 VL53L1_Error status = VL53L1_ERROR_NONE;
183
184 LOG_FUNCTION_START("");
185
186 /* Xtalk default configuration
187 *
188 * algo__crosstalk_compensation_plane_offset_kcps
189 * = pdev->customer.algo__crosstalk_compensation_plane_offset_kcps
190 * algo__crosstalk_compensation_x_plane_gradient_kcps
191 * = pdev->customer.algo__crosstalk_compensation_x_plane_gradient_kcps
192 * algo__crosstalk_compensation_y_plane_gradient_kcps
193 * = pdev->customer.algo__crosstalk_compensation_y_plane_gradient_kcps
194 *
195 */
196
197 /* Store xtalk data into golden copy */
198
199 pdata->algo__crosstalk_compensation_plane_offset_kcps =
200 pnvm->algo__crosstalk_compensation_plane_offset_kcps;
201 pdata->algo__crosstalk_compensation_x_plane_gradient_kcps =
202 pnvm->algo__crosstalk_compensation_x_plane_gradient_kcps;
203 pdata->algo__crosstalk_compensation_y_plane_gradient_kcps =
204 pnvm->algo__crosstalk_compensation_y_plane_gradient_kcps;
205
206 /* Store NVM defaults for later use */
207
208 pdata->nvm_default__crosstalk_compensation_plane_offset_kcps =
209 (uint32_t)pnvm->algo__crosstalk_compensation_plane_offset_kcps;
210 pdata->nvm_default__crosstalk_compensation_x_plane_gradient_kcps =
211 pnvm->algo__crosstalk_compensation_x_plane_gradient_kcps;
212 pdata->nvm_default__crosstalk_compensation_y_plane_gradient_kcps =
213 pnvm->algo__crosstalk_compensation_y_plane_gradient_kcps;
214
215 pdata->lite_mode_crosstalk_margin_kcps =
216 VL53L1_TUNINGPARM_LITE_XTALK_MARGIN_KCPS_DEFAULT;
217
218 /* Default for Range Ignore Threshold Mult = 2.0 */
219
220 pdata->crosstalk_range_ignore_threshold_mult =
221 VL53L1_TUNINGPARM_LITE_RIT_MULT_DEFAULT;
222
223 if ((pdata->algo__crosstalk_compensation_plane_offset_kcps == 0x00)
224 && (pdata->algo__crosstalk_compensation_x_plane_gradient_kcps == 0x00)
225 && (pdata->algo__crosstalk_compensation_y_plane_gradient_kcps == 0x00))
226 pdata->global_crosstalk_compensation_enable = 0x00;
227 else
228 pdata->global_crosstalk_compensation_enable = 0x01;
229
230
231 if ((status == VL53L1_ERROR_NONE) &&
232 (pdata->global_crosstalk_compensation_enable == 0x01)) {
233 pdata->crosstalk_range_ignore_threshold_rate_mcps =
234 VL53L1_calc_range_ignore_threshold(
235 pdata->algo__crosstalk_compensation_plane_offset_kcps,
236 pdata->algo__crosstalk_compensation_x_plane_gradient_kcps,
237 pdata->algo__crosstalk_compensation_y_plane_gradient_kcps,
238 pdata->crosstalk_range_ignore_threshold_mult);
239 } else {
240 pdata->crosstalk_range_ignore_threshold_rate_mcps = 0;
241 }
242
243 LOG_FUNCTION_END(status);
244
245 return status;
246 }
247
248 #ifndef VL53L1_NOCALIB
VL53L1_init_offset_cal_config_struct(VL53L1_offsetcal_config_t * pdata)249 VL53L1_Error VL53L1_init_offset_cal_config_struct(
250 VL53L1_offsetcal_config_t *pdata)
251 {
252 /*
253 * Initializes Offset Calibration Config structure
254 * - for use with VL53L1_run_offset_calibration()
255 */
256
257 VL53L1_Error status = VL53L1_ERROR_NONE;
258
259 LOG_FUNCTION_START("");
260
261 /* Preset Timeout and DSS defaults */
262
263 pdata->dss_config__target_total_rate_mcps =
264 VL53L1_TUNINGPARM_OFFSET_CAL_DSS_RATE_MCPS_DEFAULT;
265 /* 20.0 Mcps */
266 pdata->phasecal_config_timeout_us =
267 VL53L1_TUNINGPARM_OFFSET_CAL_PHASECAL_TIMEOUT_US_DEFAULT;
268 /* 1000 us */
269 pdata->range_config_timeout_us =
270 VL53L1_TUNINGPARM_OFFSET_CAL_RANGE_TIMEOUT_US_DEFAULT;
271 /* 13000 us */
272 pdata->mm_config_timeout_us =
273 VL53L1_TUNINGPARM_OFFSET_CAL_MM_TIMEOUT_US_DEFAULT;
274 /* 13000 us - Added as part of Patch_AddedOffsetCalMMTuningParm_11791 */
275
276 /* Init number of averaged samples */
277
278 pdata->pre_num_of_samples =
279 VL53L1_TUNINGPARM_OFFSET_CAL_PRE_SAMPLES_DEFAULT;
280 pdata->mm1_num_of_samples =
281 VL53L1_TUNINGPARM_OFFSET_CAL_MM1_SAMPLES_DEFAULT;
282 pdata->mm2_num_of_samples =
283 VL53L1_TUNINGPARM_OFFSET_CAL_MM2_SAMPLES_DEFAULT;
284
285 LOG_FUNCTION_END(status);
286
287 return status;
288 }
289 #endif
290
VL53L1_init_tuning_parm_storage_struct(VL53L1_tuning_parm_storage_t * pdata)291 VL53L1_Error VL53L1_init_tuning_parm_storage_struct(
292 VL53L1_tuning_parm_storage_t *pdata)
293 {
294 /*
295 * Initializes Tuning Param storage structure
296 */
297
298 VL53L1_Error status = VL53L1_ERROR_NONE;
299
300 LOG_FUNCTION_START("");
301
302 /* Default configuration
303 *
304 * - Custom overwrite possible from vl53l1_set_tuning_parms()
305 * - via tuning file input
306 */
307
308 pdata->tp_tuning_parm_version =
309 VL53L1_TUNINGPARM_VERSION_DEFAULT;
310 pdata->tp_tuning_parm_key_table_version =
311 VL53L1_TUNINGPARM_KEY_TABLE_VERSION_DEFAULT;
312 pdata->tp_tuning_parm_lld_version =
313 VL53L1_TUNINGPARM_LLD_VERSION_DEFAULT;
314 pdata->tp_init_phase_rtn_lite_long =
315 VL53L1_TUNINGPARM_INITIAL_PHASE_RTN_LITE_LONG_RANGE_DEFAULT;
316 pdata->tp_init_phase_rtn_lite_med =
317 VL53L1_TUNINGPARM_INITIAL_PHASE_RTN_LITE_MED_RANGE_DEFAULT;
318 pdata->tp_init_phase_rtn_lite_short =
319 VL53L1_TUNINGPARM_INITIAL_PHASE_RTN_LITE_SHORT_RANGE_DEFAULT;
320 pdata->tp_init_phase_ref_lite_long =
321 VL53L1_TUNINGPARM_INITIAL_PHASE_REF_LITE_LONG_RANGE_DEFAULT;
322 pdata->tp_init_phase_ref_lite_med =
323 VL53L1_TUNINGPARM_INITIAL_PHASE_REF_LITE_MED_RANGE_DEFAULT;
324 pdata->tp_init_phase_ref_lite_short =
325 VL53L1_TUNINGPARM_INITIAL_PHASE_REF_LITE_SHORT_RANGE_DEFAULT;
326 pdata->tp_consistency_lite_phase_tolerance =
327 VL53L1_TUNINGPARM_CONSISTENCY_LITE_PHASE_TOLERANCE_DEFAULT;
328 pdata->tp_phasecal_target =
329 VL53L1_TUNINGPARM_PHASECAL_TARGET_DEFAULT;
330 pdata->tp_cal_repeat_rate =
331 VL53L1_TUNINGPARM_LITE_CAL_REPEAT_RATE_DEFAULT;
332 pdata->tp_lite_min_clip =
333 VL53L1_TUNINGPARM_LITE_MIN_CLIP_MM_DEFAULT;
334 pdata->tp_lite_long_sigma_thresh_mm =
335 VL53L1_TUNINGPARM_LITE_LONG_SIGMA_THRESH_MM_DEFAULT;
336 pdata->tp_lite_med_sigma_thresh_mm =
337 VL53L1_TUNINGPARM_LITE_MED_SIGMA_THRESH_MM_DEFAULT;
338 pdata->tp_lite_short_sigma_thresh_mm =
339 VL53L1_TUNINGPARM_LITE_SHORT_SIGMA_THRESH_MM_DEFAULT;
340 pdata->tp_lite_long_min_count_rate_rtn_mcps =
341 VL53L1_TUNINGPARM_LITE_LONG_MIN_COUNT_RATE_RTN_MCPS_DEFAULT;
342 pdata->tp_lite_med_min_count_rate_rtn_mcps =
343 VL53L1_TUNINGPARM_LITE_MED_MIN_COUNT_RATE_RTN_MCPS_DEFAULT;
344 pdata->tp_lite_short_min_count_rate_rtn_mcps =
345 VL53L1_TUNINGPARM_LITE_SHORT_MIN_COUNT_RATE_RTN_MCPS_DEFAULT;
346 pdata->tp_lite_sigma_est_pulse_width_ns =
347 VL53L1_TUNINGPARM_LITE_SIGMA_EST_PULSE_WIDTH_DEFAULT;
348 pdata->tp_lite_sigma_est_amb_width_ns =
349 VL53L1_TUNINGPARM_LITE_SIGMA_EST_AMB_WIDTH_NS_DEFAULT;
350 pdata->tp_lite_sigma_ref_mm =
351 VL53L1_TUNINGPARM_LITE_SIGMA_REF_MM_DEFAULT;
352 pdata->tp_lite_seed_cfg =
353 VL53L1_TUNINGPARM_LITE_SEED_CONFIG_DEFAULT;
354 pdata->tp_timed_seed_cfg =
355 VL53L1_TUNINGPARM_TIMED_SEED_CONFIG_DEFAULT;
356 pdata->tp_lite_quantifier =
357 VL53L1_TUNINGPARM_LITE_QUANTIFIER_DEFAULT;
358 pdata->tp_lite_first_order_select =
359 VL53L1_TUNINGPARM_LITE_FIRST_ORDER_SELECT_DEFAULT;
360
361 /* Preset Mode Configurations */
362 /* - New parms added as part of Patch_TuningParmPresetModeAddition_11839 */
363
364 pdata->tp_dss_target_lite_mcps =
365 VL53L1_TUNINGPARM_LITE_DSS_CONFIG_TARGET_TOTAL_RATE_MCPS_DEFAULT;
366 pdata->tp_dss_target_timed_mcps =
367 VL53L1_TUNINGPARM_TIMED_DSS_CONFIG_TARGET_TOTAL_RATE_MCPS_DEFAULT;
368 pdata->tp_phasecal_timeout_lite_us =
369 VL53L1_TUNINGPARM_LITE_PHASECAL_CONFIG_TIMEOUT_US;
370 pdata->tp_phasecal_timeout_timed_us =
371 VL53L1_TUNINGPARM_TIMED_PHASECAL_CONFIG_TIMEOUT_US_DEFAULT;
372 pdata->tp_mm_timeout_lite_us =
373 VL53L1_TUNINGPARM_LITE_MM_CONFIG_TIMEOUT_US_DEFAULT;
374 pdata->tp_mm_timeout_timed_us =
375 VL53L1_TUNINGPARM_TIMED_MM_CONFIG_TIMEOUT_US_DEFAULT;
376 pdata->tp_range_timeout_lite_us =
377 VL53L1_TUNINGPARM_LITE_RANGE_CONFIG_TIMEOUT_US_DEFAULT;
378 pdata->tp_range_timeout_timed_us =
379 VL53L1_TUNINGPARM_TIMED_RANGE_CONFIG_TIMEOUT_US_DEFAULT;
380
381 /* Added for Patch_LowPowerAutoMode */
382
383 pdata->tp_mm_timeout_lpa_us =
384 VL53L1_TUNINGPARM_LOWPOWERAUTO_MM_CONFIG_TIMEOUT_US_DEFAULT;
385 pdata->tp_range_timeout_lpa_us =
386 VL53L1_TUNINGPARM_LOWPOWERAUTO_RANGE_CONFIG_TIMEOUT_US_DEFAULT;
387
388
389 LOG_FUNCTION_END(status);
390
391 return status;
392 }
393
394
VL53L1_preset_mode_standard_ranging(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)395 VL53L1_Error VL53L1_preset_mode_standard_ranging(
396 VL53L1_static_config_t *pstatic,
397 VL53L1_general_config_t *pgeneral,
398 VL53L1_timing_config_t *ptiming,
399 VL53L1_dynamic_config_t *pdynamic,
400 VL53L1_system_control_t *psystem,
401 VL53L1_tuning_parm_storage_t *ptuning_parms)
402 {
403 /*
404 * Initializes static and dynamic data structures fordevice preset mode
405 * VL53L1_DEVICEPRESETMODE_STANDARD_RANGING
406 *
407 * - streaming
408 * - single sigma delta
409 * - back to back
410 *
411 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
412 */
413
414 VL53L1_Error status = VL53L1_ERROR_NONE;
415
416 LOG_FUNCTION_START("");
417
418 /* Static Configuration */
419
420 /* dss_config__target_total_rate_mcps = 20.0 Mcps 9.7 fp */
421 pstatic->dss_config__target_total_rate_mcps = 0x0A00;
422 pstatic->debug__ctrl = 0x00;
423 pstatic->test_mode__ctrl = 0x00;
424 pstatic->clk_gating__ctrl = 0x00;
425 pstatic->nvm_bist__ctrl = 0x00;
426 pstatic->nvm_bist__num_nvm_words = 0x00;
427 pstatic->nvm_bist__start_address = 0x00;
428 pstatic->host_if__status = 0x00;
429 pstatic->pad_i2c_hv__config = 0x00;
430 pstatic->pad_i2c_hv__extsup_config = 0x00;
431
432 /*
433 * 0 - gpio__extsup_hv
434 * 1 - gpio__vmodeint_hv
435 */
436 pstatic->gpio_hv_pad__ctrl = 0x00;
437
438 /*
439 * Set interrupt active low
440 *
441 * 3:0 - gpio__mux_select_hv
442 * 4 - gpio__mux_active_high_hv
443 */
444 pstatic->gpio_hv_mux__ctrl = \
445 VL53L1_DEVICEINTERRUPTPOLARITY_ACTIVE_LOW | \
446 VL53L1_DEVICEGPIOMODE_OUTPUT_RANGE_AND_ERROR_INTERRUPTS;
447
448 pstatic->gpio__tio_hv_status = 0x02;
449 pstatic->gpio__fio_hv_status = 0x00;
450 pstatic->ana_config__spad_sel_pswidth = 0x02;
451 pstatic->ana_config__vcsel_pulse_width_offset = 0x08;
452 pstatic->ana_config__fast_osc__config_ctrl = 0x00;
453
454 pstatic->sigma_estimator__effective_pulse_width_ns =
455 ptuning_parms->tp_lite_sigma_est_pulse_width_ns;
456 pstatic->sigma_estimator__effective_ambient_width_ns =
457 ptuning_parms->tp_lite_sigma_est_amb_width_ns;
458 pstatic->sigma_estimator__sigma_ref_mm =
459 ptuning_parms->tp_lite_sigma_ref_mm;
460 /* Minimum allowable value of 1 - 0 disables the feature */
461 pstatic->algo__crosstalk_compensation_valid_height_mm = 0x01;
462 pstatic->spare_host_config__static_config_spare_0 = 0x00;
463 pstatic->spare_host_config__static_config_spare_1 = 0x00;
464
465 pstatic->algo__range_ignore_threshold_mcps = 0x0000;
466
467 /* set RIT distance to 20 mm */
468 pstatic->algo__range_ignore_valid_height_mm = 0xff;
469 pstatic->algo__range_min_clip =
470 ptuning_parms->tp_lite_min_clip;
471 /*
472 * Phase consistency check limit - format 1.3 fp
473 * 0x02 -> 0.25
474 * 0x08 -> 1.00
475 */
476 pstatic->algo__consistency_check__tolerance =
477 ptuning_parms->tp_consistency_lite_phase_tolerance;
478 pstatic->spare_host_config__static_config_spare_2 = 0x00;
479 pstatic->sd_config__reset_stages_msb = 0x00;
480 pstatic->sd_config__reset_stages_lsb = 0x00;
481
482 pgeneral->gph_config__stream_count_update_value = 0x00;
483 pgeneral->global_config__stream_divider = 0x00;
484 pgeneral->system__interrupt_config_gpio =
485 VL53L1_INTERRUPT_CONFIG_NEW_SAMPLE_READY;
486 pgeneral->cal_config__vcsel_start = 0x0B;
487
488 /*
489 * Set VHV / Phase Cal repeat rate to 1 every
490 * 60 * 60 ranges (once every minute @ 60Hz)
491 * 0 - disables
492 * 12-bit value -> 4095 max
493 */
494 pgeneral->cal_config__repeat_rate =
495 ptuning_parms->tp_cal_repeat_rate;
496 pgeneral->global_config__vcsel_width = 0x02;
497 /* 13 macro periods gives a timeout of 1ms */
498 pgeneral->phasecal_config__timeout_macrop = 0x0D;
499 /* Phase cal target phase 2.0625 - 4.4 fp -> 0x21*/
500 pgeneral->phasecal_config__target =
501 ptuning_parms->tp_phasecal_target;
502 pgeneral->phasecal_config__override = 0x00;
503 pgeneral->dss_config__roi_mode_control =
504 VL53L1_DEVICEDSSMODE__TARGET_RATE;
505 /* format for threshold high and low is 9.7 fp */
506 pgeneral->system__thresh_rate_high = 0x0000;
507 pgeneral->system__thresh_rate_low = 0x0000;
508 /* The format for manual effective spads is 8.8 -> 0x8C00 = 140.00 */
509 pgeneral->dss_config__manual_effective_spads_select = 0x8C00;
510 pgeneral->dss_config__manual_block_select = 0x00;
511
512 /*
513 * Aperture attenuation value - format 0.8
514 *
515 * Nominal: 5x -> 0.200000 * 256 = 51 = 0x33
516 * Measured: 4.6x -> 0.217391 * 256 = 56 = 0x38
517 */
518 pgeneral->dss_config__aperture_attenuation = 0x38;
519 pgeneral->dss_config__max_spads_limit = 0xFF;
520 pgeneral->dss_config__min_spads_limit = 0x01;
521
522 /* Timing Configuration */
523
524 /* Default timing of 2ms */
525 ptiming->mm_config__timeout_macrop_a_hi = 0x00;
526 ptiming->mm_config__timeout_macrop_a_lo = 0x1a;
527 ptiming->mm_config__timeout_macrop_b_hi = 0x00;
528 ptiming->mm_config__timeout_macrop_b_lo = 0x20;
529 /* Setup for 30ms default */
530 ptiming->range_config__timeout_macrop_a_hi = 0x01;
531 ptiming->range_config__timeout_macrop_a_lo = 0xCC;
532 /* register value 11 gives a 24 VCSEL period */
533 ptiming->range_config__vcsel_period_a = 0x0B;
534 /* Setup for 30ms default */
535 ptiming->range_config__timeout_macrop_b_hi = 0x01;
536 ptiming->range_config__timeout_macrop_b_lo = 0xF5;
537 /* register value 09 gives a 20 VCSEL period */
538 ptiming->range_config__vcsel_period_b = 0x09;
539 /*
540 * Sigma thresh register - format 14.2
541 *
542 * 0x003C -> 15.0 mm
543 * 0x0050 -> 20.0 mm
544 */
545 ptiming->range_config__sigma_thresh =
546 ptuning_parms->tp_lite_med_sigma_thresh_mm;
547 /*
548 * Rate Limit - format 9.7fp
549 * 0x0020 -> 0.250 Mcps
550 * 0x0080 -> 1.000 Mcps
551 */
552 ptiming->range_config__min_count_rate_rtn_limit_mcps =
553 ptuning_parms->tp_lite_med_min_count_rate_rtn_mcps;
554
555 /* Phase limit register formats = 5.3
556 * low = 0x08 -> 1.0
557 * high = 0x78 -> 15.0 -> 3.0m
558 */
559 ptiming->range_config__valid_phase_low = 0x08;
560 ptiming->range_config__valid_phase_high = 0x78;
561 ptiming->system__intermeasurement_period = 0x00000000;
562 ptiming->system__fractional_enable = 0x00;
563
564 /* Dynamic Configuration */
565
566 pdynamic->system__grouped_parameter_hold_0 = 0x01;
567
568 pdynamic->system__thresh_high = 0x0000;
569 pdynamic->system__thresh_low = 0x0000;
570 pdynamic->system__enable_xtalk_per_quadrant = 0x00;
571 pdynamic->system__seed_config =
572 ptuning_parms->tp_lite_seed_cfg;
573
574 /* Timing A */
575 pdynamic->sd_config__woi_sd0 = 0x0B;
576 /* Timing B */
577 pdynamic->sd_config__woi_sd1 = 0x09;
578
579 pdynamic->sd_config__initial_phase_sd0 =
580 ptuning_parms->tp_init_phase_rtn_lite_med;
581 pdynamic->sd_config__initial_phase_sd1 =
582 ptuning_parms->tp_init_phase_ref_lite_med;;
583
584 pdynamic->system__grouped_parameter_hold_1 = 0x01;
585
586 /*
587 * Quantifier settings
588 *
589 * sd_config__first_order_select
590 * bit 0 - return sigma delta
591 * bit 1 - reference sigma delta
592 *
593 * sd_config__first_order_select = 0x03 (1st order)
594 *
595 * sd_config__quantifier options
596 * 0
597 * 1 -> 64
598 * 2 -> 128
599 * 3 -> 256
600 *
601 * sd_config__first_order_select = 0x00 (2nd order)
602 *
603 * sd_config__quantifier options
604 * 0
605 * 1 -> 256
606 * 2 -> 1024
607 * 3 -> 4095
608 *
609 * Setting below 2nd order, Quantifier = 1024
610 */
611
612 pdynamic->sd_config__first_order_select =
613 ptuning_parms->tp_lite_first_order_select;
614 pdynamic->sd_config__quantifier =
615 ptuning_parms->tp_lite_quantifier;
616
617 /* Below defaults will be overwritten by zone_cfg
618 * Spad no = 199 (0xC7)
619 * Spad no = 63 (0x3F)
620 */
621 pdynamic->roi_config__user_roi_centre_spad = 0xC7;
622 /* 16x16 ROI */
623 pdynamic->roi_config__user_roi_requested_global_xy_size = 0xFF;
624
625
626 pdynamic->system__sequence_config = \
627 VL53L1_SEQUENCE_VHV_EN | \
628 VL53L1_SEQUENCE_PHASECAL_EN | \
629 VL53L1_SEQUENCE_DSS1_EN | \
630 VL53L1_SEQUENCE_DSS2_EN | \
631 VL53L1_SEQUENCE_MM2_EN | \
632 VL53L1_SEQUENCE_RANGE_EN;
633
634 pdynamic->system__grouped_parameter_hold = 0x02;
635
636 /* System control */
637
638
639 psystem->system__stream_count_ctrl = 0x00;
640 psystem->firmware__enable = 0x01;
641 psystem->system__interrupt_clear = \
642 VL53L1_CLEAR_RANGE_INT;
643
644 psystem->system__mode_start = \
645 VL53L1_DEVICESCHEDULERMODE_STREAMING | \
646 VL53L1_DEVICEREADOUTMODE_SINGLE_SD | \
647 VL53L1_DEVICEMEASUREMENTMODE_BACKTOBACK;
648
649 LOG_FUNCTION_END(status);
650
651 return status;
652 }
653
654
VL53L1_preset_mode_standard_ranging_short_range(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)655 VL53L1_Error VL53L1_preset_mode_standard_ranging_short_range(
656 VL53L1_static_config_t *pstatic,
657 VL53L1_general_config_t *pgeneral,
658 VL53L1_timing_config_t *ptiming,
659 VL53L1_dynamic_config_t *pdynamic,
660 VL53L1_system_control_t *psystem,
661 VL53L1_tuning_parm_storage_t *ptuning_parms)
662 {
663 /*
664 * Initializes static and dynamic data structures for
665 * device preset mode
666 *
667 * VL53L1_DEVICEPRESETMODE_STANDARD_RANGING_SHORT_RANGE
668 * (up to 1.4 metres)
669 *
670 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
671 */
672
673 VL53L1_Error status = VL53L1_ERROR_NONE;
674
675 LOG_FUNCTION_START("");
676
677 /* Call standard ranging configuration followed by
678 * overrides for the short range configuration
679 */
680
681 status = VL53L1_preset_mode_standard_ranging(
682 pstatic,
683 pgeneral,
684 ptiming,
685 pdynamic,
686 psystem,
687 ptuning_parms);
688
689 /* now override standard ranging specific registers */
690
691 if (status == VL53L1_ERROR_NONE) {
692
693 /* Timing Configuration
694 *
695 * vcsel_period_a = 7 -> 16 period
696 * vcsel_period_b = 5 -> 12 period
697 * sigma_thresh = 0x003C -> 14.2fp -> 15.0 mm
698 * min_count_rate_rtn_limit_mcps = 0x0080 -> 9.7fp -> 1.0 Mcps
699 * valid_phase_low = 0x08 -> 5.3fp -> 1.0
700 * valid_phase_high = 0x38 -> 5.3fp -> 7.0 -> 1.4m
701 */
702
703 ptiming->range_config__vcsel_period_a = 0x07;
704 ptiming->range_config__vcsel_period_b = 0x05;
705 ptiming->range_config__sigma_thresh =
706 ptuning_parms->tp_lite_short_sigma_thresh_mm;
707 ptiming->range_config__min_count_rate_rtn_limit_mcps =
708 ptuning_parms->tp_lite_short_min_count_rate_rtn_mcps;
709 ptiming->range_config__valid_phase_low = 0x08;
710 ptiming->range_config__valid_phase_high = 0x38;
711
712 /* Dynamic Configuration
713 * SD0 -> Timing A
714 * SD1 -> Timing B
715 */
716
717 pdynamic->sd_config__woi_sd0 = 0x07;
718 pdynamic->sd_config__woi_sd1 = 0x05;
719 pdynamic->sd_config__initial_phase_sd0 =
720 ptuning_parms->tp_init_phase_rtn_lite_short;
721 pdynamic->sd_config__initial_phase_sd1 =
722 ptuning_parms->tp_init_phase_ref_lite_short;
723 }
724
725 LOG_FUNCTION_END(status);
726
727 return status;
728 }
729
730
VL53L1_preset_mode_standard_ranging_long_range(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)731 VL53L1_Error VL53L1_preset_mode_standard_ranging_long_range(
732 VL53L1_static_config_t *pstatic,
733 VL53L1_general_config_t *pgeneral,
734 VL53L1_timing_config_t *ptiming,
735 VL53L1_dynamic_config_t *pdynamic,
736 VL53L1_system_control_t *psystem,
737 VL53L1_tuning_parm_storage_t *ptuning_parms)
738 {
739 /*
740 * Initializes static and dynamic data structures for
741 * device preset mode
742 *
743 * VL53L1_DEVICEPRESETMODE_STANDARD_RANGING_LONG_RANGE
744 * (up to 4.8 metres)
745 *
746 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
747 */
748
749 VL53L1_Error status = VL53L1_ERROR_NONE;
750
751 LOG_FUNCTION_START("");
752
753 /* Call standard ranging configuration with
754 * overrides for long range configuration
755 */
756
757 status = VL53L1_preset_mode_standard_ranging(
758 pstatic,
759 pgeneral,
760 ptiming,
761 pdynamic,
762 psystem,
763 ptuning_parms);
764
765 /* now override standard ranging specific registers */
766
767 if (status == VL53L1_ERROR_NONE) {
768
769 /* Timing Configuration
770 *
771 * vcsel_period_a = 15 -> 32 period
772 * vcsel_period_b = 13 -> 28 period
773 * sigma_thresh = 0x003C -> 14.2fp -> 15.0 mm
774 * min_count_rate_rtn_limit_mcps = 0x0080 -> 9.7fp -> 1.0 Mcps
775 * valid_phase_low = 0x08 -> 5.3fp -> 1.0
776 * valid_phase_high = 0xB8 -> 5.3fp -> 23.0 -> 4.6m
777 */
778
779 ptiming->range_config__vcsel_period_a = 0x0F;
780 ptiming->range_config__vcsel_period_b = 0x0D;
781 ptiming->range_config__sigma_thresh =
782 ptuning_parms->tp_lite_long_sigma_thresh_mm;
783 ptiming->range_config__min_count_rate_rtn_limit_mcps =
784 ptuning_parms->tp_lite_long_min_count_rate_rtn_mcps;
785 ptiming->range_config__valid_phase_low = 0x08;
786 ptiming->range_config__valid_phase_high = 0xB8;
787
788 /* Dynamic Configuration
789 * SD0 -> Timing A
790 * SD1 -> Timing B
791 */
792
793 pdynamic->sd_config__woi_sd0 = 0x0F;
794 pdynamic->sd_config__woi_sd1 = 0x0D;
795 pdynamic->sd_config__initial_phase_sd0 =
796 ptuning_parms->tp_init_phase_rtn_lite_long;
797 pdynamic->sd_config__initial_phase_sd1 =
798 ptuning_parms->tp_init_phase_ref_lite_long;
799 }
800
801 LOG_FUNCTION_END(status);
802
803 return status;
804 }
805
806
807 #ifndef VL53L1_NOCALIB
VL53L1_preset_mode_standard_ranging_mm1_cal(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)808 VL53L1_Error VL53L1_preset_mode_standard_ranging_mm1_cal(
809 VL53L1_static_config_t *pstatic,
810 VL53L1_general_config_t *pgeneral,
811 VL53L1_timing_config_t *ptiming,
812 VL53L1_dynamic_config_t *pdynamic,
813 VL53L1_system_control_t *psystem,
814 VL53L1_tuning_parm_storage_t *ptuning_parms)
815 {
816 /*
817 * Initializes static and dynamic data structures for
818 * device preset mode
819 *
820 * VL53L1_DEVICEPRESETMODE_STANDARD_RANGING_MM1_CAL
821 *
822 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
823 */
824
825 VL53L1_Error status = VL53L1_ERROR_NONE;
826
827 LOG_FUNCTION_START("");
828
829 /* Call standard ranging configuration with
830 * overrides for long range configuration
831 */
832
833 status = VL53L1_preset_mode_standard_ranging(
834 pstatic,
835 pgeneral,
836 ptiming,
837 pdynamic,
838 psystem,
839 ptuning_parms);
840
841 /* now override standard ranging specific registers */
842
843 if (status == VL53L1_ERROR_NONE) {
844
845 pgeneral->dss_config__roi_mode_control =
846 VL53L1_DEVICEDSSMODE__REQUESTED_EFFFECTIVE_SPADS;
847
848 pdynamic->system__sequence_config = \
849 VL53L1_SEQUENCE_VHV_EN | \
850 VL53L1_SEQUENCE_PHASECAL_EN | \
851 VL53L1_SEQUENCE_DSS1_EN | \
852 VL53L1_SEQUENCE_DSS2_EN | \
853 VL53L1_SEQUENCE_MM1_EN;
854 }
855
856 LOG_FUNCTION_END(status);
857
858 return status;
859 }
860
861
VL53L1_preset_mode_standard_ranging_mm2_cal(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)862 VL53L1_Error VL53L1_preset_mode_standard_ranging_mm2_cal(
863 VL53L1_static_config_t *pstatic,
864 VL53L1_general_config_t *pgeneral,
865 VL53L1_timing_config_t *ptiming,
866 VL53L1_dynamic_config_t *pdynamic,
867 VL53L1_system_control_t *psystem,
868 VL53L1_tuning_parm_storage_t *ptuning_parms)
869 {
870 /*
871 * Initializes static and dynamic data structures for
872 * device preset mode
873 *
874 * VL53L1_DEVICEPRESETMODE_STANDARD_RANGING_MM2_CAL
875 *
876 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
877 */
878
879 VL53L1_Error status = VL53L1_ERROR_NONE;
880
881 LOG_FUNCTION_START("");
882
883 /* Call standard ranging configuration with
884 * overrides for long range configuration
885 */
886
887 status = VL53L1_preset_mode_standard_ranging(
888 pstatic,
889 pgeneral,
890 ptiming,
891 pdynamic,
892 psystem,
893 ptuning_parms);
894
895 /* now override standard ranging specific registers */
896
897 if (status == VL53L1_ERROR_NONE) {
898
899 pgeneral->dss_config__roi_mode_control =
900 VL53L1_DEVICEDSSMODE__REQUESTED_EFFFECTIVE_SPADS;
901
902 pdynamic->system__sequence_config = \
903 VL53L1_SEQUENCE_VHV_EN | \
904 VL53L1_SEQUENCE_PHASECAL_EN | \
905 VL53L1_SEQUENCE_DSS1_EN | \
906 VL53L1_SEQUENCE_DSS2_EN | \
907 VL53L1_SEQUENCE_MM2_EN;
908 }
909
910 LOG_FUNCTION_END(status);
911
912 return status;
913 }
914 #endif
915
916
VL53L1_preset_mode_timed_ranging(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)917 VL53L1_Error VL53L1_preset_mode_timed_ranging(
918
919 VL53L1_static_config_t *pstatic,
920 VL53L1_general_config_t *pgeneral,
921 VL53L1_timing_config_t *ptiming,
922 VL53L1_dynamic_config_t *pdynamic,
923 VL53L1_system_control_t *psystem,
924 VL53L1_tuning_parm_storage_t *ptuning_parms)
925 {
926 /*
927 * Initializes static and dynamic data structures for
928 * device preset mode
929 *
930 * VL53L1_DEVICEPRESETMODE_TIMED_RANGING
931 *
932 * - pseudo-solo
933 * - single sigma delta
934 * - timed
935 *
936 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
937 */
938
939 VL53L1_Error status = VL53L1_ERROR_NONE;
940
941 LOG_FUNCTION_START("");
942
943 /* Call standard ranging configuration */
944
945 status = VL53L1_preset_mode_standard_ranging(
946 pstatic,
947 pgeneral,
948 ptiming,
949 pdynamic,
950 psystem,
951 ptuning_parms);
952
953 /* now override standard ranging specific registers */
954
955 if (status == VL53L1_ERROR_NONE) {
956
957 /* Dynamic Configuration */
958
959 /* Disable GPH */
960 pdynamic->system__grouped_parameter_hold = 0x00;
961
962 /* Re-Configure timing budget default for 13ms */
963 ptiming->range_config__timeout_macrop_a_hi = 0x00;
964 ptiming->range_config__timeout_macrop_a_lo = 0xB1;
965 /* Setup for 13ms default */
966 ptiming->range_config__timeout_macrop_b_hi = 0x00;
967 ptiming->range_config__timeout_macrop_b_lo = 0xD4;
968
969 /* Timing Configuration */
970
971 ptiming->system__intermeasurement_period = 0x00000600;
972 pdynamic->system__seed_config =
973 ptuning_parms->tp_timed_seed_cfg;
974
975 /* System control */
976
977 /* Configure Timed/Psuedo-solo mode */
978 psystem->system__mode_start =
979 VL53L1_DEVICESCHEDULERMODE_PSEUDO_SOLO | \
980 VL53L1_DEVICEREADOUTMODE_SINGLE_SD | \
981 VL53L1_DEVICEMEASUREMENTMODE_TIMED;
982 }
983
984 LOG_FUNCTION_END(status);
985
986 return status;
987 }
988
VL53L1_preset_mode_timed_ranging_short_range(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)989 VL53L1_Error VL53L1_preset_mode_timed_ranging_short_range(
990
991 VL53L1_static_config_t *pstatic,
992 VL53L1_general_config_t *pgeneral,
993 VL53L1_timing_config_t *ptiming,
994 VL53L1_dynamic_config_t *pdynamic,
995 VL53L1_system_control_t *psystem,
996 VL53L1_tuning_parm_storage_t *ptuning_parms)
997 {
998 /*
999 * Initializes static and dynamic data structures for
1000 * device preset mode
1001 *
1002 * VL53L1_DEVICEPRESETMODE_TIMED_RANGING_SHORT_RANGE
1003 *
1004 * - pseudo-solo
1005 * - single sigma delta
1006 * - timed
1007 *
1008 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
1009 */
1010
1011 VL53L1_Error status = VL53L1_ERROR_NONE;
1012
1013 LOG_FUNCTION_START("");
1014
1015 /* Call standard ranging configuration */
1016
1017 status = VL53L1_preset_mode_standard_ranging_short_range(
1018 pstatic,
1019 pgeneral,
1020 ptiming,
1021 pdynamic,
1022 psystem,
1023 ptuning_parms);
1024
1025 /* now override standard ranging specific registers */
1026
1027 if (status == VL53L1_ERROR_NONE) {
1028
1029 /* Dynamic Configuration */
1030
1031 /* Disable GPH */
1032 pdynamic->system__grouped_parameter_hold = 0x00;
1033
1034
1035 /* Timing Configuration */
1036
1037 /* Re-Configure timing budget default for 13ms */
1038 ptiming->range_config__timeout_macrop_a_hi = 0x01;
1039 ptiming->range_config__timeout_macrop_a_lo = 0x84;
1040 /* Setup for 13ms default */
1041 ptiming->range_config__timeout_macrop_b_hi = 0x01;
1042 ptiming->range_config__timeout_macrop_b_lo = 0xB1;
1043
1044 ptiming->system__intermeasurement_period = 0x00000600;
1045 pdynamic->system__seed_config =
1046 ptuning_parms->tp_timed_seed_cfg;
1047
1048 /* System control */
1049
1050 /* Configure Timed/Psuedo-solo mode */
1051 psystem->system__mode_start =
1052 VL53L1_DEVICESCHEDULERMODE_PSEUDO_SOLO | \
1053 VL53L1_DEVICEREADOUTMODE_SINGLE_SD | \
1054 VL53L1_DEVICEMEASUREMENTMODE_TIMED;
1055 }
1056
1057 LOG_FUNCTION_END(status);
1058
1059 return status;
1060 }
1061
VL53L1_preset_mode_timed_ranging_long_range(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)1062 VL53L1_Error VL53L1_preset_mode_timed_ranging_long_range(
1063
1064 VL53L1_static_config_t *pstatic,
1065 VL53L1_general_config_t *pgeneral,
1066 VL53L1_timing_config_t *ptiming,
1067 VL53L1_dynamic_config_t *pdynamic,
1068 VL53L1_system_control_t *psystem,
1069 VL53L1_tuning_parm_storage_t *ptuning_parms)
1070 {
1071 /*
1072 * Initializes static and dynamic data structures for
1073 * device preset mode
1074 *
1075 * VL53L1_DEVICEPRESETMODE_TIMED_RANGING_LONG_RANGE
1076 *
1077 * - pseudo-solo
1078 * - single sigma delta
1079 * - timed
1080 *
1081 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
1082 */
1083
1084 VL53L1_Error status = VL53L1_ERROR_NONE;
1085
1086 LOG_FUNCTION_START("");
1087
1088 /* Call standard ranging configuration */
1089
1090 status = VL53L1_preset_mode_standard_ranging_long_range(
1091 pstatic,
1092 pgeneral,
1093 ptiming,
1094 pdynamic,
1095 psystem,
1096 ptuning_parms);
1097
1098 /* now override standard ranging specific registers */
1099
1100 if (status == VL53L1_ERROR_NONE) {
1101
1102 /* Dynamic Configuration */
1103
1104 /* Disable GPH */
1105 pdynamic->system__grouped_parameter_hold = 0x00;
1106
1107
1108 /* Timing Configuration */
1109
1110 /* Re-Configure timing budget default for 13ms */
1111 ptiming->range_config__timeout_macrop_a_hi = 0x00;
1112 ptiming->range_config__timeout_macrop_a_lo = 0x97;
1113 /* Setup for 13ms default */
1114 ptiming->range_config__timeout_macrop_b_hi = 0x00;
1115 ptiming->range_config__timeout_macrop_b_lo = 0xB1;
1116
1117 ptiming->system__intermeasurement_period = 0x00000600;
1118 pdynamic->system__seed_config =
1119 ptuning_parms->tp_timed_seed_cfg;
1120
1121 /* System control */
1122
1123 /* Configure Timed/Psuedo-solo mode */
1124 psystem->system__mode_start =
1125 VL53L1_DEVICESCHEDULERMODE_PSEUDO_SOLO | \
1126 VL53L1_DEVICEREADOUTMODE_SINGLE_SD | \
1127 VL53L1_DEVICEMEASUREMENTMODE_TIMED;
1128 }
1129
1130 LOG_FUNCTION_END(status);
1131
1132 return status;
1133 }
1134
1135 /* Start Patch_LowPowerAutoMode */
VL53L1_preset_mode_low_power_auto_ranging(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms,VL53L1_low_power_auto_data_t * plpadata)1136 VL53L1_Error VL53L1_preset_mode_low_power_auto_ranging(
1137
1138 VL53L1_static_config_t *pstatic,
1139 VL53L1_general_config_t *pgeneral,
1140 VL53L1_timing_config_t *ptiming,
1141 VL53L1_dynamic_config_t *pdynamic,
1142 VL53L1_system_control_t *psystem,
1143 VL53L1_tuning_parm_storage_t *ptuning_parms,
1144 VL53L1_low_power_auto_data_t *plpadata)
1145 {
1146 /*
1147 * Initializes static and dynamic data structures for
1148 * device preset mode
1149 *
1150 * VL53L1_DEVICEPRESETMODE_LOWPOWERAUTO_MEDIUM_RANGE
1151 *
1152 * - pseudo-solo
1153 * - single sigma delta
1154 * - timed
1155 * - special low power auto mode for Presence application
1156 *
1157 * PLEASE NOTE THE SETTINGS BELOW ARE PROVISIONAL AND WILL CHANGE!
1158 */
1159
1160 VL53L1_Error status = VL53L1_ERROR_NONE;
1161
1162 LOG_FUNCTION_START("");
1163
1164 /* Call standard ranging configuration */
1165
1166 status = VL53L1_preset_mode_timed_ranging(
1167 pstatic,
1168 pgeneral,
1169 ptiming,
1170 pdynamic,
1171 psystem,
1172 ptuning_parms);
1173
1174 /* now setup the low power auto mode */
1175
1176 if (status == VL53L1_ERROR_NONE) {
1177 status = VL53L1_config_low_power_auto_mode(
1178 pgeneral,
1179 pdynamic,
1180 plpadata
1181 );
1182 }
1183
1184 LOG_FUNCTION_END(status);
1185
1186 return status;
1187 }
1188
VL53L1_preset_mode_low_power_auto_short_ranging(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms,VL53L1_low_power_auto_data_t * plpadata)1189 VL53L1_Error VL53L1_preset_mode_low_power_auto_short_ranging(
1190
1191 VL53L1_static_config_t *pstatic,
1192 VL53L1_general_config_t *pgeneral,
1193 VL53L1_timing_config_t *ptiming,
1194 VL53L1_dynamic_config_t *pdynamic,
1195 VL53L1_system_control_t *psystem,
1196 VL53L1_tuning_parm_storage_t *ptuning_parms,
1197 VL53L1_low_power_auto_data_t *plpadata)
1198 {
1199 /*
1200 * Initializes static and dynamic data structures for
1201 * device preset mode
1202 *
1203 * VL53L1_DEVICEPRESETMODE_LOWPOWERAUTO_SHORT_RANGE
1204 *
1205 * - pseudo-solo
1206 * - single sigma delta
1207 * - timed
1208 * - special low power auto mode for Presence application
1209 *
1210 * PLEASE NOTE THE SETTINGS BELOW ARE PROVISIONAL AND WILL CHANGE!
1211 */
1212
1213 VL53L1_Error status = VL53L1_ERROR_NONE;
1214
1215 LOG_FUNCTION_START("");
1216
1217 /* Call standard ranging configuration */
1218
1219 status = VL53L1_preset_mode_timed_ranging_short_range(
1220 pstatic,
1221 pgeneral,
1222 ptiming,
1223 pdynamic,
1224 psystem,
1225 ptuning_parms);
1226
1227 /* now setup the low power auto mode */
1228
1229 if (status == VL53L1_ERROR_NONE) {
1230 status = VL53L1_config_low_power_auto_mode(
1231 pgeneral,
1232 pdynamic,
1233 plpadata
1234 );
1235 }
1236
1237 LOG_FUNCTION_END(status);
1238
1239 return status;
1240 }
1241
VL53L1_preset_mode_low_power_auto_long_ranging(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms,VL53L1_low_power_auto_data_t * plpadata)1242 VL53L1_Error VL53L1_preset_mode_low_power_auto_long_ranging(
1243
1244 VL53L1_static_config_t *pstatic,
1245 VL53L1_general_config_t *pgeneral,
1246 VL53L1_timing_config_t *ptiming,
1247 VL53L1_dynamic_config_t *pdynamic,
1248 VL53L1_system_control_t *psystem,
1249 VL53L1_tuning_parm_storage_t *ptuning_parms,
1250 VL53L1_low_power_auto_data_t *plpadata)
1251 {
1252 /*
1253 * Initializes static and dynamic data structures for
1254 * device preset mode
1255 *
1256 * VL53L1_DEVICEPRESETMODE_LOWPOWERAUTO_LONG_RANGE
1257 *
1258 * - pseudo-solo
1259 * - single sigma delta
1260 * - timed
1261 * - special low power auto mode for Presence application
1262 *
1263 * PLEASE NOTE THE SETTINGS BELOW ARE PROVISIONAL AND WILL CHANGE!
1264 */
1265
1266 VL53L1_Error status = VL53L1_ERROR_NONE;
1267
1268 LOG_FUNCTION_START("");
1269
1270 /* Call standard ranging configuration */
1271
1272 status = VL53L1_preset_mode_timed_ranging_long_range(
1273 pstatic,
1274 pgeneral,
1275 ptiming,
1276 pdynamic,
1277 psystem,
1278 ptuning_parms);
1279
1280 /* now setup the low power auto mode */
1281
1282 if (status == VL53L1_ERROR_NONE) {
1283 status = VL53L1_config_low_power_auto_mode(
1284 pgeneral,
1285 pdynamic,
1286 plpadata
1287 );
1288 }
1289
1290 LOG_FUNCTION_END(status);
1291
1292 return status;
1293 }
1294
1295 /* End Patch_LowPowerAutoMode */
1296
VL53L1_preset_mode_singleshot_ranging(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)1297 VL53L1_Error VL53L1_preset_mode_singleshot_ranging(
1298
1299 VL53L1_static_config_t *pstatic,
1300 VL53L1_general_config_t *pgeneral,
1301 VL53L1_timing_config_t *ptiming,
1302 VL53L1_dynamic_config_t *pdynamic,
1303 VL53L1_system_control_t *psystem,
1304 VL53L1_tuning_parm_storage_t *ptuning_parms)
1305 {
1306 /*
1307 * Initializes static and dynamic data structures for device preset mode
1308 * VL53L1_DEVICEPRESETMODE_TIMED_RANGING
1309 *
1310 * - pseudo-solo
1311 * - single sigma delta
1312 * - timed
1313 *
1314 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
1315 */
1316
1317 VL53L1_Error status = VL53L1_ERROR_NONE;
1318
1319 LOG_FUNCTION_START("");
1320
1321 /* Call standard ranging configuration */
1322
1323 status = VL53L1_preset_mode_standard_ranging(
1324 pstatic,
1325 pgeneral,
1326 ptiming,
1327 pdynamic,
1328 psystem,
1329 ptuning_parms);
1330
1331 /* now override standard ranging specific registers */
1332
1333 if (status == VL53L1_ERROR_NONE) {
1334
1335 /* Dynamic Configuration */
1336
1337 /* Disable GPH */
1338 pdynamic->system__grouped_parameter_hold = 0x00;
1339
1340 /* Timing Configuration */
1341
1342 /* Re-Configure timing budget default for 13ms */
1343 ptiming->range_config__timeout_macrop_a_hi = 0x00;
1344 ptiming->range_config__timeout_macrop_a_lo = 0xB1;
1345 /* Setup for 13ms default */
1346 ptiming->range_config__timeout_macrop_b_hi = 0x00;
1347 ptiming->range_config__timeout_macrop_b_lo = 0xD4;
1348
1349 pdynamic->system__seed_config =
1350 ptuning_parms->tp_timed_seed_cfg;
1351
1352 /* System control */
1353
1354 /* Configure Timed/Psuedo-solo mode */
1355 psystem->system__mode_start = \
1356 VL53L1_DEVICESCHEDULERMODE_PSEUDO_SOLO | \
1357 VL53L1_DEVICEREADOUTMODE_SINGLE_SD | \
1358 VL53L1_DEVICEMEASUREMENTMODE_SINGLESHOT;
1359 }
1360
1361 LOG_FUNCTION_END(status);
1362
1363 return status;
1364 }
1365
1366
VL53L1_preset_mode_olt(VL53L1_static_config_t * pstatic,VL53L1_general_config_t * pgeneral,VL53L1_timing_config_t * ptiming,VL53L1_dynamic_config_t * pdynamic,VL53L1_system_control_t * psystem,VL53L1_tuning_parm_storage_t * ptuning_parms)1367 VL53L1_Error VL53L1_preset_mode_olt(
1368 VL53L1_static_config_t *pstatic,
1369 VL53L1_general_config_t *pgeneral,
1370 VL53L1_timing_config_t *ptiming,
1371 VL53L1_dynamic_config_t *pdynamic,
1372 VL53L1_system_control_t *psystem,
1373 VL53L1_tuning_parm_storage_t *ptuning_parms)
1374 {
1375 /**
1376 * Initializes static and dynamic data structures for device preset mode
1377 * VL53L1_DEVICEPRESETMODE_OLT
1378 *
1379 * PLEASE NOTE THE SETTINGS BELOW AT PROVISIONAL AND WILL CHANGE!
1380 */
1381
1382 VL53L1_Error status = VL53L1_ERROR_NONE;
1383
1384 LOG_FUNCTION_START("");
1385
1386 /* Call standard ranging configuration */
1387
1388 status = VL53L1_preset_mode_standard_ranging(
1389 pstatic,
1390 pgeneral,
1391 ptiming,
1392 pdynamic,
1393 psystem,
1394 ptuning_parms);
1395
1396 /* now override OLT specific registers */
1397
1398 if (status == VL53L1_ERROR_NONE) {
1399
1400 /* Disables requirement for host handshake */
1401 psystem->system__stream_count_ctrl = 0x01;
1402 }
1403
1404 LOG_FUNCTION_END(status);
1405
1406 return status;
1407 }
1408