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_core.h
65  *
66  * @brief EwokPlus25 low level API function definitions
67  */
68 
69 #ifndef _VL53L1_API_CORE_H_
70 #define _VL53L1_API_CORE_H_
71 
72 #include "vl53l1_platform.h"
73 
74 #ifdef __cplusplus
75 extern "C" {
76 #endif
77 
78 
79 /**
80  * @brief Get LL Driver version information
81  *
82  * @param[in]   Dev       : Device handle
83  * @param[out]  pversion  : pointer to VL53L1_ll_version_t
84  *
85  * @return  VL53L1_ERROR_NONE     Success
86  */
87 
88 #ifdef VL53L1_DEBUG
89 VL53L1_Error VL53L1_get_version(
90 	VL53L1_DEV            Dev,
91 	VL53L1_ll_version_t  *pversion);
92 
93 /**
94  * @brief Gets Device Firmware version
95  *
96  * @param[in]   Dev           : Device handle
97  * @param[out]  pfw_version   : pointer to uint16_t FW version
98  *
99  * @return  VL53L1_ERROR_NONE     Success
100  */
101 
102 VL53L1_Error VL53L1_get_device_firmware_version(
103 	VL53L1_DEV         Dev,
104 	uint16_t          *pfw_version);
105 #endif
106 
107 
108 /**
109  * @brief Initialises pdev structure and optionally read the
110  *        part to part information form he device G02 registers
111  *
112  * Important: VL53L1_platform_initialise() *must* called before calling
113  * this function
114  *
115  * @param[in]   Dev           : Device handle
116  * @param[out]  read_p2p_data : if > 0 then reads and caches P2P data
117  *
118  * @return  VL53L1_ERROR_NONE     Success
119  */
120 
121 VL53L1_Error VL53L1_data_init(
122 	VL53L1_DEV         Dev,
123 	uint8_t            read_p2p_data);
124 
125 
126 /**
127  * @brief  For C-API one time initialization only reads device
128  *         G02 registers containing data copied from NVM
129  *
130  *  Contains the key NVM data e.g identification info
131  *  fast oscillator freq, max trim and laser safety info
132  *
133  *  Function all only be called after the device has finished booting
134  *
135  * @param[in]   Dev           : Device handle
136  *
137  * @return  VL53L1_ERROR_NONE     Success
138  */
139 
140 VL53L1_Error VL53L1_read_p2p_data(
141 	VL53L1_DEV      Dev);
142 
143 
144 /**
145  * @brief Performs device software reset and then waits for  the firmware
146  *        to finish booting
147  *
148  * @param[in]   Dev           : Device handle
149  *
150  * @return  VL53L1_ERROR_NONE     Success
151  * @return  "Other error code"    See ::VL53L1_Error
152  */
153 
154 VL53L1_Error VL53L1_software_reset(
155 	VL53L1_DEV      Dev);
156 
157 
158 /**
159  * @brief  Sets the customer part to part data
160  *
161  * Important: does **not** apply the settings to the device.
162  * Updates the following structures in the device structure
163  *
164  * Just an internal memcpy to
165  *
166  *
167  * @param[in]   Dev             : Device handle
168  * @param[in]   pcal_data       : pointer to VL53L1_calibration_data_t
169  *
170  * @return  VL53L1_ERROR_NONE     Success
171  * @return  "Other error code"    See ::VL53L1_Error
172  */
173 
174 VL53L1_Error VL53L1_set_part_to_part_data(
175 	VL53L1_DEV                            Dev,
176 	VL53L1_calibration_data_t            *pcal_data);
177 
178 
179 /**
180  * @brief  Gets the customer part to part data
181  *
182  * Just an internal memory copy
183  *
184  * @param[in]   Dev             : Device handle
185  * @param[out]  pcal_data       : pointer to VL53L1_calibration_data_t
186  *
187  *
188  * @return  VL53L1_ERROR_NONE     Success
189  * @return  "Other error code"    See ::VL53L1_Error
190  */
191 
192 VL53L1_Error VL53L1_get_part_to_part_data(
193 	VL53L1_DEV                            Dev,
194 	VL53L1_calibration_data_t            *pcal_data);
195 
196 
197 /**
198  * @brief  Gets the tuning parm part to part data
199  *
200  * Just an internal copy
201  *
202  * @param[in]   Dev             : Device handle
203  * @param[out]  ptun_data       : pointer to VL53L1_tuning_parameters_t
204  *
205  *
206  * @return  VL53L1_ERROR_NONE     Success
207  * @return  "Other error code"    See ::VL53L1_Error
208  */
209 
210 #ifdef VL53L1_DEBUG
211 VL53L1_Error VL53L1_get_tuning_debug_data(
212 	VL53L1_DEV                            Dev,
213 	VL53L1_tuning_parameters_t            *ptun_data);
214 #endif
215 
216 
217 /**
218  * @brief  Sets the inter measurement period in the VL53L1_timing_config_t structure
219  *
220  * Uses the pdev->dbg_results.result__osc_calibrate_val value convert from [ms]
221  *
222  * @param[in]   Dev                         : Device handle
223  * @param[in]   inter_measurement_period_ms : requested inter measurement period in [ms]
224  *
225  * @return  VL53L1_ERROR_NONE     Success
226  * @return  "Other error code"    See ::VL53L1_Error
227  */
228 
229 VL53L1_Error VL53L1_set_inter_measurement_period_ms(
230 	VL53L1_DEV          Dev,
231 	uint32_t            inter_measurement_period_ms);
232 
233 
234 /**
235  * @brief  Gets inter measurement period from the VL53L1_timing_config_t structure
236  *
237  * Uses the pdev->dbg_results.result__osc_calibrate_val value convert into [ms]
238  *
239  * @param[in]   Dev                           : Device handle
240  * @param[out]  pinter_measurement_period_ms  : current inter measurement period in [ms]
241  *
242  * @return  VL53L1_ERROR_NONE     Success
243  * @return  "Other error code"    See ::VL53L1_Error
244  */
245 
246 VL53L1_Error VL53L1_get_inter_measurement_period_ms(
247 	VL53L1_DEV          Dev,
248 	uint32_t           *pinter_measurement_period_ms);
249 
250 
251 /**
252  * @brief  Sets the phasecal, mode mitigation and ranging timeouts
253  *         in the VL53L1_timing_config_t structure
254  *
255  * Uses the pdev->stat_nvm.osc_measured__fast_osc__frequency value convert from [us]
256  *
257  * @param[in]   Dev                         : Device handle
258  * @param[in]   phasecal_config_timeout_us  : requested Phase Cal Timeout e.g. 1000us
259  * @param[in]   mm_config_timeout_us        : requested MM Timeout e.g. 2000us
260  * @param[in]   range_config_timeout_us     : requested Ranging Timeout e.g 13000us
261  *
262  * @return  VL53L1_ERROR_NONE     Success
263  * @return  "Other error code"    See ::VL53L1_Error
264  */
265 
266 VL53L1_Error VL53L1_set_timeouts_us(
267 	VL53L1_DEV          Dev,
268 	uint32_t            phasecal_config_timeout_us,
269 	uint32_t            mm_config_timeout_us,
270 	uint32_t            range_config_timeout_us);
271 
272 
273 /**
274  * @brief  Gets the phasecal, mode mitigation and ranging timeouts
275  *         for the VL53L1_timing_config_t structure
276  *
277  * Uses the pdev->stat_nvm.osc_measured__fast_osc__frequency convert into [us]
278  *
279  * @param[in]   Dev                          : Device handle
280  * @param[out]  pphasecal_config_timeout_us  : current Phase Cal Timeout in [us]
281  * @param[out]  pmm_config_timeout_us        : current MM Timeout in [us]
282  * @param[out]  prange_config_timeout_us     : current Ranging Timeout in [us]
283  *
284  * @return  VL53L1_ERROR_NONE     Success
285  * @return  "Other error code"    See ::VL53L1_Error
286  */
287 
288 VL53L1_Error VL53L1_get_timeouts_us(
289 	VL53L1_DEV          Dev,
290 	uint32_t           *pphasecal_config_timeout_us,
291 	uint32_t           *pmm_config_timeout_us,
292 	uint32_t           *prange_config_timeout_us);
293 
294 
295 /**
296  * @brief  Sets the 12-bit calibration repeat period value
297  *
298  * Sets the repeat period for VHV and phasecal in ranges.
299  * Setting to zero to disables the repeat, but the VHV
300  * and PhaseCal is still run on the very first range in
301  * this case.
302  *
303  * Only even values should be set
304  *
305  * The max value is 4094 i.e. every
306  *
307  * @param[in]   Dev                        : Device handle
308  * @param[in]   cal_config__repeat_period  : current calibration config repeat period
309  *
310  * @return  VL53L1_ERROR_NONE     Success
311  * @return  "Other error code"    See ::VL53L1_Error
312  */
313 
314 VL53L1_Error VL53L1_set_calibration_repeat_period(
315 	VL53L1_DEV          Dev,
316 	uint16_t            cal_config__repeat_period);
317 
318 
319 /**
320  * @brief  Gets the current 12-bit calibration repeat period value
321  *
322  * @param[in]   Dev                         : Device handle
323  * @param[out]  pcal_config__repeat_period  : current calibration config repeat period
324  *
325  * @return  VL53L1_ERROR_NONE     Success
326  * @return  "Other error code"    See ::VL53L1_Error
327  */
328 
329 VL53L1_Error VL53L1_get_calibration_repeat_period(
330 	VL53L1_DEV          Dev,
331 	uint16_t           *pcal_config__repeat_period);
332 
333 
334 /**
335  * @brief  Set system sequence config bit value
336  *
337  * @param[in]   Dev              : Device handle
338  * @param[in]   bit_id           : VL53L1_DeviceSequenceConfig bit id
339  * @param[in]   value            : Input Bit value = 0 or 1
340  *
341  * @return  VL53L1_ERROR_NONE     Success
342  * @return  "Other error code"    See ::VL53L1_Error
343  */
344 
345 VL53L1_Error VL53L1_set_sequence_config_bit(
346 	VL53L1_DEV                   Dev,
347 	VL53L1_DeviceSequenceConfig  bit_id,
348 	uint8_t                      value);
349 
350 
351 /**
352  * @brief  Get system sequence config bit value
353  *
354  * @param[in]   Dev              : Device handle
355  * @param[in]   bit_id           : VL53L1_DeviceSequenceConfig bit id
356  * @param[out]  pvalue           : Output Bit value = 0 or 1
357  *
358  * @return  VL53L1_ERROR_NONE     Success
359  * @return  "Other error code"    See ::VL53L1_Error
360  */
361 
362 VL53L1_Error VL53L1_get_sequence_config_bit(
363 	VL53L1_DEV                   Dev,
364 	VL53L1_DeviceSequenceConfig  bit_id,
365 	uint8_t                     *pvalue);
366 
367 
368 /**
369  * @brief  Set the interrupt polarity bit in
370  *
371  * @param[in]   Dev                 : Device handle
372  * @param[in]   interrupt_polarity  : Interrupt Polarity
373  *
374  * @return  VL53L1_ERROR_NONE     Success
375  * @return  "Other error code"    See ::VL53L1_Error
376  */
377 
378 VL53L1_Error VL53L1_set_interrupt_polarity(
379 	VL53L1_DEV                       Dev,
380 	VL53L1_DeviceInterruptPolarity  interrupt_polarity);
381 
382 
383 /**
384  * @brief  Get the interrupt polarity bit state
385  *
386  * @param[in]   Dev                  : Device handle
387  * @param[out]  pinterrupt_polarity  : Interrupt Polarity Bit value
388  *
389  * @return  VL53L1_ERROR_NONE     Success
390  * @return  "Other error code"    See ::VL53L1_Error
391  */
392 
393 VL53L1_Error VL53L1_get_interrupt_polarity(
394 	VL53L1_DEV                      Dev,
395 	VL53L1_DeviceInterruptPolarity  *pinterrupt_polarity);
396 
397 /**
398  * @brief  Set the Ref spad char cfg struct internal to pdev
399  *
400  * @param[in]  Dev     : Device handle
401  * @param[in]  pdata   : Input pointer to VL53L1_refspadchar_config_t
402  *
403  * @return  VL53L1_ERROR_NONE     Success
404  * @return  "Other error code"    See ::VL53L1_Error
405  */
406 
407 #ifndef VL53L1_NOCALIB
408 VL53L1_Error VL53L1_get_refspadchar_config_struct(
409 	VL53L1_DEV                     Dev,
410 	VL53L1_refspadchar_config_t   *pdata);
411 #endif
412 
413 /**
414  * @brief  Extract the Ref spad char cfg struct from pdev
415  *
416  * @param[in]  Dev     : Device handle
417  * @param[out] pdata   : Output pointer to VL53L1_refspadchar_config_t
418  *
419  * @return  VL53L1_ERROR_NONE     Success
420  * @return  "Other error code"    See ::VL53L1_Error
421  */
422 
423 #ifndef VL53L1_NOCALIB
424 VL53L1_Error VL53L1_set_refspadchar_config_struct(
425 	VL53L1_DEV                     Dev,
426 	VL53L1_refspadchar_config_t   *pdata);
427 #endif
428 
429 /**
430  * @brief  Set the Range Ignore Threshold Rate value
431  *
432  * @param[in]  Dev                  : Device handle
433  * @param[in]  range_ignore_thresh_mult     : Input RIT Mult value, in \
434  *                                            3.5 fractional value
435  * @param[in]  range_ignore_threshold_mcps  : Range Ignore Threshold value
436  *
437  * @return  VL53L1_ERROR_NONE     Success
438  * @return  "Other error code"    See ::VL53L1_Error
439  */
440 
441 VL53L1_Error VL53L1_set_range_ignore_threshold(
442 	VL53L1_DEV              Dev,
443 	uint8_t                 range_ignore_thresh_mult,
444 	uint16_t                range_ignore_threshold_mcps);
445 
446 /**
447  * @brief  Get the Range Ignore Threshold Rate value
448  *
449  *
450  *
451  * @param[in]   Dev                  : Device handle
452  * @param[out]  prange_ignore_thresh_mult              : \
453  *              Range ignore threshold internal multiplier value in \
454  *              3.5 fractional format.
455  * @param[out]  prange_ignore_threshold_mcps_internal  : \
456  *              Range Ignore Threshold Rate value generated from \
457  *              current xtalk parms
458  * @param[out]  prange_ignore_threshold_mcps_current   : \
459  *              Range Ignore Threshold Rate value generated from \
460  *              device static config struct
461  *
462  * @return  VL53L1_ERROR_NONE     Success
463  * @return  "Other error code"    See ::VL53L1_Error
464  */
465 
466 VL53L1_Error VL53L1_get_range_ignore_threshold(
467 	VL53L1_DEV              Dev,
468 	uint8_t                *prange_ignore_thresh_mult,
469 	uint16_t               *prange_ignore_threshold_mcps_internal,
470 	uint16_t               *prange_ignore_threshold_mcps_current);
471 
472 
473 /**
474  * @brief  Sets the current user Zone (ROI) configuration structure data
475  *
476  * @param[in]   Dev            : Device handle
477  * @param[in]   puser_zone     : pointer to user Zone (ROI) data structure
478  *
479  * @return  VL53L1_ERROR_NONE     Success
480  * @return  "Other error code"    See ::VL53L1_Error
481  */
482 
483 VL53L1_Error VL53L1_set_user_zone(
484 	VL53L1_DEV          Dev,
485 	VL53L1_user_zone_t *puser_zone);
486 
487 
488 /**
489  * @brief  Gets the current user zone (ROI) configuration structure data
490  *
491  * @param[in]   Dev            : Device handle
492  * @param[out]  puser_zone     : pointer to user zone (ROI) data structure
493  *
494  * @return  VL53L1_ERROR_NONE     Success
495  * @return  "Other error code"    See ::VL53L1_Error
496  */
497 
498 VL53L1_Error VL53L1_get_user_zone(
499 	VL53L1_DEV          Dev,
500 	VL53L1_user_zone_t *puser_zone);
501 
502 
503 /**
504  * @brief  Gets the current mode mitigation zone (ROI) configuration structure data
505  *
506  * @param[in]   Dev         : Device handle
507  * @param[out]  pmm_roi     : pointer to user zone (ROI) data structure
508  *
509  * @return  VL53L1_ERROR_NONE     Success
510  * @return  "Other error code"    See ::VL53L1_Error
511  */
512 
513 VL53L1_Error VL53L1_get_mode_mitigation_roi(
514 	VL53L1_DEV          Dev,
515 	VL53L1_user_zone_t *pmm_roi);
516 
517 
518 /**
519  * @brief  Initialises the configuration data structures for
520  *         the selected preset mode
521  *
522  * Important: does **not** apply the settings to the device.
523  * Updates the following structures in the device structure
524  *
525  * - static config  : pdev->stat_cfg
526  * - dynamic config : pdev->dyn_cfg
527  * - system_control  :pdev->sys_ctrl
528  *
529  * Uses osc_measured__fast_osc__frequency in  pdev->stat_nvm to
530  * convert the input timeouts in [us] to internal macro period
531  * timeout values.
532  *
533  * Please call VL53L1_init_and_start_range() to update device
534  * and start a range
535  *
536  * @param[in]   Dev                                : Device handle
537  * @param[in]   device_preset_mode                 : selected device preset mode
538  * @param[in]   dss_config__target_total_rate_mcps : DSS target rate in 9.7 format e.g 0x0A00 -> 20.0 Mcps
539  * @param[in]   phasecal_config_timeout_us         : requested Phase Cal Timeout e.g. 1000us
540  * @param[in]   mm_config_timeout_us               : requested MM Timeout e.g. 2000us
541  * @param[in]   range_config_timeout_us            : requested Ranging Timeout e.g 10000us
542  * @param[in]   inter_measurement_period_ms        : requested timed mode repeat rate e.g 100ms
543  *
544  * @return  VL53L1_ERROR_NONE     Success
545  * @return  "Other error code"    See ::VL53L1_Error
546  */
547 
548 VL53L1_Error VL53L1_set_preset_mode(
549 	VL53L1_DEV                   Dev,
550 	VL53L1_DevicePresetModes     device_preset_mode,
551 	uint16_t                     dss_config__target_total_rate_mcps,
552 	uint32_t                     phasecal_config_timeout_us,
553 	uint32_t                     mm_config_timeout_us,
554 	uint32_t                     range_config_timeout_us,
555 	uint32_t                     inter_measurement_period_ms);
556 
557 
558 /**
559  * @brief  Gets the requested preset mode configuration tuning parameters
560  *
561  * Function Added as part of Patch_TuningParmPresetModeAddition_11839
562  *
563  * @param[in]   Dev                : Device Handle
564  * @param[in]  device_preset_mode  : selected device preset mode
565  * @param[out] pdss_config__target_total_rate_mcps : dss rate output value
566  * @param[out] pphasecal_config_timeout_us : phasecal timeout output value
567  * @param[out] pmm_config_timeout_us    : mm timeout output value
568  * @param[out] prange_config_timeout_us : range timeout output value
569  *
570  * @return  VL53L1_ERROR_NONE     Success
571  * @return  "Other error code"    See ::VL53L1_Error
572  */
573 
574 VL53L1_Error VL53L1_get_preset_mode_timing_cfg(
575 	VL53L1_DEV                   Dev,
576 	VL53L1_DevicePresetModes     device_preset_mode,
577 	uint16_t                    *pdss_config__target_total_rate_mcps,
578 	uint32_t                    *pphasecal_config_timeout_us,
579 	uint32_t                    *pmm_config_timeout_us,
580 	uint32_t                    *prange_config_timeout_us);
581 
582 /**
583  * @brief  Simple function to enable xtalk compensation
584  *
585  * Applies xtalk compensation to hist post processing,
586  * and applies settings to device,
587  *
588  * @param[in]   Dev             : Device Handle
589  *
590  * @return  VL53L1_ERROR_NONE     Success
591  * @return  "Other error code"    See ::VL53L1_Error
592  */
593 
594 VL53L1_Error VL53L1_enable_xtalk_compensation(
595 	VL53L1_DEV                 Dev);
596 
597 /**
598  * @brief  Simple function to disable xtalk compensation
599  *
600  * Disables xtalk compensation from hist post processing,
601  * and clears settings to device
602  *
603  * @param[in]   Dev             : Device Handle
604  *
605  * @return  VL53L1_ERROR_NONE     Success
606  * @return  "Other error code"    See ::VL53L1_Error
607  */
608 
609 VL53L1_Error VL53L1_disable_xtalk_compensation(
610 	VL53L1_DEV                 Dev);
611 
612 
613 /**
614  * @brief  Simple function to retrieve xtalk compensation
615  * status
616  *
617  * @param[in]   Dev                             : Device Handle
618  * @param[out]  pcrosstalk_compensation_enable  : pointer to \
619  * uint8 type, returns crosstalk compensation status \
620  * where 0 means disabled and 1 means enabled.
621  *
622  */
623 
624 void VL53L1_get_xtalk_compensation_enable(
625 	VL53L1_DEV    Dev,
626 	uint8_t       *pcrosstalk_compensation_enable);
627 
628 /**
629  * @brief  Builds and sends the I2C buffer to initialize the device
630  *         and start a range measurement
631  *
632  * The device_config_level input controls the level of initialization
633  * applied to the device
634  *
635  *  - System control only
636  *  - Dynamic Onwards
637  *      - dynamic_config and system_control
638  *  - Static Onwards
639  *      - static_config, dynamic_config & system_control
640  *      - software standby mode only
641  *  - Customer Onwards
642  *      - customer_nvm_managed, static_config, dynamic_config & system_control
643  *      - software standby mode only
644  *  - Full
645  *      - static_nvm_managed, customer_nvm_managed, static_config, dynamic_config & system_control
646  *      - software standby mode only
647  *
648  * The system_control register group is always written as the last
649  * register of this group SYSTEM__MODE_START decides what happens next ...
650  *
651  * @param[in]   Dev                   : Device handle
652  * @param[in]   measurement_mode      : Options: \n
653  *                                      VL53L1_DEVICEMEASUREMENTMODE_STOP \n
654  *                                      VL53L1_DEVICEMEASUREMENTMODE_SINGLESHOT \n
655  *                                      VL53L1_DEVICEMEASUREMENTMODE_BACKTOBACK \n
656  *                                      VL53L1_DEVICEMEASUREMENTMODE_TIMED
657  * @param[in]   device_config_level   : Options: \n
658  *                                      VL53L1_DEVICECONFIGLEVEL_SYSTEM_CONTROL \n
659  *                                      VL53L1_DEVICECONFIGLEVEL_DYNAMIC_ONWARDS \n
660  *                                      VL53L1_DEVICECONFIGLEVEL_TIMING_ONWARDS \n
661  *                                      VL53L1_DEVICECONFIGLEVEL_STATIC_ONWARDS \n
662  *                                      VL53L1_DEVICECONFIGLEVEL_CUSTOMER_ONWARDS \n
663  *                                      VL53L1_DEVICECONFIGLEVEL_FULL
664  *
665  * The system_control register group is always written as the last
666  * register of this group SYSTEM__MODE_START decides what happens next ..
667  * @return  VL53L1_ERROR_NONE     Success
668  * @return  "Other error code"    See ::VL53L1_Error
669  */
670 
671 VL53L1_Error VL53L1_init_and_start_range(
672 	VL53L1_DEV                      Dev,
673 	uint8_t                         measurement_mode,
674 	VL53L1_DeviceConfigLevel        device_config_level);
675 
676 
677 /**
678  * @brief  Sends an abort command to stop the in progress range.
679  *         Also clears all of the measurement mode bits.
680  *
681  * @param[in]   Dev                  : Device handle
682  *
683  * @return  VL53L1_ERROR_NONE     Success
684  * @return  "Other error code"    See ::VL53L1_Error
685  */
686 
687 VL53L1_Error VL53L1_stop_range(
688 	VL53L1_DEV  Dev);
689 
690 
691 /**
692  * @brief  Get range measurement result data
693  *
694  * Reads the required number of registers as single multi byte read
695  * transaction and decodes the data into the data structures
696  *
697  * range_result_level controls which result data is read back from the
698  * device
699  *
700  *  - Full
701  *     - both system and core results are read back
702  *  - System Results
703  *     - only system results are read back
704  *     - only the system_results structure is updated in this case
705  *
706  * @param[in]   Dev                   : Device Handle
707  * @param[in]   device_result_level   : Options: \n
708  *                                      VL53L1_DEVICERESULTSLEVEL_FULL \n
709  *                                      VL53L1_DEVICERESULTSLEVEL_UPTO_CORE \n
710  *                                      VL53L1_DEVICERESULTSLEVEL_SYSTEM_RESULTS
711  *
712  * @return  VL53L1_ERROR_NONE     Success
713  * @return  "Other error code"    See ::VL53L1_Error
714  */
715 
716 VL53L1_Error VL53L1_get_measurement_results(
717 	VL53L1_DEV                  Dev,
718 	VL53L1_DeviceResultsLevel   device_result_level);
719 
720 
721 /**
722  * @brief  Get device system results, updates GPH registers and
723  *         clears interrupt and configures SYSTEM__MODE_START
724  *         based on the input measurement mode
725  *
726  * Internally uses the following functions:
727  *
728  *  - VL53L1_get_measurement_results()
729  *  - VLS3L1_init_and_start_range()
730  *
731  * The system_control register group is always written as the last
732  * register of this group SYSTEM__MODE_START decides what happens next ...
733  *
734  * @param[in]   Dev                  : Device Handle
735  * @param[in]   device_result_level  : Options: \n
736  *                                      VL53L1_DEVICERESULTSLEVEL_FULL \n
737  *                                      VL53L1_DEVICERESULTSLEVEL_UPTO_CORE \n
738  *                                      VL53L1_DEVICERESULTSLEVEL_SYSTEM_RESULTS
739  * @param[out]  prange_results      : pointer to VL53L1_range_results_t
740 
741  *
742  * @return  VL53L1_ERROR_NONE     Success
743  * @return  "Other error code"    See ::VL53L1_Error
744  */
745 
746 VL53L1_Error VL53L1_get_device_results(
747 	VL53L1_DEV                 Dev,
748 	VL53L1_DeviceResultsLevel  device_result_level,
749 	VL53L1_range_results_t    *prange_results);
750 
751 
752 /**
753  * @brief Sends the ranging handshake to clear the interrupt
754  *        allow the device to move onto the next range
755  *
756  * updates GPH registers and clears interrupt and configures
757  * SYSTEM__MODE_START register based on the input measurement mode
758  *
759  * Internally uses the following functions:
760  *
761  *  - VLS3L1_init_and_start_range()
762  *
763  * The system_control register group is always written as the last
764  * register of this group SYSTEM__MODE_START decides what happens next ...
765  *
766  * @param[in]   Dev                   : Device Handle
767  * @param[in]   measurement_mode      : Options: \n
768  *                                      VL53L1_DEVICEMEASUREMENTMODE_STOP \n
769  *                                      VL53L1_DEVICEMEASUREMENTMODE_SINGLESHOT \n
770  *                                      VL53L1_DEVICEMEASUREMENTMODE_BACKTOBACK \n
771  *                                      VL53L1_DEVICEMEASUREMENTMODE_TIMED
772  *
773  * @return  VL53L1_ERROR_NONE     Success
774  * @return  "Other error code"    See ::VL53L1_Error
775  */
776 
777 VL53L1_Error VL53L1_clear_interrupt_and_enable_next_range(
778 	VL53L1_DEV       Dev,
779 	uint8_t          measurement_mode);
780 
781 
782 /**
783  * @brief Copies system and core results to range results data structure
784  *
785  * @param[in]   gain_factor   : gain correction factor 1.11 format
786  * @param[in]   psys          : pointer to VL53L1_system_results_t
787  * @param[in]   pcore         : pointer to VL53L1_core_results_t
788  * @param[out]  presults      : pointer to VL53L1_range_results_t
789  */
790 
791 void VL53L1_copy_sys_and_core_results_to_range_results(
792 	int32_t                           gain_factor,
793 	VL53L1_system_results_t          *psys,
794 	VL53L1_core_results_t            *pcore,
795 	VL53L1_range_results_t           *presults);
796 
797 /**
798  * @brief Configure the GPIO interrupt config, from the given input
799  *
800  * @param[in]    Dev                    : Device Handle
801  * @param[in]    intr_mode_distance     : distance interrupt mode
802  * @param[in]    intr_mode_rate         : rate interrupt mode
803  * @param[in]    intr_new_measure_ready : trigger when new interrupt ready
804  * @param[in]    intr_no_target         : trigger when no target found
805  * @param[in]    intr_combined_mode     : switch on combined mode
806  * @param[in]    thresh_distance_high	: High distance threshold in mm
807  * @param[in]    thresh_distance_low  	: Low distance threshold in mm
808  * @param[in]    thresh_rate_high	: High rate threshold in 9.7 Mcps
809  * @param[in]    thresh_rate_low 	: Low rate threshold in 9.7 Mcps
810  */
811 
812 VL53L1_Error VL53L1_set_GPIO_interrupt_config(
813 	VL53L1_DEV                      Dev,
814 	VL53L1_GPIO_Interrupt_Mode	intr_mode_distance,
815 	VL53L1_GPIO_Interrupt_Mode	intr_mode_rate,
816 	uint8_t				intr_new_measure_ready,
817 	uint8_t				intr_no_target,
818 	uint8_t				intr_combined_mode,
819 	uint16_t			thresh_distance_high,
820 	uint16_t			thresh_distance_low,
821 	uint16_t			thresh_rate_high,
822 	uint16_t			thresh_rate_low
823 	);
824 
825 /**
826  * @brief Configure the GPIO interrupt config, from the given structure
827  *
828  * @param[in]    Dev    	: Device Handle
829  * @param[in]    intconf	: input structure (note, not a pointer)
830  */
831 
832 VL53L1_Error VL53L1_set_GPIO_interrupt_config_struct(
833 	VL53L1_DEV                      Dev,
834 	VL53L1_GPIO_interrupt_config_t	intconf);
835 
836 /**
837  * @brief Retrieves the GPIO interrupt config structure currently programmed
838  * 		into the API
839  *
840  * @param[in]    Dev    	: Device Handle
841  * @param[out]   pintconf	: output pointer to structure (note, pointer)
842  */
843 
844 VL53L1_Error VL53L1_get_GPIO_interrupt_config(
845 	VL53L1_DEV                      Dev,
846 	VL53L1_GPIO_interrupt_config_t	*pintconf);
847 
848 /**
849  * @brief Set function for offset calibration mode
850  *
851  * @param[in]    Dev    	      : Device Handle
852  * @param[in]    offset_cal_mode  : input calibration mode
853  *
854  * @return   VL53L1_ERROR_NONE    Success
855  * @return  "Other error code"    See ::VL53L1_Error
856  */
857 
858 VL53L1_Error VL53L1_set_offset_calibration_mode(
859 	VL53L1_DEV                      Dev,
860 	VL53L1_OffsetCalibrationMode   offset_cal_mode);
861 
862 
863 /**
864  * @brief Get function for offset calibration mode
865  *
866  * @param[in]    Dev    	        : Device Handle
867  * @param[out]   poffset_cal_mode	: output pointer for calibration mode
868  *
869  * @return   VL53L1_ERROR_NONE    Success
870  * @return  "Other error code"    See ::VL53L1_Error
871  */
872 
873 VL53L1_Error VL53L1_get_offset_calibration_mode(
874 	VL53L1_DEV                      Dev,
875 	VL53L1_OffsetCalibrationMode  *poffset_cal_mode);
876 
877 
878 /**
879  * @brief Set function for offset correction mode
880  *
881  * @param[in]    Dev    	      : Device Handle
882  * @param[in]    offset_cor_mode  : input correction mode
883  *
884  * @return   VL53L1_ERROR_NONE    Success
885  * @return  "Other error code"    See ::VL53L1_Error
886  */
887 
888 VL53L1_Error VL53L1_set_offset_correction_mode(
889 	VL53L1_DEV                     Dev,
890 	VL53L1_OffsetCalibrationMode   offset_cor_mode);
891 
892 
893 /**
894  * @brief Get function for offset correction mode
895  *
896  * @param[in]    Dev    	        : Device Handle
897  * @param[out]   poffset_cor_mode	: output pointer for correction mode
898  *
899  * @return   VL53L1_ERROR_NONE    Success
900  * @return  "Other error code"    See ::VL53L1_Error
901  */
902 
903 VL53L1_Error VL53L1_get_offset_correction_mode(
904 	VL53L1_DEV                    Dev,
905 	VL53L1_OffsetCorrectionMode  *poffset_cor_mode);
906 
907 /**
908  * @brief Get function for Xtalk Margin setting
909  * Histogram Mode version
910  *
911  * @param[in]    Dev    	    : Device Handle
912  * @param[out]   pxtalk_margin	: output pointer for int16_t xtalk_margin factor \
913  *                            in fixed point 7.9 Kcps.
914  *
915  * @return   VL53L1_ERROR_NONE    Success
916  * @return  "Other error code"    See ::VL53L1_Error
917  */
918 
919 VL53L1_Error VL53L1_get_lite_xtalk_margin_kcps(
920 	VL53L1_DEV                          Dev,
921 	int16_t                           *pxtalk_margin);
922 
923 /**
924  * @brief Set function for Xtalk Margin setting
925  *  Histogram Mode version
926  *
927  * @param[in]  Dev    	     : Device Handle
928  * @param[in]  xtalk_margin : Input int16_t xtalk_margin factor \
929  *                            in fixed point 7.9 Kcps.
930  *
931  * @return   VL53L1_ERROR_NONE    Success
932  * @return  "Other error code"    See ::VL53L1_Error
933  */
934 
935 VL53L1_Error VL53L1_set_lite_xtalk_margin_kcps(
936 	VL53L1_DEV                          Dev,
937 	int16_t                             xtalk_margin);
938 
939 /**
940  * @brief Get function for Lite Mode Minimum Count Rate
941  * parameter, used to filter and validate ranges based on
942  * signal rate
943  *
944  * Note: the min count rate value is overwritten when setting preset
945  * modes, and should only be altered after preset mode has been
946  * selected when running Lite Mode.
947  *
948  * @param[in]  Dev    	     : Device Handle
949  * @param[out] plite_mincountrate : Output pointer for uint16_t min count rate\
950  *                            in fixed point 9.7 Mcps
951  *
952  * @return   VL53L1_ERROR_NONE    Success
953  * @return  "Other error code"    See ::VL53L1_Error
954  */
955 
956 VL53L1_Error VL53L1_get_lite_min_count_rate(
957 	VL53L1_DEV                          Dev,
958 	uint16_t                           *plite_mincountrate);
959 
960 
961 /**
962  * @brief Set function for Lite Mode Minimum Count Rate
963  * parameter, used to filter and validate ranges based on
964  * signal rate
965  *
966  * Note: the min count rate value is overwritten when setting preset
967  * modes, and should only be altered after preset mode has been
968  * selected when running Lite Mode.
969  *
970  * @param[in]  Dev    	     : Device Handle
971  * @param[in]  lite_mincountrate : Input uint16_t min count rate
972  *                                  in fixed point 9.7 Mcps
973  *
974  * @return   VL53L1_ERROR_NONE    Success
975  * @return  "Other error code"    See ::VL53L1_Error
976  */
977 
978 VL53L1_Error VL53L1_set_lite_min_count_rate(
979 	VL53L1_DEV                          Dev,
980 	uint16_t                            lite_mincountrate);
981 
982 
983 /**
984  * @brief Get function for Lite Mode Max Sigma Threshold
985  * parameter, used to filter and validate ranges based on
986  * estimated sigma level
987  *
988  * Note: the sigma thresh value is overwritten when setting preset
989  * modes, and should only be altered after preset mode has been
990  * selected when running Lite Mode.
991  *
992  * @param[in]  Dev    	   : Device Handle
993  * @param[out] plite_sigma : Output pointer for uint16_t sigma thresh\
994  *                            in fixed point 14.2 mm
995  *
996  * @return   VL53L1_ERROR_NONE    Success
997  * @return  "Other error code"    See ::VL53L1_Error
998  */
999 
1000 
1001 VL53L1_Error VL53L1_get_lite_sigma_threshold(
1002 	VL53L1_DEV                          Dev,
1003 	uint16_t                           *plite_sigma);
1004 
1005 
1006 /**
1007  * @brief Set function for Lite Mode Max Sigma Threshold
1008  * parameter, used to filter and validate ranges based on
1009  * estimated sigma level
1010  *
1011  * Note: the sigma thresh value is overwritten when setting preset
1012  * modes, and should only be altered after preset mode has been
1013  * selected when running Lite Mode.
1014  *
1015  * @param[in]  Dev    	   : Device Handle
1016  * @param[in]  lite_sigma  : Input  uint16_t sigma thresh\
1017  *                            in fixed point 14.2 mm
1018  *
1019  * @return   VL53L1_ERROR_NONE    Success
1020  * @return  "Other error code"    See ::VL53L1_Error
1021  */
1022 
1023 VL53L1_Error VL53L1_set_lite_sigma_threshold(
1024 	VL53L1_DEV                          Dev,
1025 	uint16_t                            lite_sigma);
1026 
1027 
1028 /**
1029  * @brief Function to restore the plane_offset, x gradient and y gradient
1030  * values to original NVM values.
1031  *
1032  * This function does not recalculate all xtalk parms derived from the
1033  * rates in question. In order to ensure correct ranging, a call to
1034  * VL53L1_enable_xtalk_compensation should always be called prior
1035  * to starting the ranging process.
1036  *
1037  * @param[in]  Dev    	   : Device Handle
1038  *
1039  * @return   VL53L1_ERROR_NONE    Success
1040  * @return  "Other error code"    See ::VL53L1_Error
1041  */
1042 
1043 VL53L1_Error VL53L1_restore_xtalk_nvm_default(
1044 	VL53L1_DEV                     Dev);
1045 
1046 /**
1047  * @brief Set function for VHV Config values
1048  * sets two parms into individual internal byte
1049  *
1050  * init_en - enables use of the init value instead of latest setting
1051  * init_value - custom vhv setting or populated from nvm
1052  *
1053  * @param[in] Dev    	     : Device Handle
1054  * @param[in] vhv_init_en    : input init_en setting
1055  * @param[in] vhv_init_value : input vhv custom value
1056  *
1057  * @return   VL53L1_ERROR_NONE    Success
1058  * @return  "Other error code"    See ::VL53L1_Error
1059  */
1060 
1061 VL53L1_Error VL53L1_set_vhv_config(
1062 	VL53L1_DEV                   Dev,
1063 	uint8_t                      vhv_init_en,
1064 	uint8_t                      vhv_init_value);
1065 
1066 /**
1067  * @brief Get function for VHV Config values
1068  * extracts two parms from individual internal byte
1069  *
1070  * init_en - enables use of the init value instead of latest setting
1071  * init_value - custom vhv setting or populated from nvm
1072  *
1073  * @param[in] Dev    	       : Device Handle
1074  * @param[out] pvhv_init_en    : Output pointer to uint8_t value
1075  * @param[out] pvhv_init_value : Output pointer to uint8_t value
1076  *
1077  * @return   VL53L1_ERROR_NONE    Success
1078  * @return  "Other error code"    See ::VL53L1_Error
1079  */
1080 
1081 VL53L1_Error VL53L1_get_vhv_config(
1082 	VL53L1_DEV                   Dev,
1083 	uint8_t                     *pvhv_init_en,
1084 	uint8_t                     *pvhv_init_value);
1085 
1086 /**
1087  * @brief Set function for VHV loopbound config
1088  *
1089  * Loopbound sets the number of +/- vhv settings to try
1090  * around the vhv init value during vhv search
1091  * i.e. if init_value = 10 and loopbound = 2
1092  * vhv search will run from 10-2 to 10+2
1093  * 8 to 12.
1094  *
1095  * @param[in] Dev    	       : Device Handle
1096  * @param[in] vhv_loopbound    : input loopbound value
1097  *
1098  * @return   VL53L1_ERROR_NONE    Success
1099  * @return  "Other error code"    See ::VL53L1_Error
1100  */
1101 
1102 VL53L1_Error VL53L1_set_vhv_loopbound(
1103 	VL53L1_DEV                   Dev,
1104 	uint8_t                      vhv_loopbound);
1105 
1106 /**
1107  * @brief Get function for VHV loopbound config
1108  *
1109  * Loopbound sets the number of +/- vhv settings to try
1110  * around the vhv init value during vhv search
1111  * i.e. if init_value = 10 and loopbound = 2
1112  * vhv search will run from 10-2 to 10+2
1113  * 8 to 12.
1114  *
1115  * @param[in]  Dev    	       : Device Handle
1116  * @param[out] pvhv_loopbound  : pointer to byte to extract loopbound
1117  *
1118  * @return   VL53L1_ERROR_NONE    Success
1119  * @return  "Other error code"    See ::VL53L1_Error
1120  */
1121 
1122 VL53L1_Error VL53L1_get_vhv_loopbound(
1123 	VL53L1_DEV                   Dev,
1124 	uint8_t                     *pvhv_loopbound);
1125 
1126 /**
1127  * @brief Generic Tuning Parameter extraction function
1128  *
1129  * User passes a key input to retrieve a specific tuning parameter
1130  * value, this will be cast to the int32_t type and output via
1131  * the ptuning_parm_value pointer
1132  *
1133  * If the key does not match any tuning parameter, status is returned
1134  * with VL53L1_ERROR_INVALID_PARAMS
1135  *
1136  * Patch_AddedTuningParms_11761
1137  *
1138  * @param[in] Dev    	       : Device Handle
1139  * @param[in] tuning_parm_key  : Key value to access specific tuning parm
1140  * @param[out] ptuning_parm_value : Pointer to output int32_t type, retrieves \
1141  *                                  requested tuning parm
1142  *
1143  * @return   VL53L1_ERROR_NONE    Success
1144  * @return  "Other error code"    See ::VL53L1_Error
1145  */
1146 
1147 VL53L1_Error VL53L1_get_tuning_parm(
1148 	VL53L1_DEV                     Dev,
1149 	VL53L1_TuningParms             tuning_parm_key,
1150 	int32_t                       *ptuning_parm_value);
1151 
1152 /**
1153  * @brief Generic Tuning Parameter set function
1154  *
1155  * User passes a key input to set a specific tuning parameter
1156  * value, this will be cast to the internal data type from the
1157  * input int32_t data type.
1158  *
1159  * If the key does not match any tuning parameter, status is returned
1160  * with VL53L1_ERROR_INVALID_PARAMS
1161  *
1162  * Patch_AddedTuningParms_11761
1163  *
1164  * @param[in] Dev    	       : Device Handle
1165  * @param[in] tuning_parm_key  : Key value to access specific tuning parm
1166  * @param[in] tuning_parm_value : Input tuning parm value of int32_t type, \
1167  *                                sets requested tuning parm.
1168  *
1169  * @return   VL53L1_ERROR_NONE    Success
1170  * @return  "Other error code"    See ::VL53L1_Error
1171  */
1172 
1173 VL53L1_Error VL53L1_set_tuning_parm(
1174 	VL53L1_DEV                     Dev,
1175 	VL53L1_TuningParms             tuning_parm_key,
1176 	int32_t                        tuning_parm_value);
1177 
1178 
1179 #ifdef __cplusplus
1180 }
1181 #endif
1182 
1183 #endif /* _VL53L1_API_CORE_H_ */
1184