Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: VL6180_Board
VL6180INC/vl6180_platform.h@0:1da5e4bcb8e5, 2020-10-28 (annotated)
- 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?
User | Revision | Line number | New 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 |