This is a driver needed by NFCEEPROOM constructor for the ST ST25DV NFC chip.

Dependents:   mbed-os-example-nfc-EEPROM

Committer:
apalmieri
Date:
Tue Jan 28 15:54:19 2020 +0000
Revision:
0:dd89565c6276
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
apalmieri 0:dd89565c6276 1 /**
apalmieri 0:dd89565c6276 2 ******************************************************************************
apalmieri 0:dd89565c6276 3 * @file x_nucleo_nfc04a1.c
apalmieri 0:dd89565c6276 4 * @author MMY Application Team
apalmieri 0:dd89565c6276 5 * @version $Revision: 3351 $
apalmieri 0:dd89565c6276 6 * @date $Date: 2017-01-25 17:28:08 +0100 (Wed, 25 Jan 2017) $
apalmieri 0:dd89565c6276 7 * @brief This file provides nfc04a1 specific functions
apalmieri 0:dd89565c6276 8 ******************************************************************************
apalmieri 0:dd89565c6276 9 * @attention
apalmieri 0:dd89565c6276 10 *
apalmieri 0:dd89565c6276 11 * <h2><center>&copy; COPYRIGHT 2017 STMicroelectronics</center></h2>
apalmieri 0:dd89565c6276 12 *
apalmieri 0:dd89565c6276 13 * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
apalmieri 0:dd89565c6276 14 * You may not use this file except in compliance with the License.
apalmieri 0:dd89565c6276 15 * You may obtain a copy of the License at:
apalmieri 0:dd89565c6276 16 *
apalmieri 0:dd89565c6276 17 * http://www.st.com/myliberty
apalmieri 0:dd89565c6276 18 *
apalmieri 0:dd89565c6276 19 * Unless required by applicable law or agreed to in writing, software
apalmieri 0:dd89565c6276 20 * distributed under the License is distributed on an "AS IS" BASIS,
apalmieri 0:dd89565c6276 21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
apalmieri 0:dd89565c6276 22 * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
apalmieri 0:dd89565c6276 23 * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
apalmieri 0:dd89565c6276 24 * See the License for the specific language governing permissions and
apalmieri 0:dd89565c6276 25 * limitations under the License.
apalmieri 0:dd89565c6276 26 *
apalmieri 0:dd89565c6276 27 ******************************************************************************
apalmieri 0:dd89565c6276 28 */
apalmieri 0:dd89565c6276 29
apalmieri 0:dd89565c6276 30 /* Includes ------------------------------------------------------------------*/
apalmieri 0:dd89565c6276 31 #include "st25dv.h"
apalmieri 0:dd89565c6276 32 #include "time.h"
apalmieri 0:dd89565c6276 33
apalmieri 0:dd89565c6276 34 /** @defgroup X_NUCLEO_NFC04A1
apalmieri 0:dd89565c6276 35 * @{
apalmieri 0:dd89565c6276 36 */
apalmieri 0:dd89565c6276 37 /* Private typedef -----------------------------------------------------------*/
apalmieri 0:dd89565c6276 38 /* Private defines -----------------------------------------------------------*/
apalmieri 0:dd89565c6276 39 /* Private macros ------------------------------------------------------------*/
apalmieri 0:dd89565c6276 40 /* Private variables ---------------------------------------------------------*/
apalmieri 0:dd89565c6276 41 /* Global variables ----------------------------------------------------------*/
apalmieri 0:dd89565c6276 42 /** @defgroup X_NUCLEO_NFC04A1_Global_Variables
apalmieri 0:dd89565c6276 43 * @{
apalmieri 0:dd89565c6276 44 */
apalmieri 0:dd89565c6276 45 //uint8_t NFC04A1_Led[3] = { 1 , 2 , 3 };
apalmieri 0:dd89565c6276 46
apalmieri 0:dd89565c6276 47 /**
apalmieri 0:dd89565c6276 48 * @}
apalmieri 0:dd89565c6276 49 */
apalmieri 0:dd89565c6276 50
apalmieri 0:dd89565c6276 51 /* Private function prototypes -----------------------------------------------*/
apalmieri 0:dd89565c6276 52
apalmieri 0:dd89565c6276 53 NFCTAG_StatusTypeDef ST25DV_IO_Init( I2C* mi2cChannel, DigitalOut *mLPD );
apalmieri 0:dd89565c6276 54 NFCTAG_StatusTypeDef ST25DV_IO_MemWrite( const uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel );
apalmieri 0:dd89565c6276 55 NFCTAG_StatusTypeDef ST25DV_IO_MemRead( uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel );
apalmieri 0:dd89565c6276 56 NFCTAG_StatusTypeDef ST25DV_IO_Read( uint8_t * const pData, const uint8_t DevAddr, const uint16_t Size, I2C* mi2cChannel );
apalmieri 0:dd89565c6276 57 NFCTAG_StatusTypeDef ST25DV_IO_IsDeviceReady( const uint8_t DevAddr, const uint32_t Trials, I2C* mi2cChannel);
apalmieri 0:dd89565c6276 58 NFCTAG_StatusTypeDef NFCTAG_ConvertStatus(uint8_t ret);
apalmieri 0:dd89565c6276 59
apalmieri 0:dd89565c6276 60
apalmieri 0:dd89565c6276 61 /* Functions Definition ------------------------------------------------------*/
apalmieri 0:dd89565c6276 62 /** @defgroup X_NUCLEO_NFC04A1_Public_Functions
apalmieri 0:dd89565c6276 63 * @{
apalmieri 0:dd89565c6276 64 */
apalmieri 0:dd89565c6276 65
apalmieri 0:dd89565c6276 66
apalmieri 0:dd89565c6276 67
apalmieri 0:dd89565c6276 68 /**
apalmieri 0:dd89565c6276 69 * @brief Toggles the selected LED
apalmieri 0:dd89565c6276 70 * @param led : Specifies the Led to be toggled
apalmieri 0:dd89565c6276 71 * @retval None
apalmieri 0:dd89565c6276 72 */
apalmieri 0:dd89565c6276 73 void NFC04A1_LED_Toggle( DigitalOut* led)
apalmieri 0:dd89565c6276 74 {
apalmieri 0:dd89565c6276 75 *led = !(*led);
apalmieri 0:dd89565c6276 76 }
apalmieri 0:dd89565c6276 77
apalmieri 0:dd89565c6276 78
apalmieri 0:dd89565c6276 79
apalmieri 0:dd89565c6276 80 /**
apalmieri 0:dd89565c6276 81 * @brief This function get the GPIO value through GPIO
apalmieri 0:dd89565c6276 82 * @param None
apalmieri 0:dd89565c6276 83 * @retval HAL GPIO pin status
apalmieri 0:dd89565c6276 84 */
apalmieri 0:dd89565c6276 85 DigitalOut NFC04A1_GPO_ReadPin( DigitalOut *mMISO )
apalmieri 0:dd89565c6276 86 {
apalmieri 0:dd89565c6276 87 return *mMISO;
apalmieri 0:dd89565c6276 88 }
apalmieri 0:dd89565c6276 89
apalmieri 0:dd89565c6276 90 /**
apalmieri 0:dd89565c6276 91 * @brief This function initialize the GPIO to manage the NFCTAG LPD pin
apalmieri 0:dd89565c6276 92 * @param None
apalmieri 0:dd89565c6276 93 * @retval None
apalmieri 0:dd89565c6276 94 */
apalmieri 0:dd89565c6276 95
apalmieri 0:dd89565c6276 96 void NFC04A1_LPD_Init( DigitalOut *mLPD )
apalmieri 0:dd89565c6276 97 {
apalmieri 0:dd89565c6276 98 *mLPD = 0;
apalmieri 0:dd89565c6276 99 }
apalmieri 0:dd89565c6276 100
apalmieri 0:dd89565c6276 101 /**
apalmieri 0:dd89565c6276 102 * @brief This function get the GPIO value through GPIO
apalmieri 0:dd89565c6276 103 * @param None
apalmieri 0:dd89565c6276 104 * @retval HAL GPIO pin status
apalmieri 0:dd89565c6276 105 */
apalmieri 0:dd89565c6276 106 uint8_t NFC04A1_LPD_ReadPin( DigitalOut *mLPD )
apalmieri 0:dd89565c6276 107 {
apalmieri 0:dd89565c6276 108 return mLPD -> read();
apalmieri 0:dd89565c6276 109 }
apalmieri 0:dd89565c6276 110
apalmieri 0:dd89565c6276 111 /**
apalmieri 0:dd89565c6276 112 * @brief This function get the GPIO value through GPIO
apalmieri 0:dd89565c6276 113 * @param None
apalmieri 0:dd89565c6276 114 * @retval HAL GPIO pin status
apalmieri 0:dd89565c6276 115 */
apalmieri 0:dd89565c6276 116 void NFC04A1_LPD_WritePin( uint8_t LpdPinState, DigitalOut *mLPD )
apalmieri 0:dd89565c6276 117 {
apalmieri 0:dd89565c6276 118 mLPD -> write( LpdPinState );
apalmieri 0:dd89565c6276 119 }
apalmieri 0:dd89565c6276 120
apalmieri 0:dd89565c6276 121 /**
apalmieri 0:dd89565c6276 122 * @brief This function select the i2cChannel1 speed to communicate with NFCTAG
apalmieri 0:dd89565c6276 123 * @param i2cChannelspeedchoice Number from 0 to 5 to select i2cChannel speed
apalmieri 0:dd89565c6276 124 * @param mi2cChannel : I2C channel
apalmieri 0:dd89565c6276 125 * @retval HAL GPIO pin status
apalmieri 0:dd89565c6276 126 */
apalmieri 0:dd89565c6276 127 void NFC04A1_Selecti2cSpeed( uint8_t i2cspeedchoice, I2C* mi2cChannel)
apalmieri 0:dd89565c6276 128 {
apalmieri 0:dd89565c6276 129
apalmieri 0:dd89565c6276 130 switch( i2cspeedchoice )
apalmieri 0:dd89565c6276 131 {
apalmieri 0:dd89565c6276 132 case 0:
apalmieri 0:dd89565c6276 133
apalmieri 0:dd89565c6276 134 mi2cChannel -> frequency(10000);
apalmieri 0:dd89565c6276 135 break;
apalmieri 0:dd89565c6276 136
apalmieri 0:dd89565c6276 137 case 1:
apalmieri 0:dd89565c6276 138
apalmieri 0:dd89565c6276 139 mi2cChannel -> frequency(100000);
apalmieri 0:dd89565c6276 140 break;
apalmieri 0:dd89565c6276 141
apalmieri 0:dd89565c6276 142 case 2:
apalmieri 0:dd89565c6276 143
apalmieri 0:dd89565c6276 144 mi2cChannel -> frequency(200000);
apalmieri 0:dd89565c6276 145 break;
apalmieri 0:dd89565c6276 146
apalmieri 0:dd89565c6276 147 case 3:
apalmieri 0:dd89565c6276 148
apalmieri 0:dd89565c6276 149 mi2cChannel -> frequency(400000);
apalmieri 0:dd89565c6276 150 break;
apalmieri 0:dd89565c6276 151
apalmieri 0:dd89565c6276 152 case 4:
apalmieri 0:dd89565c6276 153
apalmieri 0:dd89565c6276 154 mi2cChannel -> frequency(800000);
apalmieri 0:dd89565c6276 155 break;
apalmieri 0:dd89565c6276 156
apalmieri 0:dd89565c6276 157 case 5:
apalmieri 0:dd89565c6276 158
apalmieri 0:dd89565c6276 159 mi2cChannel -> frequency(1000000);
apalmieri 0:dd89565c6276 160 break;
apalmieri 0:dd89565c6276 161
apalmieri 0:dd89565c6276 162 default:
apalmieri 0:dd89565c6276 163
apalmieri 0:dd89565c6276 164 mi2cChannel -> frequency(1000000);
apalmieri 0:dd89565c6276 165 break;
apalmieri 0:dd89565c6276 166 }
apalmieri 0:dd89565c6276 167
apalmieri 0:dd89565c6276 168 }
apalmieri 0:dd89565c6276 169
apalmieri 0:dd89565c6276 170 /**
apalmieri 0:dd89565c6276 171 * @}
apalmieri 0:dd89565c6276 172 */
apalmieri 0:dd89565c6276 173
apalmieri 0:dd89565c6276 174 /** @defgroup X_NUCLEO_NFC04A1_Private_Functions
apalmieri 0:dd89565c6276 175 * @{
apalmieri 0:dd89565c6276 176 */
apalmieri 0:dd89565c6276 177 /******************************** LINK EEPROM COMPONENT *****************************/
apalmieri 0:dd89565c6276 178
apalmieri 0:dd89565c6276 179 /**
apalmieri 0:dd89565c6276 180 * @brief Initializes peripherals used by the i2cChannel NFCTAG driver
apalmieri 0:dd89565c6276 181 * @param mi2cChannel : I2C channel
apalmieri 0:dd89565c6276 182 * @param mLPD
apalmieri 0:dd89565c6276 183 * @retval NFCTAG enum status
apalmieri 0:dd89565c6276 184 */
apalmieri 0:dd89565c6276 185 NFCTAG_StatusTypeDef ST25DV_IO_Init( I2C* mi2cChannel, DigitalOut *mLPD )
apalmieri 0:dd89565c6276 186 {
apalmieri 0:dd89565c6276 187
apalmieri 0:dd89565c6276 188
apalmieri 0:dd89565c6276 189 NFC04A1_LPD_Init( mLPD );
apalmieri 0:dd89565c6276 190
apalmieri 0:dd89565c6276 191 NFC04A1_Selecti2cSpeed(3, mi2cChannel);
apalmieri 0:dd89565c6276 192
apalmieri 0:dd89565c6276 193 return NFCTAG_OK;
apalmieri 0:dd89565c6276 194 }
apalmieri 0:dd89565c6276 195
apalmieri 0:dd89565c6276 196 /**
apalmieri 0:dd89565c6276 197 * @brief Write data, at specific address, through i2c to the ST25DV
apalmieri 0:dd89565c6276 198 * @param pData: pointer to the data to write
apalmieri 0:dd89565c6276 199 * @param DevAddr : Target device address
apalmieri 0:dd89565c6276 200 * @param TarAddr : i2c data memory address to write
apalmieri 0:dd89565c6276 201 * @param Size : Size in bytes of the value to be written
apalmieri 0:dd89565c6276 202 * @param mi2cChannel : I2C channel
apalmieri 0:dd89565c6276 203 * @retval NFCTAG enum status
apalmieri 0:dd89565c6276 204 */
apalmieri 0:dd89565c6276 205 NFCTAG_StatusTypeDef ST25DV_IO_MemWrite( const uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel )
apalmieri 0:dd89565c6276 206 {
apalmieri 0:dd89565c6276 207
apalmieri 0:dd89565c6276 208 uint8_t ret = 4;
apalmieri 0:dd89565c6276 209
apalmieri 0:dd89565c6276 210 uint8_t Addr = DevAddr;
apalmieri 0:dd89565c6276 211
apalmieri 0:dd89565c6276 212
apalmieri 0:dd89565c6276 213 uint8_t buffer[2];
apalmieri 0:dd89565c6276 214 buffer[0] = (uint8_t) (TarAddr>>8);
apalmieri 0:dd89565c6276 215 buffer[1] = (uint8_t) (TarAddr&0xFF);
apalmieri 0:dd89565c6276 216
apalmieri 0:dd89565c6276 217
apalmieri 0:dd89565c6276 218 char * pDataChar = (char*) pData;
apalmieri 0:dd89565c6276 219
apalmieri 0:dd89565c6276 220
apalmieri 0:dd89565c6276 221 ret = mi2cChannel -> write(Addr, (const char*)buffer, 2 , true);
apalmieri 0:dd89565c6276 222
apalmieri 0:dd89565c6276 223 // Address is not OK
apalmieri 0:dd89565c6276 224 if(ret != 0)
apalmieri 0:dd89565c6276 225 return NFCTAG_ConvertStatus(ret);
apalmieri 0:dd89565c6276 226
apalmieri 0:dd89565c6276 227 ret = mi2cChannel -> write(Addr, pDataChar, Size, false);
apalmieri 0:dd89565c6276 228
apalmieri 0:dd89565c6276 229 return NFCTAG_ConvertStatus(ret);
apalmieri 0:dd89565c6276 230 }
apalmieri 0:dd89565c6276 231
apalmieri 0:dd89565c6276 232
apalmieri 0:dd89565c6276 233 /*
apalmieri 0:dd89565c6276 234 * @brief Reads data at a specific address from the NFCTAG.
apalmieri 0:dd89565c6276 235 * @param pData: pointer to store read data
apalmieri 0:dd89565c6276 236 * @param DevAddr : Target device address
apalmieri 0:dd89565c6276 237 * @param TarAddr : i2c data memory address to read
apalmieri 0:dd89565c6276 238 * @param Size : Size in bytes of the value to be read
apalmieri 0:dd89565c6276 239 * @param mi2cChannel : I2C channel
apalmieri 0:dd89565c6276 240 * @retval NFCTAG enum status
apalmieri 0:dd89565c6276 241 */
apalmieri 0:dd89565c6276 242
apalmieri 0:dd89565c6276 243 NFCTAG_StatusTypeDef ST25DV_IO_MemRead( uint8_t * const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size, I2C* mi2cChannel )
apalmieri 0:dd89565c6276 244 {
apalmieri 0:dd89565c6276 245
apalmieri 0:dd89565c6276 246 uint8_t ret = 4;
apalmieri 0:dd89565c6276 247 uint8_t Addr = DevAddr;
apalmieri 0:dd89565c6276 248
apalmieri 0:dd89565c6276 249 uint8_t buffer[2];
apalmieri 0:dd89565c6276 250 buffer[0] = (uint8_t) (TarAddr>>8);
apalmieri 0:dd89565c6276 251 buffer[1] = (uint8_t) (TarAddr&0xFF);
apalmieri 0:dd89565c6276 252
apalmieri 0:dd89565c6276 253 ret = mi2cChannel -> write(Addr, (const char*)buffer , 2 , false);
apalmieri 0:dd89565c6276 254
apalmieri 0:dd89565c6276 255 // Address is not OK
apalmieri 0:dd89565c6276 256 if(ret != 0)
apalmieri 0:dd89565c6276 257 return NFCTAG_ConvertStatus(ret);
apalmieri 0:dd89565c6276 258
apalmieri 0:dd89565c6276 259 char * pDataChar = (char*) pData;
apalmieri 0:dd89565c6276 260
apalmieri 0:dd89565c6276 261 ret = mi2cChannel -> read(DevAddr, pDataChar, Size, false );
apalmieri 0:dd89565c6276 262
apalmieri 0:dd89565c6276 263 return NFCTAG_ConvertStatus(ret);
apalmieri 0:dd89565c6276 264 }
apalmieri 0:dd89565c6276 265
apalmieri 0:dd89565c6276 266 NFCTAG_StatusTypeDef NFCTAG_ConvertStatus(uint8_t ret) {
apalmieri 0:dd89565c6276 267 if (ret == 0) {
apalmieri 0:dd89565c6276 268 return NFCTAG_OK;
apalmieri 0:dd89565c6276 269 } else if ((ret == 2) || (ret == 3)) {
apalmieri 0:dd89565c6276 270 return NFCTAG_NACK;
apalmieri 0:dd89565c6276 271 } else {
apalmieri 0:dd89565c6276 272 return NFCTAG_ERROR;
apalmieri 0:dd89565c6276 273 }
apalmieri 0:dd89565c6276 274 }
apalmieri 0:dd89565c6276 275
apalmieri 0:dd89565c6276 276
apalmieri 0:dd89565c6276 277 /**
apalmieri 0:dd89565c6276 278 * @brief Reads data at current address from the NFCTAG.
apalmieri 0:dd89565c6276 279 * @param pData: pointer to store read data
apalmieri 0:dd89565c6276 280 * @param DevAddr : Target device address
apalmieri 0:dd89565c6276 281 * @param Size : Size in bytes of the value to be read
apalmieri 0:dd89565c6276 282 * @retval NFCTAG enum status
apalmieri 0:dd89565c6276 283 */
apalmieri 0:dd89565c6276 284 NFCTAG_StatusTypeDef ST25DV_IO_Read( uint8_t * const pData, const uint8_t DevAddr, const uint16_t Size, I2C* mi2cChannel )
apalmieri 0:dd89565c6276 285 {
apalmieri 0:dd89565c6276 286 //this has to change( send addr then read)
apalmieri 0:dd89565c6276 287 int i = 0;
apalmieri 0:dd89565c6276 288 uint8_t ret = 4;
apalmieri 0:dd89565c6276 289
apalmieri 0:dd89565c6276 290 char * pDataChar = (char*) pData;
apalmieri 0:dd89565c6276 291 uint8_t ReadAddr = DevAddr | 1u;
apalmieri 0:dd89565c6276 292 ret = mi2cChannel -> read(ReadAddr, pDataChar, 1, false );
apalmieri 0:dd89565c6276 293
apalmieri 0:dd89565c6276 294
apalmieri 0:dd89565c6276 295 // Tell slave we need to read 1byte from the current register
apalmieri 0:dd89565c6276 296 while(mi2cChannel -> read( 0 ) != 0) {
apalmieri 0:dd89565c6276 297 pData[i++] = mi2cChannel -> read( 0 );
apalmieri 0:dd89565c6276 298
apalmieri 0:dd89565c6276 299 }
apalmieri 0:dd89565c6276 300
apalmieri 0:dd89565c6276 301
apalmieri 0:dd89565c6276 302 return NFCTAG_ConvertStatus( ret);
apalmieri 0:dd89565c6276 303 }
apalmieri 0:dd89565c6276 304
apalmieri 0:dd89565c6276 305
apalmieri 0:dd89565c6276 306 /**
apalmieri 0:dd89565c6276 307 * @brief Checks if target device is ready for communication
apalmieri 0:dd89565c6276 308 * @note This function is used with Memory devices
apalmieri 0:dd89565c6276 309 * @param DevAddr : Target device address
apalmieri 0:dd89565c6276 310 * @param mi2cChannel : I2C channel
apalmieri 0:dd89565c6276 311 * @retval NFCTAG enum status
apalmieri 0:dd89565c6276 312 */
apalmieri 0:dd89565c6276 313 NFCTAG_StatusTypeDef ST25DV_IO_IsDeviceReady( const uint8_t DevAddr, const uint32_t Trials, I2C* mi2cChannel)
apalmieri 0:dd89565c6276 314 {
apalmieri 0:dd89565c6276 315 int ret = 4;
apalmieri 0:dd89565c6276 316 uint32_t count = 0;
apalmieri 0:dd89565c6276 317
apalmieri 0:dd89565c6276 318 uint8_t Addr = DevAddr;
apalmieri 0:dd89565c6276 319
apalmieri 0:dd89565c6276 320
apalmieri 0:dd89565c6276 321 while ((count++ < Trials && ret) ) {
apalmieri 0:dd89565c6276 322 ret = mi2cChannel -> write(Addr, NULL, 0 , false);
apalmieri 0:dd89565c6276 323 }
apalmieri 0:dd89565c6276 324 return NFCTAG_ConvertStatus(ret);
apalmieri 0:dd89565c6276 325 }
apalmieri 0:dd89565c6276 326
apalmieri 0:dd89565c6276 327
apalmieri 0:dd89565c6276 328
apalmieri 0:dd89565c6276 329
apalmieri 0:dd89565c6276 330 /**
apalmieri 0:dd89565c6276 331 * @}
apalmieri 0:dd89565c6276 332 */
apalmieri 0:dd89565c6276 333
apalmieri 0:dd89565c6276 334 /**
apalmieri 0:dd89565c6276 335 * @}
apalmieri 0:dd89565c6276 336 */
apalmieri 0:dd89565c6276 337
apalmieri 0:dd89565c6276 338 /**
apalmieri 0:dd89565c6276 339 * @}
apalmieri 0:dd89565c6276 340 */
apalmieri 0:dd89565c6276 341
apalmieri 0:dd89565c6276 342 /******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/