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_ll_def.h 65 * 66 * @brief Type definitions for VL53L1 LL Driver. 67 * 68 */ 69 70 71 #ifndef _VL53L1_LL_DEF_H_ 72 #define _VL53L1_LL_DEF_H_ 73 74 #include "vl53l1_ll_device.h" 75 #include "vl53l1_error_codes.h" 76 #include "vl53l1_register_structs.h" 77 #include "vl53l1_platform_user_config.h" 78 #include "vl53l1_platform_user_defines.h" 79 #include "vl53l1_error_exceptions.h" 80 81 #ifdef __cplusplus 82 extern "C" { 83 #endif 84 85 /** @defgroup VL53L1_globalLLDriverDefine_group VL53L1 Defines 86 * @brief VL53L1 LL Driver Defines 87 * @{ 88 */ 89 90 /** VL53L1 Low Level Driver IMPLEMENTATION major version */ 91 #define VL53L1_LL_API_IMPLEMENTATION_VER_MAJOR 1 92 /** VL53L1 Low Level DriverI IMPLEMENTATION minor version */ 93 #define VL53L1_LL_API_IMPLEMENTATION_VER_MINOR 2 94 /** VL53L1 Low Level DriverI IMPLEMENTATION sub version */ 95 #define VL53L1_LL_API_IMPLEMENTATION_VER_SUB 13 96 /** VL53L1 Low Level Driver IMPLEMENTATION sub version */ 97 #define VL53L1_LL_API_IMPLEMENTATION_VER_REVISION 2190 98 99 #define VL53L1_LL_API_IMPLEMENTATION_VER_STRING "1.2.13.2190" 100 101 /** VL53L1_FIRMWARE min and max compatible revisions */ 102 #define VL53L1_FIRMWARE_VER_MINIMUM 398 103 #define VL53L1_FIRMWARE_VER_MAXIMUM 400 104 105 106 /**************************************** 107 * PRIVATE define do not edit 108 ****************************************/ 109 110 #define VL53L1_LL_CALIBRATION_DATA_STRUCT_VERSION 0xECAB0102 111 /** VL53L1 Calibration Data struct version */ 112 113 /* Start Patch_ZoneCalDataStructVersion_11854 */ 114 115 #define VL53L1_LL_ZONE_CALIBRATION_DATA_STRUCT_VERSION 0xECAE0101 116 /** VL53L1 Zone Calibration Data struct version */ 117 118 /* End Patch_ZoneCalDataStructVersion_11854 */ 119 120 #define VL53L1_MAX_OFFSET_RANGE_RESULTS 3 121 /*!< Sets the maximum number of offset range results 122 required for the offset calibration. 123 Order is RANGE, MM1, MM2 */ 124 125 #define VL53L1_NVM_MAX_FMT_RANGE_DATA 4 126 /*!< The number of FMT range data points stored in NVM */ 127 128 #define VL53L1_NVM_PEAK_RATE_MAP_SAMPLES 25 129 /*!< The number of samples in the NVM peak rate signal map */ 130 #define VL53L1_NVM_PEAK_RATE_MAP_WIDTH 5 131 /*!< Array width of NVM peak rate signal map */ 132 #define VL53L1_NVM_PEAK_RATE_MAP_HEIGHT 5 133 /*!< Array height the NVM peak rate signal map */ 134 135 /** @defgroup VL53L1_defineExtraError_group Error and Warning code returned by API 136 * The following DEFINE are used to identify the PAL ERROR 137 * @{ 138 */ 139 140 #define VL53L1_ERROR_DEVICE_FIRMWARE_TOO_OLD ((VL53L1_Error) - 80) 141 /*!< Device Firmware too old .. */ 142 #define VL53L1_ERROR_DEVICE_FIRMWARE_TOO_NEW ((VL53L1_Error) - 85) 143 /*!< Device Firmware too new .. */ 144 #define VL53L1_ERROR_UNIT_TEST_FAIL ((VL53L1_Error) - 90) 145 /*!< Unit Test Fail */ 146 #define VL53L1_ERROR_FILE_READ_FAIL ((VL53L1_Error) - 95) 147 /*!< File Read Fail */ 148 #define VL53L1_ERROR_FILE_WRITE_FAIL ((VL53L1_Error) - 96) 149 /*!< File Write Fail */ 150 /*!< Tells requested functionality has not been implemented yet or 151 * not compatible with the device */ 152 /** @} VL53L1_defineExtraError_group */ 153 154 155 /** @brief Defines the parameters of the LL driver Get Version Functions 156 */ 157 typedef struct { 158 uint32_t ll_revision; /*!< revision number */ 159 uint8_t ll_major; /*!< major number */ 160 uint8_t ll_minor; /*!< minor number */ 161 uint8_t ll_build; /*!< build number */ 162 } VL53L1_ll_version_t; 163 164 165 /** @brief Reference SPAD Characterization (RefSpadChar) Config 166 */ 167 168 typedef struct { 169 170 uint8_t device_test_mode; /*!< Device test mode */ 171 uint8_t vcsel_period; /*!< VCSEL period (register) value */ 172 uint32_t timeout_us; /*!< timeout in [us] */ 173 uint16_t target_count_rate_mcps; 174 /*!< Target reference total count rate in [Mcps] - 9.7 format */ 175 uint16_t min_count_rate_limit_mcps; 176 /*!< Min valid reference rate [Mcps] - 9.7 format */ 177 uint16_t max_count_rate_limit_mcps; 178 /*!< Max valid reference rate [Mcps] - 9.7 format */ 179 180 } VL53L1_refspadchar_config_t; 181 182 183 /** @brief SPAD Self Check (SSC) Config data structure 184 */ 185 186 187 typedef struct { 188 189 VL53L1_DeviceSscArray array_select; 190 /*!< SPAD Array select 191 * 0 - store RTN array count rates \n 192 * 1 - store REF array count rates */ 193 uint8_t vcsel_period; 194 /*!< VCSEL period (register) value */ 195 uint8_t vcsel_start; 196 /*!< VCSEL start register value */ 197 uint8_t vcsel_width; 198 /*!< VCSEL ssc_timeout_us width register value e.g. 2 */ 199 uint32_t timeout_us; 200 /*!< requested Ranging Timeout in [us] e.g 100000us */ 201 uint16_t rate_limit_mcps; 202 /*!< Rate limit for checks either 1.15 or 203 * 9.7 dependent on test_mode 204 */ 205 206 } VL53L1_ssc_config_t; 207 208 209 /** @brief Xtalk Extraction and Paramter Config 210 */ 211 212 typedef struct { 213 214 215 uint32_t algo__crosstalk_compensation_plane_offset_kcps; 216 /*!< Private crosstalk_compensation_plane_offset_kcps (fixed point 9.9) */ 217 int16_t algo__crosstalk_compensation_x_plane_gradient_kcps; 218 /*!< Private crosstalk_compensation_x_plane_gradient_kcps (fixed point 5.11) */ 219 int16_t algo__crosstalk_compensation_y_plane_gradient_kcps; 220 /*!< Private crosstalk_compensation_y_plane_gradient_kcps (fixed point 5.11) */ 221 uint32_t nvm_default__crosstalk_compensation_plane_offset_kcps; 222 /*!< NVm stored crosstalk_compensation_plane_offset_kcps (fixed point 9.9) */ 223 int16_t nvm_default__crosstalk_compensation_x_plane_gradient_kcps; 224 /*!< NVM stored crosstalk_compensation_x_plane_gradient_kcps (fixed point 5.11) */ 225 int16_t nvm_default__crosstalk_compensation_y_plane_gradient_kcps; 226 /*!< NVM stored crosstalk_compensation_y_plane_gradient_kcps (fixed point 5.11) */ 227 uint8_t global_crosstalk_compensation_enable; 228 /*!< Enable switch for crosstalk compensation in all modes */ 229 int16_t lite_mode_crosstalk_margin_kcps; 230 /*!< Additional xtalk factor rate, added to plane_offset value in both 231 * SD mode, applied as a seperate addition at point of 232 * application to the device, plane_offset 233 * value remains unaltered. (fixed point 7.9) 234 */ 235 uint8_t crosstalk_range_ignore_threshold_mult; 236 /*!< User set multiplier for range ignore threshold setting (fixed point 3.5) */ 237 uint16_t crosstalk_range_ignore_threshold_rate_mcps; 238 /*!< Generated range ignore threshold rate in Mcps per spad (fixed 239 * point 3.13) 240 */ 241 242 } VL53L1_xtalk_config_t; 243 244 245 /** @brief TuningParameter Storage 246 * 247 * - Storage structure for any LLD tuning parms 248 * which are dynamically altered by low level functions 249 * mostly when programming directly to the device 250 * 251 *- Added as part of Patch_AddingTuningParmStorage_11821 252 */ 253 254 typedef struct { 255 256 257 uint16_t tp_tuning_parm_version; 258 /*!< Programmed Global tuning version num for debug 259 */ 260 uint16_t tp_tuning_parm_key_table_version; 261 /*!< Key Table tuning structure \ 262 * version 263 */ 264 uint16_t tp_tuning_parm_lld_version; 265 /*!< Programmed LLD version to ensure matching tuning structure \ 266 * key table 267 */ 268 uint8_t tp_init_phase_rtn_lite_long; 269 /*!< initial phase value for rtn array \ 270 * in Lite Long Ranging Mode 271 */ 272 uint8_t tp_init_phase_rtn_lite_med; 273 /*!< initial phase value for rtn array \ 274 * in Lite Medium Ranging Mode 275 */ 276 uint8_t tp_init_phase_rtn_lite_short; 277 /*!< initial phase value for rtn array \ 278 * in Lite Short Ranging Mode 279 */ 280 uint8_t tp_init_phase_ref_lite_long; 281 /*!< initial phase value for ref array \ 282 * in Lite Long Ranging Mode 283 */ 284 uint8_t tp_init_phase_ref_lite_med; 285 /*!< initial phase value for ref array \ 286 * in Lite Medium Ranging Mode 287 */ 288 uint8_t tp_init_phase_ref_lite_short; 289 /*!< initial phase value for ref array \ 290 * in Lite short Ranging Mode 291 */ 292 293 uint8_t tp_consistency_lite_phase_tolerance; 294 /*!< Phase tolerance consistency value to be used \ 295 * in Lite modes 296 */ 297 uint8_t tp_phasecal_target; 298 /*!< Phasecal target value 299 */ 300 uint16_t tp_cal_repeat_rate; 301 /*!< Auto VHV/Calibration repeat rate for \ 302 * use in Lite mode 303 */ 304 uint8_t tp_lite_min_clip; 305 /*!< Min Clip value in mm applied to device in Lite \ 306 * modes 307 */ 308 309 uint16_t tp_lite_long_sigma_thresh_mm; 310 /*!< Sigma threshold limit for Lite Long mode \ 311 * in 14.2 format mm 312 */ 313 uint16_t tp_lite_med_sigma_thresh_mm; 314 /*!< Sigma threshold limit for Lite Medium mode \ 315 * in 14.2 format mm 316 */ 317 uint16_t tp_lite_short_sigma_thresh_mm; 318 /*!< Sigma threshold limit for Lite Short mode \ 319 * in 14.2 format mm 320 */ 321 322 uint16_t tp_lite_long_min_count_rate_rtn_mcps; 323 /*!< Min count rate level used in lite long mode \ 324 * in 9.7 Mcps format 325 */ 326 uint16_t tp_lite_med_min_count_rate_rtn_mcps; 327 /*!< Min count rate level used in lite medium mode \ 328 * in 9.7 Mcps format 329 */ 330 uint16_t tp_lite_short_min_count_rate_rtn_mcps; 331 /*!< Min count rate level used in lite short mode \ 332 * in 9.7 Mcps format 333 */ 334 335 uint8_t tp_lite_sigma_est_pulse_width_ns; 336 /*!< Sigma thresholding tunign parm for Lite mode 337 */ 338 uint8_t tp_lite_sigma_est_amb_width_ns; 339 /*!< Sigma thresholding tunign parm for Lite mode 340 */ 341 uint8_t tp_lite_sigma_ref_mm; 342 /*!< Sigma thresholding tunign parm for Lite mode 343 */ 344 uint8_t tp_lite_seed_cfg; 345 /*!< Lite Mode Seed mode switch 346 */ 347 uint8_t tp_timed_seed_cfg; 348 /*!< Timed Mode Seed mode switch 349 */ 350 351 uint8_t tp_lite_quantifier; 352 /*!< Low level quantifier setting for lite modes 353 */ 354 uint8_t tp_lite_first_order_select; 355 /*!< Low level First order select setting for lite modes 356 */ 357 358 uint16_t tp_dss_target_lite_mcps; 359 /*!< DSS Target rate in 9.7 format Mcps for lite modes 360 */ 361 uint16_t tp_dss_target_timed_mcps; 362 /*!< DSS Target rate in 9.7 format Mcps for Timed modes 363 */ 364 365 uint32_t tp_phasecal_timeout_lite_us; 366 /*!< Phasecal timeout in us for lite modes 367 */ 368 369 uint32_t tp_phasecal_timeout_timed_us; 370 /*!< Phasecal timeout in us for Timed modes 371 */ 372 373 uint32_t tp_mm_timeout_lite_us; 374 /*!< MM stage timeout in us for Lite modes 375 */ 376 uint32_t tp_mm_timeout_timed_us; 377 /*!< MM stage timeout in us for Timed modes 378 */ 379 uint32_t tp_mm_timeout_lpa_us; 380 /*!< MM stage timeout in us for Low Power Auto modes 381 */ 382 383 uint32_t tp_range_timeout_lite_us; 384 /*!< Ranging stage timeout in us for Lite modes 385 */ 386 uint32_t tp_range_timeout_timed_us; 387 /*!< Ranging stage timeout in us for Timed modes 388 */ 389 uint32_t tp_range_timeout_lpa_us; 390 /*!< Ranging stage timeout in us for Low Power Auto modes 391 */ 392 393 } VL53L1_tuning_parm_storage_t; 394 395 396 397 /** @brief Optical Centre data 398 * 399 */ 400 401 typedef struct { 402 403 uint8_t x_centre; /*!< Optical x centre : 4.4 format */ 404 uint8_t y_centre; /*!< Optical y centre : 4.4 format */ 405 406 } VL53L1_optical_centre_t; 407 408 409 /** @brief Defines User Zone(ROI) parameters 410 * 411 */ 412 413 typedef struct { 414 415 uint8_t x_centre; /*!< Zone x centre : 0-15 range */ 416 uint8_t y_centre; /*!< Zone y centre : 0-15 range */ 417 uint8_t width; /*!< Width of Zone 0 = 1, 7 = 8, 15 = 16 */ 418 uint8_t height; /*!< Height of Zone 0 = 1, 7 = 8, 15 = 16 */ 419 420 } VL53L1_user_zone_t; 421 422 423 /** 424 * @struct VL53L1_GPIO_interrupt_config_t 425 * 426 * @brief Structure to configure conditions when GPIO interrupt is trigerred 427 * 428 */ 429 430 typedef struct { 431 432 /*! Distance interrupt mode */ 433 VL53L1_GPIO_Interrupt_Mode intr_mode_distance; 434 435 /*! Rate interrupt mode */ 436 VL53L1_GPIO_Interrupt_Mode intr_mode_rate; 437 438 /*! trigger interrupt if a new measurement is ready 439 * __WARNING!__ will override other settings 440 */ 441 uint8_t intr_new_measure_ready; 442 443 /*! Trigger interrupt if no target found */ 444 uint8_t intr_no_target; 445 446 /*! If set to 0, interrupts will only be triggered if BOTH rate AND 447 * distance thresholds are triggered (combined mode). If set to 1, 448 * interrupts will be triggered if EITHER rate OR distance thresholds 449 * are triggered (independent mode). */ 450 uint8_t intr_combined_mode; 451 452 /* -- thresholds -- */ 453 /* The struct holds a copy of the thresholds but they are written when 454 * this structure is set using VL53L1_set_GPIO_interrupt_config/_struct 455 * */ 456 457 /*! Distance threshold high limit (mm) */ 458 uint16_t threshold_distance_high; 459 460 /*! Distance threshold low limit (mm) */ 461 uint16_t threshold_distance_low; 462 463 /*! Rate threshold high limit (9.7 Mcps) */ 464 uint16_t threshold_rate_high; 465 466 /*! Rate threshold low limit (9.7 Mcps) */ 467 uint16_t threshold_rate_low; 468 469 } VL53L1_GPIO_interrupt_config_t; 470 471 /* Start Patch_LowPowerAutoMode */ 472 /** 473 * @struct VL53L1_low_power_auto_data_t 474 * 475 * @brief Structure to hold state, tuning and output variables for the low 476 * power auto mode (Presence) 477 * 478 */ 479 480 typedef struct { 481 482 /*! Tuning variable for the VHV loop bound setting in low power auto 483 * mode. This is zero based, so the number of loops in VHV is this + 1. 484 * Please note, the first range will run with default VHV settings. 485 * Only lower 6 bits are allowed */ 486 uint8_t vhv_loop_bound; 487 488 /*! Indicates if we are or are not in low power auto mode */ 489 uint8_t is_low_power_auto_mode; 490 491 /*! Used to check if we're running the first range or not. Not to be 492 * used as a stream count */ 493 uint8_t low_power_auto_range_count; 494 495 /*! saved interrupt config byte to restore */ 496 uint8_t saved_interrupt_config; 497 498 /*! saved vhv config init byte to restore */ 499 uint8_t saved_vhv_init; 500 501 /*! saved vhv config timeout byte to restore */ 502 uint8_t saved_vhv_timeout; 503 504 /*! phase cal resutl from the first range */ 505 uint8_t first_run_phasecal_result; 506 507 /*! DSS. Total rate per spad given from the current range */ 508 uint32_t dss__total_rate_per_spad_mcps; 509 510 /*! DSS. Calculated required SPADs value */ 511 uint16_t dss__required_spads; 512 513 } VL53L1_low_power_auto_data_t; 514 515 /* End Patch_LowPowerAutoMode */ 516 517 /** 518 * @struct VL53L1_range_data_t 519 * @brief Internal data structure for storing post processed ranges 520 * 521 */ 522 523 typedef struct { 524 525 /* Info size */ 526 527 uint8_t range_id; 528 /*!< Range Result id e.g 0, 1, 2 */ 529 uint32_t time_stamp; 530 /*!< 32-bit time stamp */ 531 532 uint16_t width; 533 /*!< VCSEL pulse width in [PLL clocks] 6.4 format */ 534 uint8_t woi; 535 /*!< WOI width in [PLL clocks] */ 536 537 uint16_t fast_osc_frequency; 538 /*!< Oscillator frequency in 4.12 format */ 539 uint16_t zero_distance_phase; 540 /*!< Zero Distance phase in 5.11 format */ 541 uint16_t actual_effective_spads; 542 /*!< effective SPAD count in 8.8 format */ 543 544 uint32_t total_periods_elapsed; 545 /*!< Elapsed time in macro periods for readout channel */ 546 547 uint32_t peak_duration_us; 548 /*!< Peak VCSEL width time in us */ 549 550 uint32_t woi_duration_us; 551 /*!< WOI duration time in us */ 552 553 554 /* Event counts */ 555 556 uint32_t ambient_window_events; 557 /*!< Return event count for the ambient window */ 558 uint32_t ranging_total_events; 559 /*!< Return ranging event count for the ranging window. 560 This includes both VCSEL and ambient contributions */ 561 int32_t signal_total_events; 562 /*!< Return event count for the ranging window with ambient 563 subtracted, Note it is 32-bit signed register */ 564 565 /* Rates */ 566 567 uint16_t peak_signal_count_rate_mcps; 568 /*! Peak signal (VCSEL) Rate in 9.7 format */ 569 uint16_t avg_signal_count_rate_mcps; 570 /*! Average signal (VCSEL) Rate in 9.7 format */ 571 uint16_t ambient_count_rate_mcps; 572 /*! Ambient Rate in 9.7 format */ 573 uint16_t total_rate_per_spad_mcps; 574 /*! Total Rate Per SPAD in 3.13 format */ 575 uint32_t peak_rate_per_spad_kcps; 576 /*! Peak Rate Per SPAD in 13.11 format */ 577 578 /* Sigma */ 579 580 uint16_t sigma_mm; 581 /*!< Range sigma Estimate [mm] 9.7 format */ 582 583 /* Phase */ 584 585 uint16_t median_phase; 586 /*!< Median Phase in 5.11 format */ 587 588 /* Range */ 589 590 int16_t median_range_mm; 591 /*!< Median Range in [mm] by default there are no fractional bits 592 Optionally 1 or 2 fractional can be enabled via the 593 VL53L1_SYSTEM__FRACTIONAL_ENABLE register */ 594 595 /* Range status */ 596 597 uint8_t range_status; 598 599 } VL53L1_range_data_t; 600 601 602 /** 603 * @struct VL53L1_range_results_t 604 * @brief Structure for storing the set of range results 605 * 606 */ 607 608 typedef struct { 609 610 VL53L1_DeviceState cfg_device_state; 611 /*!< Configuration Device State */ 612 VL53L1_DeviceState rd_device_state; 613 /*!< Read Device State */ 614 uint8_t stream_count; 615 /*!< 8-bit stream count */ 616 617 uint8_t device_status; 618 /*!< Global device status for result set */ 619 620 VL53L1_range_data_t data[2]; 621 /*!< Range data each target distance */ 622 623 } VL53L1_range_results_t; 624 625 /** 626 * @struct VL53L1_offset_range_data_t 627 * @brief Structure for storing the set of range results 628 * required for the mm1 and mm2 offset calibration 629 * functions 630 * 631 */ 632 633 typedef struct { 634 635 uint8_t preset_mode; 636 /*!< Preset Mode use for range */ 637 uint8_t dss_config__roi_mode_control; 638 /*!< Dynamic SPAD selection mode */ 639 uint16_t dss_config__manual_effective_spads_select; 640 /*!< Requested number of manual effective SPAD's */ 641 uint8_t no_of_samples; 642 /*!< Number of ranges */ 643 uint32_t effective_spads; 644 /*!< Average effective SPAD's 8.8 format */ 645 uint32_t peak_rate_mcps; 646 /*!< Average peak rate Mcps 9.7 format */ 647 uint32_t sigma_mm; 648 /*!< Average sigma in [mm] 14.2 format */ 649 int32_t median_range_mm; 650 /*!< Avg of median range over all ranges \ 651 note value is signed */ 652 int32_t range_mm_offset; 653 /*!< The calculated range offset value */ 654 655 } VL53L1_offset_range_data_t; 656 657 658 /** 659 * @struct VL53L1_offset_range_results_t 660 * @brief Structure for storing the set of range results 661 * required for the offset calibration functions 662 * 663 */ 664 665 typedef struct { 666 667 int16_t cal_distance_mm; 668 /*!< the calibration distance in [mm]*/ 669 VL53L1_Error cal_status; 670 /*!< Calibration status, check for warning codes */ 671 uint8_t cal_report; 672 /*!< Stage for above cal status - 0 Pre, 1 = MM1, 2 = MM2 */ 673 uint8_t max_results; 674 /*!< Array size for histogram range data i.e. max number 675 of results */ 676 uint8_t active_results; 677 /*!< Number of active measurements */ 678 VL53L1_offset_range_data_t data[VL53L1_MAX_OFFSET_RANGE_RESULTS]; 679 /*!< Range results for each offset measurement */ 680 681 } VL53L1_offset_range_results_t; 682 683 /** 684 * @struct VL53L1_additional_offset_cal_data_t 685 * @brief Additional Offset Calibration Data 686 * 687 * Additional offset calibration data. Contains the rate 688 * and effective SPAD counts for the MM inner and outer 689 * calibration steps. 690 */ 691 692 typedef struct { 693 694 uint16_t result__mm_inner_actual_effective_spads; 695 /*!< MM Inner actual effective SPADs, 8.8 format */ 696 uint16_t result__mm_outer_actual_effective_spads; 697 /*!< MM Outer actual effective SPADs, 8.8 format */ 698 uint16_t result__mm_inner_peak_signal_count_rtn_mcps; 699 /*!< Mean value of MM Inner return peak rate in [Mcps], 9.7 format */ 700 uint16_t result__mm_outer_peak_signal_count_rtn_mcps; 701 /*!< Mean value of MM Outer return peak rate in [Mcps], 9.7 format */ 702 703 } VL53L1_additional_offset_cal_data_t; 704 705 706 /** 707 * @struct VL53L1_cal_peak_rate_map_t 708 * @brief Structure for storing the calibration peak rate map 709 * Used by DMAX to understand the spatial roll off 710 * in the signal rate map towards the corner of the 711 * SPAD array. 712 */ 713 714 typedef struct { 715 716 int16_t cal_distance_mm; 717 /*!< calibration distance in [mm], 14.2 format */ 718 uint16_t max_samples; 719 /*!< Array size for rate map i.e. max number samples */ 720 uint16_t width; 721 /*!< Array width */ 722 uint16_t height; 723 /*!< Array height */ 724 uint16_t peak_rate_mcps[VL53L1_NVM_PEAK_RATE_MAP_SAMPLES]; 725 /*!< Array of rate map samples */ 726 727 } VL53L1_cal_peak_rate_map_t; 728 729 730 /** 731 * @struct VL53L1_gain_calibration_data_t 732 * 733 * @brief Gain calibration data 734 * 735 */ 736 737 typedef struct { 738 739 uint16_t standard_ranging_gain_factor; 740 /*!< Standard ranging gain correction factor 1.11 format */ 741 742 } VL53L1_gain_calibration_data_t; 743 744 745 /** 746 * @struct VL53L1_ll_driver_state_t 747 * 748 * @brief Contains the driver state information 749 * 750 */ 751 752 typedef struct { 753 754 VL53L1_DeviceState cfg_device_state; 755 /*!< Configuration Device State */ 756 uint8_t cfg_stream_count; 757 /*!< configuration stream count, becomes expected 758 stream count for zone */ 759 uint8_t cfg_gph_id; 760 /*!< Config Grouped Parameter Hold ID */ 761 uint8_t cfg_timing_status; 762 /*!< Timing A or B flag 0 = A, 1 = B */ 763 764 VL53L1_DeviceState rd_device_state; 765 /*!< Read Device State */ 766 uint8_t rd_stream_count; 767 /*!< rd stream count, used to check actual stream count */ 768 uint8_t rd_gph_id; 769 /*!< Read Grouped Parameter Hold ID */ 770 uint8_t rd_timing_status; 771 /*!< Timing A or B flag 0 = A, 1 = B */ 772 773 } VL53L1_ll_driver_state_t; 774 775 /** @brief Run Offset Cal Function (offsetcal) Config 776 */ 777 778 typedef struct { 779 780 uint16_t dss_config__target_total_rate_mcps; 781 /*!< DSS Target rate in MCPS (9.7 format) used \ 782 * during run_offset_calibration() */ 783 uint32_t phasecal_config_timeout_us; 784 /*!< Phasecal timeout in us \ 785 * used during run_offset_calibration() */ 786 uint32_t range_config_timeout_us; 787 /*!< Range timeout in us used during \ 788 * run_offset_calibration() */ 789 uint32_t mm_config_timeout_us; 790 /*!< MM timeout in us used during \ 791 * run_offset_calibration() \ 792 * Added as part of Patch_AddedOffsetCalMMTuningParm_11791 */ 793 uint8_t pre_num_of_samples; 794 /*!< Number of Ranging samples used during \ 795 * run_offset_calibration() */ 796 uint8_t mm1_num_of_samples; 797 /*!< Number of MM1 samples used during \ 798 * run_offset_calibration() */ 799 uint8_t mm2_num_of_samples; 800 /*!< Number of MM2 samples used during \ 801 * run_offset_calibration() */ 802 803 } VL53L1_offsetcal_config_t; 804 805 806 807 /** 808 * @struct VL53L1_LLDriverData_t 809 * 810 * @brief VL53L1 LL Driver ST private data structure \n 811 * 812 */ 813 814 typedef struct { 815 816 uint8_t wait_method; 817 /*!< Wait type : blocking or non blocking */ 818 VL53L1_DevicePresetModes preset_mode; 819 /*!< Current preset mode */ 820 VL53L1_DeviceMeasurementModes measurement_mode; 821 /*!< Current measurement mode */ 822 VL53L1_OffsetCalibrationMode offset_calibration_mode; 823 /*!< Current offset calibration mode */ 824 VL53L1_OffsetCorrectionMode offset_correction_mode; 825 /*!< Current offset_ correction mode */ 826 uint32_t phasecal_config_timeout_us; 827 /*!< requested Phase Cal Timeout e.g. 1000us */ 828 uint32_t mm_config_timeout_us; 829 /*!< requested MM Timeout e.g. 2000us */ 830 uint32_t range_config_timeout_us; 831 /*!< requested Ranging Timeout e.g 13000us */ 832 uint32_t inter_measurement_period_ms; 833 /*!< requested Timing mode repeat period e.g 100ms */ 834 uint16_t dss_config__target_total_rate_mcps; 835 /*!< requested DSS Target Total Rate in 9.7 format e.g. 40.0Mcps 836 * - Patch_ChangingPresetModeInputParms_11780 */ 837 uint32_t fw_ready_poll_duration_ms; 838 /*!< FW ready poll duration in ms*/ 839 uint8_t fw_ready; 840 /*!< Result of FW ready check */ 841 uint8_t debug_mode; 842 /*!< Internal Only - read extra debug data */ 843 844 /*!< version info structure */ 845 VL53L1_ll_version_t version; 846 847 /*!< version info structure */ 848 VL53L1_ll_driver_state_t ll_state; 849 850 /*!< decoded GPIO interrupt config */ 851 VL53L1_GPIO_interrupt_config_t gpio_interrupt_config; 852 853 /*!< public register data structures */ 854 VL53L1_customer_nvm_managed_t customer; 855 VL53L1_cal_peak_rate_map_t cal_peak_rate_map; 856 VL53L1_additional_offset_cal_data_t add_off_cal_data; 857 VL53L1_gain_calibration_data_t gain_cal; 858 VL53L1_user_zone_t mm_roi; 859 VL53L1_optical_centre_t optical_centre; 860 861 /*!< tuning parameter storage */ 862 VL53L1_tuning_parm_storage_t tuning_parms; 863 864 /*!< private return good SPAD map */ 865 uint8_t rtn_good_spads[VL53L1_RTN_SPAD_BUFFER_SIZE]; 866 867 /*!< private internal configuration structures */ 868 VL53L1_refspadchar_config_t refspadchar; 869 VL53L1_ssc_config_t ssc_cfg; 870 VL53L1_xtalk_config_t xtalk_cfg; 871 VL53L1_offsetcal_config_t offsetcal_cfg; 872 873 /*!< private internal register data structures */ 874 VL53L1_static_nvm_managed_t stat_nvm; 875 VL53L1_static_config_t stat_cfg; 876 VL53L1_general_config_t gen_cfg; 877 VL53L1_timing_config_t tim_cfg; 878 VL53L1_dynamic_config_t dyn_cfg; 879 VL53L1_system_control_t sys_ctrl; 880 VL53L1_system_results_t sys_results; 881 VL53L1_nvm_copy_data_t nvm_copy_data; 882 883 /*!< Private Offset structure */ 884 VL53L1_offset_range_results_t offset_results; 885 886 /*!< private debug register data structures */ 887 VL53L1_core_results_t core_results; 888 VL53L1_debug_results_t dbg_results; 889 890 /* Start Patch_LowPowerAutoMode */ 891 /*!< Low Powr Auto Mode Data */ 892 VL53L1_low_power_auto_data_t low_power_auto_data; 893 /* End Patch_LowPowerAutoMode */ 894 895 #ifdef PAL_EXTENDED 896 /* Patch Debug Data */ 897 VL53L1_patch_results_t patch_results; 898 VL53L1_shadow_core_results_t shadow_core_results; 899 VL53L1_shadow_system_results_t shadow_sys_results; 900 VL53L1_prev_shadow_core_results_t prev_shadow_core_results; 901 VL53L1_prev_shadow_system_results_t prev_shadow_sys_results; 902 #endif 903 904 } VL53L1_LLDriverData_t; 905 906 907 /** 908 * @struct VL53L1_LLDriverResults_t 909 * 910 * @brief VL53L1 LL Driver ST private results structure 911 * 912 */ 913 914 typedef struct { 915 916 /* Private last range results */ 917 VL53L1_range_results_t range_results; 918 919 } VL53L1_LLDriverResults_t; 920 921 /** 922 * @struct VL53L1_calibration_data_t 923 * 924 * @brief Per Part calibration data 925 * 926 */ 927 928 typedef struct { 929 930 uint32_t struct_version; 931 VL53L1_customer_nvm_managed_t customer; 932 VL53L1_additional_offset_cal_data_t add_off_cal_data; 933 VL53L1_optical_centre_t optical_centre; 934 VL53L1_gain_calibration_data_t gain_cal; 935 VL53L1_cal_peak_rate_map_t cal_peak_rate_map; 936 937 } VL53L1_calibration_data_t; 938 939 940 /** 941 * @struct VL53L1_tuning_parameters_t 942 * 943 * @brief Tuning Parameters Debug data 944 * 945 */ 946 947 typedef struct { 948 uint16_t vl53l1_tuningparm_version; 949 uint16_t vl53l1_tuningparm_key_table_version; 950 uint16_t vl53l1_tuningparm_lld_version; 951 uint8_t vl53l1_tuningparm_consistency_lite_phase_tolerance; 952 uint8_t vl53l1_tuningparm_phasecal_target; 953 uint16_t vl53l1_tuningparm_lite_cal_repeat_rate; 954 uint16_t vl53l1_tuningparm_lite_ranging_gain_factor; 955 uint8_t vl53l1_tuningparm_lite_min_clip_mm; 956 uint16_t vl53l1_tuningparm_lite_long_sigma_thresh_mm; 957 uint16_t vl53l1_tuningparm_lite_med_sigma_thresh_mm; 958 uint16_t vl53l1_tuningparm_lite_short_sigma_thresh_mm; 959 uint16_t vl53l1_tuningparm_lite_long_min_count_rate_rtn_mcps; 960 uint16_t vl53l1_tuningparm_lite_med_min_count_rate_rtn_mcps; 961 uint16_t vl53l1_tuningparm_lite_short_min_count_rate_rtn_mcps; 962 uint8_t vl53l1_tuningparm_lite_sigma_est_pulse_width; 963 uint8_t vl53l1_tuningparm_lite_sigma_est_amb_width_ns; 964 uint8_t vl53l1_tuningparm_lite_sigma_ref_mm; 965 uint8_t vl53l1_tuningparm_lite_rit_mult; 966 uint8_t vl53l1_tuningparm_lite_seed_config; 967 uint8_t vl53l1_tuningparm_lite_quantifier; 968 uint8_t vl53l1_tuningparm_lite_first_order_select; 969 int16_t vl53l1_tuningparm_lite_xtalk_margin_kcps; 970 uint8_t vl53l1_tuningparm_initial_phase_rtn_lite_long_range; 971 uint8_t vl53l1_tuningparm_initial_phase_rtn_lite_med_range; 972 uint8_t vl53l1_tuningparm_initial_phase_rtn_lite_short_range; 973 uint8_t vl53l1_tuningparm_initial_phase_ref_lite_long_range; 974 uint8_t vl53l1_tuningparm_initial_phase_ref_lite_med_range; 975 uint8_t vl53l1_tuningparm_initial_phase_ref_lite_short_range; 976 uint8_t vl53l1_tuningparm_timed_seed_config; 977 uint8_t vl53l1_tuningparm_vhv_loopbound; 978 uint8_t vl53l1_tuningparm_refspadchar_device_test_mode; 979 uint8_t vl53l1_tuningparm_refspadchar_vcsel_period; 980 uint32_t vl53l1_tuningparm_refspadchar_phasecal_timeout_us; 981 uint16_t vl53l1_tuningparm_refspadchar_target_count_rate_mcps; 982 uint16_t vl53l1_tuningparm_refspadchar_min_countrate_limit_mcps; 983 uint16_t vl53l1_tuningparm_refspadchar_max_countrate_limit_mcps; 984 uint16_t vl53l1_tuningparm_offset_cal_dss_rate_mcps; 985 uint32_t vl53l1_tuningparm_offset_cal_phasecal_timeout_us; 986 uint32_t vl53l1_tuningparm_offset_cal_mm_timeout_us; 987 uint32_t vl53l1_tuningparm_offset_cal_range_timeout_us; 988 uint8_t vl53l1_tuningparm_offset_cal_pre_samples; 989 uint8_t vl53l1_tuningparm_offset_cal_mm1_samples; 990 uint8_t vl53l1_tuningparm_offset_cal_mm2_samples; 991 uint8_t vl53l1_tuningparm_spadmap_vcsel_period; 992 uint8_t vl53l1_tuningparm_spadmap_vcsel_start; 993 uint16_t vl53l1_tuningparm_spadmap_rate_limit_mcps; 994 uint16_t vl53l1_tuningparm_lite_dss_config_target_total_rate_mcps; 995 uint16_t vl53l1_tuningparm_timed_dss_config_target_total_rate_mcps; 996 uint32_t vl53l1_tuningparm_lite_phasecal_config_timeout_us; 997 uint32_t vl53l1_tuningparm_timed_phasecal_config_timeout_us; 998 uint32_t vl53l1_tuningparm_lite_mm_config_timeout_us; 999 uint32_t vl53l1_tuningparm_timed_mm_config_timeout_us; 1000 uint32_t vl53l1_tuningparm_lite_range_config_timeout_us; 1001 uint32_t vl53l1_tuningparm_timed_range_config_timeout_us; 1002 uint8_t vl53l1_tuningparm_lowpowerauto_vhv_loop_bound; 1003 uint32_t vl53l1_tuningparm_lowpowerauto_mm_config_timeout_us; 1004 uint32_t vl53l1_tuningparm_lowpowerauto_range_config_timeout_us; 1005 } VL53L1_tuning_parameters_t; 1006 1007 1008 /** 1009 * @struct VL53L1_spad_rate_data_t 1010 * @brief SPAD Rate Data output by SSC 1011 * 1012 * Container for the SPAD Rate data output by SPAD select check (SSC) 1013 * The data is stored in the buffer in SPAD number order and not 1014 * raster order 1015 * 1016 * Rate data is it either 1.15 or 9.7 fixed point format 1017 */ 1018 1019 typedef struct { 1020 1021 uint8_t spad_type; 1022 /*!< Type of rate data stored */ 1023 uint16_t buffer_size; 1024 /*!< SPAD buffer size : should be at least 256 for EwokPlus25 */ 1025 uint16_t rate_data[VL53L1_NO_OF_SPAD_ENABLES]; 1026 /*!< word buffer containing the SPAD rates */ 1027 uint16_t no_of_values; 1028 /*!< Number of bytes used in the buffer */ 1029 uint8_t fractional_bits; 1030 /*!< Number of fractional bits either 7 or 15 */ 1031 uint8_t error_status; 1032 /*!< Set if supplied buffer is too small */ 1033 1034 } VL53L1_spad_rate_data_t; 1035 1036 1037 /* Start Patch_AdditionalDebugData_11823 */ 1038 1039 /** 1040 * @struct VL53L1_additional_data_t 1041 * @brief Additional debug data 1042 * 1043 * Contains the LL Driver configuration information 1044 */ 1045 1046 typedef struct { 1047 1048 VL53L1_DevicePresetModes preset_mode; 1049 /*!< Current preset mode */ 1050 VL53L1_DeviceMeasurementModes measurement_mode; 1051 /*!< Current measurement mode */ 1052 1053 uint32_t phasecal_config_timeout_us; 1054 /*!< requested Phase Cal Timeout e.g. 1000us */ 1055 uint32_t mm_config_timeout_us; 1056 /*!< requested MM Timeout e.g. 2000us */ 1057 uint32_t range_config_timeout_us; 1058 /*!< requested Ranging Timeout e.g 13000us */ 1059 uint32_t inter_measurement_period_ms; 1060 /*!< requested Timing mode repeat period e.g 100ms */ 1061 uint16_t dss_config__target_total_rate_mcps; 1062 /*!< requested DSS Target Total Rate in 9.7 format e.g. 40.0Mcps*/ 1063 1064 } VL53L1_additional_data_t; 1065 1066 /* End Patch_AdditionalDebugData_11823 */ 1067 1068 1069 /** @} VL53L1_globalLLDriverDefine_group */ 1070 1071 1072 #define SUPPRESS_UNUSED_WARNING(x) \ 1073 ((void) (x)) 1074 1075 1076 #define IGNORE_STATUS(__FUNCTION_ID__, __ERROR_STATUS_CHECK__, __STATUS__) \ 1077 do { \ 1078 DISABLE_WARNINGS(); \ 1079 if (__FUNCTION_ID__) { \ 1080 if (__STATUS__ == __ERROR_STATUS_CHECK__) { \ 1081 __STATUS__ = VL53L1_ERROR_NONE; \ 1082 WARN_OVERRIDE_STATUS(__FUNCTION_ID__); \ 1083 } \ 1084 } \ 1085 ENABLE_WARNINGS(); \ 1086 } \ 1087 while (0) 1088 1089 #define VL53L1_COPYSTRING(str, ...) \ 1090 (strncpy(str, ##__VA_ARGS__, VL53L1_MAX_STRING_LENGTH-1)) 1091 1092 #ifdef __cplusplus 1093 } 1094 #endif 1095 1096 #endif /* _VL53L1_LL_DEF_H_ */ 1097 1098 1099