vlx lib

Committer:
vijaynvr
Date:
Sun Feb 08 14:26:51 2015 +0000
Revision:
0:bc9f26b5dadf
working

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vijaynvr 0:bc9f26b5dadf 1 /*******************************************************************************
vijaynvr 0:bc9f26b5dadf 2 ################################################################################
vijaynvr 0:bc9f26b5dadf 3 # (C) STMicroelectronics 2014
vijaynvr 0:bc9f26b5dadf 4 #
vijaynvr 0:bc9f26b5dadf 5 # This program is free software; you can redistribute it and/or modify it under
vijaynvr 0:bc9f26b5dadf 6 # the terms of the GNU General Public License version 2 and only version 2 as
vijaynvr 0:bc9f26b5dadf 7 # published by the Free Software Foundation.
vijaynvr 0:bc9f26b5dadf 8 #
vijaynvr 0:bc9f26b5dadf 9 # This program is distributed in the hope that it will be useful, but WITHOUT
vijaynvr 0:bc9f26b5dadf 10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
vijaynvr 0:bc9f26b5dadf 11 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
vijaynvr 0:bc9f26b5dadf 12 # details.
vijaynvr 0:bc9f26b5dadf 13 #
vijaynvr 0:bc9f26b5dadf 14 # You should have received a copy of the GNU General Public License along with
vijaynvr 0:bc9f26b5dadf 15 # this program; if not, write to the Free Software Foundation, Inc.,
vijaynvr 0:bc9f26b5dadf 16 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
vijaynvr 0:bc9f26b5dadf 17 #
vijaynvr 0:bc9f26b5dadf 18 #------------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 19 # Imaging Division
vijaynvr 0:bc9f26b5dadf 20 ################################################################################
vijaynvr 0:bc9f26b5dadf 21 ********************************************************************************/
vijaynvr 0:bc9f26b5dadf 22
vijaynvr 0:bc9f26b5dadf 23 /*
vijaynvr 0:bc9f26b5dadf 24 '''
vijaynvr 0:bc9f26b5dadf 25 Application-level functions used for configuration and operation during extended
vijaynvr 0:bc9f26b5dadf 26 ranging.
vijaynvr 0:bc9f26b5dadf 27 '''
vijaynvr 0:bc9f26b5dadf 28 */
vijaynvr 0:bc9f26b5dadf 29
vijaynvr 0:bc9f26b5dadf 30 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 31 // module imports
vijaynvr 0:bc9f26b5dadf 32 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 33
vijaynvr 0:bc9f26b5dadf 34 // ST libraries
vijaynvr 0:bc9f26b5dadf 35
vijaynvr 0:bc9f26b5dadf 36 #include "range_upscaling_driver.h"
vijaynvr 0:bc9f26b5dadf 37
vijaynvr 0:bc9f26b5dadf 38 #include "common_driver.h"
vijaynvr 0:bc9f26b5dadf 39 #include "ranging_driver.h"
vijaynvr 0:bc9f26b5dadf 40 #include "debug.h"
vijaynvr 0:bc9f26b5dadf 41 #include "platform.h"
vijaynvr 0:bc9f26b5dadf 42
vijaynvr 0:bc9f26b5dadf 43
vijaynvr 0:bc9f26b5dadf 44 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 45 // constant definitions
vijaynvr 0:bc9f26b5dadf 46 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 47 #define IDENTIFICATION_MODEL_ID 0x00
vijaynvr 0:bc9f26b5dadf 48 #define IDENTIFICATION_MODULE_REV_MAJOR 0x03
vijaynvr 0:bc9f26b5dadf 49 #define IDENTIFICATION_MODULE_REV_MINOR 0x04
vijaynvr 0:bc9f26b5dadf 50
vijaynvr 0:bc9f26b5dadf 51 #define RESULT_RANGE_VAL 0x62
vijaynvr 0:bc9f26b5dadf 52
vijaynvr 0:bc9f26b5dadf 53 #define RANGE_SCALER 0x96
vijaynvr 0:bc9f26b5dadf 54
vijaynvr 0:bc9f26b5dadf 55 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 56 // global variable declarations
vijaynvr 0:bc9f26b5dadf 57 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 58 static ExtRangeScaler _rangeScaler = Scale2X;
vijaynvr 0:bc9f26b5dadf 59
vijaynvr 0:bc9f26b5dadf 60 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 61 // method definitions
vijaynvr 0:bc9f26b5dadf 62 //-----------------------------------------------------------------------------
vijaynvr 0:bc9f26b5dadf 63
vijaynvr 0:bc9f26b5dadf 64 static void er_set_register_tuning(uint8_t device_base_address);
vijaynvr 0:bc9f26b5dadf 65
vijaynvr 0:bc9f26b5dadf 66
vijaynvr 0:bc9f26b5dadf 67 static void er_set_register_tuning(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 68 {
vijaynvr 0:bc9f26b5dadf 69 // apply REGISTER_TUNING_ER02_100614_CustomerView.tx
vijaynvr 0:bc9f26b5dadf 70
vijaynvr 0:bc9f26b5dadf 71 // Mandatory : private registers
vijaynvr 0:bc9f26b5dadf 72 i2c_write_byte(0x0207, 0x01, device_base_address);
vijaynvr 0:bc9f26b5dadf 73 i2c_write_byte(0x0208, 0x01, device_base_address);
vijaynvr 0:bc9f26b5dadf 74 i2c_write_byte(0x0096, 0x00, device_base_address);
vijaynvr 0:bc9f26b5dadf 75 i2c_write_byte(0x0097, 0x54, device_base_address);
vijaynvr 0:bc9f26b5dadf 76 i2c_write_byte(0x00e3, 0x00, device_base_address);
vijaynvr 0:bc9f26b5dadf 77 i2c_write_byte(0x00e4, 0x04, device_base_address);
vijaynvr 0:bc9f26b5dadf 78 i2c_write_byte(0x00e5, 0x02, device_base_address);
vijaynvr 0:bc9f26b5dadf 79 i2c_write_byte(0x00e6, 0x01, device_base_address);
vijaynvr 0:bc9f26b5dadf 80 i2c_write_byte(0x00e7, 0x03, device_base_address);
vijaynvr 0:bc9f26b5dadf 81 i2c_write_byte(0x00f5, 0x02, device_base_address);
vijaynvr 0:bc9f26b5dadf 82 i2c_write_byte(0x00d9, 0x05, device_base_address);
vijaynvr 0:bc9f26b5dadf 83 i2c_write_byte(0x00db, 0xce, device_base_address);
vijaynvr 0:bc9f26b5dadf 84 i2c_write_byte(0x00dc, 0x03, device_base_address);
vijaynvr 0:bc9f26b5dadf 85 i2c_write_byte(0x00dd, 0xf8, device_base_address);
vijaynvr 0:bc9f26b5dadf 86 i2c_write_byte(0x009f, 0x00, device_base_address);
vijaynvr 0:bc9f26b5dadf 87 i2c_write_byte(0x00a3, 0x28, device_base_address);
vijaynvr 0:bc9f26b5dadf 88 i2c_write_byte(0x00b7, 0x00, device_base_address);
vijaynvr 0:bc9f26b5dadf 89 i2c_write_byte(0x00bb, 0x28, device_base_address);
vijaynvr 0:bc9f26b5dadf 90 i2c_write_byte(0x00b2, 0x09, device_base_address);
vijaynvr 0:bc9f26b5dadf 91 i2c_write_byte(0x00ca, 0x09, device_base_address);
vijaynvr 0:bc9f26b5dadf 92 i2c_write_byte(0x0198, 0x01, device_base_address);
vijaynvr 0:bc9f26b5dadf 93 i2c_write_byte(0x01b0, 0x17, device_base_address);
vijaynvr 0:bc9f26b5dadf 94 i2c_write_byte(0x01ad, 0x00, device_base_address);
vijaynvr 0:bc9f26b5dadf 95 i2c_write_byte(0x00ff, 0x05, device_base_address);
vijaynvr 0:bc9f26b5dadf 96 i2c_write_byte(0x0100, 0x05, device_base_address);
vijaynvr 0:bc9f26b5dadf 97 i2c_write_byte(0x0199, 0x05, device_base_address);
vijaynvr 0:bc9f26b5dadf 98 i2c_write_byte(0x01a6, 0x1b, device_base_address);
vijaynvr 0:bc9f26b5dadf 99 i2c_write_byte(0x01ac, 0x3e, device_base_address);
vijaynvr 0:bc9f26b5dadf 100 i2c_write_byte(0x01a7, 0x1f, device_base_address);
vijaynvr 0:bc9f26b5dadf 101 i2c_write_byte(0x0030, 0x00, device_base_address);
vijaynvr 0:bc9f26b5dadf 102
vijaynvr 0:bc9f26b5dadf 103 // Recommended : Public registers - See data sheet for more detail
vijaynvr 0:bc9f26b5dadf 104 i2c_write_byte(0x0011, 0x10, device_base_address); // Enables polling for �New Sample ready� when measurement completes
vijaynvr 0:bc9f26b5dadf 105 i2c_write_byte(0x010a, 0x30, device_base_address); // Set the averaging sample period (compromise between lower noise and increased execution time)
vijaynvr 0:bc9f26b5dadf 106 i2c_write_byte(0x003f, 0x46, device_base_address); // Sets the light and dark gain (upper nibble). Dark gain should not be changed.
vijaynvr 0:bc9f26b5dadf 107 i2c_write_byte(0x0031, 0xFF, device_base_address); // sets the # of range measurements after which auto calibration of system is performed
vijaynvr 0:bc9f26b5dadf 108 i2c_write_byte(0x0040, 0x63, device_base_address); // Set ALS integration time to 100ms
vijaynvr 0:bc9f26b5dadf 109 i2c_write_byte(0x002e, 0x01, device_base_address); // perform a single temperature calibration of the ranging sensor
vijaynvr 0:bc9f26b5dadf 110 i2c_write_byte(0x002c, 0xff, device_base_address); // set SNR limit to 0.06
vijaynvr 0:bc9f26b5dadf 111
vijaynvr 0:bc9f26b5dadf 112 // Optional: Public registers - See data sheet for more detail
vijaynvr 0:bc9f26b5dadf 113 i2c_write_byte(0x001b, 0x09, device_base_address); // Set default ranging inter-measurement period to 100ms
vijaynvr 0:bc9f26b5dadf 114 i2c_write_byte(0x003e, 0x31, device_base_address); // Set default ALS inter-measurement period to 500ms
vijaynvr 0:bc9f26b5dadf 115 i2c_write_byte(0x0014, 0x24, device_base_address); // Configures interrupt on �New sample ready�
vijaynvr 0:bc9f26b5dadf 116 }
vijaynvr 0:bc9f26b5dadf 117
vijaynvr 0:bc9f26b5dadf 118 sensor_error er_set_static_config(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 119 {
vijaynvr 0:bc9f26b5dadf 120 unsigned char module_id, rev_maj, rev_min;
vijaynvr 0:bc9f26b5dadf 121 bool_t module;
vijaynvr 0:bc9f26b5dadf 122 int32_t programmedOffset;
vijaynvr 0:bc9f26b5dadf 123
vijaynvr 0:bc9f26b5dadf 124 LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 125
vijaynvr 0:bc9f26b5dadf 126 module_id = i2c_read_byte(IDENTIFICATION_MODEL_ID, device_base_address);
vijaynvr 0:bc9f26b5dadf 127 // for use with NVM-programmed parts
vijaynvr 0:bc9f26b5dadf 128 rev_maj = i2c_read_byte(IDENTIFICATION_MODULE_REV_MAJOR, device_base_address);
vijaynvr 0:bc9f26b5dadf 129 rev_min = i2c_read_byte(IDENTIFICATION_MODULE_REV_MINOR, device_base_address);
vijaynvr 0:bc9f26b5dadf 130
vijaynvr 0:bc9f26b5dadf 131 module = FALSE;
vijaynvr 0:bc9f26b5dadf 132 if ((module_id == 0xb4) && (rev_maj == 0x01) && (rev_min == 0x02))
vijaynvr 0:bc9f26b5dadf 133 module = TRUE;
vijaynvr 0:bc9f26b5dadf 134
vijaynvr 0:bc9f26b5dadf 135 if (module)
vijaynvr 0:bc9f26b5dadf 136 er_set_register_tuning(device_base_address);
vijaynvr 0:bc9f26b5dadf 137
vijaynvr 0:bc9f26b5dadf 138 // VHV automatically run on parts that are NVM-programmed, ie customer parts!
vijaynvr 0:bc9f26b5dadf 139
vijaynvr 0:bc9f26b5dadf 140 if (common_get_system_fresh_out_of_reset(device_base_address))
vijaynvr 0:bc9f26b5dadf 141 {
vijaynvr 0:bc9f26b5dadf 142 // must write the scaler at least once to the device to ensure the scaler is in a known state.
vijaynvr 0:bc9f26b5dadf 143 er_set_scaler(_rangeScaler, device_base_address);
vijaynvr 0:bc9f26b5dadf 144
vijaynvr 0:bc9f26b5dadf 145 // for upscaled ranging, recalibrate the part-2-part offset
vijaynvr 0:bc9f26b5dadf 146 programmedOffset = er_range_get_part2Part_range_offset(device_base_address);
vijaynvr 0:bc9f26b5dadf 147 er_set_part2Part_range_offset(device_base_address, (uint8_t)(programmedOffset/_rangeScaler));
vijaynvr 0:bc9f26b5dadf 148
vijaynvr 0:bc9f26b5dadf 149 // *** only if using glass ****
vijaynvr 0:bc9f26b5dadf 150 // xtalk_height = ranging.Range_Get_Crosstalk_Valid_Height(device)
vijaynvr 0:bc9f26b5dadf 151 // ranging.Range_Set_Crosstalk_Valid_Height(device, int(xtalk_height/_rangeScaler))
vijaynvr 0:bc9f26b5dadf 152
vijaynvr 0:bc9f26b5dadf 153 common_clear_system_fresh_out_of_reset(device_base_address);
vijaynvr 0:bc9f26b5dadf 154 }
vijaynvr 0:bc9f26b5dadf 155 LOG_FUNCTION_END(NULL);
vijaynvr 0:bc9f26b5dadf 156
vijaynvr 0:bc9f26b5dadf 157 return SENSOR_ERROR_NONE;
vijaynvr 0:bc9f26b5dadf 158 }
vijaynvr 0:bc9f26b5dadf 159
vijaynvr 0:bc9f26b5dadf 160 sensor_error er_set_part2Part_range_offset(uint8_t device_base_address, uint8_t part_to_part_range_offset)
vijaynvr 0:bc9f26b5dadf 161 {
vijaynvr 0:bc9f26b5dadf 162 LOG_FUNCTION_START((void*)&device_base_address,(void*)&part_to_part_range_offset);
vijaynvr 0:bc9f26b5dadf 163
vijaynvr 0:bc9f26b5dadf 164 i2c_write_byte(SYSRANGE_PART_TO_PART_RANGE_OFFSET, part_to_part_range_offset, device_base_address);
vijaynvr 0:bc9f26b5dadf 165
vijaynvr 0:bc9f26b5dadf 166 LOG_FUNCTION_END(NULL);
vijaynvr 0:bc9f26b5dadf 167
vijaynvr 0:bc9f26b5dadf 168 return SENSOR_ERROR_NONE;
vijaynvr 0:bc9f26b5dadf 169 }
vijaynvr 0:bc9f26b5dadf 170
vijaynvr 0:bc9f26b5dadf 171 uint8_t er_range_get_part2Part_range_offset(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 172 {
vijaynvr 0:bc9f26b5dadf 173 uint8_t ret=0;
vijaynvr 0:bc9f26b5dadf 174
vijaynvr 0:bc9f26b5dadf 175 LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 176 ret = i2c_read_byte(SYSRANGE_PART_TO_PART_RANGE_OFFSET, device_base_address);
vijaynvr 0:bc9f26b5dadf 177 LOG_FUNCTION_END(ret);
vijaynvr 0:bc9f26b5dadf 178
vijaynvr 0:bc9f26b5dadf 179 return ret;
vijaynvr 0:bc9f26b5dadf 180 }
vijaynvr 0:bc9f26b5dadf 181
vijaynvr 0:bc9f26b5dadf 182 uint32_t er_get_result(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 183 {
vijaynvr 0:bc9f26b5dadf 184 uint32_t range = 0;
vijaynvr 0:bc9f26b5dadf 185
vijaynvr 0:bc9f26b5dadf 186 LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 187
vijaynvr 0:bc9f26b5dadf 188 range = (uint32_t)(i2c_read_byte(RESULT_RANGE_VAL, device_base_address) * _rangeScaler);
vijaynvr 0:bc9f26b5dadf 189
vijaynvr 0:bc9f26b5dadf 190 LOG_FUNCTION_END(range);
vijaynvr 0:bc9f26b5dadf 191
vijaynvr 0:bc9f26b5dadf 192 return range;
vijaynvr 0:bc9f26b5dadf 193 }
vijaynvr 0:bc9f26b5dadf 194
vijaynvr 0:bc9f26b5dadf 195
vijaynvr 0:bc9f26b5dadf 196 sensor_error er_set_scaler(uint8_t scaler, uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 197 {
vijaynvr 0:bc9f26b5dadf 198 //const uint16_t cMask = 0x01ff;
vijaynvr 0:bc9f26b5dadf 199 const uint16_t cScalerVal1X = 253;
vijaynvr 0:bc9f26b5dadf 200 const uint16_t cScalerVal2X = 127;
vijaynvr 0:bc9f26b5dadf 201 const uint16_t cScalerVal3X = 84;
vijaynvr 0:bc9f26b5dadf 202 uint32_t ret=0;
vijaynvr 0:bc9f26b5dadf 203 uint16_t scalerVal = cScalerVal2X;
vijaynvr 0:bc9f26b5dadf 204
vijaynvr 0:bc9f26b5dadf 205 LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 206
vijaynvr 0:bc9f26b5dadf 207 if(scaler == Scale1X)
vijaynvr 0:bc9f26b5dadf 208 {
vijaynvr 0:bc9f26b5dadf 209 _rangeScaler = Scale1X;
vijaynvr 0:bc9f26b5dadf 210 scalerVal = cScalerVal1X;
vijaynvr 0:bc9f26b5dadf 211 }
vijaynvr 0:bc9f26b5dadf 212 else if(scaler == Scale2X)
vijaynvr 0:bc9f26b5dadf 213 {
vijaynvr 0:bc9f26b5dadf 214 _rangeScaler = Scale2X;
vijaynvr 0:bc9f26b5dadf 215 scalerVal = cScalerVal2X;
vijaynvr 0:bc9f26b5dadf 216 }
vijaynvr 0:bc9f26b5dadf 217 else
vijaynvr 0:bc9f26b5dadf 218 {
vijaynvr 0:bc9f26b5dadf 219 _rangeScaler = Scale3X;
vijaynvr 0:bc9f26b5dadf 220 scalerVal = cScalerVal3X;
vijaynvr 0:bc9f26b5dadf 221 }
vijaynvr 0:bc9f26b5dadf 222
vijaynvr 0:bc9f26b5dadf 223 i2c_write_word(RANGE_SCALER, scalerVal, device_base_address);
vijaynvr 0:bc9f26b5dadf 224
vijaynvr 0:bc9f26b5dadf 225 LOG_FUNCTION_END(ret);
vijaynvr 0:bc9f26b5dadf 226
vijaynvr 0:bc9f26b5dadf 227 return ret;
vijaynvr 0:bc9f26b5dadf 228 }
vijaynvr 0:bc9f26b5dadf 229
vijaynvr 0:bc9f26b5dadf 230 uint8_t er_get_scaler(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 231 {
vijaynvr 0:bc9f26b5dadf 232 uint8_t ret = _rangeScaler;
vijaynvr 0:bc9f26b5dadf 233
vijaynvr 0:bc9f26b5dadf 234 //LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 235
vijaynvr 0:bc9f26b5dadf 236 //LOG_FUNCTION_END(ret);
vijaynvr 0:bc9f26b5dadf 237
vijaynvr 0:bc9f26b5dadf 238 return ret;
vijaynvr 0:bc9f26b5dadf 239 }
vijaynvr 0:bc9f26b5dadf 240
vijaynvr 0:bc9f26b5dadf 241 uint32_t er_get_upper_limit(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 242 {
vijaynvr 0:bc9f26b5dadf 243 const uint32_t cScalerMax1X = 255;
vijaynvr 0:bc9f26b5dadf 244 const uint32_t cScalerMax2X = 510;
vijaynvr 0:bc9f26b5dadf 245 const uint32_t cScalerMax3X = 765;
vijaynvr 0:bc9f26b5dadf 246 uint32_t upperLim = cScalerMax1X;
vijaynvr 0:bc9f26b5dadf 247
vijaynvr 0:bc9f26b5dadf 248 LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 249
vijaynvr 0:bc9f26b5dadf 250 if(_rangeScaler == Scale2X)
vijaynvr 0:bc9f26b5dadf 251 {
vijaynvr 0:bc9f26b5dadf 252 upperLim = cScalerMax2X;
vijaynvr 0:bc9f26b5dadf 253 }
vijaynvr 0:bc9f26b5dadf 254 else if(_rangeScaler == Scale3X)
vijaynvr 0:bc9f26b5dadf 255 {
vijaynvr 0:bc9f26b5dadf 256 upperLim = cScalerMax3X;
vijaynvr 0:bc9f26b5dadf 257 }
vijaynvr 0:bc9f26b5dadf 258
vijaynvr 0:bc9f26b5dadf 259 LOG_FUNCTION_END(upperLim);
vijaynvr 0:bc9f26b5dadf 260
vijaynvr 0:bc9f26b5dadf 261 return upperLim;
vijaynvr 0:bc9f26b5dadf 262 }
vijaynvr 0:bc9f26b5dadf 263
vijaynvr 0:bc9f26b5dadf 264
vijaynvr 0:bc9f26b5dadf 265 uint32_t er_get_lower_limit(uint8_t device_base_address)
vijaynvr 0:bc9f26b5dadf 266 {
vijaynvr 0:bc9f26b5dadf 267 uint32_t lowerLimit = 0;
vijaynvr 0:bc9f26b5dadf 268 LOG_FUNCTION_START((void*)&device_base_address);
vijaynvr 0:bc9f26b5dadf 269
vijaynvr 0:bc9f26b5dadf 270 LOG_FUNCTION_END(lowerLimit);
vijaynvr 0:bc9f26b5dadf 271
vijaynvr 0:bc9f26b5dadf 272 return lowerLimit;
vijaynvr 0:bc9f26b5dadf 273 }
vijaynvr 0:bc9f26b5dadf 274
vijaynvr 0:bc9f26b5dadf 275