ST Expansion SW Team / Vl6180

Dependencies:   VL6180_Board

Dependents:   X_NUCLEO_6180

Committer:
charlesmn
Date:
Wed Oct 28 14:51:47 2020 +0000
Revision:
0:1da5e4bcb8e5
The API for controlling the VL6180 ToF sensor.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesmn 0:1da5e4bcb8e5 1 /*******************************************************************************
charlesmn 0:1da5e4bcb8e5 2 Copyright � 2014, STMicroelectronics International N.V.
charlesmn 0:1da5e4bcb8e5 3 All rights reserved.
charlesmn 0:1da5e4bcb8e5 4
charlesmn 0:1da5e4bcb8e5 5 Redistribution and use in source and binary forms, with or without
charlesmn 0:1da5e4bcb8e5 6 modification, are permitted provided that the following conditions are met:
charlesmn 0:1da5e4bcb8e5 7 * Redistributions of source code must retain the above copyright
charlesmn 0:1da5e4bcb8e5 8 notice, this list of conditions and the following disclaimer.
charlesmn 0:1da5e4bcb8e5 9 * Redistributions in binary form must reproduce the above copyright
charlesmn 0:1da5e4bcb8e5 10 notice, this list of conditions and the following disclaimer in the
charlesmn 0:1da5e4bcb8e5 11 documentation and/or other materials provided with the distribution.
charlesmn 0:1da5e4bcb8e5 12 * Neither the name of STMicroelectronics nor the
charlesmn 0:1da5e4bcb8e5 13 names of its contributors may be used to endorse or promote products
charlesmn 0:1da5e4bcb8e5 14 derived from this software without specific prior written permission.
charlesmn 0:1da5e4bcb8e5 15
charlesmn 0:1da5e4bcb8e5 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
charlesmn 0:1da5e4bcb8e5 17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
charlesmn 0:1da5e4bcb8e5 18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
charlesmn 0:1da5e4bcb8e5 19 NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
charlesmn 0:1da5e4bcb8e5 20 IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
charlesmn 0:1da5e4bcb8e5 21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
charlesmn 0:1da5e4bcb8e5 22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
charlesmn 0:1da5e4bcb8e5 23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
charlesmn 0:1da5e4bcb8e5 24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
charlesmn 0:1da5e4bcb8e5 25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
charlesmn 0:1da5e4bcb8e5 26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
charlesmn 0:1da5e4bcb8e5 27 ********************************************************************************/
charlesmn 0:1da5e4bcb8e5 28
charlesmn 0:1da5e4bcb8e5 29
charlesmn 0:1da5e4bcb8e5 30 #ifndef VL6180_PLATFORM_H
charlesmn 0:1da5e4bcb8e5 31 #define VL6180_PLATFORM_H
charlesmn 0:1da5e4bcb8e5 32
charlesmn 0:1da5e4bcb8e5 33 #ifdef _MSC_VER
charlesmn 0:1da5e4bcb8e5 34 # ifdef VL6180_API_EXPORTS
charlesmn 0:1da5e4bcb8e5 35 # define VL6180_API __declspec(dllexport)
charlesmn 0:1da5e4bcb8e5 36 # else
charlesmn 0:1da5e4bcb8e5 37 # define VL6180_API
charlesmn 0:1da5e4bcb8e5 38 # endif
charlesmn 0:1da5e4bcb8e5 39 #else
charlesmn 0:1da5e4bcb8e5 40 # define VL6180_API
charlesmn 0:1da5e4bcb8e5 41 #endif
charlesmn 0:1da5e4bcb8e5 42
charlesmn 0:1da5e4bcb8e5 43 /**
charlesmn 0:1da5e4bcb8e5 44 * pebble Linux platform
charlesmn 0:1da5e4bcb8e5 45 *
charlesmn 0:1da5e4bcb8e5 46 * Pebble is a arm (cortex R4) based CortexR4 uclinux system
charlesmn 0:1da5e4bcb8e5 47 * It can access up to 4 accessible vl6180 in multiple i2c bus
charlesmn 0:1da5e4bcb8e5 48 * device i2c is going true the cci-to i2c layer and /dev/i2cx bus ( may required root privilege)
charlesmn 0:1da5e4bcb8e5 49 * device gpio are mape to linux gpio (sys/class/gpio/--- may require special or root privilege)
charlesmn 0:1da5e4bcb8e5 50 *
charlesmn 0:1da5e4bcb8e5 51 * refer to src/VL6180_PebbleLinux.c for more details
charlesmn 0:1da5e4bcb8e5 52 */
charlesmn 0:1da5e4bcb8e5 53 #include "vl6180_def.h"
charlesmn 0:1da5e4bcb8e5 54 #include <stdlib.h>
charlesmn 0:1da5e4bcb8e5 55
charlesmn 0:1da5e4bcb8e5 56 /**
charlesmn 0:1da5e4bcb8e5 57 * @def VL6180_RANGE_STATUS_ERRSTRING
charlesmn 0:1da5e4bcb8e5 58 * @brief when define include range status Error string and related
charlesmn 0:1da5e4bcb8e5 59 *
charlesmn 0:1da5e4bcb8e5 60 * The string table lookup require some space in read only area
charlesmn 0:1da5e4bcb8e5 61 * @ingroup Configuration
charlesmn 0:1da5e4bcb8e5 62 */
charlesmn 0:1da5e4bcb8e5 63 #define VL6180_RANGE_STATUS_ERRSTRING 1
charlesmn 0:1da5e4bcb8e5 64
charlesmn 0:1da5e4bcb8e5 65 /**
charlesmn 0:1da5e4bcb8e5 66 * @def VL6180_SAFE_POLLING_ENTER
charlesmn 0:1da5e4bcb8e5 67 *
charlesmn 0:1da5e4bcb8e5 68 * @brief Ensure safe polling method when set
charlesmn 0:1da5e4bcb8e5 69 *
charlesmn 0:1da5e4bcb8e5 70 * Polling for a condition can be hazardous and result in infinite looping if any previous interrupt status
charlesmn 0:1da5e4bcb8e5 71 * condition is not cleared. \n
charlesmn 0:1da5e4bcb8e5 72 * Setting these flags enforce error clearing on start of polling method to avoid it.
charlesmn 0:1da5e4bcb8e5 73 * the drawback are : \n
charlesmn 0:1da5e4bcb8e5 74 * @li extra use-less i2c bus usage and traffic
charlesmn 0:1da5e4bcb8e5 75 * @li potentially slower measure rate.
charlesmn 0:1da5e4bcb8e5 76 * If application ensure interrupt get clear on mode or interrupt configuration change
charlesmn 0:1da5e4bcb8e5 77 * then keep option disabled. \n
charlesmn 0:1da5e4bcb8e5 78 * To be safe set these option to 1
charlesmn 0:1da5e4bcb8e5 79 * @ingroup Configuration
charlesmn 0:1da5e4bcb8e5 80 */
charlesmn 0:1da5e4bcb8e5 81 #define VL6180_SAFE_POLLING_ENTER 0
charlesmn 0:1da5e4bcb8e5 82
charlesmn 0:1da5e4bcb8e5 83
charlesmn 0:1da5e4bcb8e5 84 /**
charlesmn 0:1da5e4bcb8e5 85 * @brief Enable function start/end logging
charlesmn 0:1da5e4bcb8e5 86 *
charlesmn 0:1da5e4bcb8e5 87 * requires porting @a #LOG_FUNCTION_START @a #LOG_FUNCTION_END @a #LOG_FUNCTION_END_FMT
charlesmn 0:1da5e4bcb8e5 88 * @ingroup Configuration
charlesmn 0:1da5e4bcb8e5 89 */
charlesmn 0:1da5e4bcb8e5 90 #define VL6180_LOG_ENABLE 0
charlesmn 0:1da5e4bcb8e5 91
charlesmn 0:1da5e4bcb8e5 92
charlesmn 0:1da5e4bcb8e5 93 #define VL6180_DEV_DATA_ATTR
charlesmn 0:1da5e4bcb8e5 94 #define ROMABLE_DATA
charlesmn 0:1da5e4bcb8e5 95
charlesmn 0:1da5e4bcb8e5 96 #define VL6180_SINGLE_DEVICE_DRIVER 0
charlesmn 0:1da5e4bcb8e5 97
charlesmn 0:1da5e4bcb8e5 98 #if VL6180_SINGLE_DEVICE_DRIVER
charlesmn 0:1da5e4bcb8e5 99 #error "Not suported set redef VL6180_SINGLE_DEVICE_DRIVER 0"
charlesmn 0:1da5e4bcb8e5 100 #endif
charlesmn 0:1da5e4bcb8e5 101
charlesmn 0:1da5e4bcb8e5 102 #define VL6180_RANGE_STATUS_ERRSTRING 1
charlesmn 0:1da5e4bcb8e5 103 #define VL6180X_SAFE_POLLING_ENTER 0
charlesmn 0:1da5e4bcb8e5 104
charlesmn 0:1da5e4bcb8e5 105 #define DEFAULT_RANGE_MAX_LOOP 200
charlesmn 0:1da5e4bcb8e5 106 #define DEFAULT_ALS_MAX_LOOP 1000
charlesmn 0:1da5e4bcb8e5 107
charlesmn 0:1da5e4bcb8e5 108 /**
charlesmn 0:1da5e4bcb8e5 109 * @brief multiple VL6180 Linux Device structure
charlesmn 0:1da5e4bcb8e5 110 * @ingroup porting_multi
charlesmn 0:1da5e4bcb8e5 111 */
charlesmn 0:1da5e4bcb8e5 112 struct MyVL6180Dev_t {
charlesmn 0:1da5e4bcb8e5 113 struct VL6180DevData_t Data; /*!< embed ST VL6180 Dev data as "Data"*/
charlesmn 0:1da5e4bcb8e5 114 /* #error ADD HERE any extra device data */
charlesmn 0:1da5e4bcb8e5 115 //pthread_mutex_t i2c_lock;
charlesmn 0:1da5e4bcb8e5 116
charlesmn 0:1da5e4bcb8e5 117 int power_en_gpio; /*!< power enable gpio pin */
charlesmn 0:1da5e4bcb8e5 118 int intr_gpio; /*!< interrupt 1 gpio pin */
charlesmn 0:1da5e4bcb8e5 119 int chip_en_gpio; /*!< chip enable gpio pin */
charlesmn 0:1da5e4bcb8e5 120 int i2c_addr; /*!< device i2c address on bus */
charlesmn 0:1da5e4bcb8e5 121
charlesmn 0:1da5e4bcb8e5 122 int i2c_fd; /*!< file descriptor for device at current i2cbus @addr */
charlesmn 0:1da5e4bcb8e5 123 int i2c_bus; /*!< device i2c bus number */
charlesmn 0:1da5e4bcb8e5 124
charlesmn 0:1da5e4bcb8e5 125 char * name; /*!< humane readable device "name" ie "bayer ch 1" */
charlesmn 0:1da5e4bcb8e5 126
charlesmn 0:1da5e4bcb8e5 127 #if I2C_BUFFER_CONFIG == 2
charlesmn 0:1da5e4bcb8e5 128 uint8_t i2c_buffer[VL6180_MAX_I2C_XFER_SIZE]; /*!< Example per device i2c buffer declaration and it's accessing macro */
charlesmn 0:1da5e4bcb8e5 129 #define VL6180_GetI2cBuffer(dev, n) ((dev)->i2c_buffer)
charlesmn 0:1da5e4bcb8e5 130 #endif
charlesmn 0:1da5e4bcb8e5 131 /**
charlesmn 0:1da5e4bcb8e5 132 * @def VL6180DevDataGet
charlesmn 0:1da5e4bcb8e5 133 * @brief Get ST private structure @a VL6180DevData_t data access
charlesmn 0:1da5e4bcb8e5 134 *
charlesmn 0:1da5e4bcb8e5 135 * maybe used and as real data "ref" not just as "get" for sub-structure item
charlesmn 0:1da5e4bcb8e5 136 * like VL6180DevDataGet(FilterData.field)[i] or VL6180DevDataGet(FilterData.MeasurementIndex)++
charlesmn 0:1da5e4bcb8e5 137 * @ingroup porting_multi
charlesmn 0:1da5e4bcb8e5 138 */
charlesmn 0:1da5e4bcb8e5 139 #define VL6180DevDataGet(dev, field) (dev->Data.field)
charlesmn 0:1da5e4bcb8e5 140
charlesmn 0:1da5e4bcb8e5 141 /**
charlesmn 0:1da5e4bcb8e5 142 * @def VL6180DevDataSet(dev, field, data)
charlesmn 0:1da5e4bcb8e5 143 * @brief Set ST private structure @a VL6180DevData_t data field
charlesmn 0:1da5e4bcb8e5 144 * @param dev The device
charlesmn 0:1da5e4bcb8e5 145 * @param field St structure field name
charlesmn 0:1da5e4bcb8e5 146 * @param data Data to set
charlesmn 0:1da5e4bcb8e5 147 * @ingroup porting_multi
charlesmn 0:1da5e4bcb8e5 148 */
charlesmn 0:1da5e4bcb8e5 149 #define VL6180DevDataSet(dev, field, data) (dev->Data.field)=(data)
charlesmn 0:1da5e4bcb8e5 150 };
charlesmn 0:1da5e4bcb8e5 151
charlesmn 0:1da5e4bcb8e5 152 typedef struct MyVL6180Dev_t *VL6180Dev_t;
charlesmn 0:1da5e4bcb8e5 153
charlesmn 0:1da5e4bcb8e5 154
charlesmn 0:1da5e4bcb8e5 155
charlesmn 0:1da5e4bcb8e5 156
charlesmn 0:1da5e4bcb8e5 157 /* is implemanted a a real fucntion */
charlesmn 0:1da5e4bcb8e5 158 void VL6180_PollDelay(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 159
charlesmn 0:1da5e4bcb8e5 160 /** @def VL6180_PollDelay todo cgm do we need this
charlesmn 0:1da5e4bcb8e5 161 * @brief Default value : does nothing. Macro to be deleted it you implement a real function
charlesmn 0:1da5e4bcb8e5 162 * @ingroup api_platform
charlesmn 0:1da5e4bcb8e5 163 */
charlesmn 0:1da5e4bcb8e5 164 #define VL6180_PollDelay(dev) (void)0
charlesmn 0:1da5e4bcb8e5 165
charlesmn 0:1da5e4bcb8e5 166 double getTimeSecs();
charlesmn 0:1da5e4bcb8e5 167
charlesmn 0:1da5e4bcb8e5 168
charlesmn 0:1da5e4bcb8e5 169 /**
charlesmn 0:1da5e4bcb8e5 170 * I2C to CCI
charlesmn 0:1da5e4bcb8e5 171 */
charlesmn 0:1da5e4bcb8e5 172 VL6180_API int VL6180_I2CWrite(VL6180Dev_t dev, uint8_t *buff, uint8_t len);
charlesmn 0:1da5e4bcb8e5 173 VL6180_API int VL6180_I2CRead(VL6180Dev_t dev, uint8_t *buff, uint8_t len);
charlesmn 0:1da5e4bcb8e5 174
charlesmn 0:1da5e4bcb8e5 175 VL6180_API int VL6180_i2c_init(VL6180Dev_t dev, char *comPortStr, unsigned int baudRate);
charlesmn 0:1da5e4bcb8e5 176 VL6180_API int VL6180_i2c_fini(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 177 VL6180_API int VL6180_i2c_startLogging(VL6180Dev_t dev, char *);
charlesmn 0:1da5e4bcb8e5 178 VL6180_API int VL6180_i2c_stopLogging(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 179
charlesmn 0:1da5e4bcb8e5 180 VL6180_API int VL6180_I2cRead(VL6180Dev_t dev, unsigned int reg, unsigned char* data, unsigned int length);
charlesmn 0:1da5e4bcb8e5 181 VL6180_API int VL6180_I2cWrite(VL6180Dev_t dev, unsigned int reg, unsigned char* data, unsigned int length);
charlesmn 0:1da5e4bcb8e5 182
charlesmn 0:1da5e4bcb8e5 183 VL6180_API int VL6180_GetErrorText(char *errorText);
charlesmn 0:1da5e4bcb8e5 184
charlesmn 0:1da5e4bcb8e5 185 #define VL6180_I2C_USER_VAR
charlesmn 0:1da5e4bcb8e5 186
charlesmn 0:1da5e4bcb8e5 187 void VL6180_GetI2CAccess(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 188 void VL6180_DoneI2CAccess(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 189
charlesmn 0:1da5e4bcb8e5 190
charlesmn 0:1da5e4bcb8e5 191
charlesmn 0:1da5e4bcb8e5 192 #if VL6180X_LOG_ENABLE
charlesmn 0:1da5e4bcb8e5 193 #include <sys/time.h>
charlesmn 0:1da5e4bcb8e5 194 #include <stdio.h>
charlesmn 0:1da5e4bcb8e5 195 extern FILE * log_file;
charlesmn 0:1da5e4bcb8e5 196
charlesmn 0:1da5e4bcb8e5 197 #define trace_printf fprinf
charlesmn 0:1da5e4bcb8e5 198 #define LOG_GET_TIME() clock()
charlesmn 0:1da5e4bcb8e5 199
charlesmn 0:1da5e4bcb8e5 200 #define LOG_FUNCTION_START(fmt, ... ) \
charlesmn 0:1da5e4bcb8e5 201 fprintf(log_file, "VL61080 beg %s start @%d\t" fmt "\n", __FUNCTION__, LOG_GET_TIME(), ##__VA_ARGS__)
charlesmn 0:1da5e4bcb8e5 202
charlesmn 0:1da5e4bcb8e5 203 #define LOG_FUNCTION_END(status)\
charlesmn 0:1da5e4bcb8e5 204 fprintf(log_file, "VL61080 end %s @%d %d\n", __FUNCTION__, LOG_GET_TIME(), (int)status)
charlesmn 0:1da5e4bcb8e5 205
charlesmn 0:1da5e4bcb8e5 206 #define LOG_FUNCTION_END_FMT(status, fmt, ... )\
charlesmn 0:1da5e4bcb8e5 207 fprintf(log_file, "End %s @%d %d\t"fmt"\n" , __FUNCTION__, LOG_GET_TIME(), (int)status,##__VA_ARGS__)
charlesmn 0:1da5e4bcb8e5 208
charlesmn 0:1da5e4bcb8e5 209 #define VL6180_ErrLog( fmt, ...) fprintf(stderr, "VL6180_ErrLog %s" fmt "\n", __func__, ##__VA_ARGS__)
charlesmn 0:1da5e4bcb8e5 210
charlesmn 0:1da5e4bcb8e5 211 #else /* VL6180X_LOG_ENABLE no logging */
charlesmn 0:1da5e4bcb8e5 212 #define LOG_FUNCTION_START(...) (void)0
charlesmn 0:1da5e4bcb8e5 213 #define LOG_FUNCTION_END(...) (void)0
charlesmn 0:1da5e4bcb8e5 214 #define LOG_FUNCTION_END_FMT(...) (void)0
charlesmn 0:1da5e4bcb8e5 215 #define VL6180_ErrLog(... ) (void)0
charlesmn 0:1da5e4bcb8e5 216 #endif /* else */
charlesmn 0:1da5e4bcb8e5 217
charlesmn 0:1da5e4bcb8e5 218 #endif /* VL6180_PLATFORM_H */
charlesmn 0:1da5e4bcb8e5 219
charlesmn 0:1da5e4bcb8e5 220
charlesmn 0:1da5e4bcb8e5 221
charlesmn 0:1da5e4bcb8e5 222