INSAT Mini Project

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Fork of X_NUCLEO_6180XA1 by ST

Committer:
gallonm
Date:
Wed Sep 09 16:00:39 2015 +0000
Revision:
1:1de1ea2994d9
Added some files

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gallonm 1:1de1ea2994d9 1 /*
gallonm 1:1de1ea2994d9 2 * $Date: 2015-01-08 14:30:24 +0100 (Thu, 08 Jan 2015) $
gallonm 1:1de1ea2994d9 3 * $Revision: 2039 $
gallonm 1:1de1ea2994d9 4 */
gallonm 1:1de1ea2994d9 5
gallonm 1:1de1ea2994d9 6 /**
gallonm 1:1de1ea2994d9 7 * @file vl6180x_i2c.h
gallonm 1:1de1ea2994d9 8 *
gallonm 1:1de1ea2994d9 9 * @brief CCI interface to "raw i2c" translation layer
gallonm 1:1de1ea2994d9 10 */
gallonm 1:1de1ea2994d9 11
gallonm 1:1de1ea2994d9 12 #ifndef VL6180_I2C_H_
gallonm 1:1de1ea2994d9 13 #define VL6180_I2C_H_
gallonm 1:1de1ea2994d9 14
gallonm 1:1de1ea2994d9 15 #include "vl6180x_platform.h"
gallonm 1:1de1ea2994d9 16
gallonm 1:1de1ea2994d9 17 /**
gallonm 1:1de1ea2994d9 18 * @defgroup cci_i2c CCI to RAW I2C translation layer
gallonm 1:1de1ea2994d9 19 *
gallonm 1:1de1ea2994d9 20 * This optional tranlation layer is implemented in __platform/cci-i2c__ directory. If user uses this translation layer for his platform, only @a VL6180x_I2CRead() and
gallonm 1:1de1ea2994d9 21 * @a VL6180x_I2CWrite() functions need to be implemented. Also, some code adaption (via macro) is required for multi-threading and for multiple device support.
gallonm 1:1de1ea2994d9 22 *
gallonm 1:1de1ea2994d9 23 * File vl6180x_i2c.c implements device register access via raw i2c access. If the targeted application and platform has no multi-thread, no multi-cpu and uses single
gallonm 1:1de1ea2994d9 24 * device, then nothing else is required than the 2 mandatory function : @a VL6180x_I2CRead() and @a VL6180x_I2CWrite().\n
gallonm 1:1de1ea2994d9 25 * In other cases, review and customize @a VL6180x_GetI2CAccess() and @a VL6180x_DoneI2CAccess() functions as well as @a #VL6180x_I2C_USER_VAR macro. This should be enough
gallonm 1:1de1ea2994d9 26 * to conform to a wide range of platform OS and application requirements .\n
gallonm 1:1de1ea2994d9 27 *
gallonm 1:1de1ea2994d9 28 * If your configured i2c for per device buffer via @a #I2C_BUFFER_CONFIG == 2, you must implement @a VL6180x_GetI2cBuffer()
gallonm 1:1de1ea2994d9 29 *
gallonm 1:1de1ea2994d9 30 * __I2C Port sample__ \n
gallonm 1:1de1ea2994d9 31 * A __linux kernel__ port need a "long flags" var for its spin_lock in all functions. the following code example declares a spin lock "lock" in the custom device structure. \n
gallonm 1:1de1ea2994d9 32 * @code
gallonm 1:1de1ea2994d9 33 struct MyVL6180Dev_t {
gallonm 1:1de1ea2994d9 34 struct VL6180xDevData_t StData;
gallonm 1:1de1ea2994d9 35 ...
gallonm 1:1de1ea2994d9 36 spinlock_t i2c_lock;
gallonm 1:1de1ea2994d9 37 };
gallonm 1:1de1ea2994d9 38 typedef struct MyVL6180Dev_t *VL6180xDev_t;
gallonm 1:1de1ea2994d9 39
gallonm 1:1de1ea2994d9 40 #define VL6180x_I2C_USER_VAR unsigned long flags;
gallonm 1:1de1ea2994d9 41 #define GetI2CAccess(dev) spin_lock_irqsave(dev->i2c_lock, flags)
gallonm 1:1de1ea2994d9 42 #define DoneI2CAccess(dev) spin_unlock_irqrestore(dev->i2c_lock,flags)
gallonm 1:1de1ea2994d9 43 @endcode
gallonm 1:1de1ea2994d9 44
gallonm 1:1de1ea2994d9 45 * __POSIX pthread__ application porting could be as follows :\n
gallonm 1:1de1ea2994d9 46 * @code
gallonm 1:1de1ea2994d9 47 struct MyVL6180Dev_t {
gallonm 1:1de1ea2994d9 48 struct VL6180xDevData_t StData;
gallonm 1:1de1ea2994d9 49 ...
gallonm 1:1de1ea2994d9 50 pthread_mutex_t *lock;
gallonm 1:1de1ea2994d9 51 };
gallonm 1:1de1ea2994d9 52 typedef struct MyVL6180Dev_t *VL6180xDev_t;
gallonm 1:1de1ea2994d9 53
gallonm 1:1de1ea2994d9 54 #define VL6180x_I2C_USER_VAR //no need
gallonm 1:1de1ea2994d9 55 #define VL6180x_GetI2CAccess(dev) pthread_mutex_lock(dev->lock)
gallonm 1:1de1ea2994d9 56 #define VL6180x_DoneI2CAcces(dev) pthread_mutex_unlock(dev->lock)
gallonm 1:1de1ea2994d9 57 * @endcode
gallonm 1:1de1ea2994d9 58 */
gallonm 1:1de1ea2994d9 59
gallonm 1:1de1ea2994d9 60 /**
gallonm 1:1de1ea2994d9 61 * @def I2C_BUFFER_CONFIG
gallonm 1:1de1ea2994d9 62 *
gallonm 1:1de1ea2994d9 63 * @brief Configure device register I2C access
gallonm 1:1de1ea2994d9 64 *
gallonm 1:1de1ea2994d9 65 * @li 0 : one GLOBAL buffer \n
gallonm 1:1de1ea2994d9 66 * Use one global buffer of MAX_I2C_XFER_SIZE byte in data space \n
gallonm 1:1de1ea2994d9 67 * This solution is not multi-device compliant nor multi-thread cpu safe \n
gallonm 1:1de1ea2994d9 68 * It can be the best option for small 8/16 bit MCU without stack and limited ram (STM8s, 80C51 ...)
gallonm 1:1de1ea2994d9 69 *
gallonm 1:1de1ea2994d9 70 * @li 1 : ON_STACK/local \n
gallonm 1:1de1ea2994d9 71 * Use local variable (on stack) buffer \n
gallonm 1:1de1ea2994d9 72 * This solution is multi-thread with use of i2c resource lock or mutex see @a VL6180x_GetI2CAccess() \n
gallonm 1:1de1ea2994d9 73 *
gallonm 1:1de1ea2994d9 74 * @li 2 : User defined \n
gallonm 1:1de1ea2994d9 75 * Per device potentially dynamic allocated. Requires @a VL6180x_GetI2cBuffer() to be implemented.
gallonm 1:1de1ea2994d9 76 * @ingroup Configuration
gallonm 1:1de1ea2994d9 77 */
gallonm 1:1de1ea2994d9 78 #define I2C_BUFFER_CONFIG 1
gallonm 1:1de1ea2994d9 79
gallonm 1:1de1ea2994d9 80 /**
gallonm 1:1de1ea2994d9 81 * @brief Write data buffer to VL6180x device via i2c
gallonm 1:1de1ea2994d9 82 * @param dev The device to write to
gallonm 1:1de1ea2994d9 83 * @param buff The data buffer
gallonm 1:1de1ea2994d9 84 * @param len The length of the transaction in byte
gallonm 1:1de1ea2994d9 85 * @return 0 on success
gallonm 1:1de1ea2994d9 86 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 87 */
gallonm 1:1de1ea2994d9 88 int VL6180x_I2CWrite(VL6180xDev_t dev, uint8_t *buff, uint8_t len);
gallonm 1:1de1ea2994d9 89
gallonm 1:1de1ea2994d9 90 /**
gallonm 1:1de1ea2994d9 91 *
gallonm 1:1de1ea2994d9 92 * @brief Read data buffer from VL6180x device via i2c
gallonm 1:1de1ea2994d9 93 * @param dev The device to read from
gallonm 1:1de1ea2994d9 94 * @param buff The data buffer to fill
gallonm 1:1de1ea2994d9 95 * @param len The length of the transaction in byte
gallonm 1:1de1ea2994d9 96 * @return 0 on success
gallonm 1:1de1ea2994d9 97 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 98 */
gallonm 1:1de1ea2994d9 99 int VL6180x_I2CRead(VL6180xDev_t dev, uint8_t *buff, uint8_t len);
gallonm 1:1de1ea2994d9 100
gallonm 1:1de1ea2994d9 101
gallonm 1:1de1ea2994d9 102 /**
gallonm 1:1de1ea2994d9 103 * @brief Declare any required variables used by i2c lock (@a VL6180x_DoneI2CAccess() and @a VL6180x_GetI2CAccess())
gallonm 1:1de1ea2994d9 104 * and buffer access : @a VL6180x_GetI2cBuffer()
gallonm 1:1de1ea2994d9 105 *
gallonm 1:1de1ea2994d9 106 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 107 */
gallonm 1:1de1ea2994d9 108 #define VL6180x_I2C_USER_VAR
gallonm 1:1de1ea2994d9 109
gallonm 1:1de1ea2994d9 110 /**
gallonm 1:1de1ea2994d9 111 * @brief Acquire lock or mutex for access to i2c data buffer and bus.\n
gallonm 1:1de1ea2994d9 112 * Delete the default VL6180x_GetI2CAccess 'do-nothing' macro below if you decide to implement this function.
gallonm 1:1de1ea2994d9 113 *
gallonm 1:1de1ea2994d9 114 * This function is used to perform i2c bus level and multiple access locking required for multi thread/proccess system.\n
gallonm 1:1de1ea2994d9 115 * Multiple access (read and update) will lock once and do multiple basic i2c rd/wr to complete the overall transfer.\n
gallonm 1:1de1ea2994d9 116 * When no locking is needed this can be a void macro.\n
gallonm 1:1de1ea2994d9 117 *
gallonm 1:1de1ea2994d9 118 * @param dev the device
gallonm 1:1de1ea2994d9 119 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 120 */
gallonm 1:1de1ea2994d9 121 void VL6180x_GetI2CAccess(VL6180xDev_t dev);
gallonm 1:1de1ea2994d9 122
gallonm 1:1de1ea2994d9 123 /**
gallonm 1:1de1ea2994d9 124 * @def VL6180x_GetI2CAccess
gallonm 1:1de1ea2994d9 125 * @brief Default 'do-nothing' macro for @a VL6180x_GetI2CAccess(). Delete if used.
gallonm 1:1de1ea2994d9 126 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 127 */
gallonm 1:1de1ea2994d9 128 #define VL6180x_GetI2CAccess(dev) (void)0 /* TODO delete if function used */
gallonm 1:1de1ea2994d9 129
gallonm 1:1de1ea2994d9 130 /**
gallonm 1:1de1ea2994d9 131 * @brief Release acquired lock or mutex for i2c access.\n
gallonm 1:1de1ea2994d9 132 * Delete default VL6180x_DoneI2CAccess 'do-nothing' macro below if implementing that function.
gallonm 1:1de1ea2994d9 133 *
gallonm 1:1de1ea2994d9 134 * This function is used to release the acquired lock.
gallonm 1:1de1ea2994d9 135 * @param dev The device
gallonm 1:1de1ea2994d9 136 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 137 */
gallonm 1:1de1ea2994d9 138 void VL6180x_DoneI2CAccess(VL6180xDev_t dev);
gallonm 1:1de1ea2994d9 139
gallonm 1:1de1ea2994d9 140 /** @def VL6180x_DoneI2CAcces
gallonm 1:1de1ea2994d9 141 * @brief Default 'do-nothing' macro for @a VL6180x_DoneI2CAcces(). Delete if used.
gallonm 1:1de1ea2994d9 142 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 143 */
gallonm 1:1de1ea2994d9 144 #define VL6180x_DoneI2CAcces(dev) (void)0 /*TODO delete if function used */
gallonm 1:1de1ea2994d9 145
gallonm 1:1de1ea2994d9 146 /**
gallonm 1:1de1ea2994d9 147 * @brief Provided data buffer for i2c access for at least n_byte.
gallonm 1:1de1ea2994d9 148 *
gallonm 1:1de1ea2994d9 149 * You must implement it when i2c @a #I2C_BUFFER_CONFIG is set to 2 (User defined).\n
gallonm 1:1de1ea2994d9 150 * This is used used in the context of #VL6180x_I2C_USER_VAR
gallonm 1:1de1ea2994d9 151 *
gallonm 1:1de1ea2994d9 152 * @param dev The device
gallonm 1:1de1ea2994d9 153 * @param n_byte Minimal number of byte
gallonm 1:1de1ea2994d9 154 * @return The buffer (cannot fail return not checked)
gallonm 1:1de1ea2994d9 155 * @ingroup cci_i2c
gallonm 1:1de1ea2994d9 156 */
gallonm 1:1de1ea2994d9 157 uint8_t *VL6180x_GetI2cBuffer(VL6180xDev_t dev, int n_byte);
gallonm 1:1de1ea2994d9 158 #if I2C_BUFFER_CONFIG == 2
gallonm 1:1de1ea2994d9 159 #error /* TODO add your macro of code here for VL6180x_GetI2cBuffer */
gallonm 1:1de1ea2994d9 160 #endif
gallonm 1:1de1ea2994d9 161
gallonm 1:1de1ea2994d9 162
gallonm 1:1de1ea2994d9 163
gallonm 1:1de1ea2994d9 164
gallonm 1:1de1ea2994d9 165
gallonm 1:1de1ea2994d9 166 #endif /* VL6180_I2C_H_ */