Merge pull request #1613 from openmv/vl53l5cx_driver

drivers/vl53l5cx: Add VL53L5CX ST driver.
This commit is contained in:
Ibrahim Abdelkader 2022-04-10 20:38:11 +02:00 committed by GitHub
commit d727d17af7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 26116 additions and 0 deletions

View File

@ -60,6 +60,7 @@ WINC1500_DIR=drivers/winc1500
MLX90621_DIR=drivers/mlx90621
MLX90640_DIR=drivers/mlx90640
MLX90641_DIR=drivers/mlx90641
VL53L5CX_DIR=drivers/vl53l5cx
PIXART_DIR=drivers/pixart
LIBPDM_DIR=lib/libpdm
TENSORFLOW_DIR=lib/libtf

View File

@ -0,0 +1,91 @@
********************************************************************************
*
* STMicroelectronics - VL53L5CX - Ultra Lite Driver
*
********************************************************************************
# Driver version history
---------------------------------------------------------------------------------------------------------------
Version : 1.0.0
Date : 06/09/2021
Comments : Initial driver release.
---------------------------------------------------------------------------------------------------------------
Version : 1.0.1
Date : 06/17/2021
Comments : Fixed wrong array size computing. No impact for host.
---------------------------------------------------------------------------------------------------------------
Version : 1.0.2
Date : 06/24/2021
Comments : Corrected bug : 1 frame over 128 was ignored using function vl53l5cx_check_data_ready().
---------------------------------------------------------------------------------------------------------------
Version : 1.0.3
Date : 07/13/2021
Comments : Corrected bug : Macro missing for more than 1 target per zone. Compilation failed.
---------------------------------------------------------------------------------------------------------------
Version : 1.0.4
Date : 07/20/2021
Comments : Corrected bug : Invalid Xtalk calibration data after running Xtalk calibration with more than 1 target per zone.
---------------------------------------------------------------------------------------------------------------
Version : 1.1.0
Date : 09/03/2021
Comments :
- Firmware update : Status 13 has been added, to indicate that the detected target has a mismatch between distance and signal.
- Added macro 'VL53L5CX_USE_RAW_FORMAT' allowing to use the default firmware format.
---------------------------------------------------------------------------------------------------------------
Version : 1.1.1
Date : 09/17/2021
Comments :
- Updated function '_vl53l5cx_send_offset_data()' which may give warnings depending of compiler options.
---------------------------------------------------------------------------------------------------------------
Version : 1.1.2
Date : 10/12/2021
Comments :
- Corrected bug : In some cases, detection thresholds were not applied when the AND operation was used with 2 thresholds.
---------------------------------------------------------------------------------------------------------------
Version : 1.2.0
Date : 01/14/2022
Comments : Several updates done in order to catch more errors from FW.
- Result structure : Added silicon temperature output
- Init function : Added several read registers used to improve initialization stability
- Start function : Added a check of memory size in orer to be sure that packet size has been correctly programmed
- Stop function : Return more relevant errors from FW
- Check data ready function : Return more relevant errors from FW
---------------------------------------------------------------------------------------------------------------
Version : 1.3.0
Date : 02/11/2021
Comments :
- Corrected reflectance format (output divided by /2 vs previous driver version)
- Added macro VL53L5CX_STATUS_TIMEOUT_ERROR
---------------------------------------------------------------------------------------------------------------

View File

@ -0,0 +1,25 @@
# This file is part of the OpenMV project.
#
# Copyright (c) 2013-2021 Ibrahim Abdelkader <iabdalkader@openmv.io>
# Copyright (c) 2013-2021 Kwabena W. Agyeman <kwagyeman@openmv.io>
#
# This work is licensed under the MIT license, see the file LICENSE for details.
#
# VL53L5CX Makefile
SRCS = $(wildcard src/*.c)
OBJS = $(addprefix $(BUILD)/, $(SRCS:.c=.o))
OBJ_DIRS = $(sort $(dir $(OBJS)))
all: | $(OBJ_DIRS) $(OBJS)
$(OBJ_DIRS):
$(MKDIR) -p $@
$(BUILD)/%.o : %.c
$(ECHO) "CC $<"
$(CC) $(CFLAGS) -c -o $@ $<
$(BUILD)/%.o : %.s
$(ECHO) "AS $<"
$(AS) $(AFLAGS) $< -o $@
-include $(OBJS:%.o=%.d)

View File

@ -0,0 +1,217 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#ifndef _PLATFORM_H_
#define _PLATFORM_H_
#pragma once
#include <stdint.h>
#include <string.h>
#include "cambus.h"
/**
* @brief Structure VL53L5CX_Platform needs to be filled by the customer,
* depending on his platform. At least, it contains the VL53L5CX I2C address.
* Some additional fields can be added, as descriptors, or platform
* dependencies. Anything added into this structure is visible into the platform
* layer.
*/
typedef struct
{
/* To be filled with customer's platform. At least an I2C address/descriptor
* needs to be added */
/* Example for most standard platform : I2C address of sensor */
cambus_t *bus;
uint16_t address;
} VL53L5CX_Platform;
/*
* @brief The macro below is used to define the number of target per zone sent
* through I2C. This value can be changed by user, in order to tune I2C
* transaction, and also the total memory size (a lower number of target per
* zone means a lower RAM). The value must be between 1 and 4.
*/
#define VL53L5CX_NB_TARGET_PER_ZONE 1U
/*
* @brief The macro below can be used to avoid data conversion into the driver.
* By default there is a conversion between firmware and user data. Using this macro
* allows to use the firmware format instead of user format. The firmware format allows
* an increased precision.
*/
// #define VL53L5CX_USE_RAW_FORMAT
/*
* @brief All macro below are used to configure the sensor output. User can
* define some macros if he wants to disable selected output, in order to reduce
* I2C access.
*/
#define VL53L5CX_DISABLE_AMBIENT_PER_SPAD
#define VL53L5CX_DISABLE_NB_SPADS_ENABLED
#define VL53L5CX_DISABLE_NB_TARGET_DETECTED
#define VL53L5CX_DISABLE_SIGNAL_PER_SPAD
#define VL53L5CX_DISABLE_RANGE_SIGMA_MM
//#define VL53L5CX_DISABLE_DISTANCE_MM
#define VL53L5CX_DISABLE_REFLECTANCE_PERCENT
#define VL53L5CX_DISABLE_TARGET_STATUS
#define VL53L5CX_DISABLE_MOTION_INDICATOR
/**
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
* structure.
* @param (uint16_t) Address : I2C location of value to read.
* @param (uint8_t) *p_values : Pointer of value to read.
* @return (uint8_t) status : 0 if OK
*/
uint8_t RdByte(
VL53L5CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_value);
/**
* @brief Mandatory function used to write one single byte.
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
* structure.
* @param (uint16_t) Address : I2C location of value to read.
* @param (uint8_t) value : Pointer of value to write.
* @return (uint8_t) status : 0 if OK
*/
uint8_t WrByte(
VL53L5CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t value);
/**
* @brief Mandatory function used to read multiples bytes.
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
* structure.
* @param (uint16_t) Address : I2C location of values to read.
* @param (uint8_t) *p_values : Buffer of bytes to read.
* @param (uint32_t) size : Size of *p_values buffer.
* @return (uint8_t) status : 0 if OK
*/
uint8_t RdMulti(
VL53L5CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_values,
uint32_t size);
/**
* @brief Mandatory function used to write multiples bytes.
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
* structure.
* @param (uint16_t) Address : I2C location of values to write.
* @param (uint8_t) *p_values : Buffer of bytes to write.
* @param (uint32_t) size : Size of *p_values buffer.
* @return (uint8_t) status : 0 if OK
*/
uint8_t WrMulti(
VL53L5CX_Platform *p_platform,
uint16_t RegisterAdress,
uint8_t *p_values,
uint32_t size);
/**
* @brief Optional function, only used to perform an hardware reset of the
* sensor. This function is not used in the API, but it can be used by the host.
* This function is not mandatory to fill if user don't want to reset the
* sensor.
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
* structure.
* @return (uint8_t) status : 0 if OK
*/
uint8_t Reset_Sensor(
VL53L5CX_Platform *p_platform);
/**
* @brief Mandatory function, used to swap a buffer. The buffer size is always a
* multiple of 4 (4, 8, 12, 16, ...).
* @param (uint8_t*) buffer : Buffer to swap, generally uint32_t
* @param (uint16_t) size : Buffer size to swap
*/
void SwapBuffer(
uint8_t *buffer,
uint16_t size);
/**
* @brief Mandatory function, used to wait during an amount of time. It must be
* filled as it's used into the API.
* @param (VL53L5CX_Platform*) p_platform : Pointer of VL53L5CX platform
* structure.
* @param (uint32_t) TimeMs : Time to wait in ms.
* @return (uint8_t) status : 0 if wait is finished.
*/
uint8_t WaitMs(
VL53L5CX_Platform *p_platform,
uint32_t TimeMs);
#endif // _PLATFORM_H_

View File

@ -0,0 +1,740 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#ifndef VL53L5CX_API_H_
#define VL53L5CX_API_H_
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)
#pragma anon_unions
#endif
#include "platform.h"
/**
* @brief Current driver version.
*/
#define VL53L5CX_API_REVISION "VL53L5CX_1.3.0"
/**
* @brief Default I2C address of VL53L5CX sensor. Can be changed using function
* vl53l5cx_set_i2c_address() function is called.
*/
#define VL53L5CX_DEFAULT_I2C_ADDRESS ((uint16_t)0x52)
/**
* @brief Macro VL53L5CX_RESOLUTION_4X4 or VL53L5CX_RESOLUTION_8X8 allows
* setting sensor in 4x4 mode or 8x8 mode, using function
* vl53l5cx_set_resolution().
*/
#define VL53L5CX_RESOLUTION_4X4 ((uint8_t) 16U)
#define VL53L5CX_RESOLUTION_8X8 ((uint8_t) 64U)
/**
* @brief Macro VL53L5CX_TARGET_ORDER_STRONGEST or VL53L5CX_TARGET_ORDER_CLOSEST
* are used to select the target order for data output.
*/
#define VL53L5CX_TARGET_ORDER_CLOSEST ((uint8_t) 1U)
#define VL53L5CX_TARGET_ORDER_STRONGEST ((uint8_t) 2U)
/**
* @brief Macro VL53L5CX_RANGING_MODE_CONTINUOUS and
* VL53L5CX_RANGING_MODE_AUTONOMOUS are used to change the ranging mode.
* Autonomous mode can be used to set a precise integration time, whereas
* continuous is always maximum.
*/
#define VL53L5CX_RANGING_MODE_CONTINUOUS ((uint8_t) 1U)
#define VL53L5CX_RANGING_MODE_AUTONOMOUS ((uint8_t) 3U)
/**
* @brief The default power mode is VL53L5CX_POWER_MODE_WAKEUP. User can choose
* the mode VL53L5CX_POWER_MODE_SLEEP to save power consumption is the device
* is not used. The low power mode retains the firmware and the configuration.
* Both modes can be changed using function vl53l5cx_set_power_mode().
*/
#define VL53L5CX_POWER_MODE_SLEEP ((uint8_t) 0U)
#define VL53L5CX_POWER_MODE_WAKEUP ((uint8_t) 1U)
/**
* @brief Macro VL53L5CX_STATUS_OK indicates that VL53L5 sensor has no error.
* Macro VL53L5CX_STATUS_ERROR indicates that something is wrong (value,
* I2C access, ...). Macro VL53L5CX_MCU_ERROR is used to indicate a MCU issue.
*/
#define VL53L5CX_STATUS_OK ((uint8_t) 0U)
#define VL53L5CX_STATUS_TIMEOUT_ERROR ((uint8_t) 1U)
#define VL53L5CX_MCU_ERROR ((uint8_t) 66U)
#define VL53L5CX_STATUS_INVALID_PARAM ((uint8_t) 127U)
#define VL53L5CX_STATUS_ERROR ((uint8_t) 255U)
/**
* @brief Definitions for Range results block headers
*/
#if VL53L5CX_NB_TARGET_PER_ZONE == 1
#define VL53L5CX_START_BH ((uint32_t)0x0000000DU)
#define VL53L5CX_METADATA_BH ((uint32_t)0x54B400C0U)
#define VL53L5CX_COMMONDATA_BH ((uint32_t)0x54C00040U)
#define VL53L5CX_AMBIENT_RATE_BH ((uint32_t)0x54D00104U)
#define VL53L5CX_SPAD_COUNT_BH ((uint32_t)0x55D00404U)
#define VL53L5CX_NB_TARGET_DETECTED_BH ((uint32_t)0xCF7C0401U)
#define VL53L5CX_SIGNAL_RATE_BH ((uint32_t)0xCFBC0404U)
#define VL53L5CX_RANGE_SIGMA_MM_BH ((uint32_t)0xD2BC0402U)
#define VL53L5CX_DISTANCE_BH ((uint32_t)0xD33C0402U)
#define VL53L5CX_REFLECTANCE_BH ((uint32_t)0xD43C0401U)
#define VL53L5CX_TARGET_STATUS_BH ((uint32_t)0xD47C0401U)
#define VL53L5CX_MOTION_DETECT_BH ((uint32_t)0xCC5008C0U)
#define VL53L5CX_METADATA_IDX ((uint16_t)0x54B4U)
#define VL53L5CX_SPAD_COUNT_IDX ((uint16_t)0x55D0U)
#define VL53L5CX_AMBIENT_RATE_IDX ((uint16_t)0x54D0U)
#define VL53L5CX_NB_TARGET_DETECTED_IDX ((uint16_t)0xCF7CU)
#define VL53L5CX_SIGNAL_RATE_IDX ((uint16_t)0xCFBCU)
#define VL53L5CX_RANGE_SIGMA_MM_IDX ((uint16_t)0xD2BCU)
#define VL53L5CX_DISTANCE_IDX ((uint16_t)0xD33CU)
#define VL53L5CX_REFLECTANCE_EST_PC_IDX ((uint16_t)0xD43CU)
#define VL53L5CX_TARGET_STATUS_IDX ((uint16_t)0xD47CU)
#define VL53L5CX_MOTION_DETEC_IDX ((uint16_t)0xCC50U)
#else
#define VL53L5CX_START_BH ((uint32_t)0x0000000DU)
#define VL53L5CX_METADATA_BH ((uint32_t)0x54B400C0U)
#define VL53L5CX_COMMONDATA_BH ((uint32_t)0x54C00040U)
#define VL53L5CX_AMBIENT_RATE_BH ((uint32_t)0x54D00104U)
#define VL53L5CX_NB_TARGET_DETECTED_BH ((uint32_t)0x57D00401U)
#define VL53L5CX_SPAD_COUNT_BH ((uint32_t)0x55D00404U)
#define VL53L5CX_SIGNAL_RATE_BH ((uint32_t)0x58900404U)
#define VL53L5CX_RANGE_SIGMA_MM_BH ((uint32_t)0x64900402U)
#define VL53L5CX_DISTANCE_BH ((uint32_t)0x66900402U)
#define VL53L5CX_REFLECTANCE_BH ((uint32_t)0x6A900401U)
#define VL53L5CX_TARGET_STATUS_BH ((uint32_t)0x6B900401U)
#define VL53L5CX_MOTION_DETECT_BH ((uint32_t)0xCC5008C0U)
#define VL53L5CX_METADATA_IDX ((uint16_t)0x54B4U)
#define VL53L5CX_SPAD_COUNT_IDX ((uint16_t)0x55D0U)
#define VL53L5CX_AMBIENT_RATE_IDX ((uint16_t)0x54D0U)
#define VL53L5CX_NB_TARGET_DETECTED_IDX ((uint16_t)0x57D0U)
#define VL53L5CX_SIGNAL_RATE_IDX ((uint16_t)0x5890U)
#define VL53L5CX_RANGE_SIGMA_MM_IDX ((uint16_t)0x6490U)
#define VL53L5CX_DISTANCE_IDX ((uint16_t)0x6690U)
#define VL53L5CX_REFLECTANCE_EST_PC_IDX ((uint16_t)0x6A90U)
#define VL53L5CX_TARGET_STATUS_IDX ((uint16_t)0x6B90U)
#define VL53L5CX_MOTION_DETEC_IDX ((uint16_t)0xCC50U)
#endif
/**
* @brief Inner Macro for API. Not for user, only for development.
*/
#define VL53L5CX_NVM_DATA_SIZE ((uint16_t)492U)
#define VL53L5CX_CONFIGURATION_SIZE ((uint16_t)972U)
#define VL53L5CX_OFFSET_BUFFER_SIZE ((uint16_t)488U)
#define VL53L5CX_XTALK_BUFFER_SIZE ((uint16_t)776U)
#define VL53L5CX_DCI_ZONE_CONFIG ((uint16_t)0x5450U)
#define VL53L5CX_DCI_FREQ_HZ ((uint16_t)0x5458U)
#define VL53L5CX_DCI_INT_TIME ((uint16_t)0x545CU)
#define VL53L5CX_DCI_FW_NB_TARGET ((uint16_t)0x5478)
#define VL53L5CX_DCI_RANGING_MODE ((uint16_t)0xAD30U)
#define VL53L5CX_DCI_DSS_CONFIG ((uint16_t)0xAD38U)
#define VL53L5CX_DCI_TARGET_ORDER ((uint16_t)0xAE64U)
#define VL53L5CX_DCI_SHARPENER ((uint16_t)0xAED8U)
#define VL53L5CX_DCI_MOTION_DETECTOR_CFG ((uint16_t)0xBFACU)
#define VL53L5CX_DCI_SINGLE_RANGE ((uint16_t)0xCD5CU)
#define VL53L5CX_DCI_OUTPUT_CONFIG ((uint16_t)0xCD60U)
#define VL53L5CX_DCI_OUTPUT_ENABLES ((uint16_t)0xCD68U)
#define VL53L5CX_DCI_OUTPUT_LIST ((uint16_t)0xCD78U)
#define VL53L5CX_DCI_PIPE_CONTROL ((uint16_t)0xCF78U)
#define VL53L5CX_UI_CMD_STATUS ((uint16_t)0x2C00U)
#define VL53L5CX_UI_CMD_START ((uint16_t)0x2C04U)
#define VL53L5CX_UI_CMD_END ((uint16_t)0x2FFFU)
/**
* @brief Inner values for API. Max buffer size depends of the selected output.
*/
#ifndef VL53L5CX_DISABLE_AMBIENT_PER_SPAD
#define L5CX_AMB_SIZE 260U
#else
#define L5CX_AMB_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_NB_SPADS_ENABLED
#define L5CX_SPAD_SIZE 260U
#else
#define L5CX_SPAD_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_NB_TARGET_DETECTED
#define L5CX_NTAR_SIZE 68U
#else
#define L5CX_NTAR_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_SIGNAL_PER_SPAD
#define L5CX_SPS_SIZE ((256U * VL53L5CX_NB_TARGET_PER_ZONE) + 4U)
#else
#define L5CX_SPS_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_RANGE_SIGMA_MM
#define L5CX_SIGR_SIZE ((128U * VL53L5CX_NB_TARGET_PER_ZONE) + 4U)
#else
#define L5CX_SIGR_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_DISTANCE_MM
#define L5CX_DIST_SIZE ((128U * VL53L5CX_NB_TARGET_PER_ZONE) + 4U)
#else
#define L5CX_DIST_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_REFLECTANCE_PERCENT
#define L5CX_RFLEST_SIZE ((64U *VL53L5CX_NB_TARGET_PER_ZONE) + 4U)
#else
#define L5CX_RFLEST_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_TARGET_STATUS
#define L5CX_STA_SIZE ((64U *VL53L5CX_NB_TARGET_PER_ZONE) + 4U)
#else
#define L5CX_STA_SIZE 0U
#endif
#ifndef VL53L5CX_DISABLE_MOTION_INDICATOR
#define L5CX_MOT_SIZE 144U
#else
#define L5CX_MOT_SIZE 0U
#endif
/**
* @brief Macro VL53L5CX_MAX_RESULTS_SIZE indicates the maximum size used by
* output through I2C. Value 40 corresponds to headers + meta-data + common-data
* and 8 corresponds to the footer.
*/
#define VL53L5CX_MAX_RESULTS_SIZE ( 40U \
+ L5CX_AMB_SIZE + L5CX_SPAD_SIZE + L5CX_NTAR_SIZE + L5CX_SPS_SIZE \
+ L5CX_SIGR_SIZE + L5CX_DIST_SIZE + L5CX_RFLEST_SIZE + L5CX_STA_SIZE \
+ L5CX_MOT_SIZE + 8U)
/**
* @brief Macro VL53L5CX_TEMPORARY_BUFFER_SIZE can be used to know the size of
* the temporary buffer. The minimum size is 1024, and the maximum depends of
* the output configuration.
*/
#if VL53L5CX_MAX_RESULTS_SIZE < 1024U
#define VL53L5CX_TEMPORARY_BUFFER_SIZE ((uint32_t) 1024U)
#else
#define VL53L5CX_TEMPORARY_BUFFER_SIZE ((uint32_t) VL53L5CX_MAX_RESULTS_SIZE)
#endif
/**
* @brief Structure VL53L5CX_Configuration contains the sensor configuration.
* User MUST not manually change these field, except for the sensor address.
*/
typedef struct
{
/* Platform, filled by customer into the 'platform.h' file */
VL53L5CX_Platform platform;
/* Results streamcount, value auto-incremented at each range */
uint8_t streamcount;
/* Size of data read though I2C */
uint32_t data_read_size;
/* Address of default configuration buffer */
uint8_t *default_configuration;
/* Address of default Xtalk buffer */
uint8_t *default_xtalk;
/* Offset buffer */
uint8_t offset_data[VL53L5CX_OFFSET_BUFFER_SIZE];
/* Xtalk buffer */
uint8_t xtalk_data[VL53L5CX_XTALK_BUFFER_SIZE];
/* Temporary buffer used for internal driver processing */
uint8_t temp_buffer[VL53L5CX_TEMPORARY_BUFFER_SIZE];
} VL53L5CX_Configuration;
/**
* @brief Structure VL53L5CX_ResultsData contains the ranging results of
* VL53L5CX. If user wants more than 1 target per zone, the results can be split
* into 2 sub-groups :
* - Per zone results. These results are common to all targets (ambient_per_spad
* , nb_target_detected and nb_spads_enabled).
* - Per target results : These results are different relative to the detected
* target (signal_per_spad, range_sigma_mm, distance_mm, reflectance,
* target_status).
*/
typedef struct
{
/* Internal sensor silicon temperature */
int8_t silicon_temp_degc;
/* Ambient noise in kcps/spads */
#ifndef VL53L5CX_DISABLE_AMBIENT_PER_SPAD
uint32_t ambient_per_spad[VL53L5CX_RESOLUTION_8X8];
#endif
/* Number of valid target detected for 1 zone */
#ifndef VL53L5CX_DISABLE_NB_TARGET_DETECTED
uint8_t nb_target_detected[VL53L5CX_RESOLUTION_8X8];
#endif
/* Number of spads enabled for this ranging */
#ifndef VL53L5CX_DISABLE_NB_SPADS_ENABLED
uint32_t nb_spads_enabled[VL53L5CX_RESOLUTION_8X8];
#endif
/* Signal returned to the sensor in kcps/spads */
#ifndef VL53L5CX_DISABLE_SIGNAL_PER_SPAD
uint32_t signal_per_spad[(VL53L5CX_RESOLUTION_8X8
*VL53L5CX_NB_TARGET_PER_ZONE)];
#endif
/* Sigma of the current distance in mm */
#ifndef VL53L5CX_DISABLE_RANGE_SIGMA_MM
uint16_t range_sigma_mm[(VL53L5CX_RESOLUTION_8X8
*VL53L5CX_NB_TARGET_PER_ZONE)];
#endif
/* Measured distance in mm */
#ifndef VL53L5CX_DISABLE_DISTANCE_MM
int16_t distance_mm[(VL53L5CX_RESOLUTION_8X8
*VL53L5CX_NB_TARGET_PER_ZONE)];
#endif
/* Estimated reflectance in percent */
#ifndef VL53L5CX_DISABLE_REFLECTANCE_PERCENT
uint8_t reflectance[(VL53L5CX_RESOLUTION_8X8
*VL53L5CX_NB_TARGET_PER_ZONE)];
#endif
/* Status indicating the measurement validity (5 & 9 means ranging OK)*/
#ifndef VL53L5CX_DISABLE_TARGET_STATUS
uint8_t target_status[(VL53L5CX_RESOLUTION_8X8
*VL53L5CX_NB_TARGET_PER_ZONE)];
#endif
/* Motion detector results */
#ifndef VL53L5CX_DISABLE_MOTION_INDICATOR
struct
{
uint32_t global_indicator_1;
uint32_t global_indicator_2;
uint8_t status;
uint8_t nb_of_detected_aggregates;
uint8_t nb_of_aggregates;
uint8_t spare;
uint32_t motion[32];
} motion_indicator;
#endif
} VL53L5CX_ResultsData;
union Block_header {
uint32_t bytes;
struct {
uint32_t type : 4;
uint32_t size : 12;
uint32_t idx : 16;
};
};
uint8_t vl53l5cx_is_alive(
VL53L5CX_Configuration *p_dev,
uint8_t *p_is_alive);
/**
* @brief Mandatory function used to initialize the sensor. This function must
* be called after a power on, to load the firmware into the VL53L5CX. It takes
* a few hundred milliseconds.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @return (uint8_t) status : 0 if initialization is OK.
*/
uint8_t vl53l5cx_init(
VL53L5CX_Configuration *p_dev);
/**
* @brief This function is used to change the I2C address of the sensor. If
* multiple VL53L5 sensors are connected to the same I2C line, all other LPn
* pins needs to be set to Low. The default sensor address is 0x52.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint16_t) i2c_address : New I2C address.
* @return (uint8_t) status : 0 if new address is OK
*/
uint8_t vl53l5cx_set_i2c_address(
VL53L5CX_Configuration *p_dev,
uint16_t i2c_address);
/**
* @brief This function is used to get the current sensor power mode.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_power_mode : Current power mode. The value of this
* pointer is equal to 0 if the sensor is in low power,
* (VL53L5CX_POWER_MODE_SLEEP), or 1 if sensor is in standard mode
* (VL53L5CX_POWER_MODE_WAKEUP).
* @return (uint8_t) status : 0 if power mode is OK
*/
uint8_t vl53l5cx_get_power_mode(
VL53L5CX_Configuration *p_dev,
uint8_t *p_power_mode);
/**
* @brief This function is used to set the sensor in Low Power mode, for
* example if the sensor is not used during a long time. The macro
* VL53L5CX_POWER_MODE_SLEEP can be used to enable the low power mode. When user
* want to restart the sensor, he can use macro VL53L5CX_POWER_MODE_WAKEUP.
* Please ensure that the device is not streaming before calling the function.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) power_mode : Selected power mode (VL53L5CX_POWER_MODE_SLEEP
* or VL53L5CX_POWER_MODE_WAKEUP)
* @return (uint8_t) status : 0 if power mode is OK, or 127 if power mode
* requested by user is not valid.
*/
uint8_t vl53l5cx_set_power_mode(
VL53L5CX_Configuration *p_dev,
uint8_t power_mode);
/**
* @brief This function starts a ranging session. When the sensor streams, host
* cannot change settings 'on-the-fly'.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @return (uint8_t) status : 0 if start is OK.
*/
uint8_t vl53l5cx_start_ranging(
VL53L5CX_Configuration *p_dev);
/**
* @brief This function stops the ranging session. It must be used when the
* sensor streams, after calling vl53l5cx_start_ranging().
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @return (uint8_t) status : 0 if stop is OK
*/
uint8_t vl53l5cx_stop_ranging(
VL53L5CX_Configuration *p_dev);
/**
* @brief This function checks if a new data is ready by polling I2C. If a new
* data is ready, a flag will be raised.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_isReady : Value of this pointer be updated to 0 if data
* is not ready, or 1 if a new data is ready.
* @return (uint8_t) status : 0 if I2C reading is OK
*/
uint8_t vl53l5cx_check_data_ready(
VL53L5CX_Configuration *p_dev,
uint8_t *p_isReady);
/**
* @brief This function gets the ranging data, using the selected output and the
* resolution.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (VL53L5CX_ResultsData) *p_results : VL53L5 results structure.
* @return (uint8_t) status : 0 data are successfully get.
*/
uint8_t vl53l5cx_get_ranging_data(
VL53L5CX_Configuration *p_dev,
VL53L5CX_ResultsData *p_results);
/**
* @brief This function gets the current resolution (4x4 or 8x8).
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_resolution : Value of this pointer will be equal to 16
* for 4x4 mode, and 64 for 8x8 mode.
* @return (uint8_t) status : 0 if resolution is OK.
*/
uint8_t vl53l5cx_get_resolution(
VL53L5CX_Configuration *p_dev,
uint8_t *p_resolution);
/**
* @brief This function sets a new resolution (4x4 or 8x8).
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) resolution : Use macro VL53L5CX_RESOLUTION_4X4 or
* VL53L5CX_RESOLUTION_8X8 to set the resolution.
* @return (uint8_t) status : 0 if set resolution is OK.
*/
uint8_t vl53l5cx_set_resolution(
VL53L5CX_Configuration *p_dev,
uint8_t resolution);
/**
* @brief This function gets the current ranging frequency in Hz. Ranging
* frequency corresponds to the time between each measurement.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_frequency_hz: Contains the ranging frequency in Hz.
* @return (uint8_t) status : 0 if ranging frequency is OK.
*/
uint8_t vl53l5cx_get_ranging_frequency_hz(
VL53L5CX_Configuration *p_dev,
uint8_t *p_frequency_hz);
/**
* @brief This function sets a new ranging frequency in Hz. Ranging frequency
* corresponds to the measurements frequency. This setting depends of
* the resolution, so please select your resolution before using this function.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) frequency_hz : Contains the ranging frequency in Hz.
* - For 4x4, min and max allowed values are : [1;60]
* - For 8x8, min and max allowed values are : [1;15]
* @return (uint8_t) status : 0 if ranging frequency is OK, or 127 if the value
* is not correct.
*/
uint8_t vl53l5cx_set_ranging_frequency_hz(
VL53L5CX_Configuration *p_dev,
uint8_t frequency_hz);
/**
* @brief This function gets the current integration time in ms.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint32_t) *p_time_ms: Contains integration time in ms.
* @return (uint8_t) status : 0 if integration time is OK.
*/
uint8_t vl53l5cx_get_integration_time_ms(
VL53L5CX_Configuration *p_dev,
uint32_t *p_time_ms);
/**
* @brief This function sets a new integration time in ms. Integration time must
* be computed to be lower than the ranging period, for a selected resolution.
* Please note that this function has no impact on ranging mode continous.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint32_t) time_ms : Contains the integration time in ms. For all
* resolutions and frequency, the minimum value is 2ms, and the maximum is
* 1000ms.
* @return (uint8_t) status : 0 if set integration time is OK.
*/
uint8_t vl53l5cx_set_integration_time_ms(
VL53L5CX_Configuration *p_dev,
uint32_t integration_time_ms);
/**
* @brief This function gets the current sharpener in percent. Sharpener can be
* changed to blur more or less zones depending of the application.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint32_t) *p_sharpener_percent: Contains the sharpener in percent.
* @return (uint8_t) status : 0 if get sharpener is OK.
*/
uint8_t vl53l5cx_get_sharpener_percent(
VL53L5CX_Configuration *p_dev,
uint8_t *p_sharpener_percent);
/**
* @brief This function sets a new sharpener value in percent. Sharpener can be
* changed to blur more or less zones depending of the application. Min value is
* 0 (disabled), and max is 99.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint32_t) sharpener_percent : Value between 0 (disabled) and 99%.
* @return (uint8_t) status : 0 if set sharpener is OK.
*/
uint8_t vl53l5cx_set_sharpener_percent(
VL53L5CX_Configuration *p_dev,
uint8_t sharpener_percent);
/**
* @brief This function gets the current target order (closest or strongest).
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_target_order: Contains the target order.
* @return (uint8_t) status : 0 if get target order is OK.
*/
uint8_t vl53l5cx_get_target_order(
VL53L5CX_Configuration *p_dev,
uint8_t *p_target_order);
/**
* @brief This function sets a new target order. Please use macros
* VL53L5CX_TARGET_ORDER_STRONGEST and VL53L5CX_TARGET_ORDER_CLOSEST to define
* the new output order. By default, the sensor is configured with the strongest
* output.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) target_order : Required target order.
* @return (uint8_t) status : 0 if set target order is OK, or 127 if target
* order is unknown.
*/
uint8_t vl53l5cx_set_target_order(
VL53L5CX_Configuration *p_dev,
uint8_t target_order);
/**
* @brief This function is used to get the ranging mode. Two modes are
* available using ULD : Continuous and autonomous. The default
* mode is Autonomous.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_ranging_mode : current ranging mode
* @return (uint8_t) status : 0 if get ranging mode is OK.
*/
uint8_t vl53l5cx_get_ranging_mode(
VL53L5CX_Configuration *p_dev,
uint8_t *p_ranging_mode);
/**
* @brief This function is used to set the ranging mode. Two modes are
* available using ULD : Continuous and autonomous. The default
* mode is Autonomous.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) ranging_mode : Use macros VL53L5CX_RANGING_MODE_CONTINUOUS,
* VL53L5CX_RANGING_MODE_CONTINUOUS.
* @return (uint8_t) status : 0 if set ranging mode is OK.
*/
uint8_t vl53l5cx_set_ranging_mode(
VL53L5CX_Configuration *p_dev,
uint8_t ranging_mode);
/**
* @brief This function can be used to read 'extra data' from DCI. Using a known
* index, the function fills the casted structure passed in argument.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *data : This field can be a casted structure, or a simple
* array. Please note that the FW only accept data of 32 bits. So field data can
* only have a size of 32, 64, 96, 128, bits ....
* @param (uint32_t) index : Index of required value.
* @param (uint16_t)*data_size : This field must be the structure or array size
* (using sizeof() function).
* @return (uint8_t) status : 0 if OK
*/
uint8_t vl53l5cx_dci_read_data(
VL53L5CX_Configuration *p_dev,
uint8_t *data,
uint32_t index,
uint16_t data_size);
/**
* @brief This function can be used to write 'extra data' to DCI. The data can
* be simple data, or casted structure.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *data : This field can be a casted structure, or a simple
* array. Please note that the FW only accept data of 32 bits. So field data can
* only have a size of 32, 64, 96, 128, bits ..
* @param (uint32_t) index : Index of required value.
* @param (uint16_t)*data_size : This field must be the structure or array size
* (using sizeof() function).
* @return (uint8_t) status : 0 if OK
*/
uint8_t vl53l5cx_dci_write_data(
VL53L5CX_Configuration *p_dev,
uint8_t *data,
uint32_t index,
uint16_t data_size);
/**
* @brief This function can be used to replace 'extra data' in DCI. The data can
* be simple data, or casted structure.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *data : This field can be a casted structure, or a simple
* array. Please note that the FW only accept data of 32 bits. So field data can
* only have a size of 32, 64, 96, 128, bits ..
* @param (uint32_t) index : Index of required value.
* @param (uint16_t)*data_size : This field must be the structure or array size
* (using sizeof() function).
* @param (uint8_t) *new_data : Contains the new fields.
* @param (uint16_t) new_data_size : New data size.
* @param (uint16_t) new_data_pos : New data position into the buffer.
* @return (uint8_t) status : 0 if OK
*/
uint8_t vl53l5cx_dci_replace_data(
VL53L5CX_Configuration *p_dev,
uint8_t *data,
uint32_t index,
uint16_t data_size,
uint8_t *new_data,
uint16_t new_data_size,
uint16_t new_data_pos);
#endif //VL53L5CX_API_H_

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,196 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#ifndef VL53L5CX_PLUGIN_DETECTION_THRESHOLDS_H_
#define VL53L5CX_PLUGIN_DETECTION_THRESHOLDS_H_
#include "vl53l5cx_api.h"
/**
* @brief Macro VL53L5CX_NB_THRESHOLDS indicates the number of checkers. This
* value cannot be changed.
*/
#define VL53L5CX_NB_THRESHOLDS ((uint8_t)64U)
/**
* @brief Inner Macro for API. Not for user, only for development.
*/
#define VL53L5CX_DCI_DET_THRESH_CONFIG ((uint16_t)0x5488U)
#define VL53L5CX_DCI_DET_THRESH_GLOBAL_CONFIG ((uint16_t)0xB6E0U)
#define VL53L5CX_DCI_DET_THRESH_START ((uint16_t)0xB6E8U)
#define VL53L5CX_DCI_DET_THRESH_VALID_STATUS ((uint16_t)0xB9F0U)
/**
* @brief Macro VL53L5CX_LAST_THRESHOLD is used to indicate the end of checkers
* programming.
*/
#define VL53L5CX_LAST_THRESHOLD ((uint8_t)128U)
/**
* @brief The following macro are used to define the 'param_type' of a checker.
* They indicate what is the measurement to catch.
*/
#define VL53L5CX_DISTANCE_MM ((uint8_t)1U)
#define VL53L5CX_SIGNAL_PER_SPAD_KCPS ((uint8_t)2U)
#define VL53L5CX_RANGE_SIGMA_MM ((uint8_t)4U)
#define VL53L5CX_AMBIENT_PER_SPAD_KCPS ((uint8_t)8U)
#define VL53L5CX_NB_TARGET_DETECTED ((uint8_t)9U)
#define VL53L5CX_TARGET_STATUS ((uint8_t)12U)
#define VL53L5CX_NB_SPADS_ENABLED ((uint8_t)13U)
#define VL53L5CX_MOTION_INDICATOR ((uint8_t)19U)
/**
* @brief The following macro are used to define the 'type' of a checker.
* They indicate the window of measurements, defined by low and a high
* thresholds.
*/
#define VL53L5CX_IN_WINDOW ((uint8_t)0U)
#define VL53L5CX_OUT_OF_WINDOW ((uint8_t)1U)
#define VL53L5CX_LESS_THAN_EQUAL_MIN_CHECKER ((uint8_t)2U)
#define VL53L5CX_GREATER_THAN_MAX_CHECKER ((uint8_t)3U)
#define VL53L5CX_EQUAL_MIN_CHECKER ((uint8_t)4U)
#define VL53L5CX_NOT_EQUAL_MIN_CHECKER ((uint8_t)5U)
/**
* @brief The following macro are used to define multiple checkers in the same
* zone, using operators. Please note that the first checker MUST always be a OR
* operation.
*/
#define VL53L5CX_OPERATION_NONE ((uint8_t)0U)
#define VL53L5CX_OPERATION_OR ((uint8_t)0U)
#define VL53L5CX_OPERATION_AND ((uint8_t)2U)
/**
* @brief Structure VL53L5CX_DetectionThresholds contains a single threshold.
* This structure is never used alone, it must be used as an array of 64
* thresholds (defined by macro VL53L5CX_NB_THRESHOLDS).
*/
typedef struct {
/* Low threshold */
int32_t param_low_thresh;
/* High threshold */
int32_t param_high_thresh;
/* Measurement to catch (VL53L5CX_MEDIAN_RANGE_MM,...)*/
uint8_t measurement;
/* Windows type (VL53L5CX_IN_WINDOW, VL53L5CX_OUT_WINDOW, ...) */
uint8_t type;
/* Zone id. Please read VL53L5 user manual to find the zone id.Set macro
* VL53L5CX_LAST_THRESHOLD to indicates the end of checkers */
uint8_t zone_num;
/* Mathematics operation (AND/OR). The first threshold is always OR.*/
uint8_t mathematic_operation;
}VL53L5CX_DetectionThresholds;
/**
* @brief This function allows indicating if the detection thresholds are
* enabled.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) *p_enabled : Set to 1 if enabled, or 0 if disable.
* @return (uint8_t) status : 0 if OK
*/
uint8_t vl53l5cx_get_detection_thresholds_enable(
VL53L5CX_Configuration *p_dev,
uint8_t *p_enabled);
/**
* @brief This function allows enable the detection thresholds.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint8_t) enabled : Set to 1 to enable, or 0 to disable thresholds.
* @return (uint8_t) status : 0 if programming is OK
*/
uint8_t vl53l5cx_set_detection_thresholds_enable(
VL53L5CX_Configuration *p_dev,
uint8_t enabled);
/**
* @brief This function allows getting the detection thresholds.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (VL53L5CX_DetectionThresholds) *p_thresholds : Array of 64 thresholds.
* @return (uint8_t) status : 0 if programming is OK
*/
uint8_t vl53l5cx_get_detection_thresholds(
VL53L5CX_Configuration *p_dev,
VL53L5CX_DetectionThresholds *p_thresholds);
/**
* @brief This function allows programming the detection thresholds.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (VL53L5CX_DetectionThresholds) *p_thresholds : Array of 64 thresholds.
* @return (uint8_t) status : 0 if programming is OK
*/
uint8_t vl53l5cx_set_detection_thresholds(
VL53L5CX_Configuration *p_dev,
VL53L5CX_DetectionThresholds *p_thresholds);
#endif /* VL53L5CX_PLUGIN_DETECTION_THRESHOLDS_H_ */

View File

@ -0,0 +1,146 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#ifndef VL53L5CX_PLUGIN_MOTION_INDICATOR_H_
#define VL53L5CX_PLUGIN_MOTION_INDICATOR_H_
#include "vl53l5cx_api.h"
/**
* @brief Motion indicator internal configuration structure.
*/
typedef struct {
int32_t ref_bin_offset;
uint32_t detection_threshold;
uint32_t extra_noise_sigma;
uint32_t null_den_clip_value;
uint8_t mem_update_mode;
uint8_t mem_update_choice;
uint8_t sum_span;
uint8_t feature_length;
uint8_t nb_of_aggregates;
uint8_t nb_of_temporal_accumulations;
uint8_t min_nb_for_global_detection;
uint8_t global_indicator_format_1;
uint8_t global_indicator_format_2;
uint8_t spare_1;
uint8_t spare_2;
uint8_t spare_3;
int8_t map_id[64];
uint8_t indicator_format_1[32];
uint8_t indicator_format_2[32];
}VL53L5CX_Motion_Configuration;
/**
* @brief This function is used to initialized the motion indicator. By default,
* indicator is programmed to monitor movements between 400mm and 1500mm.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (VL53L5CX_Motion_Configuration) *p_motion_config : Structure
* containing the initialized motion configuration.
* @param (uint8_t) resolution : Wanted resolution, defined by macros
* VL53L5CX_RESOLUTION_4X4 or VL53L5CX_RESOLUTION_8X8.
* @return (uint8_t) status : 0 if OK, or 127 is the resolution is unknown.
*/
uint8_t vl53l5cx_motion_indicator_init(
VL53L5CX_Configuration *p_dev,
VL53L5CX_Motion_Configuration *p_motion_config,
uint8_t resolution);
/**
* @brief This function can be used to change the working distance of motion
* indicator. By default, indicator is programmed to monitor movements between
* 400mm and 1500mm.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (VL53L5CX_Motion_Configuration) *p_motion_config : Structure
* containing the initialized motion configuration.
* @param (uint16_t) distance_min_mm : Minimum distance for indicator (min value
* 400mm, max 4000mm).
* @param (uint16_t) distance_max_mm : Maximum distance for indicator (min value
* 400mm, max 4000mm).
* VL53L5CX_RESOLUTION_4X4 or VL53L5CX_RESOLUTION_8X8.
* @return (uint8_t) status : 0 if OK, or 127 if an argument is invalid.
*/
uint8_t vl53l5cx_motion_indicator_set_distance_motion(
VL53L5CX_Configuration *p_dev,
VL53L5CX_Motion_Configuration *p_motion_config,
uint16_t distance_min_mm,
uint16_t distance_max_mm);
/**
* @brief This function is used to update the internal motion indicator map.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (VL53L5CX_Motion_Configuration) *p_motion_config : Structure
* containing the initialized motion configuration.
* @param (uint8_t) resolution : Wanted SCI resolution, defined by macros
* VL53L5CX_RESOLUTION_4X4 or VL53L5CX_RESOLUTION_8X8.
* @return (uint8_t) status : 0 if OK, or 127 is the resolution is unknown.
*/
uint8_t vl53l5cx_motion_indicator_set_resolution(
VL53L5CX_Configuration *p_dev,
VL53L5CX_Motion_Configuration *p_motion_config,
uint8_t resolution);
#endif /* VL53L5CX_PLUGIN_MOTION_INDICATOR_H_ */

View File

@ -0,0 +1,441 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#ifndef VL53L5CX_PLUGIN_XTALK_H_
#define VL53L5CX_PLUGIN_XTALK_H_
#include "vl53l5cx_api.h"
/**
* @brief Inner internal number of targets.
*/
#if VL53L5CX_NB_TARGET_PER_ZONE == 1
#define VL53L5CX_FW_NBTAR_XTALK 2
#else
#define VL53L5CX_FW_NBTAR_XTALK VL53L5CX_NB_TARGET_PER_ZONE
#endif
/**
* @brief Inner Macro for plugin. Not for user, only for development.
*/
#define VL53L5CX_DCI_CAL_CFG ((uint16_t)0x5470U)
#define VL53L5CX_DCI_XTALK_CFG ((uint16_t)0xAD94U)
/**
* @brief This function starts the VL53L5CX sensor in order to calibrate Xtalk.
* This calibration is recommended is user wants to use a coverglass.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint16_t) reflectance_percent : Target reflectance in percent. This
* value is include between 1 and 99%. For a better efficiency, ST recommends a
* 3% target reflectance.
* @param (uint8_t) nb_samples : Nb of samples used for calibration. A higher
* number of samples means a higher accuracy, but it increases the calibration
* time. Minimum is 1 and maximum is 16.
* @param (uint16_t) distance_mm : Target distance in mm. The minimum allowed
* distance is 600mm, and maximum is 3000mm. The target must stay in Full FOV,
* so short distance are easier for calibration.
* @return (uint8_t) status : 0 if calibration OK, 127 if an argument has an
* incorrect value, or 255 is something failed.
*/
uint8_t vl53l5cx_calibrate_xtalk(
VL53L5CX_Configuration *p_dev,
uint16_t reflectance_percent,
uint8_t nb_samples,
uint16_t distance_mm);
/**
* @brief This function gets the Xtalk buffer. The buffer is available after
* using the function vl53l5cx_calibrate_xtalk().
* @param (VL53L5CX_Configuration) *p_dev : VL53L5 configuration structure.
* @param (uint8_t) *p_xtalk_data : Buffer with a size defined by
* macro VL53L5CX_XTALK_SIZE.
* @return (uint8_t) status : 0 if buffer reading OK
*/
uint8_t vl53l5cx_get_caldata_xtalk(
VL53L5CX_Configuration *p_dev,
uint8_t *p_xtalk_data);
/**
* @brief This function sets the Xtalk buffer. This function can be used to
* override default Xtalk buffer.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5 configuration structure.
* @param (uint8_t) *p_xtalk_data : Buffer with a size defined by
* macro VL53L5CX_XTALK_SIZE.
* @return (uint8_t) status : 0 if buffer OK
*/
uint8_t vl53l5cx_set_caldata_xtalk(
VL53L5CX_Configuration *p_dev,
uint8_t *p_xtalk_data);
/**
* @brief This function gets the Xtalk margin. This margin is used to increase
* the Xtalk threshold. It can also be used to avoid false positives after the
* Xtalk calibration. The default value is 50 kcps/spads.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint32_t) *p_xtalk_margin : Xtalk margin in kcps/spads.
* @return (uint8_t) status : 0 if reading OK
*/
uint8_t vl53l5cx_get_xtalk_margin(
VL53L5CX_Configuration *p_dev,
uint32_t *p_xtalk_margin);
/**
* @brief This function sets the Xtalk margin. This margin is used to increase
* the Xtalk threshold. It can also be used to avoid false positives after the
* Xtalk calibration. The default value is 50 kcps/spads.
* @param (VL53L5CX_Configuration) *p_dev : VL53L5CX configuration structure.
* @param (uint32_t) xtalk_margin : New Xtalk margin in kcps/spads. Min value is
* 0 kcps/spads, and max is 10.000 kcps/spads
* @return (uint8_t) status : 0 if set margin is OK, or 127 is the margin is
* invalid.
*/
uint8_t vl53l5cx_set_xtalk_margin(
VL53L5CX_Configuration *p_dev,
uint32_t xtalk_margin);
/**
* @brief Command used to get Xtalk calibration data
*/
static const uint8_t VL53L5CX_GET_XTALK_CMD[] = {
0x54, 0x00, 0x00, 0x40,
0x9F, 0xD8, 0x00, 0xC0,
0x9F, 0xE4, 0x01, 0x40,
0x9F, 0xF8, 0x00, 0x40,
0x9F, 0xFC, 0x04, 0x04,
0xA0, 0xFC, 0x01, 0x00,
0xA1, 0x0C, 0x01, 0x00,
0xA1, 0x1C, 0x00, 0xC0,
0xA1, 0x28, 0x09, 0x02,
0xA2, 0x48, 0x00, 0x40,
0xA2, 0x4C, 0x00, 0x81,
0xA2, 0x54, 0x00, 0x81,
0xA2, 0x5C, 0x00, 0x81,
0xA2, 0x64, 0x00, 0x81,
0xA2, 0x6C, 0x00, 0x84,
0xA2, 0x8C, 0x00, 0x82,
0x00, 0x00, 0x00, 0x0F,
0x07, 0x02, 0x00, 0x44
};
/**
* @brief Command used to get run Xtalk calibration
*/
static const uint8_t VL53L5CX_CALIBRATE_XTALK[] = {
0x54, 0x50, 0x00, 0x80,
0x00, 0x04, 0x08, 0x08,
0x00, 0x00, 0x04, 0x04,
0xAD, 0x30, 0x00, 0x80,
0x03, 0x01, 0x06, 0x03,
0x00, 0x00, 0x01, 0x00,
0xAD, 0x38, 0x01, 0x00,
0x01, 0xE0, 0x01, 0x40,
0x00, 0x10, 0x00, 0x10,
0x01, 0x00, 0x01, 0x00,
0x00, 0x00, 0x00, 0x01,
0x54, 0x58, 0x00, 0x40,
0x04, 0x1A, 0x02, 0x00,
0x54, 0x5C, 0x01, 0x40,
0x00, 0x01, 0x00, 0x51,
0x00, 0x00, 0x0F, 0xA0,
0x0F, 0xA0, 0x03, 0xE8,
0x02, 0x80, 0x1F, 0x40,
0x00, 0x00, 0x05, 0x00,
0x54, 0x70, 0x00, 0x80,
0x03, 0x20, 0x03, 0x20,
0x00, 0x00, 0x00, 0x08,
0x54, 0x78, 0x01, 0x00,
0x01, 0x1B, 0x00, 0x21,
0x00, 0x33, 0x00, 0x00,
0x02, 0x00, 0x00, 0x01,
0x04, 0x01, 0x08, VL53L5CX_FW_NBTAR_XTALK,
0x54, 0x88, 0x01, 0x40,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x08, 0x00,
0xAD, 0x48, 0x01, 0x00,
0x01, 0xF4, 0x00, 0x00,
0x03, 0x06, 0x00, 0x10,
0x08, 0x08, 0x08, 0x08,
0x00, 0x00, 0x00, 0x08,
0xAD, 0x60, 0x01, 0x00,
0x00, 0x00, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00,
0x20, 0x1F, 0x01, 0xF4,
0x00, 0x00, 0x1D, 0x0A,
0xAD, 0x70, 0x00, 0x80,
0x08, 0x00, 0x1F, 0x40,
0x00, 0x00, 0x00, 0x01,
0xAD, 0x78, 0x00, 0x80,
0x00, 0xA0, 0x03, 0x20,
0x00, 0x01, 0x01, 0x90,
0xAD, 0x80, 0x00, 0x40,
0x00, 0x00, 0x28, 0x00,
0xAD, 0x84, 0x00, 0x80,
0x00, 0x00, 0x32, 0x00,
0x03, 0x20, 0x00, 0x00,
0xAD, 0x8C, 0x00, 0x80,
0x02, 0x58, 0xFF, 0x38,
0x00, 0x00, 0x00, 0x0C,
0xAD, 0x94, 0x01, 0x00,
0x00, 0x01, 0x90, 0x00,
0xFF, 0xFF, 0xFC, 0x00,
0x00, 0x00, 0x04, 0x00,
0x00, 0x00, 0x01, 0x00,
0xAD, 0xA4, 0x00, 0xC0,
0x04, 0x80, 0x06, 0x1A,
0x00, 0x80, 0x05, 0x80,
0x00, 0x00, 0x01, 0x06,
0xAD, 0xB0, 0x00, 0xC0,
0x04, 0x80, 0x06, 0x1A,
0x19, 0x00, 0x05, 0x80,
0x00, 0x00, 0x01, 0x90,
0xAD, 0xBC, 0x04, 0x40,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x12, 0x00, 0x25,
0x00, 0x00, 0x00, 0x06,
0x00, 0x00, 0x00, 0x05,
0x00, 0x00, 0x00, 0x05,
0x00, 0x00, 0x00, 0x06,
0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x0F,
0x00, 0x00, 0x00, 0x5A,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x09,
0x0B, 0x0C, 0x0B, 0x0B,
0x03, 0x03, 0x11, 0x05,
0x01, 0x01, 0x01, 0x01,
0x00, 0x00, 0x00, 0x00,
0x00, 0x0D, 0x00, 0x00,
0xAE, 0x00, 0x01, 0x04,
0x00, 0x00, 0x00, 0x04,
0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x0A,
0x00, 0x00, 0x00, 0x0C,
0x00, 0x00, 0x00, 0x0D,
0x00, 0x00, 0x00, 0x0E,
0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x08,
0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x00, 0x10,
0x00, 0x00, 0x00, 0x20,
0x00, 0x00, 0x00, 0x20,
0x00, 0x00, 0x00, 0x06,
0x00, 0x00, 0x05, 0x0A,
0x02, 0x00, 0x0C, 0x08,
0x00, 0x00, 0x00, 0x00,
0xAE, 0x40, 0x00, 0x40,
0x00, 0x00, 0x00, 0xFF,
0xAE, 0x44, 0x00, 0x40,
0x00, 0x10, 0x04, 0x01,
0xAE, 0x48, 0x00, 0x40,
0x00, 0x00, 0x10, 0x00,
0xAE, 0x4C, 0x00, 0x40,
0x00, 0x00, 0x00, 0x01,
0xAE, 0x50, 0x01, 0x40,
0x00, 0x00, 0x00, 0x14,
0x04, 0x00, 0x28, 0x00,
0x03, 0x20, 0x6C, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xAE, 0x64, 0x00, 0x40,
0x00, 0x00, 0x00, 0x01,
0xAE, 0xD8, 0x01, 0x00,
0x00, 0xC8, 0x05, 0xDC,
0x00, 0x00, 0x0C, 0xCD,
0x01, 0x04, 0x00, 0x00,
0x00, 0x01, 0x26, 0x01,
0xB5, 0x50, 0x02, 0x82,
0xA3, 0xE8, 0xA3, 0xB8,
0xA4, 0x38, 0xA4, 0x28,
0xA6, 0x48, 0xA4, 0x48,
0xA7, 0x88, 0xA7, 0x48,
0xAC, 0x10, 0xA7, 0x90,
0x99, 0xBC, 0x99, 0xB4,
0x9A, 0xFC, 0x9A, 0xBC,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB5, 0xA0, 0x02, 0x82,
0x00, 0x88, 0x03, 0x00,
0x00, 0x82, 0x00, 0x82,
0x04, 0x04, 0x04, 0x08,
0x00, 0x80, 0x04, 0x01,
0x09, 0x02, 0x09, 0x08,
0x04, 0x04, 0x00, 0x80,
0x04, 0x01, 0x04, 0x01,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB5, 0xF0, 0x00, 0x40,
0x00, 0x04, 0x00, 0x00,
0xB3, 0x9C, 0x01, 0x00,
0x40, 0x00, 0x05, 0x1E,
0x02, 0x1B, 0x08, 0x7C,
0x80, 0x01, 0x12, 0x01,
0x00, 0x00, 0x08, 0x00,
0xB6, 0xC0, 0x00, 0xC0,
0x00, 0x00, 0x60, 0x00,
0x00, 0x00, 0x20, 0x00,
0x00, 0x00, 0x00, 0x00,
0xAE, 0xA8, 0x00, 0x40,
0x00, 0x00, 0x04, 0x05,
0xAE, 0xAC, 0x00, 0x80,
0x01, 0x00, 0x01, 0x00,
0x00, 0x02, 0x00, 0x00,
0xAE, 0xB4, 0x00, 0x40,
0x00, 0x00, 0x00, 0x00,
0xAE, 0xB8, 0x00, 0x81,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xAE, 0xC0, 0x00, 0x81,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xAE, 0xC8, 0x00, 0x81,
0x08, 0x01, 0x01, 0x08,
0x00, 0x00, 0x00, 0x08,
0xAE, 0xD0, 0x00, 0x81,
0x01, 0x08, 0x08, 0x08,
0x00, 0x00, 0x00, 0x01,
0xB5, 0xF4, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB5, 0xFC, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x04, 0x00, 0x40,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x08, 0x00, 0x44,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x18, 0x00, 0x44,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x28, 0x00, 0x44,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x38, 0x00, 0x44,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x48, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x58, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0xB6, 0x68, 0x01, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x54, 0x70, 0x00, 0x80,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x02,
0x00, 0x00, 0x00, 0x0F,
0x00, 0x01, 0x03, 0xD4
};
#endif /* VL53L5CX_PLUGIN_XTALK_H_ */

View File

@ -0,0 +1,115 @@
/*
* This file is part of the OpenMV project.
*
* Copyright (c) 2013-2021 Ibrahim Abdelkader <iabdalkader@openmv.io>
* Copyright (c) 2013-2021 Kwabena W. Agyeman <kwagyeman@openmv.io>
*
* This work is licensed under the MIT license, see the file LICENSE for details.
*
* VL53L5CX platform implementation.
*/
#include "omv_boardconfig.h"
#if (OMV_ENABLE_TOF_VL53L5CX == 1)
#include "py/mphal.h"
#include "cambus.h"
#include "platform.h"
uint8_t RdByte(VL53L5CX_Platform *platform, uint16_t regaddr, uint8_t *data)
{
regaddr = __REVSH(regaddr);
if (cambus_write_bytes(platform->bus, platform->address, (uint8_t *) &regaddr, 2, CAMBUS_XFER_NO_STOP) != 0) {
return -1;
}
if (cambus_read_bytes(platform->bus, platform->address, data, 1, CAMBUS_XFER_NO_FLAGS) != 0) {
return -1;
}
return 0;
}
uint8_t WrByte(VL53L5CX_Platform *platform, uint16_t regaddr, uint8_t data)
{
regaddr = __REVSH(regaddr);
if (cambus_write_bytes(platform->bus, platform->address, (uint8_t*) &regaddr, 2, CAMBUS_XFER_SUSPEND) != 0) {
return -1;
}
if (cambus_write_bytes(platform->bus, platform->address, &data, 1, CAMBUS_XFER_NO_FLAGS) != 0) {
return -1;
}
return 0;
}
uint8_t RdMulti(VL53L5CX_Platform *platform, uint16_t regaddr, uint8_t *data, uint32_t size)
{
regaddr = __REVSH(regaddr);
if (cambus_write_bytes(platform->bus, platform->address, (uint8_t *) &regaddr, 2, CAMBUS_XFER_NO_STOP) != 0) {
return -1;
}
if (cambus_read_bytes(platform->bus, platform->address, data, size, CAMBUS_XFER_NO_FLAGS) != 0) {
return -1;
}
return 0;
}
uint8_t WrMulti(VL53L5CX_Platform *platform, uint16_t regaddr, uint8_t *data, uint32_t size)
{
regaddr = __REVSH(regaddr);
if (cambus_write_bytes(platform->bus, platform->address, (uint8_t*) &regaddr, 2, CAMBUS_XFER_SUSPEND) != 0) {
return -1;
}
if (cambus_write_bytes(platform->bus, platform->address, data, size, CAMBUS_XFER_NO_FLAGS) != 0) {
return -1;
}
return 0;
}
uint8_t Reset_Sensor( VL53L5CX_Platform *platform)
{
uint8_t status = 0;
/* (Optional) Need to be implemented by customer. This function returns 0 if OK */
/* Set pin LPN to LOW */
/* Set pin AVDD to LOW */
/* Set pin VDDIO to LOW */
WaitMs(platform, 100);
/* Set pin LPN of to HIGH */
/* Set pin AVDD of to HIGH */
/* Set pin VDDIO of to HIGH */
WaitMs(platform, 100);
return status;
}
void SwapBuffer(uint8_t *buffer, uint16_t size)
{
uint32_t i, tmp;
/* Example of possible implementation using <string.h> */
for(i = 0; i < size; i = i + 4) {
tmp = (
buffer[i]<<24)
|(buffer[i+1]<<16)
|(buffer[i+2]<<8)
|(buffer[i+3]);
memcpy(&(buffer[i]), &tmp, 4);
}
}
uint8_t WaitMs(VL53L5CX_Platform *platform, uint32_t ms)
{
mp_hal_delay_ms(ms);
return 0;
}
#endif // #if (OMV_ENABLE_TOF_VL53L5CX == 1)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,210 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#include "vl53l5cx_plugin_detection_thresholds.h"
uint8_t vl53l5cx_get_detection_thresholds_enable(
VL53L5CX_Configuration *p_dev,
uint8_t *p_enabled)
{
uint8_t status = VL53L5CX_STATUS_OK;
status |= vl53l5cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer,
VL53L5CX_DCI_DET_THRESH_GLOBAL_CONFIG, 8);
*p_enabled = p_dev->temp_buffer[0x1];
return status;
}
uint8_t vl53l5cx_set_detection_thresholds_enable(
VL53L5CX_Configuration *p_dev,
uint8_t enabled)
{
uint8_t tmp, status = VL53L5CX_STATUS_OK;
uint8_t grp_global_config[] = {0x01, 0x00, 0x01, 0x00};
if(enabled == (uint8_t)1)
{
grp_global_config[0x01] = 0x01;
tmp = 0x04;
}
else
{
grp_global_config[0x01] = 0x00;
tmp = 0x0C;
}
/* Set global interrupt config */
status |= vl53l5cx_dci_replace_data(p_dev, p_dev->temp_buffer,
VL53L5CX_DCI_DET_THRESH_GLOBAL_CONFIG, 8,
(uint8_t*)&grp_global_config, 4, 0x00);
/* Update interrupt config */
status |= vl53l5cx_dci_replace_data(p_dev, p_dev->temp_buffer,
VL53L5CX_DCI_DET_THRESH_CONFIG, 20,
(uint8_t*)&tmp, 1, 0x11);
return status;
}
uint8_t vl53l5cx_get_detection_thresholds(
VL53L5CX_Configuration *p_dev,
VL53L5CX_DetectionThresholds *p_thresholds)
{
uint8_t i, status = VL53L5CX_STATUS_OK;
/* Get thresholds configuration */
status |= vl53l5cx_dci_read_data(p_dev, (uint8_t*)p_thresholds,
VL53L5CX_DCI_DET_THRESH_START,
(uint16_t)VL53L5CX_NB_THRESHOLDS
*(uint16_t)sizeof(VL53L5CX_DetectionThresholds));
for(i = 0; i < (uint8_t)VL53L5CX_NB_THRESHOLDS; i++)
{
switch(p_thresholds[i].measurement)
{
case VL53L5CX_DISTANCE_MM:
p_thresholds[i].param_low_thresh /= 4;
p_thresholds[i].param_high_thresh /= 4;
break;
case VL53L5CX_SIGNAL_PER_SPAD_KCPS:
p_thresholds[i].param_low_thresh /= 2048;
p_thresholds[i].param_high_thresh /= 2048;
break;
case VL53L5CX_RANGE_SIGMA_MM:
p_thresholds[i].param_low_thresh /= 128;
p_thresholds[i].param_high_thresh /= 128;
break;
case VL53L5CX_AMBIENT_PER_SPAD_KCPS:
p_thresholds[i].param_low_thresh /= 2048;
p_thresholds[i].param_high_thresh /= 2048;
break;
case VL53L5CX_NB_SPADS_ENABLED:
p_thresholds[i].param_low_thresh /= 256;
p_thresholds[i].param_high_thresh /= 256;
break;
case VL53L5CX_MOTION_INDICATOR:
p_thresholds[i].param_low_thresh /= 65535;
p_thresholds[i].param_high_thresh /= 65535;
break;
default:
break;
}
}
return status;
}
uint8_t vl53l5cx_set_detection_thresholds(
VL53L5CX_Configuration *p_dev,
VL53L5CX_DetectionThresholds *p_thresholds)
{
uint8_t i, status = VL53L5CX_STATUS_OK;
uint8_t grp_valid_target_cfg[] = {0x05, 0x05, 0x05, 0x05,
0x05, 0x05, 0x05, 0x05};
for(i = 0; i < (uint8_t) VL53L5CX_NB_THRESHOLDS; i++)
{
switch(p_thresholds[i].measurement)
{
case VL53L5CX_DISTANCE_MM:
p_thresholds[i].param_low_thresh *= 4;
p_thresholds[i].param_high_thresh *= 4;
break;
case VL53L5CX_SIGNAL_PER_SPAD_KCPS:
p_thresholds[i].param_low_thresh *= 2048;
p_thresholds[i].param_high_thresh *= 2048;
break;
case VL53L5CX_RANGE_SIGMA_MM:
p_thresholds[i].param_low_thresh *= 128;
p_thresholds[i].param_high_thresh *= 128;
break;
case VL53L5CX_AMBIENT_PER_SPAD_KCPS:
p_thresholds[i].param_low_thresh *= 2048;
p_thresholds[i].param_high_thresh *= 2048;
break;
case VL53L5CX_NB_SPADS_ENABLED:
p_thresholds[i].param_low_thresh *= 256;
p_thresholds[i].param_high_thresh *= 256;
break;
case VL53L5CX_MOTION_INDICATOR:
p_thresholds[i].param_low_thresh *= 65535;
p_thresholds[i].param_high_thresh *= 65535;
break;
default:
break;
}
}
/* Set valid target list */
status |= vl53l5cx_dci_write_data(p_dev, (uint8_t*)grp_valid_target_cfg,
VL53L5CX_DCI_DET_THRESH_VALID_STATUS,
(uint16_t)sizeof(grp_valid_target_cfg));
/* Set thresholds configuration */
status |= vl53l5cx_dci_write_data(p_dev, (uint8_t*)p_thresholds,
VL53L5CX_DCI_DET_THRESH_START,
(uint16_t)(VL53L5CX_NB_THRESHOLDS
*sizeof(VL53L5CX_DetectionThresholds)));
return status;
}

View File

@ -0,0 +1,172 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#include <math.h>
#include "vl53l5cx_plugin_motion_indicator.h"
uint8_t vl53l5cx_motion_indicator_init(
VL53L5CX_Configuration *p_dev,
VL53L5CX_Motion_Configuration *p_motion_config,
uint8_t resolution)
{
uint8_t status = VL53L5CX_STATUS_OK;
(void)memset(p_motion_config, 0, sizeof(VL53L5CX_Motion_Configuration));
p_motion_config->ref_bin_offset = 13633;
p_motion_config->detection_threshold = 2883584;
p_motion_config->extra_noise_sigma = 0;
p_motion_config->null_den_clip_value = 0;
p_motion_config->mem_update_mode = 6;
p_motion_config->mem_update_choice = 2;
p_motion_config->sum_span = 4;
p_motion_config->feature_length = 9;
p_motion_config->nb_of_aggregates = 16;
p_motion_config->nb_of_temporal_accumulations = 16;
p_motion_config->min_nb_for_global_detection = 1;
p_motion_config->global_indicator_format_1 = 8;
p_motion_config->global_indicator_format_2 = 0;
p_motion_config->spare_1 = 0;
p_motion_config->spare_2 = 0;
p_motion_config->spare_3 = 0;
status |= vl53l5cx_motion_indicator_set_resolution(p_dev,
p_motion_config, resolution);
return status;
}
uint8_t vl53l5cx_motion_indicator_set_distance_motion(
VL53L5CX_Configuration *p_dev,
VL53L5CX_Motion_Configuration *p_motion_config,
uint16_t distance_min_mm,
uint16_t distance_max_mm)
{
uint8_t status = VL53L5CX_STATUS_OK;
float_t tmp;
if(((distance_max_mm - distance_min_mm) > (uint16_t)1500)
|| (distance_min_mm < (uint16_t)400)
|| (distance_max_mm > (uint16_t)4000))
{
status |= VL53L5CX_STATUS_INVALID_PARAM;
}
else
{
tmp = (float_t)((((float_t)distance_min_mm/(float_t)37.5348)
-(float_t)4.0)*(float_t)2048.5);
p_motion_config->ref_bin_offset = (int32_t)tmp;
tmp = (float_t)((((((float_t)distance_max_mm-
(float_t)distance_min_mm)/(float_t)10.0)+(float_t)30.02784)
/((float_t)15.01392))+(float_t)0.5);
p_motion_config->feature_length = (uint8_t)tmp;
status |= vl53l5cx_dci_write_data(p_dev,
(uint8_t*)(p_motion_config),
VL53L5CX_DCI_MOTION_DETECTOR_CFG,
(uint16_t)sizeof(*p_motion_config));
}
return status;
}
uint8_t vl53l5cx_motion_indicator_set_resolution(
VL53L5CX_Configuration *p_dev,
VL53L5CX_Motion_Configuration *p_motion_config,
uint8_t resolution)
{
uint8_t i, status = VL53L5CX_STATUS_OK;
switch(resolution)
{
case VL53L5CX_RESOLUTION_4X4:
for(i = 0; i < (uint8_t)VL53L5CX_RESOLUTION_4X4; i++)
{
p_motion_config->map_id[i] = (int8_t)i;
}
(void)memset(p_motion_config->map_id + 16, -1, 48);
break;
case VL53L5CX_RESOLUTION_8X8:
for(i = 0; i < (uint8_t)VL53L5CX_RESOLUTION_8X8; i++)
{
p_motion_config->map_id[i] = (int8_t)((((int8_t)
i % 8)/2) + (4*((int8_t)i/16)));
}
break;
default:
status |= VL53L5CX_STATUS_ERROR;
break;
}
if(status != (uint8_t)0)
{
status |= vl53l5cx_dci_write_data(p_dev,
(uint8_t*)(p_motion_config),
VL53L5CX_DCI_MOTION_DETECTOR_CFG,
(uint16_t)sizeof(*p_motion_config));
}
return status;
}

View File

@ -0,0 +1,414 @@
/*******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This file is part of the VL53L5CX Ultra Lite Driver and is dual licensed,
* either 'STMicroelectronics Proprietary license'
* or 'BSD 3-clause "New" or "Revised" License' , at your option.
*
********************************************************************************
*
* 'STMicroelectronics Proprietary license'
*
********************************************************************************
*
* License terms: STMicroelectronics Proprietary in accordance with licensing
* terms at www.st.com/sla0081
*
* STMicroelectronics confidential
* Reproduction and Communication of this document is strictly prohibited unless
* specifically authorized in writing by STMicroelectronics.
*
*
********************************************************************************
*
* Alternatively, the VL53L5CX Ultra Lite Driver may be distributed under the
* terms of 'BSD 3-clause "New" or "Revised" License', in which case the
* following provisions apply instead of the ones mentioned above :
*
********************************************************************************
*
* License terms: BSD 3-clause "New" or "Revised" License.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*
*******************************************************************************/
#include "vl53l5cx_plugin_xtalk.h"
/*
* Inner function, not available outside this file. This function is used to
* wait for an answer from VL53L5 sensor.
*/
static uint8_t _vl53l5cx_poll_for_answer(
VL53L5CX_Configuration *p_dev,
uint16_t address,
uint8_t expected_value)
{
uint8_t status = VL53L5CX_STATUS_OK;
uint8_t timeout = 0;
do {
status |= RdMulti(&(p_dev->platform),
address, p_dev->temp_buffer, 4);
status |= WaitMs(&(p_dev->platform), 10);
/* 2s timeout or FW error*/
if((timeout >= (uint8_t)200)
|| (p_dev->temp_buffer[2] >= (uint8_t) 0x7f))
{
status |= VL53L5CX_MCU_ERROR;
break;
}
else
{
timeout++;
}
}while ((p_dev->temp_buffer[0x1]) != expected_value);
return status;
}
/*
* Inner function, not available outside this file. This function is used to
* program the output using the macro defined into the 'platform.h' file.
*/
static uint8_t _vl53l5cx_program_output_config(
VL53L5CX_Configuration *p_dev)
{
uint8_t resolution, status = VL53L5CX_STATUS_OK;
uint32_t i;
uint64_t header_config;
union Block_header *bh_ptr;
status |= vl53l5cx_get_resolution(p_dev, &resolution);
p_dev->data_read_size = 0;
/* Enable mandatory output (meta and common data) */
uint32_t output_bh_enable[] = {
0x0001FFFFU,
0x00000000U,
0x00000000U,
0xC0000000U};
/* Send addresses of possible output */
uint32_t output[] ={
0x0000000DU,
0x54000040U,
0x9FD800C0U,
0x9FE40140U,
0x9FF80040U,
0x9FFC0404U,
0xA0FC0100U,
0xA10C0100U,
0xA11C00C0U,
0xA1280902U,
0xA2480040U,
0xA24C0081U,
0xA2540081U,
0xA25C0081U,
0xA2640081U,
0xA26C0084U,
0xA28C0082U};
/* Update data size */
for (i = 0; i < (uint32_t)(sizeof(output)/sizeof(uint32_t)); i++)
{
if ((output[i] == (uint8_t)0)
|| ((output_bh_enable[i/(uint32_t)32]
&((uint32_t)1 << (i%(uint32_t)32))) == (uint32_t)0))
{
continue;
}
bh_ptr = (union Block_header *)&(output[i]);
if (((uint8_t)bh_ptr->type >= (uint8_t)0x1)
&& ((uint8_t)bh_ptr->type < (uint8_t)0x0d))
{
if ((bh_ptr->idx >= (uint16_t)0x54d0)
&& (bh_ptr->idx < (uint16_t)(0x54d0 + 960)))
{
bh_ptr->size = resolution;
}
else
{
bh_ptr->size = (uint8_t)(resolution
* (uint8_t)VL53L5CX_NB_TARGET_PER_ZONE);
}
p_dev->data_read_size += bh_ptr->type * bh_ptr->size;
}
else
{
p_dev->data_read_size += bh_ptr->size;
}
p_dev->data_read_size += (uint32_t)4;
}
p_dev->data_read_size += (uint32_t)20;
status |= vl53l5cx_dci_write_data(p_dev,
(uint8_t*)&(output),
VL53L5CX_DCI_OUTPUT_LIST, (uint16_t)sizeof(output));
header_config = (uint64_t)i + (uint64_t)1;
header_config = header_config << 32;
header_config += (uint64_t)p_dev->data_read_size;
status |= vl53l5cx_dci_write_data(p_dev, (uint8_t*)&(header_config),
VL53L5CX_DCI_OUTPUT_CONFIG,
(uint16_t)sizeof(header_config));
status |= vl53l5cx_dci_write_data(p_dev, (uint8_t*)&(output_bh_enable),
VL53L5CX_DCI_OUTPUT_ENABLES,
(uint16_t)sizeof(output_bh_enable));
return status;
}
uint8_t vl53l5cx_calibrate_xtalk(
VL53L5CX_Configuration *p_dev,
uint16_t reflectance_percent,
uint8_t nb_samples,
uint16_t distance_mm)
{
uint16_t timeout = 0;
uint8_t cmd[] = {0x00, 0x03, 0x00, 0x00};
uint8_t footer[] = {0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x03, 0x04};
uint8_t continue_loop = 1, status = VL53L5CX_STATUS_OK;
uint8_t resolution, frequency, target_order, sharp_prct, ranging_mode;
uint32_t integration_time_ms, xtalk_margin;
uint16_t reflectance = reflectance_percent;
uint8_t samples = nb_samples;
uint16_t distance = distance_mm;
/* Get initial configuration */
status |= vl53l5cx_get_resolution(p_dev, &resolution);
status |= vl53l5cx_get_ranging_frequency_hz(p_dev, &frequency);
status |= vl53l5cx_get_integration_time_ms(p_dev, &integration_time_ms);
status |= vl53l5cx_get_sharpener_percent(p_dev, &sharp_prct);
status |= vl53l5cx_get_target_order(p_dev, &target_order);
status |= vl53l5cx_get_xtalk_margin(p_dev, &xtalk_margin);
status |= vl53l5cx_get_ranging_mode(p_dev, &ranging_mode);
/* Check input arguments validity */
if(((reflectance < (uint16_t)1) || (reflectance > (uint16_t)99))
|| ((distance < (uint16_t)600) || (distance > (uint16_t)3000))
|| ((samples < (uint8_t)1) || (samples > (uint8_t)16)))
{
status |= VL53L5CX_STATUS_INVALID_PARAM;
}
else
{
status |= vl53l5cx_set_resolution(p_dev,
VL53L5CX_RESOLUTION_8X8);
/* Send Xtalk calibration buffer */
(void)memcpy(p_dev->temp_buffer, VL53L5CX_CALIBRATE_XTALK,
sizeof(VL53L5CX_CALIBRATE_XTALK));
status |= WrMulti(&(p_dev->platform), 0x2c28,
p_dev->temp_buffer,
(uint16_t)sizeof(VL53L5CX_CALIBRATE_XTALK));
status |= _vl53l5cx_poll_for_answer(p_dev,
VL53L5CX_UI_CMD_STATUS, 0x3);
/* Format input argument */
reflectance = reflectance * (uint16_t)16;
distance = distance * (uint16_t)4;
/* Update required fields */
status |= vl53l5cx_dci_replace_data(p_dev, p_dev->temp_buffer,
VL53L5CX_DCI_CAL_CFG, 8,
(uint8_t*)&distance, 2, 0x00);
status |= vl53l5cx_dci_replace_data(p_dev, p_dev->temp_buffer,
VL53L5CX_DCI_CAL_CFG, 8,
(uint8_t*)&reflectance, 2, 0x02);
status |= vl53l5cx_dci_replace_data(p_dev, p_dev->temp_buffer,
VL53L5CX_DCI_CAL_CFG, 8,
(uint8_t*)&samples, 1, 0x04);
/* Program output for Xtalk calibration */
status |= _vl53l5cx_program_output_config(p_dev);
/* Start ranging session */
status |= WrMulti(&(p_dev->platform),
VL53L5CX_UI_CMD_END - (uint16_t)(4 - 1),
(uint8_t*)cmd, sizeof(cmd));
status |= _vl53l5cx_poll_for_answer(p_dev,
VL53L5CX_UI_CMD_STATUS, 0x3);
/* Wait for end of calibration */
do {
status |= RdMulti(&(p_dev->platform),
0x0, p_dev->temp_buffer, 4);
if(p_dev->temp_buffer[0] != VL53L5CX_STATUS_ERROR)
{
/* Coverglass too good for Xtalk calibration */
if((p_dev->temp_buffer[2] >= (uint8_t)0x7f) &&
(((uint16_t)(p_dev->temp_buffer[3] &
(uint16_t)0x80) >> 7) == (uint16_t)1))
{
(void)memcpy(p_dev->xtalk_data,
p_dev->default_xtalk,
VL53L5CX_XTALK_BUFFER_SIZE);
}
continue_loop = (uint8_t)0;
}
else if(timeout >= (uint16_t)400)
{
status |= VL53L5CX_STATUS_ERROR;
continue_loop = (uint8_t)0;
}
else
{
timeout++;
status |= WaitMs(&(p_dev->platform), 50);
}
}while (continue_loop == (uint8_t)1);
}
/* Save Xtalk data into the Xtalk buffer */
(void)memcpy(p_dev->temp_buffer, VL53L5CX_GET_XTALK_CMD,
sizeof(VL53L5CX_GET_XTALK_CMD));
status |= WrMulti(&(p_dev->platform), 0x2fb8,
p_dev->temp_buffer,
(uint16_t)sizeof(VL53L5CX_GET_XTALK_CMD));
status |= _vl53l5cx_poll_for_answer(p_dev,VL53L5CX_UI_CMD_STATUS, 0x03);
status |= RdMulti(&(p_dev->platform), VL53L5CX_UI_CMD_START,
p_dev->temp_buffer,
VL53L5CX_XTALK_BUFFER_SIZE + (uint16_t)4);
(void)memcpy(&(p_dev->xtalk_data[0]), &(p_dev->temp_buffer[8]),
VL53L5CX_XTALK_BUFFER_SIZE - (uint16_t)8);
(void)memcpy(&(p_dev->xtalk_data[VL53L5CX_XTALK_BUFFER_SIZE
- (uint16_t)8]), footer, sizeof(footer));
/* Reset default buffer */
status |= WrMulti(&(p_dev->platform), 0x2c34,
p_dev->default_configuration,
VL53L5CX_CONFIGURATION_SIZE);
status |= _vl53l5cx_poll_for_answer(p_dev,VL53L5CX_UI_CMD_STATUS, 0x03);
/* Reset initial configuration */
status |= vl53l5cx_set_resolution(p_dev, resolution);
status |= vl53l5cx_set_ranging_frequency_hz(p_dev, frequency);
status |= vl53l5cx_set_integration_time_ms(p_dev, integration_time_ms);
status |= vl53l5cx_set_sharpener_percent(p_dev, sharp_prct);
status |= vl53l5cx_set_target_order(p_dev, target_order);
status |= vl53l5cx_set_xtalk_margin(p_dev, xtalk_margin);
status |= vl53l5cx_set_ranging_mode(p_dev, ranging_mode);
return status;
}
uint8_t vl53l5cx_get_caldata_xtalk(
VL53L5CX_Configuration *p_dev,
uint8_t *p_xtalk_data)
{
uint8_t status = VL53L5CX_STATUS_OK, resolution;
uint8_t footer[] = {0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x03, 0x04};
status |= vl53l5cx_get_resolution(p_dev, &resolution);
status |= vl53l5cx_set_resolution(p_dev, VL53L5CX_RESOLUTION_8X8);
(void)memcpy(p_dev->temp_buffer, VL53L5CX_GET_XTALK_CMD,
sizeof(VL53L5CX_GET_XTALK_CMD));
status |= WrMulti(&(p_dev->platform), 0x2fb8,
p_dev->temp_buffer, sizeof(VL53L5CX_GET_XTALK_CMD));
status |= _vl53l5cx_poll_for_answer(p_dev,VL53L5CX_UI_CMD_STATUS, 0x03);
status |= RdMulti(&(p_dev->platform), VL53L5CX_UI_CMD_START,
p_dev->temp_buffer,
VL53L5CX_XTALK_BUFFER_SIZE + (uint16_t)4);
(void)memcpy(&(p_xtalk_data[0]), &(p_dev->temp_buffer[8]),
VL53L5CX_XTALK_BUFFER_SIZE-(uint16_t)8);
(void)memcpy(&(p_xtalk_data[VL53L5CX_XTALK_BUFFER_SIZE - (uint16_t)8]),
footer, sizeof(footer));
status |= vl53l5cx_set_resolution(p_dev, resolution);
return status;
}
uint8_t vl53l5cx_set_caldata_xtalk(
VL53L5CX_Configuration *p_dev,
uint8_t *p_xtalk_data)
{
uint8_t resolution, status = VL53L5CX_STATUS_OK;
status |= vl53l5cx_get_resolution(p_dev, &resolution);
(void)memcpy(p_dev->xtalk_data, p_xtalk_data, VL53L5CX_XTALK_BUFFER_SIZE);
status |= vl53l5cx_set_resolution(p_dev, resolution);
return status;
}
uint8_t vl53l5cx_get_xtalk_margin(
VL53L5CX_Configuration *p_dev,
uint32_t *p_xtalk_margin)
{
uint8_t status = VL53L5CX_STATUS_OK;
status |= vl53l5cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer,
VL53L5CX_DCI_XTALK_CFG, 16);
(void)memcpy(p_xtalk_margin, p_dev->temp_buffer, 4);
*p_xtalk_margin = *p_xtalk_margin/(uint32_t)2048;
return status;
}
uint8_t vl53l5cx_set_xtalk_margin(
VL53L5CX_Configuration *p_dev,
uint32_t xtalk_margin)
{
uint8_t status = VL53L5CX_STATUS_OK;
uint32_t margin_kcps = xtalk_margin;
if(margin_kcps > (uint32_t)10000)
{
status |= VL53L5CX_STATUS_INVALID_PARAM;
}
else
{
margin_kcps = margin_kcps*(uint32_t)2048;
status |= vl53l5cx_dci_replace_data(p_dev, p_dev->temp_buffer,
VL53L5CX_DCI_XTALK_CFG, 16,
(uint8_t*)&margin_kcps, 4, 0x00);
}
return status;
}

View File

@ -43,6 +43,7 @@ OMV_CFLAGS += -I$(TOP_DIR)/$(OMV_DIR)/ports/$(PORT)/modules/
OMV_CFLAGS += -I$(TOP_DIR)/$(LEPTON_DIR)/include/
OMV_CFLAGS += -I$(TOP_DIR)/$(LSM6DS3_DIR)/include/
OMV_CFLAGS += -I$(TOP_DIR)/$(LSM6DSOX_DIR)/include/
OMV_CFLAGS += -I$(TOP_DIR)/$(VL53L5CX_DIR)/include/
OMV_CFLAGS += -I$(TOP_DIR)/$(WINC1500_DIR)/include/
OMV_CFLAGS += -I$(TOP_DIR)/$(MLX90621_DIR)/include/
OMV_CFLAGS += -I$(TOP_DIR)/$(MLX90640_DIR)/include/
@ -119,6 +120,7 @@ endif
FIRM_OBJ += $(wildcard $(BUILD)/$(MLX90621_DIR)/src/*.o)
FIRM_OBJ += $(wildcard $(BUILD)/$(MLX90640_DIR)/src/*.o)
FIRM_OBJ += $(wildcard $(BUILD)/$(MLX90641_DIR)/src/*.o)
FIRM_OBJ += $(wildcard $(BUILD)/$(VL53L5CX_DIR)/src/*.o)
FIRM_OBJ += $(wildcard $(BUILD)/$(PIXART_DIR)/src/*.o)
#------------- OpenMV Objects ----------------#
@ -566,6 +568,7 @@ endif
UVC_OBJ += $(wildcard $(BUILD)/$(MLX90621_DIR)/src/*.o)
UVC_OBJ += $(wildcard $(BUILD)/$(MLX90640_DIR)/src/*.o)
UVC_OBJ += $(wildcard $(BUILD)/$(MLX90641_DIR)/src/*.o)
UVC_OBJ += $(wildcard $(BUILD)/$(VL53L5CX_DIR)/src/*.o)
UVC_OBJ += $(wildcard $(BUILD)/$(PIXART_DIR)/src/*.o)
endif
@ -631,6 +634,7 @@ endif
$(MAKE) -C $(MLX90621_DIR) BUILD=$(BUILD)/$(MLX90621_DIR) CFLAGS="$(CFLAGS) -MMD"
$(MAKE) -C $(MLX90640_DIR) BUILD=$(BUILD)/$(MLX90640_DIR) CFLAGS="$(CFLAGS) -MMD"
$(MAKE) -C $(MLX90641_DIR) BUILD=$(BUILD)/$(MLX90641_DIR) CFLAGS="$(CFLAGS) -MMD"
$(MAKE) -C $(VL53L5CX_DIR) BUILD=$(BUILD)/$(VL53L5CX_DIR) CFLAGS="$(CFLAGS) -MMD"
$(MAKE) -C $(PIXART_DIR) BUILD=$(BUILD)/$(PIXART_DIR) CFLAGS="$(CFLAGS) -MMD"
$(MAKE) -C $(OMV_DIR) BUILD=$(BUILD)/$(OMV_DIR) CFLAGS="$(CFLAGS) -MMD"
ifeq ($(CUBEAI), 1)