mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
drivers/vl53l8cx: Add VL53L8CX ULD driver.
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
This commit is contained in:
parent
7d735a7849
commit
35233d1650
@ -66,6 +66,7 @@ MLX90621_DIR=drivers/mlx90621
|
|||||||
MLX90640_DIR=drivers/mlx90640
|
MLX90640_DIR=drivers/mlx90640
|
||||||
MLX90641_DIR=drivers/mlx90641
|
MLX90641_DIR=drivers/mlx90641
|
||||||
VL53L5CX_DIR=drivers/vl53l5cx
|
VL53L5CX_DIR=drivers/vl53l5cx
|
||||||
|
VL53L8CX_DIR=drivers/vl53l8cx
|
||||||
PIXART_DIR=drivers/pixart
|
PIXART_DIR=drivers/pixart
|
||||||
DISPLAY_DIR=drivers/display
|
DISPLAY_DIR=drivers/display
|
||||||
DAVE2D_DIR=drivers/dave2d
|
DAVE2D_DIR=drivers/dave2d
|
||||||
|
|||||||
9
src/drivers/vl53l8cx/LICENSE
Normal file
9
src/drivers/vl53l8cx/LICENSE
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
The clear BSD license
|
||||||
|
|
||||||
|
The redistribution and use of this license in source and binary forms, with or without modifications, is permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met:
|
||||||
|
|
||||||
|
* Redistribution of the source code must retain the STMicroelectronics copyright notice, this list of conditions, and the following disclaimer.
|
||||||
|
* Redistribution in a binary form must reproduce the STMicroelectronics copyright notice, this list of conditions, and the following disclaimer in the documentation and/or other materials provided with the distribution.
|
||||||
|
* 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.
|
||||||
|
|
||||||
|
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER 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.
|
||||||
42
src/drivers/vl53l8cx/Makefile
Normal file
42
src/drivers/vl53l8cx/Makefile
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# SPDX-License-Identifier: MIT
|
||||||
|
#
|
||||||
|
# Copyright (C) 2025 OpenMV, LLC.
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in
|
||||||
|
# all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
# THE SOFTWARE.
|
||||||
|
#
|
||||||
|
# VL53L8CX Makefile
|
||||||
|
override CFLAGS += -Os
|
||||||
|
|
||||||
|
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)
|
||||||
107
src/drivers/vl53l8cx/include/platform.h
Normal file
107
src/drivers/vl53l8cx/include/platform.h
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* Copyright (C) 2025 OpenMV, LLC.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* VL53L8CX platform implementation.
|
||||||
|
*/
|
||||||
|
#ifndef __VL53L8CX_PLATFORM_H__
|
||||||
|
#define __VL53L8CX_PLATFORM_H__
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <omv_i2c.h>
|
||||||
|
#include "py/mphal.h"
|
||||||
|
|
||||||
|
// Driver configuration
|
||||||
|
#define VL53L8CX_NB_TARGET_PER_ZONE (1U)
|
||||||
|
#define VL53L8CX_DISABLE_AMBIENT_PER_SPAD
|
||||||
|
#define VL53L8CX_DISABLE_NB_SPADS_ENABLED
|
||||||
|
#define VL53L8CX_DISABLE_NB_TARGET_DETECTED
|
||||||
|
#define VL53L8CX_DISABLE_SIGNAL_PER_SPAD
|
||||||
|
#define VL53L8CX_DISABLE_RANGE_SIGMA_MM
|
||||||
|
#define VL53L8CX_DISABLE_REFLECTANCE_PERCENT
|
||||||
|
#define VL53L8CX_DISABLE_TARGET_STATUS
|
||||||
|
#define VL53L8CX_DISABLE_MOTION_INDICATOR
|
||||||
|
|
||||||
|
// Platform struct.
|
||||||
|
typedef struct {
|
||||||
|
omv_i2c_t *bus;
|
||||||
|
uint16_t address;
|
||||||
|
} VL53L8CX_Platform;
|
||||||
|
|
||||||
|
void vl53l8cx_reset(VL53L8CX_Platform *platform);
|
||||||
|
void vl53l8cx_shutdown(VL53L8CX_Platform *platform);
|
||||||
|
void vl53l8cx_swap(uint8_t *buf, uint16_t size);
|
||||||
|
uint8_t vl53l8cx_read(VL53L8CX_Platform *platform, uint16_t addr, uint8_t *buf, uint32_t size);
|
||||||
|
uint8_t vl53l8cx_write(VL53L8CX_Platform *platform, uint16_t addr, uint8_t *buf, uint32_t size);
|
||||||
|
|
||||||
|
// Platform API.
|
||||||
|
#define VL53L8CX_CHECK_STATUS(status) ({ \
|
||||||
|
if (status != VL53L8CX_STATUS_OK) { \
|
||||||
|
return -1; \
|
||||||
|
} \
|
||||||
|
status; \
|
||||||
|
})
|
||||||
|
#define VL53L8CX_RdByte(platform, addr, buf) ({ \
|
||||||
|
uint8_t status = vl53l8cx_read(platform, addr, buf, 1); \
|
||||||
|
VL53L8CX_CHECK_STATUS(status); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define VL53L8CX_WrByte(platform, addr, buf) ({ \
|
||||||
|
uint8_t status = vl53l8cx_write(platform, addr, (uint8_t [1]){ buf }, 1); \
|
||||||
|
VL53L8CX_CHECK_STATUS(status); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define VL53L8CX_RdMulti(platform, addr, buf, size) ({ \
|
||||||
|
uint8_t status = vl53l8cx_read(platform, addr, buf, size); \
|
||||||
|
VL53L8CX_CHECK_STATUS(status); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define VL53L8CX_WrMulti(platform, addr, buf, size) ({ \
|
||||||
|
uint8_t status = vl53l8cx_write(platform, addr, buf, size); \
|
||||||
|
VL53L8CX_CHECK_STATUS(status); \
|
||||||
|
})
|
||||||
|
#define VL53L8CX_WaitMs(platform, ms) ({ mp_hal_delay_ms(ms); 0; })
|
||||||
|
#define VL53L8CX_SwapBuffer(buf, size) vl53l8cx_swap(buf, size)
|
||||||
|
|
||||||
|
// Driver shim layer.
|
||||||
|
#define vl53lx_dev_t VL53L8CX_Configuration
|
||||||
|
#define vl53lx_data_t VL53L8CX_ResultsData
|
||||||
|
|
||||||
|
#define vl53lx_init vl53l8cx_init
|
||||||
|
#define vl53lx_reset vl53l8cx_reset
|
||||||
|
#define vl53lx_shutdown vl53l8cx_shutdown
|
||||||
|
#define vl53lx_is_alive vl53l8cx_is_alive
|
||||||
|
|
||||||
|
#define vl53lx_set_resolution vl53l8cx_set_resolution
|
||||||
|
#define vl53lx_set_sharpener_percent vl53l8cx_set_sharpener_percent
|
||||||
|
|
||||||
|
#define vl53lx_start_ranging vl53l8cx_start_ranging
|
||||||
|
#define vl53lx_stop_ranging vl53l8cx_stop_ranging
|
||||||
|
#define vl53lx_get_ranging_data vl53l8cx_get_ranging_data
|
||||||
|
#define vl53lx_check_data_ready vl53l8cx_check_data_ready
|
||||||
|
#define vl53lx_set_ranging_mode vl53l8cx_set_ranging_mode
|
||||||
|
#define vl53lx_set_ranging_frequency_hz vl53l8cx_set_ranging_frequency_hz
|
||||||
|
|
||||||
|
#define VL53LX_RESOLUTION_8X8 VL53L8CX_RESOLUTION_8X8
|
||||||
|
#define VL53LX_RANGING_MODE_CONTINUOUS VL53L8CX_RANGING_MODE_CONTINUOUS
|
||||||
|
|
||||||
|
#endif // __VL53L8CX_PLATFORM_H__
|
||||||
758
src/drivers/vl53l8cx/include/vl53l8cx_api.h
Normal file
758
src/drivers/vl53l8cx/include/vl53l8cx_api.h
Normal file
@ -0,0 +1,758 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_API_H_
|
||||||
|
#define VL53L8CX_API_H_
|
||||||
|
|
||||||
|
#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)
|
||||||
|
#pragma anon_unions
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Current driver version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_API_REVISION "VL53L8CX_2.0.0"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Default I2C address of VL53L8CX sensor. Can be changed using function
|
||||||
|
* vl53l8cx_set_i2c_address() function is called.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_DEFAULT_I2C_ADDRESS ((uint16_t)0x52)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8 allows
|
||||||
|
* setting sensor in 4x4 mode or 8x8 mode, using function
|
||||||
|
* vl53l8cx_set_resolution().
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_RESOLUTION_4X4 ((uint8_t) 16U)
|
||||||
|
#define VL53L8CX_RESOLUTION_8X8 ((uint8_t) 64U)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_TARGET_ORDER_STRONGEST or VL53L8CX_TARGET_ORDER_CLOSEST
|
||||||
|
* are used to select the target order for data output.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_TARGET_ORDER_CLOSEST ((uint8_t) 1U)
|
||||||
|
#define VL53L8CX_TARGET_ORDER_STRONGEST ((uint8_t) 2U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_RANGING_MODE_CONTINUOUS and
|
||||||
|
* VL53L8CX_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 VL53L8CX_RANGING_MODE_CONTINUOUS ((uint8_t) 1U)
|
||||||
|
#define VL53L8CX_RANGING_MODE_AUTONOMOUS ((uint8_t) 3U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The default power mode is VL53L8CX_POWER_MODE_WAKEUP. User can choose two
|
||||||
|
* different modes to save power consumption when is the device
|
||||||
|
* is not used:
|
||||||
|
* - VL53L8CX_POWER_MODE_SLEEP: This mode retains the firmware and the configuration. It
|
||||||
|
* is recommended when the device needs to quickly wake-up.
|
||||||
|
* - VL53L8CX_POWER_MODE_DEEP_SLEEP: This mode clears all memory, by consequence the firmware,
|
||||||
|
* the configuration and the calibration are lost. It is recommended when the device sleeps during
|
||||||
|
* a long time as it consumes a very low current consumption.
|
||||||
|
* Both modes can be changed using function vl53l8cx_set_power_mode().
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_POWER_MODE_SLEEP ((uint8_t) 0U)
|
||||||
|
#define VL53L8CX_POWER_MODE_WAKEUP ((uint8_t) 1U)
|
||||||
|
#define VL53L8CX_POWER_MODE_DEEP_SLEEP ((uint8_t) 2U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_STATUS_OK indicates that VL53L5 sensor has no error.
|
||||||
|
* Macro VL53L8CX_STATUS_ERROR indicates that something is wrong (value,
|
||||||
|
* I2C access, ...). Macro VL53L8CX_MCU_ERROR is used to indicate a MCU issue.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_STATUS_OK ((uint8_t) 0U)
|
||||||
|
#define VL53L8CX_STATUS_TIMEOUT_ERROR ((uint8_t) 1U)
|
||||||
|
#define VL53L8CX_STATUS_CORRUPTED_FRAME ((uint8_t) 2U)
|
||||||
|
#define VL53L8CX_STATUS_LASER_SAFETY ((uint8_t) 3U)
|
||||||
|
#define VL53L8CX_STATUS_XTALK_FAILED ((uint8_t) 4U)
|
||||||
|
#define VL53L8CX_STATUS_FW_CHECKSUM_FAIL ((uint8_t) 5U)
|
||||||
|
#define VL53L8CX_MCU_ERROR ((uint8_t) 66U)
|
||||||
|
#define VL53L8CX_STATUS_INVALID_PARAM ((uint8_t) 127U)
|
||||||
|
#define VL53L8CX_STATUS_ERROR ((uint8_t) 255U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Definitions for Range results block headers
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if VL53L8CX_NB_TARGET_PER_ZONE == 1
|
||||||
|
|
||||||
|
#define VL53L8CX_START_BH ((uint32_t)0x0000000DU)
|
||||||
|
#define VL53L8CX_METADATA_BH ((uint32_t)0x54B400C0U)
|
||||||
|
#define VL53L8CX_COMMONDATA_BH ((uint32_t)0x54C00040U)
|
||||||
|
#define VL53L8CX_AMBIENT_RATE_BH ((uint32_t)0x54D00104U)
|
||||||
|
#define VL53L8CX_SPAD_COUNT_BH ((uint32_t)0x55D00404U)
|
||||||
|
#define VL53L8CX_NB_TARGET_DETECTED_BH ((uint32_t)0xDB840401U)
|
||||||
|
#define VL53L8CX_SIGNAL_RATE_BH ((uint32_t)0xDBC40404U)
|
||||||
|
#define VL53L8CX_RANGE_SIGMA_MM_BH ((uint32_t)0xDEC40402U)
|
||||||
|
#define VL53L8CX_DISTANCE_BH ((uint32_t)0xDF440402U)
|
||||||
|
#define VL53L8CX_REFLECTANCE_BH ((uint32_t)0xE0440401U)
|
||||||
|
#define VL53L8CX_TARGET_STATUS_BH ((uint32_t)0xE0840401U)
|
||||||
|
#define VL53L8CX_MOTION_DETECT_BH ((uint32_t)0xD85808C0U)
|
||||||
|
|
||||||
|
#define VL53L8CX_METADATA_IDX ((uint16_t)0x54B4U)
|
||||||
|
#define VL53L8CX_SPAD_COUNT_IDX ((uint16_t)0x55D0U)
|
||||||
|
#define VL53L8CX_AMBIENT_RATE_IDX ((uint16_t)0x54D0U)
|
||||||
|
#define VL53L8CX_NB_TARGET_DETECTED_IDX ((uint16_t)0xDB84U)
|
||||||
|
#define VL53L8CX_SIGNAL_RATE_IDX ((uint16_t)0xDBC4U)
|
||||||
|
#define VL53L8CX_RANGE_SIGMA_MM_IDX ((uint16_t)0xDEC4U)
|
||||||
|
#define VL53L8CX_DISTANCE_IDX ((uint16_t)0xDF44U)
|
||||||
|
#define VL53L8CX_REFLECTANCE_EST_PC_IDX ((uint16_t)0xE044U)
|
||||||
|
#define VL53L8CX_TARGET_STATUS_IDX ((uint16_t)0xE084U)
|
||||||
|
#define VL53L8CX_MOTION_DETEC_IDX ((uint16_t)0xD858U)
|
||||||
|
|
||||||
|
#else
|
||||||
|
#define VL53L8CX_START_BH ((uint32_t)0x0000000DU)
|
||||||
|
#define VL53L8CX_METADATA_BH ((uint32_t)0x54B400C0U)
|
||||||
|
#define VL53L8CX_COMMONDATA_BH ((uint32_t)0x54C00040U)
|
||||||
|
#define VL53L8CX_AMBIENT_RATE_BH ((uint32_t)0x54D00104U)
|
||||||
|
#define VL53L8CX_NB_TARGET_DETECTED_BH ((uint32_t)0x57D00401U)
|
||||||
|
#define VL53L8CX_SPAD_COUNT_BH ((uint32_t)0x55D00404U)
|
||||||
|
#define VL53L8CX_SIGNAL_RATE_BH ((uint32_t)0x58900404U)
|
||||||
|
#define VL53L8CX_RANGE_SIGMA_MM_BH ((uint32_t)0x64900402U)
|
||||||
|
#define VL53L8CX_DISTANCE_BH ((uint32_t)0x66900402U)
|
||||||
|
#define VL53L8CX_REFLECTANCE_BH ((uint32_t)0x6A900401U)
|
||||||
|
#define VL53L8CX_TARGET_STATUS_BH ((uint32_t)0x6B900401U)
|
||||||
|
#define VL53L8CX_MOTION_DETECT_BH ((uint32_t)0xCC5008C0U)
|
||||||
|
|
||||||
|
#define VL53L8CX_METADATA_IDX ((uint16_t)0x54B4U)
|
||||||
|
#define VL53L8CX_SPAD_COUNT_IDX ((uint16_t)0x55D0U)
|
||||||
|
#define VL53L8CX_AMBIENT_RATE_IDX ((uint16_t)0x54D0U)
|
||||||
|
#define VL53L8CX_NB_TARGET_DETECTED_IDX ((uint16_t)0x57D0U)
|
||||||
|
#define VL53L8CX_SIGNAL_RATE_IDX ((uint16_t)0x5890U)
|
||||||
|
#define VL53L8CX_RANGE_SIGMA_MM_IDX ((uint16_t)0x6490U)
|
||||||
|
#define VL53L8CX_DISTANCE_IDX ((uint16_t)0x6690U)
|
||||||
|
#define VL53L8CX_REFLECTANCE_EST_PC_IDX ((uint16_t)0x6A90U)
|
||||||
|
#define VL53L8CX_TARGET_STATUS_IDX ((uint16_t)0x6B90U)
|
||||||
|
#define VL53L8CX_MOTION_DETEC_IDX ((uint16_t)0xCC50U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inner Macro for API. Not for user, only for development.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_NVM_DATA_SIZE ((uint16_t)492U)
|
||||||
|
#define VL53L8CX_CONFIGURATION_SIZE ((uint16_t)972U)
|
||||||
|
#define VL53L8CX_OFFSET_BUFFER_SIZE ((uint16_t)488U)
|
||||||
|
#define VL53L8CX_XTALK_BUFFER_SIZE ((uint16_t)776U)
|
||||||
|
|
||||||
|
#define VL53L8CX_DCI_ZONE_CONFIG ((uint16_t)0x5450U)
|
||||||
|
#define VL53L8CX_DCI_FREQ_HZ ((uint16_t)0x5458U)
|
||||||
|
#define VL53L8CX_DCI_INT_TIME ((uint16_t)0x545CU)
|
||||||
|
#define VL53L8CX_DCI_FW_NB_TARGET ((uint16_t)0x5478)
|
||||||
|
#define VL53L8CX_DCI_RANGING_MODE ((uint16_t)0xAD30U)
|
||||||
|
#define VL53L8CX_DCI_DSS_CONFIG ((uint16_t)0xAD38U)
|
||||||
|
#define VL53L8CX_DCI_VHV_CONFIG ((uint16_t)0xAD60U)
|
||||||
|
#define VL53L8CX_DCI_TARGET_ORDER ((uint16_t)0xAE64U)
|
||||||
|
#define VL53L8CX_DCI_SHARPENER ((uint16_t)0xAED8U)
|
||||||
|
#define VL53L8CX_DCI_INTERNAL_CP ((uint16_t)0xB39CU)
|
||||||
|
#define VL53L8CX_DCI_SYNC_PIN ((uint16_t)0xB5F0U)
|
||||||
|
#define VL53L8CX_DCI_MOTION_DETECTOR_CFG ((uint16_t)0xBFACU)
|
||||||
|
#define VL53L8CX_DCI_SINGLE_RANGE ((uint16_t)0xD964U)
|
||||||
|
#define VL53L8CX_DCI_OUTPUT_CONFIG ((uint16_t)0xD968U)
|
||||||
|
#define VL53L8CX_DCI_OUTPUT_ENABLES ((uint16_t)0xD970U)
|
||||||
|
#define VL53L8CX_DCI_OUTPUT_LIST ((uint16_t)0xD980U)
|
||||||
|
#define VL53L8CX_DCI_PIPE_CONTROL ((uint16_t)0xDB80U)
|
||||||
|
|
||||||
|
#define VL53L8CX_UI_CMD_STATUS ((uint16_t)0x2C00U)
|
||||||
|
#define VL53L8CX_UI_CMD_START ((uint16_t)0x2C04U)
|
||||||
|
#define VL53L8CX_UI_CMD_END ((uint16_t)0x2FFFU)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inner values for API. Max buffer size depends of the selected output.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_AMBIENT_PER_SPAD
|
||||||
|
#define L5CX_AMB_SIZE 260U
|
||||||
|
#else
|
||||||
|
#define L5CX_AMB_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_NB_SPADS_ENABLED
|
||||||
|
#define L5CX_SPAD_SIZE 260U
|
||||||
|
#else
|
||||||
|
#define L5CX_SPAD_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_NB_TARGET_DETECTED
|
||||||
|
#define L5CX_NTAR_SIZE 68U
|
||||||
|
#else
|
||||||
|
#define L5CX_NTAR_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_SIGNAL_PER_SPAD
|
||||||
|
#define L5CX_SPS_SIZE ((256U * VL53L8CX_NB_TARGET_PER_ZONE) + 4U)
|
||||||
|
#else
|
||||||
|
#define L5CX_SPS_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_RANGE_SIGMA_MM
|
||||||
|
#define L5CX_SIGR_SIZE ((128U * VL53L8CX_NB_TARGET_PER_ZONE) + 4U)
|
||||||
|
#else
|
||||||
|
#define L5CX_SIGR_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_DISTANCE_MM
|
||||||
|
#define L5CX_DIST_SIZE ((128U * VL53L8CX_NB_TARGET_PER_ZONE) + 4U)
|
||||||
|
#else
|
||||||
|
#define L5CX_DIST_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_REFLECTANCE_PERCENT
|
||||||
|
#define L5CX_RFLEST_SIZE ((64U *VL53L8CX_NB_TARGET_PER_ZONE) + 4U)
|
||||||
|
#else
|
||||||
|
#define L5CX_RFLEST_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_TARGET_STATUS
|
||||||
|
#define L5CX_STA_SIZE ((64U *VL53L8CX_NB_TARGET_PER_ZONE) + 4U)
|
||||||
|
#else
|
||||||
|
#define L5CX_STA_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_DISABLE_MOTION_INDICATOR
|
||||||
|
#define L5CX_MOT_SIZE 144U
|
||||||
|
#else
|
||||||
|
#define L5CX_MOT_SIZE 0U
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_MAX_RESULTS_SIZE indicates the maximum size used by
|
||||||
|
* output through I2C. Value 40 corresponds to headers + meta-data + common-data
|
||||||
|
* and 20 corresponds to the footer.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_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 + 20U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_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 VL53L8CX_MAX_RESULTS_SIZE < 1024U
|
||||||
|
#define VL53L8CX_TEMPORARY_BUFFER_SIZE ((uint32_t) 1024U)
|
||||||
|
#else
|
||||||
|
#define VL53L8CX_TEMPORARY_BUFFER_SIZE ((uint32_t) VL53L8CX_MAX_RESULTS_SIZE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure VL53L8CX_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 */
|
||||||
|
VL53L8CX_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[VL53L8CX_OFFSET_BUFFER_SIZE];
|
||||||
|
/* Xtalk buffer */
|
||||||
|
uint8_t xtalk_data[VL53L8CX_XTALK_BUFFER_SIZE];
|
||||||
|
/* Temporary buffer used for internal driver processing */
|
||||||
|
uint8_t temp_buffer[VL53L8CX_TEMPORARY_BUFFER_SIZE];
|
||||||
|
/* Auto-stop flag for stopping the sensor */
|
||||||
|
uint8_t is_auto_stop_enabled;
|
||||||
|
} VL53L8CX_Configuration;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure VL53L8CX_ResultsData contains the ranging results of
|
||||||
|
* VL53L8CX. 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 VL53L8CX_DISABLE_AMBIENT_PER_SPAD
|
||||||
|
uint32_t ambient_per_spad[VL53L8CX_RESOLUTION_8X8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Number of valid target detected for 1 zone */
|
||||||
|
#ifndef VL53L8CX_DISABLE_NB_TARGET_DETECTED
|
||||||
|
uint8_t nb_target_detected[VL53L8CX_RESOLUTION_8X8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Number of spads enabled for this ranging */
|
||||||
|
#ifndef VL53L8CX_DISABLE_NB_SPADS_ENABLED
|
||||||
|
uint32_t nb_spads_enabled[VL53L8CX_RESOLUTION_8X8];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Signal returned to the sensor in kcps/spads */
|
||||||
|
#ifndef VL53L8CX_DISABLE_SIGNAL_PER_SPAD
|
||||||
|
uint32_t signal_per_spad[(VL53L8CX_RESOLUTION_8X8
|
||||||
|
*VL53L8CX_NB_TARGET_PER_ZONE)];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Sigma of the current distance in mm */
|
||||||
|
#ifndef VL53L8CX_DISABLE_RANGE_SIGMA_MM
|
||||||
|
uint16_t range_sigma_mm[(VL53L8CX_RESOLUTION_8X8
|
||||||
|
*VL53L8CX_NB_TARGET_PER_ZONE)];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Measured distance in mm */
|
||||||
|
#ifndef VL53L8CX_DISABLE_DISTANCE_MM
|
||||||
|
int16_t distance_mm[(VL53L8CX_RESOLUTION_8X8
|
||||||
|
*VL53L8CX_NB_TARGET_PER_ZONE)];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Estimated reflectance in percent */
|
||||||
|
#ifndef VL53L8CX_DISABLE_REFLECTANCE_PERCENT
|
||||||
|
uint8_t reflectance[(VL53L8CX_RESOLUTION_8X8
|
||||||
|
*VL53L8CX_NB_TARGET_PER_ZONE)];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Status indicating the measurement validity (5 & 9 means ranging OK)*/
|
||||||
|
#ifndef VL53L8CX_DISABLE_TARGET_STATUS
|
||||||
|
uint8_t target_status[(VL53L8CX_RESOLUTION_8X8
|
||||||
|
*VL53L8CX_NB_TARGET_PER_ZONE)];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Motion detector results */
|
||||||
|
#ifndef VL53L8CX_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
|
||||||
|
|
||||||
|
} VL53L8CX_ResultsData;
|
||||||
|
|
||||||
|
|
||||||
|
union Block_header {
|
||||||
|
uint32_t bytes;
|
||||||
|
struct {
|
||||||
|
uint32_t type : 4;
|
||||||
|
uint32_t size : 12;
|
||||||
|
uint32_t idx : 16;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_is_alive(
|
||||||
|
VL53L8CX_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 VL53L8CX. It takes
|
||||||
|
* a few hundred milliseconds.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @return (uint8_t) status : 0 if initialization is OK.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_init(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint16_t) i2c_address : New I2C address.
|
||||||
|
* @return (uint8_t) status : 0 if new address is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_i2c_address(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint16_t i2c_address);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to get the current sensor power mode.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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,
|
||||||
|
* (VL53L8CX_POWER_MODE_SLEEP), or 1 if sensor is in standard mode
|
||||||
|
* (VL53L8CX_POWER_MODE_WAKEUP).
|
||||||
|
* @return (uint8_t) status : 0 if power mode is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_power_mode(
|
||||||
|
VL53L8CX_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
|
||||||
|
* VL53L8CX_POWER_MODE_SLEEP can be used to enable the low power mode. When user
|
||||||
|
* want to restart the sensor, he can use macro VL53L8CX_POWER_MODE_WAKEUP.
|
||||||
|
* Please ensure that the device is not streaming before calling the function.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) power_mode : Selected power mode (VL53L8CX_POWER_MODE_SLEEP
|
||||||
|
* or VL53L8CX_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 vl53l8cx_set_power_mode(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @return (uint8_t) status : 0 if start is OK.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_start_ranging(
|
||||||
|
VL53L8CX_Configuration *p_dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function stops the ranging session. It must be used when the
|
||||||
|
* sensor streams, after calling vl53l8cx_start_ranging().
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @return (uint8_t) status : 0 if stop is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_stop_ranging(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_check_data_ready(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_isReady);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function gets the ranging data, using the selected output and the
|
||||||
|
* resolution.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (VL53L8CX_ResultsData) *p_results : VL53L5 results structure.
|
||||||
|
* @return (uint8_t) status : 0 data are successfully get.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_ranging_data(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_ResultsData *p_results);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function gets the current resolution (4x4 or 8x8).
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_get_resolution(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_resolution);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets a new resolution (4x4 or 8x8).
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) resolution : Use macro VL53L8CX_RESOLUTION_4X4 or
|
||||||
|
* VL53L8CX_RESOLUTION_8X8 to set the resolution.
|
||||||
|
* @return (uint8_t) status : 0 if set resolution is OK.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_resolution(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_get_ranging_frequency_hz(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_set_ranging_frequency_hz(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t frequency_hz);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function gets the current integration time in ms.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_get_integration_time_ms(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_set_integration_time_ms(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_get_sharpener_percent(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_set_sharpener_percent(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t sharpener_percent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function gets the current target order (closest or strongest).
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_get_target_order(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_target_order);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function sets a new target order. Please use macros
|
||||||
|
* VL53L8CX_TARGET_ORDER_STRONGEST and VL53L8CX_TARGET_ORDER_CLOSEST to define
|
||||||
|
* the new output order. By default, the sensor is configured with the strongest
|
||||||
|
* output.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_set_target_order(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) *p_ranging_mode : current ranging mode
|
||||||
|
* @return (uint8_t) status : 0 if get ranging mode is OK.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_ranging_mode(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) ranging_mode : Use macros VL53L8CX_RANGING_MODE_CONTINUOUS,
|
||||||
|
* VL53L8CX_RANGING_MODE_CONTINUOUS.
|
||||||
|
* @return (uint8_t) status : 0 if set ranging mode is OK.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_ranging_mode(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t ranging_mode);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to check if the synchronization pin is enabled
|
||||||
|
* or disabled. When it is enabled, the sensor waits an interrupt on B1 pin
|
||||||
|
* to start the next measurement. It is useful for multi-devices
|
||||||
|
* synchronization. By default the sync pin is disabled.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t*) p_is_sync_pin_enabled : Pointer of sync pin status. Value
|
||||||
|
* overridden to 0 if the pin is disabled, or 1 if the pin is enabled.
|
||||||
|
* @return (uint8_t) status : 0 if get sync pin OK.
|
||||||
|
*/
|
||||||
|
uint8_t vl53l8cx_get_external_sync_pin_enable(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_is_sync_pin_enabled);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to enable or disable the synchronization pin. When
|
||||||
|
* it is enabled, the sensor waits an interrupt on B1 pin to start the next
|
||||||
|
* measurement. It is useful for multi-devices synchronization. By default the sync
|
||||||
|
* pin is disabled.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) enable_sync_pin : Ste the value to 1 to enable the sync
|
||||||
|
* pin, or 0 to disable it.
|
||||||
|
* @return (uint8_t) status : 0 if set sync pin OK.
|
||||||
|
*/
|
||||||
|
uint8_t vl53l8cx_set_external_sync_pin_enable(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t enable_sync_pin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to get the number of frames between 2 temperature
|
||||||
|
* compensation.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint32_t) *p_repeat_count : Number of frames before next temperature
|
||||||
|
* compensation. Set to 0 to disable the feature (default configuration).
|
||||||
|
*/
|
||||||
|
uint8_t vl53l8cx_get_VHV_repeat_count(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint32_t *p_repeat_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to set a periodic temperature compensation. By
|
||||||
|
* setting a repeat count different to 0 the firmware automatically runs a
|
||||||
|
* temperature calibration every N frames.
|
||||||
|
* default the repeat count is set to 0
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint32_t) repeat_count : Number of frames between temperature
|
||||||
|
* compensation. Set to 0 to disable the feature (default configuration).
|
||||||
|
*/
|
||||||
|
uint8_t vl53l8cx_set_VHV_repeat_count(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint32_t repeat_count);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_dci_read_data(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_dci_write_data(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_dci_replace_data(
|
||||||
|
VL53L8CX_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 //VL53L8CX_API_H_
|
||||||
22011
src/drivers/vl53l8cx/include/vl53l8cx_buffers.h
Normal file
22011
src/drivers/vl53l8cx/include/vl53l8cx_buffers.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,186 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_PLUGIN_DETECTION_THRESHOLDS_H_
|
||||||
|
#define VL53L8CX_PLUGIN_DETECTION_THRESHOLDS_H_
|
||||||
|
|
||||||
|
#include "vl53l8cx_api.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_NB_THRESHOLDS indicates the number of checkers. This
|
||||||
|
* value cannot be changed.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_NB_THRESHOLDS ((uint8_t)64U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inner Macro for API. Not for user, only for development.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_DCI_DET_THRESH_CONFIG ((uint16_t)0x5488U)
|
||||||
|
#define VL53L8CX_DCI_DET_THRESH_GLOBAL_CONFIG ((uint16_t)0xB6E0U)
|
||||||
|
#define VL53L8CX_DCI_DET_THRESH_START ((uint16_t)0xB6E8U)
|
||||||
|
#define VL53L8CX_DCI_DET_THRESH_VALID_STATUS ((uint16_t)0xB9F0U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Macro VL53L8CX_LAST_THRESHOLD is used to indicate the end of checkers
|
||||||
|
* programming.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_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 VL53L8CX_DISTANCE_MM ((uint8_t)1U)
|
||||||
|
#define VL53L8CX_SIGNAL_PER_SPAD_KCPS ((uint8_t)2U)
|
||||||
|
#define VL53L8CX_RANGE_SIGMA_MM ((uint8_t)4U)
|
||||||
|
#define VL53L8CX_AMBIENT_PER_SPAD_KCPS ((uint8_t)8U)
|
||||||
|
#define VL53L8CX_NB_TARGET_DETECTED ((uint8_t)9U)
|
||||||
|
#define VL53L8CX_TARGET_STATUS ((uint8_t)12U)
|
||||||
|
#define VL53L8CX_NB_SPADS_ENABLED ((uint8_t)13U)
|
||||||
|
#define VL53L8CX_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 VL53L8CX_IN_WINDOW ((uint8_t)0U)
|
||||||
|
#define VL53L8CX_OUT_OF_WINDOW ((uint8_t)1U)
|
||||||
|
#define VL53L8CX_LESS_THAN_EQUAL_MIN_CHECKER ((uint8_t)2U)
|
||||||
|
#define VL53L8CX_GREATER_THAN_MAX_CHECKER ((uint8_t)3U)
|
||||||
|
#define VL53L8CX_EQUAL_MIN_CHECKER ((uint8_t)4U)
|
||||||
|
#define VL53L8CX_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 VL53L8CX_OPERATION_NONE ((uint8_t)0U)
|
||||||
|
#define VL53L8CX_OPERATION_OR ((uint8_t)0U)
|
||||||
|
#define VL53L8CX_OPERATION_AND ((uint8_t)2U)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Structure VL53L8CX_DetectionThresholds contains a single threshold.
|
||||||
|
* This structure is never used alone, it must be used as an array of 64
|
||||||
|
* thresholds (defined by macro VL53L8CX_NB_THRESHOLDS).
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
/* Low threshold */
|
||||||
|
int32_t param_low_thresh;
|
||||||
|
/* High threshold */
|
||||||
|
int32_t param_high_thresh;
|
||||||
|
/* Measurement to catch (VL53L8CX_MEDIAN_RANGE_MM,...)*/
|
||||||
|
uint8_t measurement;
|
||||||
|
/* Windows type (VL53L8CX_IN_WINDOW, VL53L8CX_OUT_WINDOW, ...) */
|
||||||
|
uint8_t type;
|
||||||
|
/* Zone id. Please read VL53L5 user manual to find the zone id.Set macro
|
||||||
|
* VL53L8CX_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;
|
||||||
|
}VL53L8CX_DetectionThresholds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function allows indicating if the detection thresholds are
|
||||||
|
* enabled.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_get_detection_thresholds_enable(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function allows enable the detection thresholds.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_set_detection_thresholds_enable(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function allows getting the detection thresholds.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (VL53L8CX_DetectionThresholds) *p_thresholds : Array of 64 thresholds.
|
||||||
|
* @return (uint8_t) status : 0 if programming is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_detection_thresholds(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_DetectionThresholds *p_thresholds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function allows programming the detection thresholds.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (VL53L8CX_DetectionThresholds) *p_thresholds : Array of 64 thresholds.
|
||||||
|
* @return (uint8_t) status : 0 if programming is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_detection_thresholds(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_DetectionThresholds *p_thresholds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to enable or disable the auto-stop feature.
|
||||||
|
* When ToF runs in autonomous mode with detection threshold, the sensor
|
||||||
|
* only emits an interrupt (INT pin) when a threshold is reached. Interrupt
|
||||||
|
* is raised when the measurement is completed. It is possible to abort the ranging
|
||||||
|
* without waiting for end of measurement completed by enabling the auto-stop. The
|
||||||
|
* sensor emits an interrupt and quickly aborts the measurements in progress. Please
|
||||||
|
* note that vl53l8cx_stop_ranging() function needs to be used after interrupt raised
|
||||||
|
* for a clean stop.
|
||||||
|
* This function is used to get the auto_stop flag.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) *p_auto_stop : Pointer of auto-stop feature, 0 disabled
|
||||||
|
* (default) or 1 enabled.
|
||||||
|
* @return (uint8_t) status : 0 if programming is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_detection_thresholds_auto_stop(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_auto_stop);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function is used to enable or disable the auto-stop feature.
|
||||||
|
* When ToF runs in autonomous mode with detection threshold, the sensor
|
||||||
|
* only emits an interrupt (INT pin) when a threshold is reached. Interrupt
|
||||||
|
* is raised when the measurement is completed. It is possible to abort the ranging
|
||||||
|
* without waiting for end of measurement completed by enabling the auto-stop. The
|
||||||
|
* sensor emits an interrupt and quickly aborts the measurements in progress. Please
|
||||||
|
* note that vl53l8cx_stop_ranging() function needs to be used after interrupt raised
|
||||||
|
* for a clean stop.
|
||||||
|
* This function is used to set the auto_stop flag.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint8_t) *p_auto_stop : Pointer of auto-stop feature, 0 disabled
|
||||||
|
* (default) or 1 enabled.
|
||||||
|
* @return (uint8_t) status : 0 if programming is OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_detection_thresholds_auto_stop(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t auto_stop);
|
||||||
|
|
||||||
|
#endif /* VL53L8CX_PLUGIN_DETECTION_THRESHOLDS_H_ */
|
||||||
@ -0,0 +1,96 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_PLUGIN_MOTION_INDICATOR_H_
|
||||||
|
#define VL53L8CX_PLUGIN_MOTION_INDICATOR_H_
|
||||||
|
|
||||||
|
#include "vl53l8cx_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];
|
||||||
|
}VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (VL53L8CX_Motion_Configuration) *p_motion_config : Structure
|
||||||
|
* containing the initialized motion configuration.
|
||||||
|
* @param (uint8_t) resolution : Wanted resolution, defined by macros
|
||||||
|
* VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8.
|
||||||
|
* @return (uint8_t) status : 0 if OK, or 127 is the resolution is unknown.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_motion_indicator_init(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (VL53L8CX_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).
|
||||||
|
* VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8.
|
||||||
|
* @return (uint8_t) status : 0 if OK, or 127 if an argument is invalid.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_motion_indicator_set_distance_motion(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (VL53L8CX_Motion_Configuration) *p_motion_config : Structure
|
||||||
|
* containing the initialized motion configuration.
|
||||||
|
* @param (uint8_t) resolution : Wanted SCI resolution, defined by macros
|
||||||
|
* VL53L8CX_RESOLUTION_4X4 or VL53L8CX_RESOLUTION_8X8.
|
||||||
|
* @return (uint8_t) status : 0 if OK, or 127 is the resolution is unknown.
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_motion_indicator_set_resolution(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_Motion_Configuration *p_motion_config,
|
||||||
|
uint8_t resolution);
|
||||||
|
|
||||||
|
#endif /* VL53L8CX_PLUGIN_MOTION_INDICATOR_H_ */
|
||||||
391
src/drivers/vl53l8cx/include/vl53l8cx_plugin_xtalk.h
Normal file
391
src/drivers/vl53l8cx/include/vl53l8cx_plugin_xtalk.h
Normal file
@ -0,0 +1,391 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef VL53L8CX_PLUGIN_XTALK_H_
|
||||||
|
#define VL53L8CX_PLUGIN_XTALK_H_
|
||||||
|
|
||||||
|
#include "vl53l8cx_api.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inner internal number of targets.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if VL53L8CX_NB_TARGET_PER_ZONE == 1
|
||||||
|
#define VL53L8CX_FW_NBTAR_XTALK 2
|
||||||
|
#else
|
||||||
|
#define VL53L8CX_FW_NBTAR_XTALK VL53L8CX_NB_TARGET_PER_ZONE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Inner Macro for plugin. Not for user, only for development.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define VL53L8CX_DCI_CAL_CFG ((uint16_t)0x5470U)
|
||||||
|
#define VL53L8CX_DCI_XTALK_CFG ((uint16_t)0xAD94U)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function starts the VL53L8CX sensor in order to calibrate Xtalk.
|
||||||
|
* This calibration is recommended is user wants to use a coverglass.
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_calibrate_xtalk(
|
||||||
|
VL53L8CX_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 vl53l8cx_calibrate_xtalk().
|
||||||
|
* @param (VL53L8CX_Configuration) *p_dev : VL53L5 configuration structure.
|
||||||
|
* @param (uint8_t) *p_xtalk_data : Buffer with a size defined by
|
||||||
|
* macro VL53L8CX_XTALK_SIZE.
|
||||||
|
* @return (uint8_t) status : 0 if buffer reading OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_caldata_xtalk(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L5 configuration structure.
|
||||||
|
* @param (uint8_t) *p_xtalk_data : Buffer with a size defined by
|
||||||
|
* macro VL53L8CX_XTALK_SIZE.
|
||||||
|
* @return (uint8_t) status : 0 if buffer OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_caldata_xtalk(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX configuration structure.
|
||||||
|
* @param (uint32_t) *p_xtalk_margin : Xtalk margin in kcps/spads.
|
||||||
|
* @return (uint8_t) status : 0 if reading OK
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_xtalk_margin(
|
||||||
|
VL53L8CX_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 (VL53L8CX_Configuration) *p_dev : VL53L8CX 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 vl53l8cx_set_xtalk_margin(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint32_t xtalk_margin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Command used to get Xtalk calibration data
|
||||||
|
*/
|
||||||
|
|
||||||
|
static const uint8_t VL53L8CX_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 VL53L8CX_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, VL53L8CX_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, 0x00, 0x12, 0x01,
|
||||||
|
0x00, 0x01, 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 /* VL53L8CX_PLUGIN_XTALK_H_ */
|
||||||
89
src/drivers/vl53l8cx/src/platform.c
Normal file
89
src/drivers/vl53l8cx/src/platform.c
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* Copyright (C) 2025 OpenMV, LLC.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*
|
||||||
|
* VL53L8CX platform implementation.
|
||||||
|
*/
|
||||||
|
#include "omv_boardconfig.h"
|
||||||
|
#if (OMV_TOF_VL53L8CX_ENABLE == 1)
|
||||||
|
|
||||||
|
#include "py/mphal.h"
|
||||||
|
#include "omv_i2c.h"
|
||||||
|
#include "omv_gpio.h"
|
||||||
|
#include "vl53l8cx_api.h"
|
||||||
|
|
||||||
|
void vl53l8cx_reset(VL53L8CX_Platform *platform) {
|
||||||
|
#if defined(OMV_TOF_RESET_PIN)
|
||||||
|
omv_gpio_config(OMV_TOF_RESET_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
||||||
|
omv_gpio_write(OMV_TOF_RESET_PIN, 1);
|
||||||
|
mp_hal_delay_ms(10);
|
||||||
|
omv_gpio_write(OMV_TOF_RESET_PIN, 0);
|
||||||
|
mp_hal_delay_ms(10);
|
||||||
|
#elif defined(OMV_TOF_POWER_PIN)
|
||||||
|
omv_gpio_config(OMV_TOF_POWER_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
||||||
|
omv_gpio_write(OMV_TOF_POWER_PIN, 0);
|
||||||
|
mp_hal_delay_ms(10);
|
||||||
|
omv_gpio_write(OMV_TOF_POWER_PIN, 1);
|
||||||
|
mp_hal_delay_ms(10);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void vl53l8cx_shutdown(VL53L8CX_Platform *platform) {
|
||||||
|
#if defined(OMV_TOF_POWER_PIN)
|
||||||
|
omv_gpio_config(OMV_TOF_POWER_PIN, OMV_GPIO_MODE_OUTPUT, OMV_GPIO_PULL_NONE, OMV_GPIO_SPEED_LOW, -1);
|
||||||
|
omv_gpio_write(OMV_TOF_POWER_PIN, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void vl53l8cx_swap(uint8_t *buf, uint16_t size) {
|
||||||
|
for (size_t i=0; i<size; i++) {
|
||||||
|
((uint32_t *) buf)[i] = __REV(((uint32_t *) buf)[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_read(VL53L8CX_Platform *platform, uint16_t addr, uint8_t *buf, uint32_t size) {
|
||||||
|
addr = __REVSH(addr);
|
||||||
|
|
||||||
|
if (omv_i2c_write_bytes(platform->bus, platform->address, (uint8_t *) &addr, 2, OMV_I2C_XFER_NO_STOP) != 0) {
|
||||||
|
return VL53L8CX_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (omv_i2c_read_bytes(platform->bus, platform->address, buf, size, OMV_I2C_XFER_NO_FLAGS) != 0) {
|
||||||
|
return VL53L8CX_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_write(VL53L8CX_Platform *platform, uint16_t addr, uint8_t *buf, uint32_t size) {
|
||||||
|
addr = __REVSH(addr);
|
||||||
|
|
||||||
|
if (omv_i2c_write_bytes(platform->bus, platform->address, (uint8_t*) &addr, 2, OMV_I2C_XFER_SUSPEND) != 0) {
|
||||||
|
return VL53L8CX_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (omv_i2c_write_bytes(platform->bus, platform->address, buf, size, OMV_I2C_XFER_NO_FLAGS) != 0) {
|
||||||
|
return VL53L8CX_STATUS_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif // #if (OMV_TOF_VL53L8CX_ENABLE == 1)
|
||||||
1379
src/drivers/vl53l8cx/src/vl53l8cx_api.c
Normal file
1379
src/drivers/vl53l8cx/src/vl53l8cx_api.c
Normal file
File diff suppressed because it is too large
Load Diff
187
src/drivers/vl53l8cx/src/vl53l8cx_plugin_detection_thresholds.c
Normal file
187
src/drivers/vl53l8cx/src/vl53l8cx_plugin_detection_thresholds.c
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vl53l8cx_plugin_detection_thresholds.h"
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_detection_thresholds_enable(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_enabled)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_DET_THRESH_GLOBAL_CONFIG, 8);
|
||||||
|
*p_enabled = p_dev->temp_buffer[0x1];
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_detection_thresholds_enable(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t enabled)
|
||||||
|
{
|
||||||
|
uint8_t tmp, status = VL53L8CX_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 |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_DET_THRESH_GLOBAL_CONFIG, 8,
|
||||||
|
(uint8_t*)&grp_global_config, 4, 0x00);
|
||||||
|
|
||||||
|
/* Update interrupt config */
|
||||||
|
status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_DET_THRESH_CONFIG, 20,
|
||||||
|
(uint8_t*)&tmp, 1, 0x11);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_detection_thresholds(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_DetectionThresholds *p_thresholds)
|
||||||
|
{
|
||||||
|
uint8_t i, status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
/* Get thresholds configuration */
|
||||||
|
status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_thresholds,
|
||||||
|
VL53L8CX_DCI_DET_THRESH_START,
|
||||||
|
(uint16_t)VL53L8CX_NB_THRESHOLDS
|
||||||
|
*(uint16_t)sizeof(VL53L8CX_DetectionThresholds));
|
||||||
|
|
||||||
|
for(i = 0; i < (uint8_t)VL53L8CX_NB_THRESHOLDS; i++)
|
||||||
|
{
|
||||||
|
switch(p_thresholds[i].measurement)
|
||||||
|
{
|
||||||
|
case VL53L8CX_DISTANCE_MM:
|
||||||
|
p_thresholds[i].param_low_thresh /= 4;
|
||||||
|
p_thresholds[i].param_high_thresh /= 4;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_SIGNAL_PER_SPAD_KCPS:
|
||||||
|
p_thresholds[i].param_low_thresh /= 2048;
|
||||||
|
p_thresholds[i].param_high_thresh /= 2048;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_RANGE_SIGMA_MM:
|
||||||
|
p_thresholds[i].param_low_thresh /= 128;
|
||||||
|
p_thresholds[i].param_high_thresh /= 128;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_AMBIENT_PER_SPAD_KCPS:
|
||||||
|
p_thresholds[i].param_low_thresh /= 2048;
|
||||||
|
p_thresholds[i].param_high_thresh /= 2048;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_NB_SPADS_ENABLED:
|
||||||
|
p_thresholds[i].param_low_thresh /= 256;
|
||||||
|
p_thresholds[i].param_high_thresh /= 256;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_MOTION_INDICATOR:
|
||||||
|
p_thresholds[i].param_low_thresh /= 65535;
|
||||||
|
p_thresholds[i].param_high_thresh /= 65535;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_detection_thresholds(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_DetectionThresholds *p_thresholds)
|
||||||
|
{
|
||||||
|
uint8_t i, status = VL53L8CX_STATUS_OK;
|
||||||
|
uint8_t grp_valid_target_cfg[] = {0x05, 0x05, 0x05, 0x05,
|
||||||
|
0x05, 0x05, 0x05, 0x05};
|
||||||
|
|
||||||
|
for(i = 0; i < (uint8_t) VL53L8CX_NB_THRESHOLDS; i++)
|
||||||
|
{
|
||||||
|
switch(p_thresholds->measurement)
|
||||||
|
{
|
||||||
|
case VL53L8CX_DISTANCE_MM:
|
||||||
|
p_thresholds[i].param_low_thresh *= 4;
|
||||||
|
p_thresholds[i].param_high_thresh *= 4;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_SIGNAL_PER_SPAD_KCPS:
|
||||||
|
p_thresholds[i].param_low_thresh *= 2048;
|
||||||
|
p_thresholds[i].param_high_thresh *= 2048;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_RANGE_SIGMA_MM:
|
||||||
|
p_thresholds[i].param_low_thresh *= 128;
|
||||||
|
p_thresholds[i].param_high_thresh *= 128;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_AMBIENT_PER_SPAD_KCPS:
|
||||||
|
p_thresholds[i].param_low_thresh *= 2048;
|
||||||
|
p_thresholds[i].param_high_thresh *= 2048;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_NB_SPADS_ENABLED:
|
||||||
|
p_thresholds[i].param_low_thresh *= 256;
|
||||||
|
p_thresholds[i].param_high_thresh *= 256;
|
||||||
|
break;
|
||||||
|
case VL53L8CX_MOTION_INDICATOR:
|
||||||
|
p_thresholds[i].param_low_thresh *= 65535;
|
||||||
|
p_thresholds[i].param_high_thresh *= 65535;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set valid target list */
|
||||||
|
status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)grp_valid_target_cfg,
|
||||||
|
VL53L8CX_DCI_DET_THRESH_VALID_STATUS,
|
||||||
|
(uint16_t)sizeof(grp_valid_target_cfg));
|
||||||
|
|
||||||
|
/* Set thresholds configuration */
|
||||||
|
status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)p_thresholds,
|
||||||
|
VL53L8CX_DCI_DET_THRESH_START,
|
||||||
|
(uint16_t)(VL53L8CX_NB_THRESHOLDS
|
||||||
|
*sizeof(VL53L8CX_DetectionThresholds)));
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_detection_thresholds_auto_stop(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_auto_stop)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_PIPE_CONTROL, 4);
|
||||||
|
*p_auto_stop = p_dev->temp_buffer[0x3];
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_detection_thresholds_auto_stop(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t auto_stop)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_PIPE_CONTROL, 4,
|
||||||
|
(uint8_t*)&auto_stop, 1, 0x03);
|
||||||
|
p_dev->is_auto_stop_enabled = (uint8_t)auto_stop;
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
122
src/drivers/vl53l8cx/src/vl53l8cx_plugin_motion_indicator.c
Normal file
122
src/drivers/vl53l8cx/src/vl53l8cx_plugin_motion_indicator.c
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include "vl53l8cx_plugin_motion_indicator.h"
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_motion_indicator_init(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_Motion_Configuration *p_motion_config,
|
||||||
|
uint8_t resolution)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
(void)memset(p_motion_config, 0, sizeof(VL53L8CX_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 |= vl53l8cx_motion_indicator_set_resolution(p_dev,
|
||||||
|
p_motion_config, resolution);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_motion_indicator_set_distance_motion(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_Motion_Configuration *p_motion_config,
|
||||||
|
uint16_t distance_min_mm,
|
||||||
|
uint16_t distance_max_mm)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_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 |= VL53L8CX_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 |= vl53l8cx_dci_write_data(p_dev,
|
||||||
|
(uint8_t*)(p_motion_config),
|
||||||
|
VL53L8CX_DCI_MOTION_DETECTOR_CFG,
|
||||||
|
(uint16_t)sizeof(*p_motion_config));
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_motion_indicator_set_resolution(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
VL53L8CX_Motion_Configuration *p_motion_config,
|
||||||
|
uint8_t resolution)
|
||||||
|
{
|
||||||
|
uint8_t i, status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
switch(resolution)
|
||||||
|
{
|
||||||
|
case VL53L8CX_RESOLUTION_4X4:
|
||||||
|
for(i = 0; i < (uint8_t)VL53L8CX_RESOLUTION_4X4; i++)
|
||||||
|
{
|
||||||
|
p_motion_config->map_id[i] = (int8_t)i;
|
||||||
|
}
|
||||||
|
(void)memset(p_motion_config->map_id + 16, -1, 48);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VL53L8CX_RESOLUTION_8X8:
|
||||||
|
for(i = 0; i < (uint8_t)VL53L8CX_RESOLUTION_8X8; i++)
|
||||||
|
{
|
||||||
|
p_motion_config->map_id[i] = (int8_t)((((int8_t)
|
||||||
|
i % 8)/2) + (4*((int8_t)i/16)));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
status |= VL53L8CX_STATUS_ERROR;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(status == VL53L8CX_STATUS_OK)
|
||||||
|
{
|
||||||
|
status |= vl53l8cx_dci_write_data(p_dev,
|
||||||
|
(uint8_t*)(p_motion_config),
|
||||||
|
VL53L8CX_DCI_MOTION_DETECTOR_CFG,
|
||||||
|
(uint16_t)sizeof(*p_motion_config));
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
366
src/drivers/vl53l8cx/src/vl53l8cx_plugin_xtalk.c
Normal file
366
src/drivers/vl53l8cx/src/vl53l8cx_plugin_xtalk.c
Normal file
@ -0,0 +1,366 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 STMicroelectronics.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is licensed under terms that can be found in the LICENSE file
|
||||||
|
* in the root directory of this software component.
|
||||||
|
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||||
|
*
|
||||||
|
******************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "vl53l8cx_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 _vl53l8cx_poll_for_answer(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint16_t address,
|
||||||
|
uint8_t expected_value)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
uint8_t timeout = 0;
|
||||||
|
|
||||||
|
do {
|
||||||
|
status |= VL53L8CX_RdMulti(&(p_dev->platform),
|
||||||
|
address, p_dev->temp_buffer, 4);
|
||||||
|
status |= VL53L8CX_WaitMs(&(p_dev->platform), 10);
|
||||||
|
|
||||||
|
/* 2s timeout or FW error*/
|
||||||
|
if((timeout >= (uint8_t)200)
|
||||||
|
|| (p_dev->temp_buffer[2] >= (uint8_t) 0x7f))
|
||||||
|
{
|
||||||
|
status |= VL53L8CX_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 _vl53l8cx_program_output_config(
|
||||||
|
VL53L8CX_Configuration *p_dev)
|
||||||
|
{
|
||||||
|
uint8_t resolution, status = VL53L8CX_STATUS_OK;
|
||||||
|
uint32_t i;
|
||||||
|
uint32_t header_config[2] = {0, 0};
|
||||||
|
union Block_header *bh_ptr;
|
||||||
|
|
||||||
|
status |= vl53l8cx_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)VL53L8CX_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)24;
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_write_data(p_dev,
|
||||||
|
(uint8_t*)&(output),
|
||||||
|
VL53L8CX_DCI_OUTPUT_LIST, (uint16_t)sizeof(output));
|
||||||
|
|
||||||
|
header_config[0] = p_dev->data_read_size;
|
||||||
|
header_config[1] = i + (uint32_t)1;
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)&(header_config),
|
||||||
|
VL53L8CX_DCI_OUTPUT_CONFIG,
|
||||||
|
(uint16_t)sizeof(header_config));
|
||||||
|
status |= vl53l8cx_dci_write_data(p_dev, (uint8_t*)&(output_bh_enable),
|
||||||
|
VL53L8CX_DCI_OUTPUT_ENABLES,
|
||||||
|
(uint16_t)sizeof(output_bh_enable));
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_calibrate_xtalk(
|
||||||
|
VL53L8CX_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 = VL53L8CX_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;
|
||||||
|
uint8_t *default_xtalk_ptr;
|
||||||
|
|
||||||
|
/* Get initial configuration */
|
||||||
|
status |= vl53l8cx_get_resolution(p_dev, &resolution);
|
||||||
|
status |= vl53l8cx_get_ranging_frequency_hz(p_dev, &frequency);
|
||||||
|
status |= vl53l8cx_get_integration_time_ms(p_dev, &integration_time_ms);
|
||||||
|
status |= vl53l8cx_get_sharpener_percent(p_dev, &sharp_prct);
|
||||||
|
status |= vl53l8cx_get_target_order(p_dev, &target_order);
|
||||||
|
status |= vl53l8cx_get_xtalk_margin(p_dev, &xtalk_margin);
|
||||||
|
status |= vl53l8cx_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 |= VL53L8CX_STATUS_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
status |= vl53l8cx_set_resolution(p_dev,
|
||||||
|
VL53L8CX_RESOLUTION_8X8);
|
||||||
|
|
||||||
|
/* Send Xtalk calibration buffer */
|
||||||
|
(void)memcpy(p_dev->temp_buffer, VL53L8CX_CALIBRATE_XTALK,
|
||||||
|
sizeof(VL53L8CX_CALIBRATE_XTALK));
|
||||||
|
status |= VL53L8CX_WrMulti(&(p_dev->platform), 0x2c28,
|
||||||
|
p_dev->temp_buffer,
|
||||||
|
(uint16_t)sizeof(VL53L8CX_CALIBRATE_XTALK));
|
||||||
|
status |= _vl53l8cx_poll_for_answer(p_dev,
|
||||||
|
VL53L8CX_UI_CMD_STATUS, 0x3);
|
||||||
|
|
||||||
|
/* Format input argument */
|
||||||
|
reflectance = reflectance * (uint16_t)16;
|
||||||
|
distance = distance * (uint16_t)4;
|
||||||
|
|
||||||
|
/* Update required fields */
|
||||||
|
status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_CAL_CFG, 8,
|
||||||
|
(uint8_t*)&distance, 2, 0x00);
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_CAL_CFG, 8,
|
||||||
|
(uint8_t*)&reflectance, 2,0x02);
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_CAL_CFG, 8,
|
||||||
|
(uint8_t*)&samples, 1, 0x04);
|
||||||
|
|
||||||
|
/* Program output for Xtalk calibration */
|
||||||
|
status |= _vl53l8cx_program_output_config(p_dev);
|
||||||
|
|
||||||
|
/* Start ranging session */
|
||||||
|
status |= VL53L8CX_WrMulti(&(p_dev->platform),
|
||||||
|
VL53L8CX_UI_CMD_END - (uint16_t)(4 - 1),
|
||||||
|
(uint8_t*)cmd, sizeof(cmd));
|
||||||
|
status |= _vl53l8cx_poll_for_answer(p_dev,
|
||||||
|
VL53L8CX_UI_CMD_STATUS, 0x3);
|
||||||
|
|
||||||
|
/* Wait for end of calibration */
|
||||||
|
do {
|
||||||
|
status |= VL53L8CX_RdMulti(&(p_dev->platform),
|
||||||
|
0x0, p_dev->temp_buffer, 4);
|
||||||
|
if(p_dev->temp_buffer[0] != VL53L8CX_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))
|
||||||
|
{
|
||||||
|
default_xtalk_ptr = p_dev->default_xtalk;
|
||||||
|
(void)memcpy(p_dev->xtalk_data,
|
||||||
|
default_xtalk_ptr,
|
||||||
|
sizeof(p_dev->xtalk_data));
|
||||||
|
status |= VL53L8CX_STATUS_XTALK_FAILED;
|
||||||
|
}
|
||||||
|
continue_loop = (uint8_t)0;
|
||||||
|
}
|
||||||
|
else if(timeout >= (uint16_t)400)
|
||||||
|
{
|
||||||
|
status |= VL53L8CX_STATUS_ERROR;
|
||||||
|
continue_loop = (uint8_t)0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
timeout++;
|
||||||
|
status |= VL53L8CX_WaitMs(&(p_dev->platform), 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
}while (continue_loop == (uint8_t)1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Save Xtalk data into the Xtalk buffer */
|
||||||
|
(void)memcpy(p_dev->temp_buffer, VL53L8CX_GET_XTALK_CMD,
|
||||||
|
sizeof(VL53L8CX_GET_XTALK_CMD));
|
||||||
|
status |= VL53L8CX_WrMulti(&(p_dev->platform), 0x2fb8,
|
||||||
|
p_dev->temp_buffer,
|
||||||
|
(uint16_t)sizeof(VL53L8CX_GET_XTALK_CMD));
|
||||||
|
status |= _vl53l8cx_poll_for_answer(p_dev,VL53L8CX_UI_CMD_STATUS, 0x03);
|
||||||
|
status |= VL53L8CX_RdMulti(&(p_dev->platform), VL53L8CX_UI_CMD_START,
|
||||||
|
p_dev->temp_buffer,
|
||||||
|
VL53L8CX_XTALK_BUFFER_SIZE + (uint16_t)4);
|
||||||
|
|
||||||
|
(void)memcpy(&(p_dev->xtalk_data[0]), &(p_dev->temp_buffer[8]),
|
||||||
|
VL53L8CX_XTALK_BUFFER_SIZE - (uint16_t)8);
|
||||||
|
(void)memcpy(&(p_dev->xtalk_data[VL53L8CX_XTALK_BUFFER_SIZE
|
||||||
|
- (uint16_t)8]), footer, sizeof(footer));
|
||||||
|
|
||||||
|
/* Reset default buffer */
|
||||||
|
status |= VL53L8CX_WrMulti(&(p_dev->platform), 0x2c34,
|
||||||
|
p_dev->default_configuration,
|
||||||
|
VL53L8CX_CONFIGURATION_SIZE);
|
||||||
|
status |= _vl53l8cx_poll_for_answer(p_dev,VL53L8CX_UI_CMD_STATUS, 0x03);
|
||||||
|
|
||||||
|
/* Reset initial configuration */
|
||||||
|
status |= vl53l8cx_set_resolution(p_dev, resolution);
|
||||||
|
status |= vl53l8cx_set_ranging_frequency_hz(p_dev, frequency);
|
||||||
|
status |= vl53l8cx_set_integration_time_ms(p_dev, integration_time_ms);
|
||||||
|
status |= vl53l8cx_set_sharpener_percent(p_dev, sharp_prct);
|
||||||
|
status |= vl53l8cx_set_target_order(p_dev, target_order);
|
||||||
|
status |= vl53l8cx_set_xtalk_margin(p_dev, xtalk_margin);
|
||||||
|
status |= vl53l8cx_set_ranging_mode(p_dev, ranging_mode);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_caldata_xtalk(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_xtalk_data)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK, resolution;
|
||||||
|
uint8_t footer[] = {0x00, 0x00, 0x00, 0x0F, 0x00, 0x01, 0x03, 0x04};
|
||||||
|
|
||||||
|
status |= vl53l8cx_get_resolution(p_dev, &resolution);
|
||||||
|
status |= vl53l8cx_set_resolution(p_dev, VL53L8CX_RESOLUTION_8X8);
|
||||||
|
|
||||||
|
(void)memcpy(p_dev->temp_buffer, VL53L8CX_GET_XTALK_CMD,
|
||||||
|
sizeof(VL53L8CX_GET_XTALK_CMD));
|
||||||
|
status |= VL53L8CX_WrMulti(&(p_dev->platform), 0x2fb8,
|
||||||
|
p_dev->temp_buffer, sizeof(VL53L8CX_GET_XTALK_CMD));
|
||||||
|
status |= _vl53l8cx_poll_for_answer(p_dev,VL53L8CX_UI_CMD_STATUS, 0x03);
|
||||||
|
status |= VL53L8CX_RdMulti(&(p_dev->platform), VL53L8CX_UI_CMD_START,
|
||||||
|
p_dev->temp_buffer,
|
||||||
|
VL53L8CX_XTALK_BUFFER_SIZE + (uint16_t)4);
|
||||||
|
|
||||||
|
(void)memcpy(&(p_xtalk_data[0]), &(p_dev->temp_buffer[8]),
|
||||||
|
VL53L8CX_XTALK_BUFFER_SIZE-(uint16_t)8);
|
||||||
|
(void)memcpy(&(p_xtalk_data[VL53L8CX_XTALK_BUFFER_SIZE - (uint16_t)8]),
|
||||||
|
footer, sizeof(footer));
|
||||||
|
|
||||||
|
status |= vl53l8cx_set_resolution(p_dev, resolution);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_set_caldata_xtalk(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint8_t *p_xtalk_data)
|
||||||
|
{
|
||||||
|
uint8_t resolution, status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
status |= vl53l8cx_get_resolution(p_dev, &resolution);
|
||||||
|
(void)memcpy(p_dev->xtalk_data, p_xtalk_data, VL53L8CX_XTALK_BUFFER_SIZE);
|
||||||
|
status |= vl53l8cx_set_resolution(p_dev, resolution);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t vl53l8cx_get_xtalk_margin(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint32_t *p_xtalk_margin)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
|
||||||
|
status |= vl53l8cx_dci_read_data(p_dev, (uint8_t*)p_dev->temp_buffer,
|
||||||
|
VL53L8CX_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 vl53l8cx_set_xtalk_margin(
|
||||||
|
VL53L8CX_Configuration *p_dev,
|
||||||
|
uint32_t xtalk_margin)
|
||||||
|
{
|
||||||
|
uint8_t status = VL53L8CX_STATUS_OK;
|
||||||
|
uint32_t margin_kcps = xtalk_margin;
|
||||||
|
|
||||||
|
if(margin_kcps > (uint32_t)10000)
|
||||||
|
{
|
||||||
|
status |= VL53L8CX_STATUS_INVALID_PARAM;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
margin_kcps = margin_kcps*(uint32_t)2048;
|
||||||
|
status |= vl53l8cx_dci_replace_data(p_dev, p_dev->temp_buffer,
|
||||||
|
VL53L8CX_DCI_XTALK_CFG, 16,
|
||||||
|
(uint8_t*)&margin_kcps, 4, 0x00);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
@ -83,6 +83,7 @@ export MLX90621_DIR
|
|||||||
export MLX90640_DIR
|
export MLX90640_DIR
|
||||||
export MLX90641_DIR
|
export MLX90641_DIR
|
||||||
export VL53L5CX_DIR
|
export VL53L5CX_DIR
|
||||||
|
export VL53L8CX_DIR
|
||||||
export PIXART_DIR
|
export PIXART_DIR
|
||||||
export DISPLAY_DIR
|
export DISPLAY_DIR
|
||||||
export LIBPDM_DIR
|
export LIBPDM_DIR
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user