HelloWorld_IDS01A4 mbed application for Spirit1 P2P demo.

Dependencies:   mbed

Fork of HelloWorld_IDS01A5_Program by rosarium pila

mbed 2.0 (a.k.a classic) HelloWorld example for Spirit1 to transfer data from one node to another.
To send the predefined data packet from the sender to the receiver, user needs to press User Button on the board. The LED on the receiver expansion board will toggle on reception of data successfully.
Data packets sent and received can be seen on USB serial terminal.

EVALUATION BOARDS RF FREQUENCY DESCRIPTION :
X-NUCLEO-IDS01A4 868 MHz 868 MHz RF expansion board based on SPIRIT1

Committer:
rosarium
Date:
Thu May 25 16:38:55 2017 +0000
Revision:
0:2ddc0583bcec
First draft version of HelloWorld_IDS01A5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rosarium 0:2ddc0583bcec 1 /**
rosarium 0:2ddc0583bcec 2 ******************************************************************************
rosarium 0:2ddc0583bcec 3 * @file SPIRIT_Aes.c
rosarium 0:2ddc0583bcec 4 * @author VMA division - AMS
rosarium 0:2ddc0583bcec 5 * @version 3.2.2
rosarium 0:2ddc0583bcec 6 * @date 08-July-2015
rosarium 0:2ddc0583bcec 7 * @brief Configuration and management of SPIRIT AES Engine.
rosarium 0:2ddc0583bcec 8 *
rosarium 0:2ddc0583bcec 9 * @attention
rosarium 0:2ddc0583bcec 10 *
rosarium 0:2ddc0583bcec 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
rosarium 0:2ddc0583bcec 12 *
rosarium 0:2ddc0583bcec 13 * Redistribution and use in source and binary forms, with or without modification,
rosarium 0:2ddc0583bcec 14 * are permitted provided that the following conditions are met:
rosarium 0:2ddc0583bcec 15 * 1. Redistributions of source code must retain the above copyright notice,
rosarium 0:2ddc0583bcec 16 * this list of conditions and the following disclaimer.
rosarium 0:2ddc0583bcec 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
rosarium 0:2ddc0583bcec 18 * this list of conditions and the following disclaimer in the documentation
rosarium 0:2ddc0583bcec 19 * and/or other materials provided with the distribution.
rosarium 0:2ddc0583bcec 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
rosarium 0:2ddc0583bcec 21 * may be used to endorse or promote products derived from this software
rosarium 0:2ddc0583bcec 22 * without specific prior written permission.
rosarium 0:2ddc0583bcec 23 *
rosarium 0:2ddc0583bcec 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
rosarium 0:2ddc0583bcec 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
rosarium 0:2ddc0583bcec 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
rosarium 0:2ddc0583bcec 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
rosarium 0:2ddc0583bcec 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
rosarium 0:2ddc0583bcec 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
rosarium 0:2ddc0583bcec 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
rosarium 0:2ddc0583bcec 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
rosarium 0:2ddc0583bcec 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
rosarium 0:2ddc0583bcec 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
rosarium 0:2ddc0583bcec 34 *
rosarium 0:2ddc0583bcec 35 ******************************************************************************
rosarium 0:2ddc0583bcec 36 */
rosarium 0:2ddc0583bcec 37
rosarium 0:2ddc0583bcec 38
rosarium 0:2ddc0583bcec 39 /* Includes ------------------------------------------------------------------*/
rosarium 0:2ddc0583bcec 40 #include "SPIRIT_Aes.h"
rosarium 0:2ddc0583bcec 41 #include "MCU_Interface.h"
rosarium 0:2ddc0583bcec 42
rosarium 0:2ddc0583bcec 43
rosarium 0:2ddc0583bcec 44 /**
rosarium 0:2ddc0583bcec 45 * @addtogroup SPIRIT_Libraries
rosarium 0:2ddc0583bcec 46 * @{
rosarium 0:2ddc0583bcec 47 */
rosarium 0:2ddc0583bcec 48
rosarium 0:2ddc0583bcec 49
rosarium 0:2ddc0583bcec 50 /**
rosarium 0:2ddc0583bcec 51 * @addtogroup SPIRIT_Aes
rosarium 0:2ddc0583bcec 52 * @{
rosarium 0:2ddc0583bcec 53 */
rosarium 0:2ddc0583bcec 54
rosarium 0:2ddc0583bcec 55
rosarium 0:2ddc0583bcec 56 /**
rosarium 0:2ddc0583bcec 57 * @defgroup Aes_Private_TypesDefinitions AES Private Types Definitions
rosarium 0:2ddc0583bcec 58 * @{
rosarium 0:2ddc0583bcec 59 */
rosarium 0:2ddc0583bcec 60
rosarium 0:2ddc0583bcec 61 /**
rosarium 0:2ddc0583bcec 62 * @}
rosarium 0:2ddc0583bcec 63 */
rosarium 0:2ddc0583bcec 64
rosarium 0:2ddc0583bcec 65
rosarium 0:2ddc0583bcec 66 /**
rosarium 0:2ddc0583bcec 67 * @defgroup Aes_Private_Defines AES Private Defines
rosarium 0:2ddc0583bcec 68 * @{
rosarium 0:2ddc0583bcec 69 */
rosarium 0:2ddc0583bcec 70
rosarium 0:2ddc0583bcec 71 /**
rosarium 0:2ddc0583bcec 72 * @}
rosarium 0:2ddc0583bcec 73 */
rosarium 0:2ddc0583bcec 74
rosarium 0:2ddc0583bcec 75
rosarium 0:2ddc0583bcec 76 /**
rosarium 0:2ddc0583bcec 77 * @defgroup Aes_Private_Macros AES Private Macros
rosarium 0:2ddc0583bcec 78 * @{
rosarium 0:2ddc0583bcec 79 */
rosarium 0:2ddc0583bcec 80
rosarium 0:2ddc0583bcec 81 /**
rosarium 0:2ddc0583bcec 82 * @}
rosarium 0:2ddc0583bcec 83 */
rosarium 0:2ddc0583bcec 84
rosarium 0:2ddc0583bcec 85
rosarium 0:2ddc0583bcec 86 /**
rosarium 0:2ddc0583bcec 87 * @defgroup Aes_Private_Variables AES Private Variables
rosarium 0:2ddc0583bcec 88 * @{
rosarium 0:2ddc0583bcec 89 */
rosarium 0:2ddc0583bcec 90
rosarium 0:2ddc0583bcec 91 /**
rosarium 0:2ddc0583bcec 92 * @}
rosarium 0:2ddc0583bcec 93 */
rosarium 0:2ddc0583bcec 94
rosarium 0:2ddc0583bcec 95
rosarium 0:2ddc0583bcec 96 /**
rosarium 0:2ddc0583bcec 97 * @defgroup Aes_Private_FunctionPrototypes AES Private Function Prototypes
rosarium 0:2ddc0583bcec 98 * @{
rosarium 0:2ddc0583bcec 99 */
rosarium 0:2ddc0583bcec 100
rosarium 0:2ddc0583bcec 101 /**
rosarium 0:2ddc0583bcec 102 * @}
rosarium 0:2ddc0583bcec 103 */
rosarium 0:2ddc0583bcec 104
rosarium 0:2ddc0583bcec 105
rosarium 0:2ddc0583bcec 106 /**
rosarium 0:2ddc0583bcec 107 * @defgroup Aes_Private_Functions AES Private Functions
rosarium 0:2ddc0583bcec 108 * @{
rosarium 0:2ddc0583bcec 109 */
rosarium 0:2ddc0583bcec 110
rosarium 0:2ddc0583bcec 111
rosarium 0:2ddc0583bcec 112 /**
rosarium 0:2ddc0583bcec 113 * @brief Enables or Disables the AES engine.
rosarium 0:2ddc0583bcec 114 * @param xNewState new state for AES engine.
rosarium 0:2ddc0583bcec 115 * This parameter can be: S_ENABLE or S_DISABLE.
rosarium 0:2ddc0583bcec 116 * @retval None
rosarium 0:2ddc0583bcec 117 */
rosarium 0:2ddc0583bcec 118 void SpiritAesMode(SpiritFunctionalState xNewState)
rosarium 0:2ddc0583bcec 119 {
rosarium 0:2ddc0583bcec 120 uint8_t tempRegValue = 0x00;
rosarium 0:2ddc0583bcec 121
rosarium 0:2ddc0583bcec 122 /* Check the parameters */
rosarium 0:2ddc0583bcec 123 s_assert_param(IS_SPIRIT_FUNCTIONAL_STATE(xNewState));
rosarium 0:2ddc0583bcec 124
rosarium 0:2ddc0583bcec 125 /* Modifies the register value */
rosarium 0:2ddc0583bcec 126 g_xStatus = SpiritSpiReadRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 127 if(xNewState == S_ENABLE)
rosarium 0:2ddc0583bcec 128 {
rosarium 0:2ddc0583bcec 129 tempRegValue |= AES_MASK;
rosarium 0:2ddc0583bcec 130 }
rosarium 0:2ddc0583bcec 131 else
rosarium 0:2ddc0583bcec 132 {
rosarium 0:2ddc0583bcec 133 tempRegValue &= ~AES_MASK;
rosarium 0:2ddc0583bcec 134 }
rosarium 0:2ddc0583bcec 135
rosarium 0:2ddc0583bcec 136 /* Writes the ANA_FUNC_CONF0 register to enable or disable the AES engine */
rosarium 0:2ddc0583bcec 137 g_xStatus = SpiritSpiWriteRegisters(ANA_FUNC_CONF0_BASE, 1, &tempRegValue);
rosarium 0:2ddc0583bcec 138
rosarium 0:2ddc0583bcec 139 }
rosarium 0:2ddc0583bcec 140
rosarium 0:2ddc0583bcec 141
rosarium 0:2ddc0583bcec 142 /**
rosarium 0:2ddc0583bcec 143 * @brief Writes the data to encrypt or decrypt, or the encryption key for the
rosarium 0:2ddc0583bcec 144 * derive decryption key operation into the AES_DATA_IN registers.
rosarium 0:2ddc0583bcec 145 * @param pcBufferDataIn pointer to the user data buffer. The first byte of the array
rosarium 0:2ddc0583bcec 146 * shall be the MSB byte and it will be put in the AES_DATA_IN[0] register, while
rosarium 0:2ddc0583bcec 147 * the last one shall be the LSB and it will be put in the AES_DATA_IN[cDataLength-1]
rosarium 0:2ddc0583bcec 148 * register. If data to write are less than 16 bytes the remaining AES_DATA_IN registers
rosarium 0:2ddc0583bcec 149 * will be filled with bytes equal to 0. This parameter is an uint8_t*.
rosarium 0:2ddc0583bcec 150 * @param cDataLength length of data in bytes.
rosarium 0:2ddc0583bcec 151 * This parameter is an uint8_t.
rosarium 0:2ddc0583bcec 152 * @retval None
rosarium 0:2ddc0583bcec 153 */
rosarium 0:2ddc0583bcec 154 void SpiritAesWriteDataIn(uint8_t* pcBufferDataIn, uint8_t cDataLength)
rosarium 0:2ddc0583bcec 155 {
rosarium 0:2ddc0583bcec 156 uint8_t i, dataInArray[16];
rosarium 0:2ddc0583bcec 157
rosarium 0:2ddc0583bcec 158 /* Verifies that there are no more than 16 bytes */
rosarium 0:2ddc0583bcec 159 (cDataLength>16) ? (cDataLength=16) : cDataLength;
rosarium 0:2ddc0583bcec 160
rosarium 0:2ddc0583bcec 161 /* Fill the dataInArray with the data buffer, using padding */
rosarium 0:2ddc0583bcec 162 for(i=0;i<16;i++)
rosarium 0:2ddc0583bcec 163 {
rosarium 0:2ddc0583bcec 164 (i<(16 - cDataLength)) ? (dataInArray[i]=0):(dataInArray[i]=pcBufferDataIn[15-i]);
rosarium 0:2ddc0583bcec 165
rosarium 0:2ddc0583bcec 166 }
rosarium 0:2ddc0583bcec 167
rosarium 0:2ddc0583bcec 168 /* Writes the AES_DATA_IN registers */
rosarium 0:2ddc0583bcec 169 g_xStatus = SpiritSpiWriteRegisters(AES_DATA_IN_15_BASE, 16, dataInArray);
rosarium 0:2ddc0583bcec 170
rosarium 0:2ddc0583bcec 171 }
rosarium 0:2ddc0583bcec 172
rosarium 0:2ddc0583bcec 173
rosarium 0:2ddc0583bcec 174 /**
rosarium 0:2ddc0583bcec 175 * @brief Returns the encrypted or decrypted data or the decription key from the AES_DATA_OUT register.
rosarium 0:2ddc0583bcec 176 * @param pcBufferDataOut pointer to the user data buffer. The AES_DATA_OUT[0]
rosarium 0:2ddc0583bcec 177 * register value will be put as first element of the buffer (MSB), while the
rosarium 0:2ddc0583bcec 178 * AES_DAT_OUT[cDataLength-1] register value will be put as last element of the buffer (LSB).
rosarium 0:2ddc0583bcec 179 * This parameter is a uint8_t*.
rosarium 0:2ddc0583bcec 180 * @param cDataLength length of data to read in bytes.
rosarium 0:2ddc0583bcec 181 * This parameter is a uint8_t.
rosarium 0:2ddc0583bcec 182 * @retval None
rosarium 0:2ddc0583bcec 183 */
rosarium 0:2ddc0583bcec 184 void SpiritAesReadDataOut(uint8_t* pcBufferDataOut, uint8_t cDataLength)
rosarium 0:2ddc0583bcec 185 {
rosarium 0:2ddc0583bcec 186 uint8_t address, dataOutArray[16];
rosarium 0:2ddc0583bcec 187
rosarium 0:2ddc0583bcec 188 /* Verifies that there are no more than 16 bytes */
rosarium 0:2ddc0583bcec 189 (cDataLength>16) ? (cDataLength=16) : cDataLength;
rosarium 0:2ddc0583bcec 190
rosarium 0:2ddc0583bcec 191 /* Evaluates the address of AES_DATA_OUT from which start to read */
rosarium 0:2ddc0583bcec 192 address = AES_DATA_OUT_15_BASE+16-cDataLength;
rosarium 0:2ddc0583bcec 193
rosarium 0:2ddc0583bcec 194 /* Reads the exact number of AES_DATA_OUT registers */
rosarium 0:2ddc0583bcec 195 g_xStatus = (SpiritSpiReadRegisters(address, cDataLength, dataOutArray));
rosarium 0:2ddc0583bcec 196
rosarium 0:2ddc0583bcec 197 /* Copy in the user buffer the read values changing the order */
rosarium 0:2ddc0583bcec 198 for(int i = (cDataLength-1); i>=0; i--)
rosarium 0:2ddc0583bcec 199 {
rosarium 0:2ddc0583bcec 200 *pcBufferDataOut = dataOutArray[i];
rosarium 0:2ddc0583bcec 201 pcBufferDataOut++;
rosarium 0:2ddc0583bcec 202 }
rosarium 0:2ddc0583bcec 203
rosarium 0:2ddc0583bcec 204 }
rosarium 0:2ddc0583bcec 205
rosarium 0:2ddc0583bcec 206
rosarium 0:2ddc0583bcec 207 /**
rosarium 0:2ddc0583bcec 208 * @brief Writes the encryption key into the AES_KEY_IN register.
rosarium 0:2ddc0583bcec 209 * @param pcKey pointer to the buffer of 4 words containing the AES key.
rosarium 0:2ddc0583bcec 210 * The first byte of the buffer shall be the most significant byte AES_KEY_0 of the AES key.
rosarium 0:2ddc0583bcec 211 * The last byte of the buffer shall be the less significant byte AES_KEY_15 of the AES key.
rosarium 0:2ddc0583bcec 212 * This parameter is an uint8_t*.
rosarium 0:2ddc0583bcec 213 * @retval None
rosarium 0:2ddc0583bcec 214 */
rosarium 0:2ddc0583bcec 215 void SpiritAesWriteKey(uint8_t* pcKey)
rosarium 0:2ddc0583bcec 216 {
rosarium 0:2ddc0583bcec 217 uint8_t pcTempKey[16];
rosarium 0:2ddc0583bcec 218 for (uint8_t i = 0; i < 16; i++)
rosarium 0:2ddc0583bcec 219 {
rosarium 0:2ddc0583bcec 220 pcTempKey[15-i] = pcKey[i];
rosarium 0:2ddc0583bcec 221 }
rosarium 0:2ddc0583bcec 222
rosarium 0:2ddc0583bcec 223 /* Writes the AES_DATA_IN registers */
rosarium 0:2ddc0583bcec 224 g_xStatus = SpiritSpiWriteRegisters(AES_KEY_IN_15_BASE, 16, pcTempKey);
rosarium 0:2ddc0583bcec 225
rosarium 0:2ddc0583bcec 226 }
rosarium 0:2ddc0583bcec 227
rosarium 0:2ddc0583bcec 228 /**
rosarium 0:2ddc0583bcec 229 * @brief Returns the encryption/decryption key from the AES_KEY_IN register.
rosarium 0:2ddc0583bcec 230 * @param pcKey pointer to the buffer of 4 words (16 bytes) containing the AES key.
rosarium 0:2ddc0583bcec 231 * The first byte of the buffer shall be the most significant byte AES_KEY_0 of the AES key.
rosarium 0:2ddc0583bcec 232 * The last byte of the buffer shall be the less significant byte AES_KEY_15 of the AES key.
rosarium 0:2ddc0583bcec 233 * This parameter is an uint8_t*.
rosarium 0:2ddc0583bcec 234 * @retval None
rosarium 0:2ddc0583bcec 235 */
rosarium 0:2ddc0583bcec 236 void SpiritAesReadKey(uint8_t* pcKey)
rosarium 0:2ddc0583bcec 237 {
rosarium 0:2ddc0583bcec 238 uint8_t pcTempKey[16];
rosarium 0:2ddc0583bcec 239
rosarium 0:2ddc0583bcec 240 /* Reads the AES_DATA_IN registers */
rosarium 0:2ddc0583bcec 241 g_xStatus = SpiritSpiReadRegisters(AES_KEY_IN_15_BASE, 16, pcTempKey);
rosarium 0:2ddc0583bcec 242
rosarium 0:2ddc0583bcec 243
rosarium 0:2ddc0583bcec 244 for (uint8_t i = 0; i < 16; i++)
rosarium 0:2ddc0583bcec 245 pcKey[i] = pcTempKey[15-i];
rosarium 0:2ddc0583bcec 246
rosarium 0:2ddc0583bcec 247 }
rosarium 0:2ddc0583bcec 248
rosarium 0:2ddc0583bcec 249
rosarium 0:2ddc0583bcec 250
rosarium 0:2ddc0583bcec 251 /**
rosarium 0:2ddc0583bcec 252 * @brief Derives the decryption key from a given encryption key.
rosarium 0:2ddc0583bcec 253 * @param None.
rosarium 0:2ddc0583bcec 254 * @retval None.
rosarium 0:2ddc0583bcec 255 */
rosarium 0:2ddc0583bcec 256 void SpiritAesDeriveDecKeyFromEnc(void)
rosarium 0:2ddc0583bcec 257 {
rosarium 0:2ddc0583bcec 258 /* Sends the COMMAND_AES_KEY command */
rosarium 0:2ddc0583bcec 259 g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_KEY);
rosarium 0:2ddc0583bcec 260
rosarium 0:2ddc0583bcec 261 }
rosarium 0:2ddc0583bcec 262
rosarium 0:2ddc0583bcec 263
rosarium 0:2ddc0583bcec 264 /**
rosarium 0:2ddc0583bcec 265 * @brief Executes the encryption operation.
rosarium 0:2ddc0583bcec 266 * @param None.
rosarium 0:2ddc0583bcec 267 * @retval None.
rosarium 0:2ddc0583bcec 268 */
rosarium 0:2ddc0583bcec 269 void SpiritAesExecuteEncryption(void)
rosarium 0:2ddc0583bcec 270 {
rosarium 0:2ddc0583bcec 271 /* Sends the COMMAND_AES_ENC command */
rosarium 0:2ddc0583bcec 272 g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_ENC);
rosarium 0:2ddc0583bcec 273
rosarium 0:2ddc0583bcec 274 }
rosarium 0:2ddc0583bcec 275
rosarium 0:2ddc0583bcec 276
rosarium 0:2ddc0583bcec 277 /**
rosarium 0:2ddc0583bcec 278 * @brief Executes the decryption operation.
rosarium 0:2ddc0583bcec 279 * @param None.
rosarium 0:2ddc0583bcec 280 * @retval None.
rosarium 0:2ddc0583bcec 281 */
rosarium 0:2ddc0583bcec 282 void SpiritAesExecuteDecryption(void)
rosarium 0:2ddc0583bcec 283 {
rosarium 0:2ddc0583bcec 284 /* Sends the COMMAND_AES_DEC command */
rosarium 0:2ddc0583bcec 285 g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_DEC);
rosarium 0:2ddc0583bcec 286
rosarium 0:2ddc0583bcec 287 }
rosarium 0:2ddc0583bcec 288
rosarium 0:2ddc0583bcec 289
rosarium 0:2ddc0583bcec 290 /**
rosarium 0:2ddc0583bcec 291 * @brief Executes the key derivation and the decryption operation.
rosarium 0:2ddc0583bcec 292 * @param None.
rosarium 0:2ddc0583bcec 293 * @retval None.
rosarium 0:2ddc0583bcec 294 */
rosarium 0:2ddc0583bcec 295 void SpiritAesDeriveDecKeyExecuteDec(void)
rosarium 0:2ddc0583bcec 296 {
rosarium 0:2ddc0583bcec 297 /* Sends the COMMAND_AES_KEY_DEC command */
rosarium 0:2ddc0583bcec 298 g_xStatus = SpiritSpiCommandStrobes(COMMAND_AES_KEY_DEC);
rosarium 0:2ddc0583bcec 299
rosarium 0:2ddc0583bcec 300 }
rosarium 0:2ddc0583bcec 301
rosarium 0:2ddc0583bcec 302
rosarium 0:2ddc0583bcec 303 /**
rosarium 0:2ddc0583bcec 304 * @}
rosarium 0:2ddc0583bcec 305 */
rosarium 0:2ddc0583bcec 306
rosarium 0:2ddc0583bcec 307
rosarium 0:2ddc0583bcec 308 /**
rosarium 0:2ddc0583bcec 309 * @}
rosarium 0:2ddc0583bcec 310 */
rosarium 0:2ddc0583bcec 311
rosarium 0:2ddc0583bcec 312
rosarium 0:2ddc0583bcec 313 /**
rosarium 0:2ddc0583bcec 314 * @}
rosarium 0:2ddc0583bcec 315 */
rosarium 0:2ddc0583bcec 316
rosarium 0:2ddc0583bcec 317
rosarium 0:2ddc0583bcec 318
rosarium 0:2ddc0583bcec 319 /******************* (C) COPYRIGHT 2015 STMicroelectronics *****END OF FILE****/