This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

Dependencies:   NDefLib X_NUCLEO_NFC01A1 mbed

Fork of X-MBED-NFC1 by Giovanni Visentini

This application provides a set of demos with X-NUCLEO-NFC01A1 expansion board.

The available demos are:

  • SAMPLE_WRITE_URL: write a tag with the ST home page URL
  • SAMPLE_COUNT_CLICK: create a custom tag to count and report the user button clicks.
  • SAMPLE_WRITE_AND_CHANGE_ALL: write a tag with all the supported records and update the tag contents when the user button is pressed.
  • SAMPLE_LOCK_TAG_CONTENT: use the M24SR component API to set the NFC tag as read-only.

To enable the different demos comment/uncomment the SAMPLE_* macros provided in main.cpp .

Files at this revision

API Documentation at this revision

Comitter:
giovannivisentini
Date:
Fri Nov 27 15:10:25 2015 +0000
Parent:
0:674813bd5ec9
Child:
2:0648c1561eb2
Commit message:
add the enable/disable read/write function

Changed in this revision

Common/nfc.h Show annotated file Show diff for this revision Revisions of this file
Interfaces/Component_class.h Show annotated file Show diff for this revision Revisions of this file
Interfaces/Nfc_class.h Show annotated file Show diff for this revision Revisions of this file
NDefLib.lib Show annotated file Show diff for this revision Revisions of this file
Type4NfcTag.h Show diff for this revision Revisions of this file
Type4NfcTagSTM24SR.cpp Show annotated file Show diff for this revision Revisions of this file
Type4NfcTagSTM24SR.h Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_NFC01A1.cpp Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_NFC01A1.h Show annotated file Show diff for this revision Revisions of this file
m24sr/lib_M24SR.cpp Show diff for this revision Revisions of this file
m24sr/lib_M24SR.h Show diff for this revision Revisions of this file
m24sr/m24sr.h Show annotated file Show diff for this revision Revisions of this file
m24sr/m24sr_class.cpp Show annotated file Show diff for this revision Revisions of this file
m24sr/m24sr_class.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Common/nfc.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/Common/nfc.h	Fri Nov 27 15:10:25 2015 +0000
@@ -1,184 +1,182 @@
-/**
- ******************************************************************************
- * @file    nfc.h
- * @author  ST Central Labs
- * @version V1.0.0
- * @date    14-October-2015
- * @brief   This header file contains the functions prototypes for the
- *          NFC device driver.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *   1. Redistributions of source code must retain the above copyright notice,
- *      this list of conditions and the following disclaimer.
- *   2. Redistributions in binary form must reproduce the above copyright notice,
- *      this list of conditions and the following disclaimer in the documentation
- *      and/or other materials provided with the distribution.
- *   3. Neither the name of STMicroelectronics nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
-#ifndef __NFC_H_
-#define __NFC_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
-#include "component.h"
-/** @addtogroup BSP
- * @{
- */
-
-/** @addtogroup Components
- * @{
- */
-
-/** @addtogroup NFC
- * @{
- */
-
-/** @defgroup NFC_Exported_Types
- * @{
- */
-
-/**
- * @brief  NFC init structure definition
- */
-typedef void* NFC_InitTypeDef;
-/**
- * @brief  Humidity and temperature status enumerator definition
- */
-typedef enum {
-	NFC_OK = 0x9000,
-	NFC_ERROR=0x6F00,
-	NFC_FILE_OVERFLOW_LE = 0x6280,
-	NFC_EOF = 0x6282,
-	NFC_PASSWORD_REQUIRED = 0x6300,
-	NFC_PASSWORD_INCORRECT = 0x63C0,
-	NFC_PASSWORD_INCORRECT1RETRY = 0x63C1,
-	NFC_PASSWORD_INCORRECT2RETRY = 0x63C2,
-	NFC_WRONG_LENGHT = 0x6700,
-	NFC_UNSUCESSFUL_UPDATING = 0x6581,
-	NFC_INCOPATIBLE_COMMAND= 0x6981,
-	NFC_SECURITY_UNSATISFIED = 0x6982,
-	NFC_REFERENCE_DATA_NOT_USABLE = 0x6984,
-
-	NFC_INCORRECT_PARAMETER = 0x6a80,
-	NFC_FILE_NOT_FOUND=0x6a82,
-	NFC_FILE_OVERFLOW_LC = 0x6A84, //TODO difference with Le??
-
-	NFC_INCORRECT_P1_OR_P2 = 0x6A86, //TODO better name?
-	NFC_RF_SESSION_KILLED=0x6500,
-	NFC_INS_NOT_SUPPORTED=0x6D00,
-	NFC_CLASS_NOT_SUPPORTED=0x6E00,
-
-	//IOError
-	NFC_IO_SUCCESS=0x0000,
-	NFC_IO_ERROR_DEFAULT=0x0010,
-	NFC_IO_ERROR_I2CTIMEOUT=0x0011,
-	NFC_IO_ERROR_CRC=0x0012,
-	NFC_IO_ERROR_NACK=0x0013,
-	NFC_IO_ERROR_PARAMETER=0x0014,
-	NFC_IO_ERROR_NBATEMPT=0x0015,
-	NFC_IO_NOACKNOWLEDGE=0x0016
-} NFC_StatusTypeDef;
-
-/**
- * @brief  NFC component identifier enumerator definition.
- */
-typedef enum
-{
-	NFC_NONE_COMPONENT = 0,
-	NFC_M24SR_COMPONENT = 1
-} NFC_ComponentTypeDef;
-
-
-/**
- * @brief  NFC driver structure definition
- */
-typedef struct {
-	/* Generic */
-	NFC_StatusTypeDef (*Init)      (void *handle, NFC_InitTypeDef *init);
-	NFC_StatusTypeDef (*ReadID)    (void *handle, uint8_t *id);
-
-	/* Interrupts */
-	NFC_StatusTypeDef (*SendInterrupt)(void *handle);
-
-	/* Specific */
-	//I2C session Commands:
-	NFC_StatusTypeDef (*GetSession)(void *handle);
-	NFC_StatusTypeDef (*KillSession)(void *handle);
-	NFC_StatusTypeDef (*Deselect)(void *handle);
-
-	//NFC forum type 4 commands:
-	NFC_StatusTypeDef (*SelectApplication)(void *handle);
-	NFC_StatusTypeDef (*SelectCCfile)(void *handle);
-	NFC_StatusTypeDef (*SelectNDEFfile)(void *handle, uint16_t NDEFfileId);
-	NFC_StatusTypeDef (*SelectSystemfile)(void *handle);
-	NFC_StatusTypeDef (*ReadBinary)(void *handle, uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead);
-	NFC_StatusTypeDef (*UpdateBinary)(void *handle, uint16_t Offset, uint8_t NbByteToWrite, uint8_t *pDataToWrite);
-
-	//ISO/IEC 7816-4 commands:
-	NFC_StatusTypeDef (*Verify)(void *handle, uint16_t uPwdId, uint8_t NbPwdByte, uint8_t *pPwd);
-	NFC_StatusTypeDef (*ChangeReferenceData)(void *handle, uint16_t uPwdId, uint8_t *pPwd);
-	NFC_StatusTypeDef (*EnableVerificationRequirement)(void *handle, uint16_t uReadOrWrite);
-	NFC_StatusTypeDef (*DisableVerificationRequirement)(void *handle, uint16_t uReadOrWrite);
-
-	//ST Specific
-	NFC_StatusTypeDef (*STReadBinary)(void *handle, uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead);
-	NFC_StatusTypeDef (*EnablePermanentState)(void *handle, uint16_t uReadOrWrite);
-	NFC_StatusTypeDef (*DisablePermanentState)(void *handle, uint16_t uReadOrWrite);
-
-	//??
-
-	NFC_StatusTypeDef (*StateControl)(void *handle, uint8_t uSetOrReset);
-	NFC_StatusTypeDef (*ManageI2CGPO)(void *handle, uint8_t GPO_I2Cconfig);
-	NFC_StatusTypeDef (*ManageRFGPO)(void *handle, uint8_t GPO_RFconfig);
-	NFC_StatusTypeDef (*RFConfig)(void *handle, uint8_t OnOffChoice);
-
-} NFC_DrvVTableTypeDef;
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __NFC_H_ */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
+/**
+ ******************************************************************************
+ * @file    nfc.h
+ * @author  ST Central Labs
+ * @version V1.0.0
+ * @date    14-October-2015
+ * @brief   This header file contains the functions prototypes for the
+ *          NFC device driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+#ifndef __NFC_H_
+#define __NFC_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include <stdint.h>
+#include "component.h"
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup Components
+ * @{
+ */
+
+/** @addtogroup NFC
+ * @{
+ */
+
+/** @defgroup NFC_Exported_Types
+ * @{
+ */
+
+/**
+ * @brief  NFC init structure definition
+ */
+typedef void* NFC_InitTypeDef;
+/**
+ * @brief  Humidity and temperature status enumerator definition
+ */
+typedef enum {
+	NFC_SUCCESS=0x0000,
+	NFC_ERROR=0x6F00,
+	NFC_FILE_OVERFLOW_LE = 0x6280,
+	NFC_EOF = 0x6282,
+	NFC_PASSWORD_REQUIRED = 0x6300,
+	NFC_PASSWORD_INCORRECT = 0x63C0,
+	NFC_PASSWORD_INCORRECT1RETRY = 0x63C1,
+	NFC_PASSWORD_INCORRECT2RETRY = 0x63C2,
+	NFC_WRONG_LENGHT = 0x6700,
+	NFC_UNSUCESSFUL_UPDATING = 0x6581,
+	NFC_INCOPATIBLE_COMMAND= 0x6981,
+	NFC_SECURITY_UNSATISFIED = 0x6982,
+	NFC_REFERENCE_DATA_NOT_USABLE = 0x6984,
+
+	NFC_INCORRECT_PARAMETER = 0x6a80,
+	NFC_FILE_NOT_FOUND=0x6a82,
+	NFC_FILE_OVERFLOW_LC = 0x6A84, //TODO difference with Le??
 
+	NFC_INCORRECT_P1_OR_P2 = 0x6A86, //TODO better name?
+	NFC_RF_SESSION_KILLED=0x6500,
+	NFC_INS_NOT_SUPPORTED=0x6D00,
+	NFC_CLASS_NOT_SUPPORTED=0x6E00,
+
+	//IOError
+
+	NFC_IO_ERROR_I2CTIMEOUT=0x0011,
+	NFC_IO_ERROR_CRC=0x0012,
+	NFC_IO_ERROR_NACK=0x0013,
+	NFC_IO_ERROR_PARAMETER=0x0014,
+	NFC_IO_ERROR_NBATEMPT=0x0015,
+	NFC_IO_NOACKNOWLEDGE=0x0016
+} NFC_StatusTypeDef;
+
+/**
+ * @brief  NFC component identifier enumerator definition.
+ */
+typedef enum
+{
+	NFC_NONE_COMPONENT = 0,
+	NFC_M24SR_COMPONENT = 1
+} NFC_ComponentTypeDef;
+
+
+/**
+ * @brief  NFC driver structure definition
+ */
+typedef struct {
+	/* Generic */
+	NFC_StatusTypeDef (*Init)      (void *handle, NFC_InitTypeDef *init);
+	NFC_StatusTypeDef (*ReadID)    (void *handle, uint8_t *id);
+
+	/* Interrupts */
+	NFC_StatusTypeDef (*SendInterrupt)(void *handle);
+
+	/* Specific */
+	//I2C session Commands:
+	NFC_StatusTypeDef (*GetSession)(void *handle);
+	NFC_StatusTypeDef (*KillSession)(void *handle);
+	NFC_StatusTypeDef (*Deselect)(void *handle);
+
+	//NFC forum type 4 commands:
+	NFC_StatusTypeDef (*SelectApplication)(void *handle);
+	NFC_StatusTypeDef (*SelectCCfile)(void *handle);
+	NFC_StatusTypeDef (*SelectNDEFfile)(void *handle, uint16_t NDEFfileId);
+	NFC_StatusTypeDef (*SelectSystemfile)(void *handle);
+	NFC_StatusTypeDef (*ReadBinary)(void *handle, uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead);
+	NFC_StatusTypeDef (*UpdateBinary)(void *handle, uint16_t Offset, uint8_t NbByteToWrite, uint8_t *pDataToWrite);
+
+	//ISO/IEC 7816-4 commands:
+	NFC_StatusTypeDef (*Verify)(void *handle, uint16_t uPwdId, uint8_t NbPwdByte, uint8_t *pPwd);
+	NFC_StatusTypeDef (*ChangeReferenceData)(void *handle, uint16_t uPwdId, uint8_t *pPwd);
+	NFC_StatusTypeDef (*EnableVerificationRequirement)(void *handle, uint16_t uReadOrWrite);
+	NFC_StatusTypeDef (*DisableVerificationRequirement)(void *handle, uint16_t uReadOrWrite);
+
+	//ST Specific
+	NFC_StatusTypeDef (*STReadBinary)(void *handle, uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead);
+	NFC_StatusTypeDef (*EnablePermanentState)(void *handle, uint16_t uReadOrWrite);
+	NFC_StatusTypeDef (*DisablePermanentState)(void *handle, uint16_t uReadOrWrite);
+
+	//??
+
+	NFC_StatusTypeDef (*StateControl)(void *handle, uint8_t uSetOrReset);
+	NFC_StatusTypeDef (*ManageI2CGPO)(void *handle, uint8_t GPO_I2Cconfig);
+	NFC_StatusTypeDef (*ManageRFGPO)(void *handle, uint8_t GPO_RFconfig);
+	NFC_StatusTypeDef (*RFConfig)(void *handle, uint8_t OnOffChoice);
+
+} NFC_DrvVTableTypeDef;
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NFC_H_ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/Interfaces/Component_class.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/Interfaces/Component_class.h	Fri Nov 27 15:10:25 2015 +0000
@@ -1,78 +1,77 @@
-/**
- ******************************************************************************
- * @file    Component_class.h
- * @author  AST / EST
- * @version V0.0.1
- * @date    13-April-2015
- * @brief   This file contains the abstract class describing the interface of a
- *          generic component.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *   1. Redistributions of source code must retain the above copyright notice,
- *      this list of conditions and the following disclaimer.
- *   2. Redistributions in binary form must reproduce the above copyright notice,
- *      this list of conditions and the following disclaimer in the documentation
- *      and/or other materials provided with the distribution.
- *   3. Neither the name of STMicroelectronics nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
-
-
-/* Define to prevent from recursive inclusion --------------------------------*/
-
-#ifndef __COMPONENT_CLASS_H
-#define __COMPONENT_CLASS_H
-
-
-/* Includes ------------------------------------------------------------------*/
-
-#include <stdint.h>
-
-
-/* Classes  ------------------------------------------------------------------*/
-
-/** An abstract class for Generic components.
- */
-class Component
-{
-public:
-	/**
-	 * @brief       Initialization of the component.
-	 * @param[out]  ptr Pointer to device specific initalization structure.
-	 * @return      0 in case of success, an error code otherwise.
-	 */
-	virtual int Init(void *ptr) = 0;
-
-	/**
-	 * @brief       Get ID of the component.
-	 * @param[out]  id Pointer to where to store the ID to.
-	 * @return      0 in case of success, an error code otherwise.
-	 */
-	virtual int ReadID(uint8_t *id) = 0;
-
-	virtual ~Component(){};
-};
-
-#endif /* __COMPONENT_CLASS_H */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 
+/**
+ ******************************************************************************
+ * @file    Component_class.h
+ * @author  AST / EST
+ * @version V0.0.1
+ * @date    13-April-2015
+ * @brief   This file contains the abstract class describing the interface of a
+ *          generic component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
 
+/* Define to prevent from recursive inclusion --------------------------------*/
+
+#ifndef __COMPONENT_CLASS_H
+#define __COMPONENT_CLASS_H
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include <stdint.h>
+
+
+/* Classes  ------------------------------------------------------------------*/
+
+/** An abstract class for Generic components.
+ */
+class Component
+{
+public:
+	/**
+	 * @brief       Initialization of the component.
+	 * @param[out]  ptr Pointer to device specific initalization structure.
+	 * @return      0 in case of success, an error code otherwise.
+	 */
+	virtual int Init(void *ptr) = 0;
+
+	/**
+	 * @brief       Get ID of the component.
+	 * @param[out]  id Pointer to where to store the ID to.
+	 * @return      0 in case of success, an error code otherwise.
+	 */
+	virtual int ReadID(uint8_t *id) = 0;
+
+	virtual ~Component(){};
+};
+
+#endif /* __COMPONENT_CLASS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 
--- a/Interfaces/Nfc_class.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/Interfaces/Nfc_class.h	Fri Nov 27 15:10:25 2015 +0000
@@ -1,108 +1,114 @@
-/**
- ******************************************************************************
- * @file    Nfc_class.h
- * @author  AST / EST
- * @version V0.0.1
- * @date    13-April-2015
- * @brief   This file contains the abstract class describing the interface of a
- *          nfc component.
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *   1. Redistributions of source code must retain the above copyright notice,
- *      this list of conditions and the following disclaimer.
- *   2. Redistributions in binary form must reproduce the above copyright notice,
- *      this list of conditions and the following disclaimer in the documentation
- *      and/or other materials provided with the distribution.
- *   3. Neither the name of STMicroelectronics nor the names of its contributors
- *      may be used to endorse or promote products derived from this software
- *      without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- ******************************************************************************
- */
-
-
-/* Generated with Stm32CubeTOO -----------------------------------------------*/
-
-
-/* Revision ------------------------------------------------------------------*/
-/*
-	Repository:       http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
-	Branch/Trunk/Tag: trunk
-	Based on:         X-CUBE-MEMS1/trunk/Drivers/BSP/Components/Common/nfc.h
-	Revision:         385
-*/
-
-
-/* Define to prevent from recursive inclusion --------------------------------*/
-
-#ifndef __NFC_CLASS_H
-#define __NFC_CLASS_H
-
-
-/* Includes ------------------------------------------------------------------*/
-
-#include "Component_class.h"
-
-
-/* Classes  ------------------------------------------------------------------*/
-
-/** An abstract class for Nfc components.
- */
-class Nfc : public Component
-{
-public:
-	/* ACTION 1 --------------------------------------------------------------*
-	 * Declare here the interface's methods.                                  *
-	 * They should be:                                                        *
-	 *   + Methods with the same name of the C component's virtual table      *
-	 *     (and extended virtual table, if any)'s functions, provided that    *
-	 *     the component's driver implements them (i.e.: the corresponding    *
-	 *     pointer to function is not "0").                                   *
-	 *                                                                        *
-	 * Example:                                                               *
-	 *    virtual int GetValue(float *pfData) = 0;                            *
-	 *------------------------------------------------------------------------*/
-	virtual NFC_StatusTypeDef GetSession(void) = 0;
-	virtual NFC_StatusTypeDef KillSession(void) = 0;
-	virtual NFC_StatusTypeDef Deselect(void) = 0;
-	virtual NFC_StatusTypeDef SelectApplication(void) = 0;
-	virtual NFC_StatusTypeDef SelectCCfile(void) = 0;
-	virtual NFC_StatusTypeDef SelectNDEFfile(uint16_t NDEFfileId) = 0;
-	virtual NFC_StatusTypeDef SelectSystemfile(void) = 0;
-	virtual NFC_StatusTypeDef ReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead) = 0;
-	virtual NFC_StatusTypeDef UpdateBinary(uint16_t Offset, uint8_t NbByteToWrite, uint8_t *pDataToWrite) = 0;
-	virtual NFC_StatusTypeDef Verify(uint16_t uPwdId, uint8_t NbPwdByte, uint8_t *pPwd) = 0;
-	virtual NFC_StatusTypeDef ChangeReferenceData(uint16_t uPwdId, uint8_t *pPwd) = 0;
-	virtual NFC_StatusTypeDef EnableVerificationRequirement(uint16_t uReadOrWrite) = 0;
-	virtual NFC_StatusTypeDef DisableVerificationRequirement(uint16_t uReadOrWrite) = 0;
-	virtual NFC_StatusTypeDef STReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead) = 0;
-	virtual NFC_StatusTypeDef EnablePermanentState(uint16_t uReadOrWrite) = 0;
-	virtual NFC_StatusTypeDef DisablePermanentState(uint16_t uReadOrWrite) = 0;
-	virtual NFC_StatusTypeDef StateControl(uint8_t uSetOrReset) = 0;
-	virtual NFC_StatusTypeDef ManageI2CGPO(uint8_t GPO_I2Cconfig) = 0;
-	virtual NFC_StatusTypeDef ManageRFGPO(uint8_t GPO_RFconfig) = 0;
-	virtual NFC_StatusTypeDef RFConfig(uint8_t OnOffChoice) = 0;
-
-	virtual ~Nfc(){};
-};
-
-#endif /* __NFC_CLASS_H */
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 
+/**
+ ******************************************************************************
+ * @file    Nfc_class.h
+ * @author  AST / EST
+ * @version V0.0.1
+ * @date    13-April-2015
+ * @brief   This file contains the abstract class describing the interface of a
+ *          nfc component.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+
+/* Generated with Stm32CubeTOO -----------------------------------------------*/
+
+
+/* Revision ------------------------------------------------------------------*/
+/*
+	Repository:       http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
+	Branch/Trunk/Tag: trunk
+	Based on:         X-CUBE-MEMS1/trunk/Drivers/BSP/Components/Common/nfc.h
+	Revision:         385
+*/
+
+
+/* Define to prevent from recursive inclusion --------------------------------*/
+
+#ifndef __NFC_CLASS_H
+#define __NFC_CLASS_H
+
 
+/* Includes ------------------------------------------------------------------*/
+
+#include "Component_class.h"
+
+
+/* Classes  ------------------------------------------------------------------*/
+
+/** An abstract class for Nfc components.
+ */
+class Nfc : public Component
+{
+public:
+
+	typedef enum{
+		ReadPwd=READ_PWD,
+		WritePwd=WRITE_PWD,
+		I2CPwd=I2C_PWD,
+	}PasswordType_t;
+
+	/* ACTION 1 --------------------------------------------------------------*
+	 * Declare here the interface's methods.                                  *
+	 * They should be:                                                        *
+	 *   + Methods with the same name of the C component's virtual table      *
+	 *     (and extended virtual table, if any)'s functions, provided that    *
+	 *     the component's driver implements them (i.e.: the corresponding    *
+	 *     pointer to function is not "0").                                   *
+	 *                                                                        *
+	 * Example:                                                               *
+	 *    virtual int GetValue(float *pfData) = 0;                            *
+	 *------------------------------------------------------------------------*/
+	virtual NFC_StatusTypeDef GetSession(void) = 0;
+	virtual NFC_StatusTypeDef KillSession(void) = 0;
+	virtual NFC_StatusTypeDef Deselect(void) = 0;
+	virtual NFC_StatusTypeDef SelectApplication(void) = 0;
+	virtual NFC_StatusTypeDef SelectCCfile(void) = 0;
+	virtual NFC_StatusTypeDef SelectNDEFfile(uint16_t NDEFfileId) = 0;
+	virtual NFC_StatusTypeDef SelectSystemfile(void) = 0;
+	virtual NFC_StatusTypeDef ReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead) = 0;
+	virtual NFC_StatusTypeDef UpdateBinary(uint16_t Offset, uint8_t NbByteToWrite, uint8_t *pDataToWrite) = 0;
+	virtual NFC_StatusTypeDef Verify(PasswordType_t uPwdId, uint8_t NbPwdByte,const uint8_t *pPwd) = 0;
+	virtual NFC_StatusTypeDef ChangeReferenceData(PasswordType_t uPwdId,const uint8_t *pPwd) = 0;
+	virtual NFC_StatusTypeDef EnableVerificationRequirement(PasswordType_t uReadOrWrite) = 0;
+	virtual NFC_StatusTypeDef DisableVerificationRequirement(PasswordType_t uReadOrWrite) = 0;
+	virtual NFC_StatusTypeDef STReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead) = 0;
+	virtual NFC_StatusTypeDef EnablePermanentState(PasswordType_t uReadOrWrite) = 0;
+	virtual NFC_StatusTypeDef DisablePermanentState(PasswordType_t uReadOrWrite) = 0;
+	virtual NFC_StatusTypeDef StateControl(uint8_t uSetOrReset) = 0;
+	virtual NFC_StatusTypeDef ManageI2CGPO(uint8_t GPO_I2Cconfig) = 0;
+	virtual NFC_StatusTypeDef ManageRFGPO(uint8_t GPO_RFconfig) = 0;
+	virtual NFC_StatusTypeDef RFConfig(uint8_t OnOffChoice) = 0;
+
+	virtual ~Nfc(){};
+};
+
+#endif /* __NFC_CLASS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 
--- a/NDefLib.lib	Thu Nov 19 08:50:18 2015 +0000
+++ b/NDefLib.lib	Fri Nov 27 15:10:25 2015 +0000
@@ -1,1 +1,1 @@
-NDefLib#04b82ae7aa43
+NDefLib#64bb6d5224dc
--- a/Type4NfcTag.h	Thu Nov 19 08:50:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,38 +0,0 @@
-/*
- * Type4NfcTag.h
- *
- *  Created on: Nov 5, 2015
- *      Author: giovanni visentini
- */
-
-#ifndef TYPE4NFCTAG_H_
-#define TYPE4NFCTAG_H_
-
-#include "NDefLib/Message.h"
-
-class Type4NfcTag {
-public:
-
-	virtual bool openSession(bool force=false)=0;
-	virtual bool closeSession()=0;
-
-	bool write(NDefLib::Message &msg){
-		const uint16_t length = msg.getByteLenght();
-		uint8_t *buffer = new uint8_t[length];
-		msg.write(buffer);
-		bool retValue =  writeByte(buffer,length);
-		delete [] buffer;
-		return retValue;
-	}
-
-	virtual bool read(void*)=0;
-
-	virtual ~Type4NfcTag(){};
-
-protected:
-	virtual bool writeByte(uint8_t *buffer,uint16_t lenght)=0;
-
-};
-
-#endif /* TYPE4NFCTAG_H_ */
-
--- a/Type4NfcTagSTM24SR.cpp	Thu Nov 19 08:50:18 2015 +0000
+++ b/Type4NfcTagSTM24SR.cpp	Fri Nov 27 15:10:25 2015 +0000
@@ -14,97 +14,113 @@
 
 #define CC_FILE_LENGTH_BYTE 15
 
-bool Type4NfcTagSTM24SR::openSession(bool force){
+bool Type4NfcTagSTM24SR::openSession(bool force) {
 
-	if(mSessionIsOpen)
+	if (mSessionIsOpen)
 		return true;
 	//else
-	if(force)
+	if (force)
 		mDevice.KillSession();
 
-
-	int8_t nTrials=OPENSESSION_NTRIALS;
+	int8_t nTrials = OPENSESSION_NTRIALS;
 	NFC_StatusTypeDef status = NFC_ERROR;
-	while(status != NFC_OK && nTrials){
-		status = mDevice.GetSession( );
+	while (status != NFC_SUCCESS && nTrials) {
+		status = mDevice.GetSession();
 		nTrials--;
 	}
 
-	if (status != NFC_OK){
+	if (status != NFC_SUCCESS) {
 		return false;
-	}//else
+	} //else
 
 	//Select the NFC type 4 application
-	if(mDevice.SelectApplication()!=NFC_OK)
+	if (mDevice.SelectApplication() != NFC_SUCCESS)
 		return false;
 
-	if(mDevice.SelectCCfile()!=NFC_OK)
+	if (mDevice.SelectCCfile() != NFC_SUCCESS)
 		return false;
 
 	uint8_t CCFile[CC_FILE_LENGTH_BYTE];
 	/* read the first 15 bytes of the CC file */
-	if(mDevice.ReadBinary(0x0000,CC_FILE_LENGTH_BYTE,CCFile)!=NFC_OK)
+	if (mDevice.ReadBinary(0x0000, CC_FILE_LENGTH_BYTE, CCFile) != NFC_SUCCESS)
 		return false;
 
 	//read the ndefFileId
-	uint16_t ndefFileId = (uint16_t) ((CCFile[0x09]<<8) | CCFile[0x0A]);
-	mMaxReadBytes = (uint16_t) ((CCFile[0x03]<<8) | CCFile[0x04]);
-	mMaxWriteBytes =(uint16_t) ((CCFile[0x05]<<8) | CCFile[0x06]);
+	uint16_t ndefFileId = (uint16_t) ((CCFile[0x09] << 8) | CCFile[0x0A]);
+	mMaxReadBytes = (uint16_t) ((CCFile[0x03] << 8) | CCFile[0x04]);
+	mMaxWriteBytes = (uint16_t) ((CCFile[0x05] << 8) | CCFile[0x06]);
 
 	//openit
-	if(mDevice.SelectNDEFfile(ndefFileId)!=NFC_OK)
+	if (mDevice.SelectNDEFfile(ndefFileId) != NFC_SUCCESS)
 		return false;
 
-	mSessionIsOpen=true;
+	mSessionIsOpen = true;
 	return true;
 }
 
-
-bool Type4NfcTagSTM24SR::closeSession(){
+bool Type4NfcTagSTM24SR::closeSession() {
 
 	//no open session
-	if(!mSessionIsOpen)
+	if (!mSessionIsOpen)
 		return true;
 
 	//close the CC file
-	if(mDevice.Deselect()!=NFC_OK)
+	if (mDevice.Deselect() != NFC_SUCCESS)
 		return false;
 
-	mSessionIsOpen=false;
+	mSessionIsOpen = false;
 	return true;
 }
 
-bool Type4NfcTagSTM24SR::writeByte(uint8_t *buffer,uint16_t length){
+bool Type4NfcTagSTM24SR::writeByte(uint8_t *buffer, uint16_t length) {
 
-	NFC_StatusTypeDef status=NFC_OK;
-	uint16_t offset=0;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t offset = 0;
 	bool prevSessionStatus = mSessionIsOpen;
-	if(!prevSessionStatus){
+	if (!prevSessionStatus) {
 		//try to acquire a session or fail
-		if(openSession(false))
+		if (openSession(false))
 			return false;
-	}//if
+	} //if
 
-	if( length > mMaxWriteBytes){
-		do{
-			status = mDevice.UpdateBinary (  offset, mMaxWriteBytes , buffer);
+	if (length > mMaxWriteBytes) {
+		do {
+			status = mDevice.UpdateBinary(offset, mMaxWriteBytes, buffer);
 			offset += mMaxWriteBytes;
 			buffer += mMaxWriteBytes;
 			length -= mMaxWriteBytes;
-		}while( length > mMaxWriteBytes && status == NFC_OK);
-	}//if
+		} while (length > mMaxWriteBytes && status == NFC_SUCCESS);
+	} //if
 
 	//finish to write the buffer
-	if( status == NFC_OK && mMaxWriteBytes)
-		status = mDevice.UpdateBinary (  offset,length  , buffer);
+	if (status == NFC_SUCCESS && mMaxWriteBytes)
+		status = mDevice.UpdateBinary(offset, length, buffer);
 
-	if(status==NFC_OK){
-		if(!prevSessionStatus) // if the session was closed, try close it
+	if (status == NFC_SUCCESS) {
+		if (!prevSessionStatus) // if the session was closed, try close it
 			return closeSession();
 		else
 			return true;
-	}else
+	} else
 		return false;
-
 }
 
+bool Type4NfcTagSTM24SR::readByte(uint16_t byteOffset, uint16_t byteLength,
+		uint8_t *buffer) {
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t offset = byteOffset;
+	if (byteLength > mMaxReadBytes) {
+		do {
+			status = mDevice.ReadBinary(offset, mMaxReadBytes, buffer);
+			offset += mMaxReadBytes;
+			buffer += mMaxReadBytes;
+			byteLength -= mMaxReadBytes;
+		} while (byteLength > mMaxWriteBytes && status == NFC_SUCCESS);
+	} //if
+	  //finish to write the buffer
+	if (status == NFC_SUCCESS && mMaxWriteBytes)
+		status = mDevice.ReadBinary(offset, byteLength, buffer);
+
+	return status == NFC_SUCCESS;
+}
+
--- a/Type4NfcTagSTM24SR.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/Type4NfcTagSTM24SR.h	Fri Nov 27 15:10:25 2015 +0000
@@ -10,22 +10,193 @@
 #include <stdint.h>
 #include "m24sr/m24sr_class.h"
 
-#include "Type4NfcTag.h"
+#include "NDefLib/Type4NfcTag.h"
 
-class Type4NfcTagSTM24SR: public Type4NfcTag {
+class Type4NfcTagSTM24SR: public NDefLib::Type4NfcTag {
 
 public:
-	Type4NfcTagSTM24SR(M24SR &device):mDevice(device),mSessionIsOpen(false),
-	mMaxReadBytes(0xFF),mMaxWriteBytes(0xFF){}
+	Type4NfcTagSTM24SR(M24SR &device) :
+			mDevice(device), mSessionIsOpen(false), mMaxReadBytes(0xFF), mMaxWriteBytes(
+					0xFF) {
+	}
 
-	virtual bool openSession(bool force=false);
+	virtual bool openSession(bool force = false);
 	virtual bool closeSession();
 
-	virtual bool read(void*){return false;};
-	virtual ~Type4NfcTagSTM24SR(){};
+	virtual ~Type4NfcTagSTM24SR() {
+		if (mSessionIsOpen)
+			closeSession();
+	}
+	;
+
+	bool enableReadPassword(const uint8_t* pCurrentWritePassword,
+			const uint8_t* pNewPassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
+				== NFC_SUCCESS) {
+			/* Set new password */
+			if (mDevice.ChangeReferenceData(M24SR::ReadPwd, pNewPassword)
+					== NFC_SUCCESS)
+				return mDevice.EnableVerificationRequirement(M24SR::ReadPwd)
+						== NFC_SUCCESS;
+		} //else
+		/* M24SR already lock but password not known */
+		return false;
+
+	}
+
+	bool disableReadPassword(const uint8_t* pCurrentWritePassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
+				== NFC_SUCCESS) {
+			/* Set new password */
+			return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
+					== NFC_SUCCESS;
+		} else {
+			/* M24SR already lock but password not known */
+			return false;
+		}
+	}
+
+	bool enableWritePassword(const uint8_t* pCurrentWritePassword,
+			uint8_t* pNewPassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		/* check we have the good password */
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
+				== NFC_SUCCESS) {
+			/* Set new password */
+			if (mDevice.ChangeReferenceData(M24SR::WritePwd, pNewPassword)
+					== NFC_SUCCESS)
+				;
+			return mDevice.EnableVerificationRequirement(M24SR::WritePwd)
+					== NFC_SUCCESS;
+		}
+		return false;
+	}
+
+	bool disableWritePassword(const uint8_t* pCurrentWritePassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
+				== NFC_SUCCESS)
+			return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
+					== NFC_SUCCESS;
+		return false;
+	}
+
+	/**
+	 * @brief  This fonction desactivate the need of read and write password for next access
+	 * @param	pSuperUserPassword : I2C super user password to overwrite read and write password
+	 * @retval SUCCESS : M24SR access is now free (no password needed)
+	 * @retval ERROR : operation does not complete
+	 */
+	bool disableAllPassword(const uint8_t* pSuperUserPassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pSuperUserPassword)
+				== NFC_SUCCESS) {
+			mDevice.DisablePermanentState(M24SR::ReadPwd);
+			mDevice.DisablePermanentState(M24SR::WritePwd);
+
+			mDevice.DisableVerificationRequirement(M24SR::ReadPwd);
+			mDevice.DisableVerificationRequirement(M24SR::WritePwd);
+
+			/* reset password */
+			mDevice.ChangeReferenceData(M24SR::ReadPwd, pSuperUserPassword);
+			mDevice.ChangeReferenceData(M24SR::WritePwd, pSuperUserPassword);
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * @brief  This fonction enable read only mode
+	 * @param	pCurrentWritePassword : Write password is needed to have right to enable read only mode
+	 * @retval SUCCESS : M24SR access is now forbidden in write mode
+	 * @retval ERROR : operation does not complete
+	 */
+	bool enableReadOnly(const uint8_t* pCurrentWritePassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
+				== NFC_SUCCESS) {
+			/* lock write to have read only */
+			return mDevice.EnablePermanentState(M24SR::WritePwd) == NFC_SUCCESS;
+		}
+		return false;
+	}
+
+	/**
+	 * @brief  This fonction disable read only mode
+	 * @param	pCurrentWritePassword : Write password is needed to have right to disable read only mode
+	 * @retval SUCCESS : M24SR write access is now allowed
+	 * @retval ERROR : operation does not complete
+	 */
+	bool disableReadOnly() {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
+				== NFC_SUCCESS) {
+			/* disable write protection to disable read only mode */
+			if (mDevice.DisablePermanentState(M24SR::WritePwd) == NFC_SUCCESS)
+				return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
+						== NFC_SUCCESS;
+		} //if
+		return false;
+	}
+
+	/**
+	 * @brief  This fonction enable write only mode
+	 * @param	pCurrentWritePassword : Write password is needed to have right to enable write only mode
+	 * @retval SUCCESS : M24SR access is now forbidden in read mode
+	 * @retval ERROR : operation does not complete
+	 */
+	bool enableWriteOnly(const uint8_t* pCurrentWritePassword) {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
+				== NFC_SUCCESS) {
+			/* disable read access and keep write */
+			return mDevice.EnablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS;
+		}
+		return false;
+	}
+
+	/**
+	 * @brief  This fonction disable write only mode
+	 * @param	pCurrentWritePassword : Write password is needed to have right to disable write only mode
+	 * @retval SUCCESS : M24SR read access is now allowed
+	 * @retval ERROR : operation does not complete
+	 */
+	bool disableWriteOnly() {
+		if (!mSessionIsOpen)
+			return false;
+
+		if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
+				== NFC_SUCCESS) {
+			/* disable write only -> enable write acces */
+			if (mDevice.DisablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS)
+				return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
+						== NFC_SUCCESS;
+		}
+		return false;
+	}
 
 protected:
-	virtual bool writeByte(uint8_t *buffer,uint16_t lenght);
+	virtual bool writeByte(uint8_t *buffer, const uint16_t lenght);
+	virtual bool readByte(const uint16_t byteOffset, const uint16_t byteLength,
+			uint8_t *buffer);
 
 private:
 
@@ -36,4 +207,3 @@
 };
 
 #endif /* TYPE4NFCTAGSTM24SR_H_ */
-
--- a/X_NUCLEO_NFC01A1.cpp	Thu Nov 19 08:50:18 2015 +0000
+++ b/X_NUCLEO_NFC01A1.cpp	Fri Nov 27 15:10:25 2015 +0000
@@ -7,13 +7,24 @@
 
 #include <X_NUCLEO_NFC01A1.h>
 
-X_NUCLEO_NFC01A1 *X_NUCLEO_NFC01A1::instance=NULL;
+X_NUCLEO_NFC01A1 *X_NUCLEO_NFC01A1::mInstance = NULL;
 
 X_NUCLEO_NFC01A1* X_NUCLEO_NFC01A1::Instance(I2C &devI2C,
-			const PinName &gpoName,const PinName &RFDisableName,
-			const PinName &led1Name,const PinName &led2Name,const PinName &led3Name){
-		if(instance==NULL)
-			instance = new X_NUCLEO_NFC01A1(devI2C,gpoName,RFDisableName,led1Name,led2Name,led3Name);
-		return instance;
-	}
-
+		const PinName &gpoName, const PinName &RFDisableName,
+		const PinName &led1Name, const PinName &led2Name,
+		const PinName &led3Name) {
+	if (mInstance == NULL) {
+		mInstance = new X_NUCLEO_NFC01A1(devI2C, gpoName, RFDisableName,
+				led1Name, led2Name, led3Name);
+		if (mInstance != NULL) {
+			const int status = mInstance->mM24SR.Init(NULL);
+			if (status != NFC_SUCCESS) {
+				delete mInstance;
+				error(
+						"Failed to init X_NUCLEO_NFC01A1 expansion board!\r\nError:0x%X\r\n",
+						status);
+			} //if init
+		} //if instance !=NULL
+	} //if instance
+	return mInstance;
+}
--- a/X_NUCLEO_NFC01A1.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/X_NUCLEO_NFC01A1.h	Fri Nov 27 15:10:25 2015 +0000
@@ -17,29 +17,37 @@
 class X_NUCLEO_NFC01A1 {
 
 private:
-	static X_NUCLEO_NFC01A1 *instance;
+	static X_NUCLEO_NFC01A1 *mInstance;
 
-	X_NUCLEO_NFC01A1(I2C &devI2C,const PinName &gpoName,const PinName &RFDisableName,
-			const PinName &led1Name,const PinName &led2Name,const PinName &led3Name):
-		mM24SR(M24SR_ADDR,devI2C,gpoName,RFDisableName),
-		mNfcLed1(led1Name),mNfcLed2(led2Name),mNfcLed3(led3Name){
+	X_NUCLEO_NFC01A1(I2C &devI2C, const PinName &gpoName,
+			const PinName &RFDisableName, const PinName &led1Name,
+			const PinName &led2Name, const PinName &led3Name) :
+			mM24SR(M24SR_ADDR, devI2C, gpoName, RFDisableName), mNfcLed1(
+					led1Name), mNfcLed2(led2Name), mNfcLed3(led3Name) {
 
 	}
 
-
 public:
-	static X_NUCLEO_NFC01A1* Instance(I2C &devI2C,
-			const PinName &gpoName=D12,const PinName &RFDisableName=D11,
-			const PinName &led1Name=D5,const PinName &led2Name=D4,const PinName &led3Name=D2);
-
+	static X_NUCLEO_NFC01A1* Instance(I2C &devI2C, const PinName &gpoName = D12,
+			const PinName &RFDisableName = D11, const PinName &led1Name = D5,
+			const PinName &led2Name = D4, const PinName &led3Name = D2);
 
-	DigitalOut& getLed1(){return mNfcLed1;}
-	DigitalOut& getLed2(){return mNfcLed2;}
-	DigitalOut& getLed3(){return mNfcLed3;}
+	DigitalOut& getLed1() {
+		return mNfcLed1;
+	}
+	DigitalOut& getLed2() {
+		return mNfcLed2;
+	}
+	DigitalOut& getLed3() {
+		return mNfcLed3;
+	}
 
-	M24SR& getM24SR(){return mM24SR;}
+	M24SR& getM24SR() {
+		return mM24SR;
+	}
 
-	virtual ~X_NUCLEO_NFC01A1(){}
+	virtual ~X_NUCLEO_NFC01A1() {
+	}
 
 private:
 
@@ -51,4 +59,3 @@
 };
 
 #endif /* X_NUCLEO_NFC01A1_H_ */
-
--- a/m24sr/lib_M24SR.cpp	Thu Nov 19 08:50:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,595 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    lib_M24SR.c
-  * @author  MMY Application Team
-  * @version V1.1.0
-  * @date    20-October-2014
-  * @brief   This file help to manage M24SR in a NFC forum context.
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */ 
-
-
-/* Includes ------------------------------------------------------------------*/
-#include "m24sr_class.h"
-#include "lib_M24SR.h"
-
-/** @addtogroup M24SR_Driver
-  * @{
-  */
-
-/** @defgroup lib_M24SR
-  * @{
-	*	@brief  This is the library to interface with the M24SR dynamic tag.
-	*         This layer simplify the use of the M24SR driver by sequencing 
-	*         some commands.
-  */
-
-uint8_t I2CPassword[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-												 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-static uint32_t NDEFSessionOpenID=NDEF_SESSION_CLOSED;
-
-/* Init NDEF_FileID with bad value in case Init failed */
-static uint16_t NDEF_FileID = 0xDEAD;
-								
-
-extern M24SR *m24srDrv;
-
-/** @defgroup libM24SR_Private_Functions
-  * @{
-  */
-
-/**
-  * @}
-  */
-
-
-/** @defgroup libM24SR_Public_Functions
-  * @{
-  */ 
-
-
-
-
-/**
-  * @brief  This fonction initialize the M24SR
-	* @param	CCBuffer : pointer on the buffer to store CC file
-	* @param	size : number of byte of data to read
-  * @retval NFC_OK : Initalization done
-	* @retval NFC_ERROR : Not able to Initialize.
-  */
-uint16_t M24SR_Initialization ( uint8_t* CCBuffer, uint8_t size )
-{
-	uint16_t status = NFC_ERROR;
-	uint16_t trials = 5; /* wait 1sec, driver is configured to let 200ms for command to complete */
-                       /* which is enough for all commands except GetSession if RF session is already opened */
-                       /* Smartphone generaly release the session within the second, but customer can modify this value */
-	
-
-	/* Perform HW initialization */
-	(*m24srDrv).Init(NULL);
-	/* Read CC file */
-	while( status != NFC_OK && trials)
-	{
-		status = (*m24srDrv).GetSession();
-		trials--;
-	}
-	if (status != NFC_OK)
-		return NFC_ERROR;
-	/*===================================*/
-	/* Select the NFC type 4 application */ 
-	/*===================================*/
-	errorchk( (*m24srDrv).SelectApplication() );
-		
-	/*==================*/		
-	/* select a CC file */ 
-	/*==================*/
-	errorchk ((*m24srDrv).SelectCCfile( ) );
-			
-	/* read the first 15 bytes of the CC file */
-	if( M24SR_ReadData ( 0x0000 , 0x0F , CCBuffer )== NFC_OK)
-	{			
-		NDEF_FileID = (uint16_t) ((CCBuffer[0x09]<<8) | CCBuffer[0x0A]);
-		errorchk( (*m24srDrv).Deselect ( ) );
-		return NFC_OK;
-	}
-	else
-		errorchk( (*m24srDrv).Deselect ( ) );
-		
-Error:
-		return NFC_ERROR;
-		
-}
-
-/**
-  * @brief  This fonction retrieve the NDEF file ID of NDEF file present in M24SR
-	* @param	NDEF_fileID : To store NDEF ID
-  * @retval NFC_OK : File ID read
-	* @retval NFC_ERROR : Not able to read file ID.
-  */
-uint16_t M24SR_GetNDEFFileId ( uint16_t *NDEF_fileID )
-{
-	if( NDEF_FileID != 0xDEAD)
-	{
-		*NDEF_fileID = NDEF_FileID;
-		return NFC_OK;
-	}
-	else
-	{
-		return NFC_ERROR;
-	}
-}
-
-
-/**
-  * @brief  This fonction configure the M24SR to access NDEF message by I2C
-	* @param	NDEF_fileID : NDEF identification to select NDEF in M24SR
-	* @param  Priority: 2 options: check if M24SR available to open session (no RF session on going)
-  *															 Kill RF session and open I2C sesssion.
-  * @retval NFC_OK : Session is opened
-	* @retval NFC_ERROR : Not able to open session.
-  */
-uint16_t M24SR_OpenNDEFSession ( uint16_t NDEF_fileID, uint16_t Priority )
-{
-	uint16_t status = NFC_ERROR;
-	uint16_t trials = 5; /* wait 1sec, driver is configured to let 200ms for command to complete */
-                       /* which is enough for all commands except GetSession if RF session is already opened */
-                       /* Smartphone generaly release the session within the second, but customer can modify this value */
-	
-	if(NDEFSessionOpenID == NDEF_SESSION_CLOSED)
-	{
-		if( Priority == TAKE_SESSION)
-		{
-			status = (*m24srDrv).KillSession( );
-		}
-		else
-		{
-			while( status != NFC_OK && trials)
-			{
-				status = (*m24srDrv).GetSession( );
-				trials--;
-			}
-		}
-		if (status != NFC_OK)
-		{
-			/* seems session already open on RF side */
-			/* But in case of I2C issue try to init again */
- 			(*m24srDrv).Init( NULL);
-			return NFC_ERROR;
-		}
-    
-		/*===================================*/
-		/* Select the NFC type 4 application */ 
-		/*===================================*/
-		errorchk( (*m24srDrv).SelectApplication( ) );
-		
-		/*====================*/
-		/* select NDEF file   */
-		/*====================*/
-		errorchk( (*m24srDrv).SelectNDEFfile( NDEF_fileID) );
-    
-		NDEFSessionOpenID = (uint32_t)(NDEF_fileID);
-    
-		return NFC_OK;
-	}
-	else if(NDEFSessionOpenID == NDEF_fileID)
-	{
-		/* Session already Open not an issue caller can perform access in NDEF file */
-		return NFC_OK;
-	}
-  
-Error:
-  return NFC_ERROR;
-}
-
-/**
-  * @brief  This fonction close the NDEF Session.
-	* @param	NDEF_fileID : NDEF identification to select NDEF in M24SR
-  * @retval NFC_OK : Session is closed
-	* @retval NFC_ERROR : Not able to close session.
-  */
-uint16_t M24SR_CloseNDEFSession ( uint16_t NDEF_fileID )
-{
-	uint16_t status = NFC_ERROR;
-	
-	if(NDEFSessionOpenID == (uint32_t)(NDEF_fileID))
-	{
-		errorchk( (*m24srDrv).Deselect ( ) );
-		NDEFSessionOpenID = NDEF_SESSION_CLOSED;
-    
-		return NFC_OK;
-	}
-	else if(NDEFSessionOpenID == NDEF_SESSION_CLOSED)
-	{
-		/* Not an NFC_ERROR as session is already closed */
-		return NFC_OK;
-	}
-  
-Error:
-  return NFC_ERROR;
-}
-
-/**
-  * @brief  This fonction read the data stored in M24SR at defined offset
-	* @param	Offset : Offset in the NDEF file in M24SR
-	* @param	DataSize : Number of byte to read
-	* @param	pData : pointer on buffer to store read data
-	* @retval Status (SW1&SW2) : Status of the operation. 
-  */
-uint16_t M24SR_ReadData ( uint16_t Offset , uint16_t DataSize , uint8_t* pData)
-{
-	uint16_t status;
-	
-	if( DataSize > M24SR_READ_MAX_NBBYTE)
-	{	
-		do
-		{
-			status = (*m24srDrv).ReadBinary (  Offset, M24SR_READ_MAX_NBBYTE , pData);
-			Offset += M24SR_READ_MAX_NBBYTE;
-			pData += M24SR_READ_MAX_NBBYTE;
-			DataSize -= M24SR_READ_MAX_NBBYTE;
-		}while( DataSize > M24SR_READ_MAX_NBBYTE && status == NFC_OK);
-		if( status == NFC_OK && DataSize)
-			status = (*m24srDrv).ReadBinary (  Offset, (uint8_t)(DataSize) , pData);
-	}
-	else
-		status = (*m24srDrv).ReadBinary (  Offset, (uint8_t)(DataSize) , pData);
-	
-	return status;
-}
-
-/**
-  * @brief  This fonction read the data stored in M24SR at defined offset without NDEF concideration
-	* @param	Offset : Offset in the NDEF file in M24SR
-	* @param	DataSize : Number of byte to read
-	* @param	pData : pointer on buffer to store read data
-	* @retval Status (SW1&SW2) : Status of the operation.  
-  */
-uint16_t M24SR_ForceReadData ( uint16_t Offset , uint16_t DataSize , uint8_t* pData)
-{
-	uint16_t status;
-	
-	if( DataSize > M24SR_READ_MAX_NBBYTE)
-	{	
-		do
-		{
-			status = (*m24srDrv).STReadBinary ( Offset, M24SR_READ_MAX_NBBYTE , pData);
-			Offset += M24SR_READ_MAX_NBBYTE;
-			pData += M24SR_READ_MAX_NBBYTE;
-			DataSize -= M24SR_READ_MAX_NBBYTE;
-		}while( DataSize > M24SR_READ_MAX_NBBYTE && status == NFC_OK);
-		if( status == NFC_OK && DataSize)
-			status = (*m24srDrv).STReadBinary (  Offset, (uint8_t)(DataSize) , pData);
-	}
-	else
-		status = (*m24srDrv).STReadBinary (  Offset, (uint8_t)(DataSize) , pData);
-	
-	return status;
-}
-
-/**
-  * @brief  This fonction write data in M24SR at defined offset
-	* @param	Offset : Offset in the NDEF file in M24SR
-	* @param	DataSize : Number of byte to read
-	* @param	pData : pointer on buffer to copy in M24SR
-	* @retval Status (SW1&SW2) : Status of the operation.  
-  */
-uint16_t M24SR_WriteData ( uint16_t Offset , uint16_t DataSize , uint8_t* pData)
-{
-	uint16_t status;
-	
-	if( DataSize > M24SR_WRITE_MAX_NBBYTE)
-	{	
-		do
-		{
-			status = (*m24srDrv).UpdateBinary (  Offset, M24SR_WRITE_MAX_NBBYTE , pData);
-			Offset += M24SR_WRITE_MAX_NBBYTE;
-			pData += M24SR_WRITE_MAX_NBBYTE;
-			DataSize -= M24SR_WRITE_MAX_NBBYTE;
-		}while( DataSize > M24SR_WRITE_MAX_NBBYTE && status == NFC_OK);
-		if( status == NFC_OK && DataSize)
-			status = (*m24srDrv).UpdateBinary (  Offset, (uint8_t)(DataSize) , pData);
-	}
-	else
-		status = (*m24srDrv).UpdateBinary (  Offset, (uint8_t)(DataSize) , pData);
-	
-	return status;
-}
-
-/**
-  * @brief  This fonction activate the need of a password for next read access
-	* @param	pCurrentWritePassword : Write password is needed to have the right to enable Read Password
-	* @param	pNewPassword : The password that will be requiered for next read access
-  * @retval NFC_OK : Read password is activated
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_EnableReadPassword( uint8_t* pCurrentWritePassword, uint8_t* pNewPassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  WRITE_PWD ,0x10 ,pCurrentWritePassword ) == NFC_OK)
-	{				
-		/* Set new password */
-		(*m24srDrv).ChangeReferenceData (  READ_PWD, pNewPassword );
-		(*m24srDrv).EnableVerificationRequirement(  READ_PWD );
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}	
-
-/**
-  * @brief  This fonction desactivate the need of a password for next read access
-	* @param	pCurrentWritePassword : Write password is needed to have the right to disable Read Password
-  * @retval NFC_OK : Read password is desactivated
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_DisableReadPassword( uint8_t* pCurrentWritePassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  WRITE_PWD ,0x10 ,pCurrentWritePassword ) == NFC_OK)
-	{				
-		/* Set new password */
-		(*m24srDrv).DisableVerificationRequirement(  READ_PWD );
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}	
-
-/**
-  * @brief  This fonction activate the need of a password for next write access
-	* @param	pCurrentWritePassword : Write password must be prensented to have the right to modify write Password
-	* @param	pNewPassword : The password that will be requiered for next write access
-  * @retval NFC_OK : Write password is activated
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_EnableWritePassword( uint8_t* pCurrentWritePassword, uint8_t* pNewPassword)
-{
-	uint16_t status;
-  
-	/* check we have the good password */
-	if ((*m24srDrv).Verify(  WRITE_PWD ,0x10 ,pCurrentWritePassword )== NFC_OK)
-	{
-		/* Set new password */
-		(*m24srDrv).ChangeReferenceData (  WRITE_PWD, pNewPassword );
-		(*m24srDrv).EnableVerificationRequirement(  WRITE_PWD );
-		status = NFC_OK;
-	}
-	else /* we don't have the good password */
-	{				
-		status = NFC_ERROR;
-	}
-	
-	return status;
-}	
-
-/**
-  * @brief  This fonction desactivate the need of a password for next write access
-	* @param	pCurrentWritePassword : Write password must be prensented to have the right to disable it
-  * @retval NFC_OK : Write password is desactivated
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_DisableWritePassword( uint8_t* pCurrentWritePassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  WRITE_PWD ,0x10 ,pCurrentWritePassword ) == NFC_OK)
-	{				
-		(*m24srDrv).DisableVerificationRequirement(  WRITE_PWD );
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}	
-
-/**
-  * @brief  This fonction desactivate the need of read and write password for next access
-	* @param	pSuperUserPassword : I2C super user password to overwrite read and write password
-  * @retval NFC_OK : M24SR access is now free (no password needed)
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_DisableAllPassword( uint8_t* pSuperUserPassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  I2C_PWD ,0x10 ,pSuperUserPassword ) == NFC_OK)
-	{				
-		(*m24srDrv).DisablePermanentState(  READ_PWD );
-		(*m24srDrv).DisablePermanentState(  WRITE_PWD );
-    
-		(*m24srDrv).DisableVerificationRequirement(  READ_PWD );
-		(*m24srDrv).DisableVerificationRequirement(  WRITE_PWD );
-    
-		/* reset password */
-		(*m24srDrv).ChangeReferenceData ( READ_PWD, pSuperUserPassword );
-		(*m24srDrv).ChangeReferenceData (  WRITE_PWD, pSuperUserPassword );
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}
-
-/**
-  * @brief  This fonction enable read only mode
-	* @param	pCurrentWritePassword : Write password is needed to have right to enable read only mode
-  * @retval NFC_OK : M24SR access is now forbidden in write mode
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_EnableReadOnly( uint8_t* pCurrentWritePassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  WRITE_PWD ,0x10 ,pCurrentWritePassword ) == NFC_OK)
-	{				
-		(*m24srDrv).EnablePermanentState(  WRITE_PWD ); /* lock write to have read only */
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}	
-
-/**
-  * @brief  This fonction disable read only mode
-	* @param	pCurrentWritePassword : Write password is needed to have right to disable read only mode
-  * @retval NFC_OK : M24SR write access is now allowed
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_DisableReadOnly( uint8_t* pCurrentWritePassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  I2C_PWD ,0x10 ,I2CPassword ) == NFC_OK)
-	{					
-		(*m24srDrv).DisablePermanentState(  WRITE_PWD ); /* disable write protection to disable read only mode */
-		(*m24srDrv).DisableVerificationRequirement(  WRITE_PWD );
-		status = NFC_OK;
-	}
-	else
-	{
-		/* we don't have the good I2C password nothing to do anymore */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}	
-
-/**
-  * @brief  This fonction enable write only mode
-	* @param	pCurrentWritePassword : Write password is needed to have right to enable write only mode
-  * @retval NFC_OK : M24SR access is now forbidden in read mode
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_EnableWriteOnly( uint8_t* pCurrentWritePassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  WRITE_PWD ,0x10 ,pCurrentWritePassword ) == NFC_OK)
-	{				
-		(*m24srDrv).EnablePermanentState(  READ_PWD ); /* disable read access and keep write */
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}	
-
-/**
-  * @brief  This fonction disable write only mode
-	* @param	pCurrentWritePassword : Write password is needed to have right to disable write only mode
-  * @retval NFC_OK : M24SR read access is now allowed
-	* @retval NFC_ERROR : operation does not complete
-  */
-uint16_t M24SR_DisableWriteOnly( uint8_t* pCurrentWritePassword)
-{
-	uint16_t status = NFC_OK;
-  
-	if((*m24srDrv).Verify(  I2C_PWD ,0x10 ,I2CPassword ) == NFC_OK)
-	{				
-		(*m24srDrv).DisablePermanentState(  READ_PWD ); /* disable write only -> enable write acces */
-		(*m24srDrv).DisableVerificationRequirement( READ_PWD );
-		status = NFC_OK;
-	}
-	else
-	{
-		/* M24SR already lock but password not known */
-		status = NFC_ERROR;
-	}
-  
-	return status;
-}
-
-/**
-  * @brief  This function configure GPO purpose for RF session
-	* @param	GPO_config: GPO configuration to set
-	* @param	mode: select RF or I2C, GPO config to update
-  * @retval Status : Status of the operation.
-  */
-uint16_t M24SR_ManageGPO( uint8_t GPO_config, uint8_t mode)
-{
-	uint16_t status;
-	
-	if( mode == RF_GPO)
-	{
-		status = (*m24srDrv).ManageRFGPO ( GPO_config );
-	}
-	else
-	{
-		status = (*m24srDrv).ManageI2CGPO (GPO_config );
-	}
-	return status;
-}
-
-/**
-  * @}
-  */
-
-/**
-  * @}
-  */
-
-/**
-  * @}
-  */
-
-/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
-
-
-
--- a/m24sr/lib_M24SR.h	Thu Nov 19 08:50:18 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,134 +0,0 @@
-/**
-  ******************************************************************************
-  * @file    lib_M24SR.h
-  * @author  MMY Application Team
-  * @version V1.0.0
-  * @date    20-November-2013
-  * @brief   This file help to manage Data inside M24SR.
-   ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
-  *
-  * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
-  * You may not use this file except in compliance with the License.
-  * You may obtain a copy of the License at:
-  *
-  *        http://www.st.com/software_license_agreement_liberty_v2
-  *
-  * Unless required by applicable law or agreed to in writing, software 
-  * distributed under the License is distributed on an "AS IS" BASIS, 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  * See the License for the specific language governing permissions and
-  * limitations under the License.
-  *
-  ******************************************************************************
-  */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __LIB_M24SR_H
-#define __LIB_M24SR_H
-
-#ifdef __cplusplus
- extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-#include <stdint.h>
-/** @addtogroup M24SR_Driver
-  * @{
-  */
-
-
-/** @addtogroup lib_M24SR
-  * @{
-  */
-	 
-/* Exported constants --------------------------------------------------------*/
-	 
-/** @defgroup lib_M24SR_Exported_Constants
-  * @{
-  */
-	 
-/** @defgroup lib_M24SR_M24SR_EEPROM_Size_Version
-  * @{
-  */	 
-/* ---------------------- M24SR properties -----------------------------------*/
-#define M24SR04_NDEF_MAX_SIZE								0x200
-#define M24SR16_NDEF_MAX_SIZE								0x800
-#define M24SR64_NDEF_MAX_SIZE								0x2000	 
-/**
-  * @}
-  */
-
-/** @defgroup lib_M24SR_Flag_to_select_open_session_command
-  * @{
-  */	 
-#define ASK_FOR_SESSION											0x0000
-#define TAKE_SESSION												0xFFFF	 
-/**
-  * @}
-  */
-
-/* M24SR buffer size is 0xF6 can be retrieve dynamicaly in CC file */
-#define M24SR_READ_MAX_NBBYTE								0xF6 
-#define M24SR_WRITE_MAX_NBBYTE							0xF6
-
-
-#define NDEF_SESSION_CLOSED									0xDEADBEEF
-
-/**
-  * @}
-  */
-
-
-/* Exported macro ------------------------------------------------------------*/
-
-/** @brief Check return statement of function
-  * @param  fCall function result to check 
-  * @retval M24SR_ACTION_COMPLETED or jump to dedicated Error management
-  */ 
-#ifndef errorchk
-#define errorchk(fCall) if (status = (fCall), status != NFC_OK) \
-	{goto Error;} else
-#endif
-	
-/**
-  * @}
-  */
-
-/**
-  * @}
-  */	
-
-uint16_t M24SR_Initialization (uint8_t* pCCBuffer, uint8_t size );
-	
-uint16_t M24SR_GetNDEFFileId ( uint16_t *NDEF_fileID );
-uint16_t M24SR_OpenNDEFSession ( uint16_t NDEF_fileID, uint16_t Priority );
-uint16_t M24SR_ReadData ( uint16_t Offset , uint16_t DataSize , uint8_t* pData);
-uint16_t M24SR_ForceReadData ( uint16_t Offset , uint16_t DataSize , uint8_t* pData);
-uint16_t M24SR_WriteData ( uint16_t Offset , uint16_t DataSize , uint8_t* pData);
-uint16_t M24SR_CloseNDEFSession ( uint16_t NDEF_fileID );	
-
-uint16_t M24SR_EnableReadPassword( uint8_t* pCurrentWritePassword, uint8_t* pNewPassword);	
-uint16_t M24SR_DisableReadPassword( uint8_t* pCurrentWritePassword );	
-uint16_t M24SR_EnableWritePassword( uint8_t* pCurrentWritePassword, uint8_t* pNewPassword);	
-uint16_t M24SR_DisableWritePassword( uint8_t* pCurrentWritePassword );
-uint16_t M24SR_DisableAllPassword( uint8_t* pSuperUserPassword);
-
-uint16_t M24SR_EnableReadOnly( uint8_t* pCurrentWritePassword);	
-uint16_t M24SR_DisableReadOnly( uint8_t* pCurrentWritePassword);	
-uint16_t M24SR_EnableWriteOnly( uint8_t* pCurrentWritePassword);	
-uint16_t M24SR_DisableWriteOnly( uint8_t* pCurrentWritePassword);
-
-uint16_t M24SR_ManageGPO( uint8_t GPO_config, uint8_t mode);
-
-#ifdef __cplusplus
-}
-#endif
-	
-	
-#endif /* __LIB_M24SR_H */
- 
-/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
-
--- a/m24sr/m24sr.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/m24sr/m24sr.h	Fri Nov 27 15:10:25 2015 +0000
@@ -1,293 +1,293 @@
-/**
- ******************************************************************************
- * @file    m24sr.h
- * @author  MMY Application Team
- * @version V1.2.0
- * @date    20-October-2014
- * @brief   This file provides a set of functions needed to manage M24SR
- ******************************************************************************
- * @attention
- *
- * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
- *
- * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
- * You may not use this file except in compliance with the License.
- * You may obtain a copy of the License at:
- *
- *        http://www.st.com/software_license_agreement_liberty_v2
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- ******************************************************************************
- */
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-#ifndef __DRV_M24SR_H
-#define __DRV_M24SR_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Includes ------------------------------------------------------------------*/
-#include "Common/nfc.h"
-
-/** @addtogroup M24SR_Driver
- * @{
- */
-
-/** @addtogroup drv_M24SR
- * @{
- */
-
-/* Exported types ------------------------------------------------------------*/
-
-/**
- * @brief  APDU-Header command structure
- */
-typedef struct {
-	uint8_t CLA; /* Command class */
-	uint8_t INS; /* Operation code */
-	uint8_t P1; /* Selection Mode */
-	uint8_t P2; /* Selection Option */
-} C_APDU_Header;
-
-/**
- * @brief  APDU-Body command structure
- */
-typedef struct {
-	uint8_t LC; /* Data field length */
-	uint8_t *pData; /* Command parameters */
-	uint8_t LE; /* Expected length of data to be returned */
-} C_APDU_Body;
-
-/**
- * @brief  APDU Command structure
- */
-typedef struct {
-	C_APDU_Header Header;
-	C_APDU_Body Body;
-} C_APDU;
-
-/**
- * @brief  SC response structure
- */
-typedef struct {
-	uint8_t *pData; /* Data returned from the card */ // pointer on the transceiver buffer = ReaderRecBuf[CR95HF_DATA_OFFSET ];
-	uint8_t SW1; /* Command Processing status */
-	uint8_t SW2; /* Command Processing qualification */
-} R_APDU;
-
-/**
- * @brief  GPO mode structure
- */
-typedef enum {
-	RF_GPO = 0, I2C_GPO
-} M24SR_GPO_MODE;
-
-/**
- * @brief  GPO state structure
- */
-typedef enum {
-	HIGH_IMPEDANCE = 0,
-	SESSION_OPENED,
-	WIP,
-	I2C_ANSWER_READY,
-	INTERRUPT,
-	STATE_CONTROL
-} M24SR_GPO_MGMT;
-
-typedef enum{
-	M24SR_WAITINGTIME_UNKNOWN= 0,
-	M24SR_WAITINGTIME_POLLING,
-	M24SR_WAITINGTIME_TIMEOUT,
-	M24SR_WAITINGTIME_GPO,
-	M24SR_INTERRUPT_GPO
-}M24SR_WAITINGTIME_MGMT;
-
-/* Exported constants --------------------------------------------------------*/
-
-/** @defgroup lib_M24SR_Exported_Constants
- * @{
- */
-
-/* ---------------------- status code ----------------------------------------*/
-#define UB_STATUS_OFFSET										4
-#define LB_STATUS_OFFSET  									3
-#define I_AM_M24SR                ((uint8_t)0xB4)
-#define I_AM_M24SR_AUTOMOTIVE                ((uint8_t)0xBC)
-
-#define M24SR_NBBYTE_INVALID								0xFFFE
-
-/** @defgroup drv_M24SR_File_Identifier
- * @{
- */
-#define SYSTEM_FILE_ID_BYTES {0xE1,0x01}
-#define CC_FILE_ID_BYTES {0xE1,0x03}
-#define NDEF_FILE_ID						0x0001	 
-/**
- * @}
- */
-
-/** @defgroup drv_M24SR_Password_Management
- * @{
- */
-#define READ_PWD								0x0001
-#define WRITE_PWD								0x0002
-#define I2C_PWD									0x0003
-
-/*-------------------------- Verify command answer ----------------------------*/
-/**
- * @}
- */
-
-/** @defgroup drv_M24SR_Command_Management
- * @{
- */
-
-/* special M24SR command ----------------------------------------------------------------------*/
-#define M24SR_OPENSESSION_COMMAND {0x26}
-#define M24SR_KILLSESSION_COMMAND {0x52}
-
-/* APDU Command: class list -------------------------------------------*/
-#define C_APDU_CLA_DEFAULT	  0x00
-#define C_APDU_CLA_ST					0xA2
-
-/*------------------------ Data Area Management Commands ---------------------*/
-#define C_APDU_SELECT_FILE     0xA4
-#define C_APDU_GET_RESPONCE    0xC0
-#define C_APDU_STATUS          0xF2
-#define C_APDU_UPDATE_BINARY   0xD6
-#define C_APDU_READ_BINARY     0xB0
-#define C_APDU_WRITE_BINARY    0xD0
-#define C_APDU_UPDATE_RECORD   0xDC
-#define C_APDU_READ_RECORD     0xB2
-
-/*-------------------------- Safety Management Commands ----------------------*/
-#define C_APDU_VERIFY          0x20
-#define C_APDU_CHANGE          0x24
-#define C_APDU_DISABLE         0x26
-#define C_APDU_ENABLE          0x28
-
-/*-------------------------- Gpio Management Commands ------------------------*/
-#define C_APDU_INTERRUPT       0xD6
-
-/*  Length	----------------------------------------------------------------------------------*/
-#define M24SR_STATUS_NBBYTE												2
-#define M24SR_CRC_NBBYTE													2
-#define M24SR_STATUSRESPONSE_NBBYTE								5
-#define M24SR_DESELECTREQUEST_COMMAND	{0xC2,0xE0,0xB4}
-#define M24SR_DESELECTRESPONSE_NBBYTE							3
-#define M24SR_WATINGTIMEEXTRESPONSE_NBBYTE				4
-#define M24SR_PASSWORD_NBBYTE											0x10
-#define M24SR_SELECTAPPLICATION_COMMAND	{0xD2,0x76,0x00,0x00,0x85,0x01,0x01}
-/*  Command structure	------------------------------------------------------------------------*/
-#define M24SR_CMDSTRUCT_SELECTAPPLICATION					0x01FF
-#define M24SR_CMDSTRUCT_SELECTCCFILE							0x017F
-#define M24SR_CMDSTRUCT_SELECTNDEFFILE						0x017F
-#define M24SR_CMDSTRUCT_READBINARY								0x019F
-#define M24SR_CMDSTRUCT_UPDATEBINARY							0x017F
-#define M24SR_CMDSTRUCT_VERIFYBINARYWOPWD					0x013F
-#define M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD				0x017F
-#define M24SR_CMDSTRUCT_CHANGEREFDATA							0x017F
-#define M24SR_CMDSTRUCT_ENABLEVERIFREQ						0x011F
-#define M24SR_CMDSTRUCT_DISABLEVERIFREQ						0x011F
-#define M24SR_CMDSTRUCT_SENDINTERRUPT							0x013F
-#define M24SR_CMDSTRUCT_GPOSTATE									0x017F
-
-/*  Command structure Mask -------------------------------------------------------------------*/
-#define M24SR_PCB_NEEDED				0x0001		/* PCB byte present or not */
-#define M24SR_CLA_NEEDED				0x0002 		/* CLA byte present or not */
-#define M24SR_INS_NEEDED				0x0004 		/* Operation code present or not*/ 
-#define M24SR_P1_NEEDED					0x0008		/* Selection Mode  present or not*/
-#define M24SR_P2_NEEDED					0x0010		/* Selection Option present or not*/
-#define M24SR_LC_NEEDED					0x0020		/* Data field length byte present or not */
-#define M24SR_DATA_NEEDED				0x0040		/* Data present or not */
-#define M24SR_LE_NEEDED					0x0080		/* Expected length present or not */
-#define M24SR_CRC_NEEDED				0x0100		/* 2 CRC bytes present	or not */
-
-#define M24SR_DID_NEEDED				0x08			/* DID byte present or not */
-
-/**
- * @}
- */
-
-/*  Offset	----------------------------------------------------------------------------------*/
-#define M24SR_OFFSET_PCB													0
-#define M24SR_OFFSET_CLASS												1
-#define M24SR_OFFSET_INS													2
-#define M24SR_OFFSET_P1														3
-
-/*  mask	------------------------------------------------------------------------------------*/
-#define M24SR_MASK_BLOCK													0xC0
-#define M24SR_MASK_IBLOCK													0x00
-#define M24SR_MASK_RBLOCK													0x80
-#define M24SR_MASK_SBLOCK													0xC0
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-/* Exported macro ------------------------------------------------------------*/
-
-/** @brief Get Most Significant Byte
- * @param  val: number where MSB must be extracted
- * @retval MSB
- */
-#define GETMSB(val) 		( (uint8_t) ((val & 0xFF00 )>>8) ) 
-
-/** @brief Get Least Significant Byte
- * @param  val: number where LSB must be extracted
- * @retval LSB
- */
-#define GETLSB(val) 		( (uint8_t) (val & 0x00FF )) 
-
-/** @brief Used to toggle the block number by adding 0 or 1 to default block number value
- * @param  val: number to know if incrementation is needed
- * @retval  0 or 1 if incrementation needed
- */
-#define TOGGLE(val) 		((val != 0x00)? 0x00 : 0x01)
-
-
-typedef struct{
-	C_APDU	command;
-	//static R_APDU 						Response;
-	uint8_t	dataBuffer[0xFF];
-	uint8_t	uM24SRbuffer [0xFF];
-	uint8_t	uDIDbyte;
-} M24SR_DrvDataTypeDef;
-
-extern NFC_StatusTypeDef  M24SR_IO_Init(void *handle);
-extern NFC_StatusTypeDef  M24SR_IO_IsAnswerReady(void *handle);
-extern NFC_StatusTypeDef  M24SR_IO_SendI2Ccommand(void *handle, uint8_t NbByte , uint8_t *pBuffer );
-extern NFC_StatusTypeDef  M24SR_IO_ReceiveI2Cresponse(void *handle, uint8_t NbByte , uint8_t *pBuffer );
-extern NFC_StatusTypeDef  M24SR_IO_PollI2C( void *handle );
-extern void M24SR_IO_GPO_ReadPin (void *handle, GPIO_PinState *pPinState);
-extern void M24SR_IO_RFDIS_WritePin (void *handle, GPIO_PinState PinState);
-extern void M24SR_IO_SetI2CSynchroMode(void *handle, M24SR_WAITINGTIME_MGMT mode);
-
-
-/**
- * @}
- */
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __DRV_M24SR_H */
-
-/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
+/**
+ ******************************************************************************
+ * @file    m24sr.h
+ * @author  MMY Application Team
+ * @version V1.2.0
+ * @date    20-October-2014
+ * @brief   This file provides a set of functions needed to manage M24SR
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT 2014 STMicroelectronics</center></h2>
+ *
+ * Licensed under MMY-ST Liberty SW License Agreement V2, (the "License");
+ * You may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *        http://www.st.com/software_license_agreement_liberty_v2
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __DRV_M24SR_H
+#define __DRV_M24SR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "Common/nfc.h"
+
+/** @addtogroup M24SR_Driver
+ * @{
+ */
+
+/** @addtogroup drv_M24SR
+ * @{
+ */
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+ * @brief  APDU-Header command structure
+ */
+typedef struct {
+	uint8_t CLA; /* Command class */
+	uint8_t INS; /* Operation code */
+	uint8_t P1; /* Selection Mode */
+	uint8_t P2; /* Selection Option */
+} C_APDU_Header;
+
+/**
+ * @brief  APDU-Body command structure
+ */
+typedef struct {
+	uint8_t LC; /* Data field length */
+	const uint8_t *pData; /* Command parameters */
+	uint8_t LE; /* Expected length of data to be returned */
+} C_APDU_Body;
+
+/**
+ * @brief  APDU Command structure
+ */
+typedef struct {
+	C_APDU_Header Header;
+	C_APDU_Body Body;
+} C_APDU;
+
+/**
+ * @brief  SC response structure
+ */
+typedef struct {
+	uint8_t *pData; /* Data returned from the card */ // pointer on the transceiver buffer = ReaderRecBuf[CR95HF_DATA_OFFSET ];
+	uint8_t SW1; /* Command Processing status */
+	uint8_t SW2; /* Command Processing qualification */
+} R_APDU;
+
+/**
+ * @brief  GPO mode structure
+ */
+typedef enum {
+	RF_GPO = 0, I2C_GPO = 1
+} M24SR_GPO_MODE;
+
+/**
+ * @brief  GPO state structure
+ */
+typedef enum {
+	HIGH_IMPEDANCE = 0,
+	SESSION_OPENED,
+	WIP,
+	I2C_ANSWER_READY,
+	INTERRUPT,
+	STATE_CONTROL
+} M24SR_GPO_MGMT;
+
+typedef enum {
+	M24SR_WAITINGTIME_UNKNOWN = 0,
+	M24SR_WAITINGTIME_POLLING,
+	M24SR_WAITINGTIME_TIMEOUT,
+	M24SR_WAITINGTIME_GPO,
+	M24SR_INTERRUPT_GPO
+} M24SR_WAITINGTIME_MGMT;
+
+/* Exported constants --------------------------------------------------------*/
+
+/** @defgroup lib_M24SR_Exported_Constants
+ * @{
+ */
+
+/* ---------------------- status code ----------------------------------------*/
+#define UB_STATUS_OFFSET										4
+#define LB_STATUS_OFFSET  									3
+#define I_AM_M24SR                ((uint8_t)0xB4)
+#define I_AM_M24SR_AUTOMOTIVE                ((uint8_t)0xBC)
+
+#define M24SR_NBBYTE_INVALID								0xFFFE
+
+/** @defgroup drv_M24SR_File_Identifier
+ * @{
+ */
+#define SYSTEM_FILE_ID_BYTES {0xE1,0x01}
+#define CC_FILE_ID_BYTES {0xE1,0x03}
+#define NDEF_FILE_ID						0x0001	 
+/**
+ * @}
+ */
+
+/** @defgroup drv_M24SR_Password_Management
+ * @{
+ */
+#define READ_PWD								0x0001
+#define WRITE_PWD								0x0002
+#define I2C_PWD									0x0003
+
+/*-------------------------- Verify command answer ----------------------------*/
+/**
+ * @}
+ */
 
+/** @defgroup drv_M24SR_Command_Management
+ * @{
+ */
+
+/* special M24SR command ----------------------------------------------------------------------*/
+#define M24SR_OPENSESSION_COMMAND {0x26}
+#define M24SR_KILLSESSION_COMMAND {0x52}
+
+/* APDU Command: class list -------------------------------------------*/
+#define C_APDU_CLA_DEFAULT	  0x00
+#define C_APDU_CLA_ST					0xA2
+
+/*------------------------ Data Area Management Commands ---------------------*/
+#define C_APDU_SELECT_FILE     0xA4
+#define C_APDU_GET_RESPONCE    0xC0
+#define C_APDU_STATUS          0xF2
+#define C_APDU_UPDATE_BINARY   0xD6
+#define C_APDU_READ_BINARY     0xB0
+#define C_APDU_WRITE_BINARY    0xD0
+#define C_APDU_UPDATE_RECORD   0xDC
+#define C_APDU_READ_RECORD     0xB2
+
+/*-------------------------- Safety Management Commands ----------------------*/
+#define C_APDU_VERIFY          0x20
+#define C_APDU_CHANGE          0x24
+#define C_APDU_DISABLE         0x26
+#define C_APDU_ENABLE          0x28
+
+/*-------------------------- Gpio Management Commands ------------------------*/
+#define C_APDU_INTERRUPT       0xD6
+
+/*  Length	----------------------------------------------------------------------------------*/
+#define M24SR_STATUS_NBBYTE												2
+#define M24SR_CRC_NBBYTE													2
+#define M24SR_STATUSRESPONSE_NBBYTE								5
+#define M24SR_DESELECTREQUEST_COMMAND	{0xC2,0xE0,0xB4}
+#define M24SR_DESELECTRESPONSE_NBBYTE							3
+#define M24SR_WATINGTIMEEXTRESPONSE_NBBYTE				4
+#define M24SR_PASSWORD_NBBYTE											0x10
+#define M24SR_SELECTAPPLICATION_COMMAND	{0xD2,0x76,0x00,0x00,0x85,0x01,0x01}
+/*  Command structure	------------------------------------------------------------------------*/
+#define M24SR_CMDSTRUCT_SELECTAPPLICATION					0x01FF
+#define M24SR_CMDSTRUCT_SELECTCCFILE							0x017F
+#define M24SR_CMDSTRUCT_SELECTNDEFFILE						0x017F
+#define M24SR_CMDSTRUCT_READBINARY								0x019F
+#define M24SR_CMDSTRUCT_UPDATEBINARY							0x017F
+#define M24SR_CMDSTRUCT_VERIFYBINARYWOPWD					0x013F
+#define M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD				0x017F
+#define M24SR_CMDSTRUCT_CHANGEREFDATA							0x017F
+#define M24SR_CMDSTRUCT_ENABLEVERIFREQ						0x011F
+#define M24SR_CMDSTRUCT_DISABLEVERIFREQ						0x011F
+#define M24SR_CMDSTRUCT_SENDINTERRUPT							0x013F
+#define M24SR_CMDSTRUCT_GPOSTATE									0x017F
+
+/*  Command structure Mask -------------------------------------------------------------------*/
+#define M24SR_PCB_NEEDED				0x0001		/* PCB byte present or not */
+#define M24SR_CLA_NEEDED				0x0002 		/* CLA byte present or not */
+#define M24SR_INS_NEEDED				0x0004 		/* Operation code present or not*/ 
+#define M24SR_P1_NEEDED					0x0008		/* Selection Mode  present or not*/
+#define M24SR_P2_NEEDED					0x0010		/* Selection Option present or not*/
+#define M24SR_LC_NEEDED					0x0020		/* Data field length byte present or not */
+#define M24SR_DATA_NEEDED				0x0040		/* Data present or not */
+#define M24SR_LE_NEEDED					0x0080		/* Expected length present or not */
+#define M24SR_CRC_NEEDED				0x0100		/* 2 CRC bytes present	or not */
+
+#define M24SR_DID_NEEDED				0x08			/* DID byte present or not */
+
+/**
+ * @}
+ */
+
+/*  Offset	----------------------------------------------------------------------------------*/
+#define M24SR_OFFSET_PCB													0
+#define M24SR_OFFSET_CLASS												1
+#define M24SR_OFFSET_INS													2
+#define M24SR_OFFSET_P1														3
+
+/*  mask	------------------------------------------------------------------------------------*/
+#define M24SR_MASK_BLOCK													0xC0
+#define M24SR_MASK_IBLOCK													0x00
+#define M24SR_MASK_RBLOCK													0x80
+#define M24SR_MASK_SBLOCK													0xC0
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/* Exported macro ------------------------------------------------------------*/
+
+/** @brief Get Most Significant Byte
+ * @param  val: number where MSB must be extracted
+ * @retval MSB
+ */
+#define GETMSB(val) 		( (uint8_t) ((val & 0xFF00 )>>8) ) 
+
+/** @brief Get Least Significant Byte
+ * @param  val: number where LSB must be extracted
+ * @retval LSB
+ */
+#define GETLSB(val) 		( (uint8_t) (val & 0x00FF )) 
+
+/** @brief Used to toggle the block number by adding 0 or 1 to default block number value
+ * @param  val: number to know if incrementation is needed
+ * @retval  0 or 1 if incrementation needed
+ */
+#define TOGGLE(val) 		((val != 0x00)? 0x00 : 0x01)
+
+typedef struct {
+	C_APDU command;
+	//static R_APDU 						Response;
+	uint8_t dataBuffer[0xFF];
+	uint8_t uM24SRbuffer[0xFF];
+	uint8_t uDIDbyte;
+} M24SR_DrvDataTypeDef;
+
+extern NFC_StatusTypeDef M24SR_IO_Init(void *handle);
+extern NFC_StatusTypeDef M24SR_IO_IsAnswerReady(void *handle);
+extern NFC_StatusTypeDef M24SR_IO_SendI2Ccommand(void *handle, uint8_t NbByte,
+		uint8_t *pBuffer);
+extern NFC_StatusTypeDef M24SR_IO_ReceiveI2Cresponse(void *handle,
+		uint8_t NbByte, uint8_t *pBuffer);
+extern NFC_StatusTypeDef M24SR_IO_PollI2C(void *handle);
+extern void M24SR_IO_GPO_ReadPin(void *handle, GPIO_PinState *pPinState);
+extern void M24SR_IO_RFDIS_WritePin(void *handle, GPIO_PinState PinState);
+extern void M24SR_IO_SetI2CSynchroMode(void *handle,
+		M24SR_WAITINGTIME_MGMT mode);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DRV_M24SR_H */
+
+/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
--- a/m24sr/m24sr_class.cpp	Thu Nov 19 08:50:18 2015 +0000
+++ b/m24sr/m24sr_class.cpp	Fri Nov 27 15:10:25 2015 +0000
@@ -1,1288 +1,1235 @@
-/**
-  ******************************************************************************
-  * @file    m24sr_class.cpp
-  * @author  MMY Application Team
-  * @version V1.2.0
-  * @date    20-October-2014
-  * @brief   This file provides a set of functions to interface with the M24SR
-  *          device.
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
-
-
-/* Generated with Stm32CubeTOO -----------------------------------------------*/
-
-
-/* Revision ------------------------------------------------------------------*/
-/*
-	Repository:       http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
-	Branch/Trunk/Tag: trunk
-	Based on:         X-CUBE-MEMS1/trunk/Drivers/BSP/Components/m24sr/m24sr.c
-	Revision:         :410
-*/
-
-/* Includes ------------------------------------------------------------------*/
-#include "m24sr_class.h"
-#include "m24sr.h"
-
-/** @addtogroup M24SR_Driver
-  * @{
-  *	@brief  <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b> 
-  */
-
-
-/** @defgroup drv_M24SR
-  * @{
-	*	@brief  This file contains the driver which implements all the M24SR commands.
-  */
-
-#ifndef errchk
-#define errchk(fCall) if (status = (fCall), status != NFC_IO_SUCCESS) \
-	{goto Error;} else
-#endif
-
-
-/**
-  * @brief  This function updates the CRC 
-  * @param  None
-  * @retval None
-  */
-uint16_t M24SR_UpdateCrc (uint8_t ch, uint16_t *lpwCrc)
-{
-  ch = (ch^(uint8_t)((*lpwCrc) & 0x00FF));
-  ch = (ch^(ch<<4));
-  *lpwCrc = (*lpwCrc >> 8)^((uint16_t)ch << 8)^((uint16_t)ch<<3)^((uint16_t)ch>>4);
-	
-  return (*lpwCrc);
-}
-
-/**
-  * @brief  This function returns the CRC 16 
-  * @param  Data : pointer on the data used to compute the CRC16
-  * @param  Length : number of byte of the data
-  * @retval CRC16 
-  */
-uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length)
-{
-  uint8_t chBlock;
-  uint16_t wCrc = 0x6363; // ITU-V.41
-  
-  do {
-    chBlock = *Data++;
-    M24SR_UpdateCrc(chBlock, &wCrc);
-  } while (--Length);
-  
-  return wCrc ;
-}
-
-
-/**  
-* @brief  	This function computes the CRC16 residue as defined by CRC ISO/IEC 13239
-* @param  	DataIn		:	input to data 
-* @param		Length 		: 	Number of bits of DataIn
-* @retval 	Status (SW1&SW2)  	:   CRC16 residue is correct	
-* @retval 	M24SR_ERROR_CRC  	:  CRC16 residue is false
-*/
-NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue (uint8_t *DataIn,uint8_t Length)
-{
-  uint16_t ResCRC=0x0000;
-  
-	/* check the CRC16 Residue */
-	if (Length !=0)
-		ResCRC= M24SR_ComputeCrc (DataIn, Length);
-	
-	if ( ResCRC == 0x0000)
-	{
-		/* Good CRC, but error status from M24SR */
-    return(NFC_StatusTypeDef)(((DataIn[Length-UB_STATUS_OFFSET]<<8) & 0xFF00) | (DataIn[Length-LB_STATUS_OFFSET] & 0x00FF) );
-	}
-	else
-	{
-		ResCRC=0x0000;
-		ResCRC= M24SR_ComputeCrc (DataIn, 5);
-		if ( ResCRC != 0x0000)
-		{
-			/* Bad CRC */
-			return NFC_IO_ERROR_CRC;
-		}
-		else
-		{
-			/* Good CRC, but error status from M24SR */
-			return (NFC_StatusTypeDef)( ((DataIn[1]<<8) & 0xFF00) | (DataIn[2] & 0x00FF) );
-		}
-	}	
-}
-
-/**
-  * @brief  Initialize the command and response structure 
-  * @param  None
-  * @retval None
-  */
-void M24SR::M24SR_InitCommandStructure ( void )
-{
-
-	/* build the command */
-	command.Header.CLA = 0x00;
-	command.Header.INS = 0x00;
-	/* copy the offset */
-	command.Header.P1 = 0x00 ;
-	command.Header.P2 = 0x00 ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = 0x00 ;
-	/* copy the number of byte to read */
-	command.Body.LE = 0x00 ;
-	command.Body.pData = dataBuffer;
-	
-  // 	/* initializes the response structure*/
-  // 	Response.pData = contex->DataBuffer;
-  // 	Response.SW1 = 0x00;
-  // 	Response.SW2 = 0x00;
-}
-
-/**
-  * @brief 		This functions creates an I block command according to the structures CommandStructure and data->command.
-	* @param	 	Command : structue which contains the field of the different parameter
-	* @param	 	CommandStructure : structure that contain the structure of the command (if the different field are presnet or not 
-	* @param	 	NbByte : number of byte of the command
-	* @param	 	pCommand : pointer of the command created
-  */
-void M24SR_BuildIBlockCommand (uint16_t CommandStructure,C_APDU *Command,uint8_t uDIDbyte, uint16_t *NbByte , uint8_t *pCommand)
-{
-	uint16_t	uCRC16;
-	static uint8_t BlockNumber = 0x01;
-	
-	(*NbByte) = 0;
-	
-	/* add the PCD byte */
-	if ((CommandStructure & M24SR_PCB_NEEDED) !=0)
-	{
-		/* toggle the block number */
-		BlockNumber = TOGGLE ( BlockNumber );
-		/* Add the I block byte */
-		pCommand[(*NbByte)++] = 0x02 |  BlockNumber; 
-	}
-	
-	/* add the DID byte */
-	if ((BlockNumber & M24SR_DID_NEEDED) !=0)
-	{
-		/* Add the I block byte */
-		pCommand[(*NbByte)++] = uDIDbyte;
-	}
-	
-	/* add the Class byte */
-	if ((CommandStructure & M24SR_CLA_NEEDED) !=0)
-	{
-		pCommand[(*NbByte)++] = Command->Header.CLA ;
-	}
-	/* add the instruction byte byte */
-	if ( (CommandStructure & M24SR_INS_NEEDED) !=0)
-	{
-		pCommand[(*NbByte)++] = Command->Header.INS ;
-	}
-	/* add the Selection Mode byte */
-	if ((CommandStructure & M24SR_P1_NEEDED) !=0)
-	{
-		pCommand[(*NbByte)++] = Command->Header.P1 ;
-	}
-	/* add the Selection Mode byte */
-	if ((CommandStructure & M24SR_P2_NEEDED) !=0)
-	{
-		pCommand[(*NbByte)++] = Command->Header.P2 ;
-	}
-	/* add Data field lengthbyte */
-	if ((CommandStructure & M24SR_LC_NEEDED) !=0)
-	{
-		pCommand[(*NbByte)++] = Command->Body.LC ;
-	}
-	/* add Data field  */
-	if ((CommandStructure & M24SR_DATA_NEEDED) !=0)
-	{
-		memcpy(&(pCommand[(*NbByte)]) ,Command->Body.pData,Command->Body.LC ) ;
-		(*NbByte) += Command->Body.LC ;
-	}
-	/* add Le field  */
-	if ((CommandStructure & M24SR_LE_NEEDED) !=0)
-	{
-		pCommand[(*NbByte)++] = Command->Body.LE ;
-	}
-	/* add CRC field  */
-	if ((CommandStructure & M24SR_CRC_NEEDED) !=0)
-	{
-		uCRC16 = M24SR_ComputeCrc (pCommand,(uint8_t) (*NbByte));
-		/* append the CRC16 */
-		pCommand [(*NbByte)++] = GETLSB	(uCRC16 ) ;
-		pCommand [(*NbByte)++] = GETMSB	(uCRC16 ) ;	
-	}
-  
-}
-
-#if 0
-/**  
-* @brief  	This function return M24SR_STATUS_SUCCESS if the pBuffer is an I-block
-* @param  	pBuffer		:	pointer of the data
-* @retval 	M24SR_STATUS_SUCCESS  :  the data is a I-Block
-* @retval 	M24SR_ERROR_DEFAULT  	:  the data is not a I-Block
-*/
-static int8_t IsIBlock (uint8_t *pBuffer)
-{
-  
-	if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_IBLOCK)
-	{
-		return M24SR_STATUS_SUCCESS;
-	}
-	else 
-	{	
-		return M24SR_ERROR_DEFAULT;
-	}
-	
-}
-
-/**  
-* @brief  	This function return M24SR_STATUS_SUCCESS if the pBuffer is an R-block
-* @param  	pBuffer		:	pointer of the data
-* @retval 	M24SR_STATUS_SUCCESS  :  the data is a R-Block
-* @retval 	M24SR_ERROR_DEFAULT  	:  the data is not a R-Block
-*/
-static int8_t IsRBlock (uint8_t *pBuffer)
-{
-  
-	if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_RBLOCK)
-	{
-		return M24SR_STATUS_SUCCESS;
-	}
-	else 
-	{	
-		return M24SR_ERROR_DEFAULT;
-	}
-	
-}
-#endif	
-	
-/**  
-* @brief  	This function return M24SR_STATUS_SUCCESS if the pBuffer is an s-block
-* @param  	pBuffer		:	pointer of the data
-* @retval 	M24SR_STATUS_SUCCESS  :  the data is a S-Block
-* @retval 	M24SR_ERROR_DEFAULT  	:  the data is not a S-Block
-*/
-static int8_t IsSBlock (uint8_t *pBuffer)
-{
-  
-	if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK)
-	{
-		return NFC_IO_SUCCESS;
-	}
-	else 
-	{	
-		return NFC_IO_ERROR_DEFAULT;
-	}
-	
-}
-
-/**
-  * @brief  This function sends the FWT extension command (S-Block format)
-	* @param	FWTbyte : FWT value
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_FWTExtension (uint8_t FWTbyte )
-{
-  uint8_t 	pBuffer[M24SR_STATUSRESPONSE_NBBYTE];
-  NFC_StatusTypeDef		status ;
-  uint8_t	NthByte = 0;
-  uint16_t uCRC16;
-  
-	/* create the response */
-	pBuffer[NthByte++] = 0xF2 ;	
-	pBuffer[NthByte++] = FWTbyte ;
-	/* compute the CRC */
-	uCRC16 = M24SR_ComputeCrc (pBuffer,0x02);
-	/* append the CRC16 */
-	pBuffer [NthByte++] = GETLSB	(uCRC16 ) ;
-	pBuffer [NthByte++]=  GETMSB	(uCRC16 ) ;
-	
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NthByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function sends the KillSession command to the M24SR device
-  * @param  None
-	* @retval NFC_OK : the function is succesful.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_KillSession ( void )
-{
-	uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND;
-	int8_t 	status;
-
-	errchk(M24SR_IO_SendI2Ccommand (sizeof(commandBuffer) , commandBuffer ));
-
-	/* Insure no access will be done just after open session */
-	/* The only way here is to poll I2C to know when M24SR is ready */
-	/* GPO can not be use with KillSession command */
-	errchk(M24SR_IO_PollI2C ());
-
-	return NFC_OK;
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-/**
-  * @brief  This function sends the Deselect command (S-Block format)
-	* @retval NFC_OK : the function is succesful.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_Deselect ( void )
-{
-	uint8_t 	pBuffer[] = M24SR_DESELECTREQUEST_COMMAND ;
-	int8_t		status ;
-
-	/* send the request */
-	errchk( M24SR_IO_SendI2Ccommand (sizeof(pBuffer) , pBuffer ));
-
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* flush the M24SR buffer */
-	errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pBuffer) , pBuffer ));
-
-	return NFC_OK;
-
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-
-
-/**
-  * @brief  This function sends the SelectApplication command
-	* @retval NFC_OK : the function is succesful.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_SelectApplication ( void )
-{
-
-	C_APDU command;
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
-	uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND;
-	uint8_t uLe = 0x00;
-	NFC_StatusTypeDef	status ;
-	uint16_t	uP1P2 =0x0400,  NbByte;
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_SELECT_FILE;
-	/* copy the offset */
-	command.Header.P1 = GETMSB	(uP1P2 ) ;
-	command.Header.P2 = GETLSB	(uP1P2 ) ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = sizeof(pDataOut) ;
-	/* copy the data */
-	command.Body.pData=pDataOut;
-	/* copy the number of byte to read */
-	command.Body.LE = uLe ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand ( M24SR_CMDSTRUCT_SELECTAPPLICATION,  &command,uDIDbyte, &NbByte , pBuffer);
-	
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pDataIn) , pDataIn ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pDataIn,sizeof(pDataIn));
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-/**
-  * @brief  This function initialize the M24SR device
-  * @retval None
-  */
-NFC_StatusTypeDef M24SR::M24SR_Init(NFC_InitTypeDef *notUsed)
-{
-	(void)notUsed;
-
-	M24SR_InitCommandStructure();
-
-/*
-	if( M24SR_KillSession() == NFC_OK)
-	{
-		M24SR_ManageI2CGPO(I2C_ANSWER_READY);
-	  M24SR_Deselect ();
-	}
-*/
-	return NFC_OK;
-}
-
-NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id){
-	 if(!nfc_id){
-	    return NFC_ERROR;
-	  }
-	NFC_StatusTypeDef error = M24SR_SelectApplication();
-	if(error!=NFC_IO_SUCCESS)
-		return error;
-
-	return M24SR_ReadBinary(0x0011,1,nfc_id);
-}
-
-
-/**
-  * @brief  This function sends the GetSession command to the M24SR device
-	* @retval NFC_OK : the function is succesful.
-  * @retval Status (SW1&SW2) : if operation does not complete.
-  */
-NFC_StatusTypeDef M24SR::M24SR_GetSession ( void )
-{
-	uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND;
-	int16_t 	status;
-
-	errchk(M24SR_IO_SendI2Ccommand (sizeof(commandBuffer) , commandBuffer ));
-
-	/* Insure no access will be done just after open session */
-	/* The only way here is to poll I2C to know when M24SR is ready */
-	/* GPO can not be use with GetSession command */
-	errchk(M24SR_IO_PollI2C ());
-
-	return NFC_OK;
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-
-
-/**
-  * @brief  This function sends the SelectCCFile command
-	* @retval NFC_OK : the function is succesful.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  * @retval Status (SW1&SW2) : if operation does not complete for another reason.
-  */
-NFC_StatusTypeDef M24SR::M24SR_SelectCCfile ( void )
-{
-	C_APDU command;
-
-	uint8_t *pBuffer = uM24SRbuffer;
-	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
-	uint8_t pDataOut[] = CC_FILE_ID_BYTES;
-	NFC_StatusTypeDef status;
-	uint16_t uP1P2 =0x000C,	NbByte;
-
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_SELECT_FILE;
-	/* copy the offset */
-	command.Header.P1 = GETMSB(uP1P2);
-	command.Header.P2 = GETLSB(uP1P2);
-	/* copy the number of byte of the data field */
-	command.Body.LC = sizeof(pDataOut);
-	command.Body.pData = pDataOut;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
-			&NbByte, pBuffer);
-
-	/* send the request */
-	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
-	errchk(M24SR_IO_IsAnswerReady());
-	/* read the response */
-	errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
-
-	status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
-	return status;
-
-	Error:
-		return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-/**
-  * @brief  This function sends the SelectSystemFile command
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_SelectSystemfile ( void )
-{
-	C_APDU command;
-
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
-	uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES;
-  NFC_StatusTypeDef	status ;
-  uint16_t	uP1P2 =0x000C, NbByte;
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_SELECT_FILE;
-	/* copy the offset */
-	command.Header.P1 = GETMSB	(uP1P2 ) ;
-	command.Header.P2 = GETLSB	(uP1P2 ) ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = sizeof(pDataOut);
-	command.Body.pData=pDataOut;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_SELECTCCFILE,  &command,uDIDbyte, &NbByte , pBuffer);
-	
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pDataIn) , pDataIn ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pDataIn,sizeof(pDataIn));
-	return status;
-  
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function sends the SelectNDEFfile command
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_SelectNDEFfile (uint16_t NDEFfileId )
-{
-	C_APDU command;
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
-	uint8_t pDataOut[]={GETMSB(NDEFfileId ), GETLSB(NDEFfileId )};
-	NFC_StatusTypeDef	status ;
-	uint16_t	uP1P2 =0x000C, NbByte;
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_SELECT_FILE;
-	/* copy the offset */
-	command.Header.P1 = GETMSB	(uP1P2 ) ;
-	command.Header.P2 = GETLSB	(uP1P2 ) ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = sizeof(pDataOut) ;
-	command.Body.pData = pDataOut;
-	/* copy the offset */
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_SELECTNDEFFILE,  &command,uDIDbyte, &NbByte , pBuffer);
-	
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pDataIn) , pDataIn ));
-
-	return M24SR_IsCorrectCRC16Residue (pDataIn,sizeof(pDataIn));
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-	
-}
-
-/**
-  * @brief  This function sends a read binary command
-	* @param	Offset : first byte to read
-	* @param	NbByteToRead : number of byte to read
-	* @param	pBufferRead : pointer of the buffer read from the M24SR device
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_ReadBinary (uint16_t Offset ,uint8_t NbByteToRead , uint8_t *pBufferRead )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer ;
-	NFC_StatusTypeDef	status ;
-	uint16_t	NbByte;
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_READ_BINARY;
-	/* copy the offset */
-	command.Header.P1 = GETMSB	(Offset ) ;
-	command.Header.P2 = GETLSB	(Offset ) ;
-	/* copy the number of byte to read */
-	command.Body.LE = NbByteToRead ;
-  
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_READBINARY,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	errchk( M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pBuffer,NbByteToRead+ M24SR_STATUSRESPONSE_NBBYTE);
-	/* retrieve the data without SW1 & SW2 as provided as return value of the function */
-	memcpy(pBufferRead ,&pBuffer[1],NbByteToRead);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-	
-}
-
-
-
-/**
-  * @brief  This function sends a ST read binary command (no error if access is not inside NDEF file)
-	* @param	Offset : first byte to read
-	* @param	NbByteToRead : number of byte to read
-	* @param	pBufferRead : pointer of the buffer read from the M24SR device
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. 
-  */
-NFC_StatusTypeDef M24SR::M24SR_STReadBinary (uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer ;
-  NFC_StatusTypeDef	status ;
-  uint16_t	NbByte;
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_ST;
-	command.Header.INS = C_APDU_READ_BINARY;
-	/* copy the offset */
-	command.Header.P1 = GETMSB	(Offset ) ;
-	command.Header.P2 = GETLSB	(Offset ) ;
-	/* copy the number of byte to read */
-	command.Body.LE = NbByteToRead ;
-  
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_READBINARY,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	errchk( M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pBuffer,NbByteToRead+ M24SR_STATUSRESPONSE_NBBYTE);
-	/* retrieve the data without SW1 & SW2 as provided as return value of the function */
-	memcpy(pBufferRead ,&pBuffer[1],NbByteToRead);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-	
-}
-
-/**
-  * @brief  This function sends a Update binary command
-	* @param	Offset : first byte to read
-	* @param	NbByteToWrite : number of byte to write
-	* @param	pBufferRead : pointer of the buffer read from the M24SR device
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_UpdateBinary (uint16_t Offset ,uint8_t NbByteToWrite,uint8_t *pDataToWrite )
-{
-	//TODO check the length of the data to write
-  uint8_t 	*pBuffer = uM24SRbuffer ;
-  NFC_StatusTypeDef	status ;
-  uint16_t	NbByte;
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_UPDATE_BINARY;
-	/* copy the offset */
-	command.Header.P1 = GETMSB	(Offset ) ;
-	command.Header.P2 = GETLSB	(Offset ) ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = NbByteToWrite ;
-	/* copy the File Id */
-	memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
-  
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_UPDATEBINARY,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-	/* if the response is a Watiting frame extenstion request */ 
-	if (IsSBlock (pBuffer) == NFC_IO_SUCCESS)
-	{
-		/*check the CRC */ 
-		if (M24SR_IsCorrectCRC16Residue (pBuffer , M24SR_WATINGTIMEEXTRESPONSE_NBBYTE) != NFC_IO_ERROR_CRC)
-		{
-			/* send the FrameExension response*/ 
-			status = M24SR_FWTExtension (pBuffer [M24SR_OFFSET_PCB+1] );
-		}
-	}
-	else
-	{	
-		status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	}
-	
-	return status;
-  
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-/**
-  * @brief  This function sends the Verify command
-	* @param	uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
-	* @param	NbPwdByte : Number of byte ( 0x00 or 0x10)
-	* @param	pPwd : pointer on the passwaord
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_Verify (uint16_t uPwdId,uint8_t NbPwdByte ,uint8_t *pPwd )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer ;
-  NFC_StatusTypeDef	status = NFC_IO_SUCCESS ;
-  uint16_t	NbByte;
-  
-	/*check the parameters */
-	if (uPwdId > 0x0003)
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-	if ( (NbPwdByte != 0x00) && (NbPwdByte != 0x10))
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-  
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_VERIFY;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uPwdId ) ;
-	command.Header.P2 = GETLSB	(uPwdId ) ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = NbPwdByte ;
-  
-	if (NbPwdByte == 0x10) 
-	{
-		/* copy the password */
-		memcpy(command.Body.pData, pPwd, NbPwdByte);
-		/* build the I²C command */
-		M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD,  &command,uDIDbyte, &NbByte , pBuffer);
-	}
-	else 
-	{
-		/* build the I²C command */
-		M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_VERIFYBINARYWOPWD,  &command,uDIDbyte, &NbByte , pBuffer);
-	}
-	
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	/* wait for answer ready */
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-/**
-  * @brief  This function sends the ChangeReferenceData command
-	* @param	uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
-	* @param	pPwd : pointer on the passwaord
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_ChangeReferenceData (uint16_t uPwdId,uint8_t *pPwd )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-  NFC_StatusTypeDef	status ;
-  uint16_t	NbByte;
-  
-	/*check the parameters */
-	if (uPwdId > 0x0003)
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-  
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_CHANGE;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uPwdId ) ;
-	command.Header.P2 = GETLSB	(uPwdId ) ;
-	/* copy the number of byte of the data field */
-	command.Body.LC = M24SR_PASSWORD_NBBYTE ;
-	/* copy the password */
-	memcpy(command.Body.pData, pPwd, M24SR_PASSWORD_NBBYTE);
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_CHANGEREFDATA,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-	
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-  
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-/**
-  * @brief  This function sends the EnableVerificationRequirement command
-	* @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_EnableVerificationRequirement (uint16_t uReadOrWrite  )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-  NFC_StatusTypeDef	status= NFC_IO_SUCCESS ;
-  uint16_t	NbByte;
-  
-	/*check the parameters */
-	if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002))
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-  
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_ENABLE;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uReadOrWrite ) ;
-	command.Header.P2 = GETLSB	(uReadOrWrite ) ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand ( M24SR_CMDSTRUCT_ENABLEVERIFREQ,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	/* The right access to be updated in EEPROM need at least 6ms */	
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-  
-	status = M24SR_IsCorrectCRC16Residue ( pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function sends the DisableVerificationRequirement command
-	* @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_DisableVerificationRequirement (uint16_t uReadOrWrite  )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	NFC_StatusTypeDef	status= NFC_IO_SUCCESS ;
-	  uint16_t	NbByte;
-  
-	/*check the parameters */
-	if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002))
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-  
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_DEFAULT;
-	command.Header.INS = C_APDU_DISABLE;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uReadOrWrite ) ;
-	command.Header.P2 = GETLSB	(uReadOrWrite ) ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_DISABLEVERIFREQ,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	/* The right access to be updated in EEPROM need at least 6ms */		
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-  
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function sends the EnablePermananentState command
-	* @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_EnablePermanentState (uint16_t uReadOrWrite  )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	NFC_StatusTypeDef	status= NFC_IO_SUCCESS ;
-	  uint16_t	NbByte;
-
-	/*check the parameters */
-	if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002))
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-  
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_ST;
-	command.Header.INS = C_APDU_ENABLE;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uReadOrWrite ) ;
-	command.Header.P2 = GETLSB	(uReadOrWrite ) ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_ENABLEVERIFREQ,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-  
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function sends the DisablePermanentState command
-	* @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_DisablePermanentState (uint16_t uReadOrWrite  )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	NFC_StatusTypeDef	status= NFC_IO_SUCCESS ;
-	  uint16_t	NbByte;
-  
-	/*check the parameters */
-	if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002))
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-  
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_ST;
-	command.Header.INS = C_APDU_DISABLE;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uReadOrWrite ) ;
-	command.Header.P2 = GETLSB	(uReadOrWrite ) ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_DISABLEVERIFREQ,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-  
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function generates a interrupt on GPO pin
-	* @param	None
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_SendInterrupt ( void  )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	uint16_t	uP1P2 =0x001E;
-	NFC_StatusTypeDef	status= NFC_IO_SUCCESS ;
-	  uint16_t	NbByte;
-	
-	status = M24SR_ManageI2CGPO(INTERRUPT);
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_ST;
-	command.Header.INS = C_APDU_INTERRUPT;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uP1P2 ) ;
-	command.Header.P2 = GETLSB	(uP1P2 ) ;
-	command.Body.LC = 0x00 ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_SENDINTERRUPT,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-  
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-/**
-  * @brief  This function force GPO pin to low state or high Z
-	* @param	uSetOrReset : select if GPO must be low (reset) or HiZ
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-	* @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
-  */
-NFC_StatusTypeDef M24SR::M24SR_StateControl (uint8_t uSetOrReset )
-{
-	uint8_t 	*pBuffer = uM24SRbuffer;
-	uint16_t	uP1P2 =0x001F;
-	NFC_StatusTypeDef	status= NFC_IO_SUCCESS ;
-	  uint16_t	NbByte;
-	
-	/*check the parameters */
-	if ( (uSetOrReset != 0x01) && (uSetOrReset != 0x00))
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-	
-	status = M24SR_ManageI2CGPO(STATE_CONTROL);
-	
-	/* build the command */
-	command.Header.CLA = C_APDU_CLA_ST;
-	command.Header.INS = C_APDU_INTERRUPT;
-	/* copy the Password Id */
-	command.Header.P1 = GETMSB	(uP1P2 ) ;
-	command.Header.P2 = GETLSB	(uP1P2 ) ;
-	command.Body.LC = 0x01 ;
-	/* copy the data */
-	memcpy(command.Body.pData , &uSetOrReset, 0x01 );
-	//command.Body.LE = 0x00 ;
-	/* build the I²C command */
-	M24SR_BuildIBlockCommand ( M24SR_CMDSTRUCT_GPOSTATE,  &command,uDIDbyte, &NbByte , pBuffer);
-  
-	/* send the request */ 
-	errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer ));
-	errchk( M24SR_IO_IsAnswerReady ());
-	/* read the response */ 
-	errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
-  
-	status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
-	return status;
-	
-Error :
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-
-/**
-  * @brief  This function configure GPO purpose for I2C session
-	* @param	GPO_I2Cconfig: GPO configuration to set
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-  */
-NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO( uint8_t GPO_I2Cconfig)
-{
-	NFC_StatusTypeDef status;
-	uint8_t GPO_config;
-	uint8_t DefaultPassword[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-	if( GPO_I2Cconfig > STATE_CONTROL)
-	{
-		return NFC_IO_ERROR_PARAMETER;
-	}
-
-	/* we must not be in interrupt mode for I2C synchro as we will change GPO purpose */
-	M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING);
-
-	M24SR_SelectApplication();
-	M24SR_SelectSystemfile();
-	M24SR_ReadBinary (0x0004 , 0x01 , &GPO_config );
-
-    /* Update only GPO purpose for I2C */
-	GPO_config = (GPO_config & 0xF0) | GPO_I2Cconfig;
-	M24SR_SelectSystemfile();
-	M24SR_Verify(I2C_PWD ,0x10 ,DefaultPassword );
-	status = M24SR_UpdateBinary (0x0004 ,0x01, &(GPO_config) );
-
-	M24SR_Deselect();
-
-	/* if we have set interrupt mode for I2C synchro we can enable interrupt mode */
-	if ( GPO_I2Cconfig == I2C_ANSWER_READY && status == NFC_OK)
-		M24SR_IO_SetI2CSynchroMode(M24SR_INTERRUPT_GPO);
-
-	return status;
-}
-
-/**
-  * @brief  This function configure GPO purpose for RF session
-	* @param	GPO_RFconfig: GPO configuration to set
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-  */
-NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(uint8_t GPO_RFconfig)
-{
-	NFC_StatusTypeDef status;
-	uint8_t GPO_config;
-	uint8_t DefaultPassword[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-	
-	if( GPO_RFconfig > STATE_CONTROL)
-	{	
-		return NFC_IO_ERROR_PARAMETER;
-	}
-	
-	M24SR_SelectApplication();
-	M24SR_SelectSystemfile();
-	M24SR_ReadBinary (0x0004 , 0x01 , &GPO_config );
-  
-  /* Update only GPO purpose for I2C */	
-	GPO_config = (GPO_config & 0x0F) | (GPO_RFconfig<<4);
-	M24SR_SelectSystemfile();
-	M24SR_Verify(I2C_PWD ,0x10 ,DefaultPassword );
-	status = M24SR_UpdateBinary (0x0004 ,0x01, &(GPO_config) );
-	
-	return status;
-}
-
-
-/**
-  * @brief  This function enable or disable RF communication
-	* @param	OnOffChoice: GPO configuration to set
-  * @retval Status (SW1&SW2) : Status of the operation to complete.
-  */
-NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice)
-{
-	/* Disable RF */
-		if ( OnOffChoice != 0 )
-		{
-			M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
-		}
-		else
-		{
-			M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
-		}
-	return NFC_OK;
-}
-
-
-
-NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte , uint8_t *pBuffer){
-	int ret = dev_i2c.write(address,(char*)pBuffer,NbByte);
-	if(ret==0)
-		return NFC_IO_SUCCESS;
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte , uint8_t *pBuffer){
-	int ret = dev_i2c.read(address,(char*)pBuffer,NbByte);
-	if(ret==0)
-		return NFC_IO_SUCCESS;
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-
-#define M24SR_POLL_DELAY 10
-#define M24SR_I2C_POLLING       1 /* In case M24SR will reply ACK failed allow to perform retry before returning error (HAL option not used) */
-
-
-NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void)
-{
-	int status = 1;
-	uint32_t nbTry = 0;
-	char buffer;
-	//
-	wait_ms(M24SR_POLL_DELAY);
-	while (status != 0 && nbTry < M24SR_I2C_POLLING)
-	{
-		status = dev_i2c.read(address, &buffer, 1, false);
-		nbTry++;
-	}
-	if (status == 0)
-		return NFC_IO_SUCCESS;
-	//else
-	return NFC_IO_ERROR_I2CTIMEOUT;
-}
-
-NFC_StatusTypeDef M24SR::M24SR_IO_IsAnswerReady(void){
-	uint32_t retry = 0xFFFFF;
-	int8_t stable = 0;
-	GPIO_PinState PinState;
-
-	 switch (syncMode){
-	 	 case M24SR_WAITINGTIME_POLLING :
-	 		 return M24SR_IO_PollI2C ();
-
-	 	 case M24SR_WAITINGTIME_TIMEOUT :
-			// M24SR FWI=5 => (256*16/fc)*2^5=9.6ms but M24SR ask for extended time to program up to 246Bytes.
-			// can be improved by
-	 		 wait_ms(80);
-	 		 return NFC_IO_SUCCESS;
-
-	 	 case M24SR_WAITINGTIME_GPO :
-	 		 do{
-				M24SR_IO_GPO_ReadPin(&PinState);
-				if( PinState == GPIO_PIN_RESET){
-					stable ++;
-				}
-				retry --;
-	 		 }
-	 		 while(stable <5 && retry>0);
-	 		 if(!retry)
-	 			 goto Error;
-	 		 return NFC_IO_SUCCESS;
-
-	 	 case M24SR_INTERRUPT_GPO :
-
-	 		/* Check if the GPIO is not already low before calling this function */
-			M24SR_IO_GPO_ReadPin(&PinState);
-			answerReadyInterrupt.enable_irq();
-			if(PinState == GPIO_PIN_SET){
-				while (!interruptIsFired)
-					__WFE();
-			}
-			interruptIsFired=false;
-			answerReadyInterrupt.disable_irq();
-			return NFC_IO_SUCCESS;
-
-	  default :
-	    return NFC_IO_ERROR_DEFAULT;
-	  }
-
-	Error :
-	  return NFC_IO_ERROR_DEFAULT;
-}
-
-
-/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
+/**
+ ******************************************************************************
+ * @file    m24sr_class.cpp
+ * @author  MMY Application Team
+ * @version V1.2.0
+ * @date    20-October-2014
+ * @brief   This file provides a set of functions to interface with the M24SR
+ *          device.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+/* Generated with Stm32CubeTOO -----------------------------------------------*/
+
+/* Revision ------------------------------------------------------------------*/
+/*
+ Repository:       http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
+ Branch/Trunk/Tag: trunk
+ Based on:         X-CUBE-MEMS1/trunk/Drivers/BSP/Components/m24sr/m24sr.c
+ Revision:         :410
+ */
+
+/* Includes ------------------------------------------------------------------*/
+#include "m24sr_class.h"
+#include "m24sr.h"
+
+const uint8_t M24SR::DEFAULT_PASSWORD[16] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
+
+/** @addtogroup M24SR_Driver
+ * @{
+ *	@brief  <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b> 
+ */
+
+/** @defgroup drv_M24SR
+ * @{
+ *	@brief  This file contains the driver which implements all the M24SR commands.
+ */
+
+#ifndef errchk
+#define NFC_COMMAND_SUCCESS 0x9000
+#define errchk(fCall) {\
+	const NFC_StatusTypeDef status = (fCall); \
+	if((status!=NFC_SUCCESS)) \
+		return status; \
+	}\
+
+#endif
+
+/**
+ * @brief  This function updates the CRC 
+ * @param  None
+ * @retval None
+ */
+uint16_t M24SR_UpdateCrc(uint8_t ch, uint16_t *lpwCrc) {
+	ch = (ch ^ (uint8_t) ((*lpwCrc) & 0x00FF));
+	ch = (ch ^ (ch << 4));
+	*lpwCrc = (*lpwCrc >> 8) ^ ((uint16_t) ch << 8) ^ ((uint16_t) ch << 3)
+			^ ((uint16_t) ch >> 4);
+
+	return (*lpwCrc);
+}
+
+/**
+ * @brief  This function returns the CRC 16 
+ * @param  Data : pointer on the data used to compute the CRC16
+ * @param  Length : number of byte of the data
+ * @retval CRC16 
+ */
+uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length) {
+	uint8_t chBlock;
+	uint16_t wCrc = 0x6363; // ITU-V.41
+
+	do {
+		chBlock = *Data++;
+		M24SR_UpdateCrc(chBlock, &wCrc);
+	} while (--Length);
+
+	return wCrc;
+}
+
+/**  
+ * @brief  	This function computes the CRC16 residue as defined by CRC ISO/IEC 13239
+ * @param  	DataIn		:	input to data 
+ * @param		Length 		: 	Number of bits of DataIn
+ * @retval 	Status (SW1&SW2)  	:   CRC16 residue is correct	
+ * @retval 	M24SR_ERROR_CRC  	:  CRC16 residue is false
+ */
+NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue(uint8_t *DataIn, uint8_t Length) {
+	uint16_t ResCRC = 0x0000;
+
+	/* check the CRC16 Residue */
+	if (Length != 0)
+		ResCRC = M24SR_ComputeCrc(DataIn, Length);
+
+	if (ResCRC == 0x0000) {
+		/* Good CRC, but error status from M24SR */
+		return (NFC_StatusTypeDef) (((DataIn[Length - UB_STATUS_OFFSET] << 8)
+				& 0xFF00) | (DataIn[Length - LB_STATUS_OFFSET] & 0x00FF));
+	} else {
+		ResCRC = 0x0000;
+		ResCRC = M24SR_ComputeCrc(DataIn, 5);
+		if (ResCRC != 0x0000) {
+			/* Bad CRC */
+			return NFC_IO_ERROR_CRC;
+		} else {
+			/* Good CRC, but error status from M24SR */
+			return (NFC_StatusTypeDef) (((DataIn[1] << 8) & 0xFF00)
+					| (DataIn[2] & 0x00FF));
+		}
+	}
+}
+
+/**
+ * @brief 		This functions creates an I block command according to the structures CommandStructure and data->command.
+ * @param	 	Command : structue which contains the field of the different parameter
+ * @param	 	CommandStructure : structure that contain the structure of the command (if the different field are presnet or not 
+ * @param	 	NbByte : number of byte of the command
+ * @param	 	pCommand : pointer of the command created
+ */
+void M24SR_BuildIBlockCommand(uint16_t CommandStructure, C_APDU *Command,
+		uint8_t uDIDbyte, uint16_t *NbByte, uint8_t *pCommand) {
+	uint16_t uCRC16;
+	static uint8_t BlockNumber = 0x01;
+
+	(*NbByte) = 0;
+
+	/* add the PCD byte */
+	if ((CommandStructure & M24SR_PCB_NEEDED) != 0) {
+		/* toggle the block number */
+		BlockNumber = TOGGLE(BlockNumber);
+		/* Add the I block byte */
+		pCommand[(*NbByte)++] = 0x02 | BlockNumber;
+	}
+
+	/* add the DID byte */
+	if ((BlockNumber & M24SR_DID_NEEDED) != 0) {
+		/* Add the I block byte */
+		pCommand[(*NbByte)++] = uDIDbyte;
+	}
+
+	/* add the Class byte */
+	if ((CommandStructure & M24SR_CLA_NEEDED) != 0) {
+		pCommand[(*NbByte)++] = Command->Header.CLA;
+	}
+	/* add the instruction byte byte */
+	if ((CommandStructure & M24SR_INS_NEEDED) != 0) {
+		pCommand[(*NbByte)++] = Command->Header.INS;
+	}
+	/* add the Selection Mode byte */
+	if ((CommandStructure & M24SR_P1_NEEDED) != 0) {
+		pCommand[(*NbByte)++] = Command->Header.P1;
+	}
+	/* add the Selection Mode byte */
+	if ((CommandStructure & M24SR_P2_NEEDED) != 0) {
+		pCommand[(*NbByte)++] = Command->Header.P2;
+	}
+	/* add Data field lengthbyte */
+	if ((CommandStructure & M24SR_LC_NEEDED) != 0) {
+		pCommand[(*NbByte)++] = Command->Body.LC;
+	}
+	/* add Data field  */
+	if ((CommandStructure & M24SR_DATA_NEEDED) != 0) {
+		memcpy(&(pCommand[(*NbByte)]), Command->Body.pData, Command->Body.LC);
+		(*NbByte) += Command->Body.LC;
+	}
+	/* add Le field  */
+	if ((CommandStructure & M24SR_LE_NEEDED) != 0) {
+		pCommand[(*NbByte)++] = Command->Body.LE;
+	}
+	/* add CRC field  */
+	if ((CommandStructure & M24SR_CRC_NEEDED) != 0) {
+		uCRC16 = M24SR_ComputeCrc(pCommand, (uint8_t) (*NbByte));
+		/* append the CRC16 */
+		pCommand[(*NbByte)++] = GETLSB(uCRC16);
+		pCommand[(*NbByte)++] = GETMSB(uCRC16);
+	}
+
+}
+
+#if 0
+/**  
+ * @brief  	This function return M24SR_STATUS_SUCCESS if the pBuffer is an I-block
+ * @param  	pBuffer		:	pointer of the data
+ * @retval 	M24SR_STATUS_SUCCESS  :  the data is a I-Block
+ * @retval 	M24SR_ERROR_DEFAULT  	:  the data is not a I-Block
+ */
+static int8_t IsIBlock (uint8_t *pBuffer)
+{
+
+	if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_IBLOCK)
+	{
+		return M24SR_STATUS_SUCCESS;
+	}
+	else
+	{
+		return M24SR_ERROR_DEFAULT;
+	}
+
+}
+
+/**  
+ * @brief  	This function return M24SR_STATUS_SUCCESS if the pBuffer is an R-block
+ * @param  	pBuffer		:	pointer of the data
+ * @retval 	M24SR_STATUS_SUCCESS  :  the data is a R-Block
+ * @retval 	M24SR_ERROR_DEFAULT  	:  the data is not a R-Block
+ */
+static int8_t IsRBlock (uint8_t *pBuffer)
+{
+
+	if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_RBLOCK)
+	{
+		return M24SR_STATUS_SUCCESS;
+	}
+	else
+	{
+		return M24SR_ERROR_DEFAULT;
+	}
+
+}
+#endif	
+
+/**  
+ * @brief  	This function return M24SR_STATUS_SUCCESS if the pBuffer is an s-block
+ * @param  	pBuffer		:	pointer of the data
+ * @retval 	M24SR_STATUS_SUCCESS  :  the data is a S-Block
+ * @retval 	M24SR_ERROR_DEFAULT  	:  the data is not a S-Block
+ */
+static NFC_StatusTypeDef IsSBlock(uint8_t *pBuffer) {
+
+	if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK) {
+		return NFC_SUCCESS;
+	} else {
+		return NFC_ERROR;
+	}
+
+}
+
+/**
+ * @brief  This function sends the FWT extension command (S-Block format)
+ * @param	FWTbyte : FWT value
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_FWTExtension(uint8_t FWTbyte) {
+	uint8_t pBuffer[M24SR_STATUSRESPONSE_NBBYTE];
+	NFC_StatusTypeDef status;
+	uint8_t NthByte = 0;
+	uint16_t uCRC16;
+
+	/* create the response */
+	pBuffer[NthByte++] = 0xF2;
+	pBuffer[NthByte++] = FWTbyte;
+	/* compute the CRC */
+	uCRC16 = M24SR_ComputeCrc(pBuffer, 0x02);
+	/* append the CRC16 */
+	pBuffer[NthByte++] = GETLSB(uCRC16);
+	pBuffer[NthByte++] = GETMSB(uCRC16);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NthByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function sends the KillSession command to the M24SR device
+ * @param  None
+ * @retval NFC_OK : the function is succesful.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_KillSession(void) {
+	uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND;
+
+	errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer));
+
+	/* Insure no access will be done just after open session */
+	/* The only way here is to poll I2C to know when M24SR is ready */
+	/* GPO can not be use with KillSession command */
+	errchk(M24SR_IO_PollI2C());
+
+	return NFC_SUCCESS;
+}
+
+/**
+ * @brief  This function sends the Deselect command (S-Block format)
+ * @retval NFC_OK : the function is succesful.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_Deselect(void) {
+	uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND;
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(sizeof(pBuffer), pBuffer));
+
+	errchk(M24SR_IO_IsAnswerReady());
+	/* flush the M24SR buffer */
+	errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pBuffer), pBuffer));
+
+	return NFC_SUCCESS;
+}
+
+/**
+ * @brief  This function sends the SelectApplication command
+ * @retval NFC_OK : the function is succesful.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_SelectApplication(void) {
+
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
+	uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND;
+	uint8_t uLe = 0x00;
+	NFC_StatusTypeDef status;
+	uint16_t uP1P2 =0x0400,
+	NbByte;
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_SELECT_FILE;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(uP1P2);
+	command.Header.P2 = GETLSB(uP1P2);
+	/* copy the number of byte of the data field */
+	command.Body.LC = sizeof(pDataOut);
+	/* copy the data */
+	command.Body.pData = pDataOut;
+	/* copy the number of byte to read */
+	command.Body.LE = uLe;
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command,
+			uDIDbyte, &NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
+
+	status= M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+
+}
+
+/**
+ * @brief  This function initialize the M24SR device
+ * @retval None
+ */
+NFC_StatusTypeDef M24SR::M24SR_Init(NFC_InitTypeDef *notUsed) {
+	(void) notUsed;
+
+	errchk(M24SR_KillSession())
+	errchk(M24SR_ManageI2CGPO(I2C_ANSWER_READY))
+	errchk(M24SR_Deselect())
+
+	return NFC_SUCCESS;
+}
+
+NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id) {
+	if (!nfc_id) {
+		return NFC_ERROR;
+	}
+
+	errchk(M24SR_SelectApplication())
+
+	return M24SR_ReadBinary(0x0011, 1, nfc_id);
+}
+
+/**
+ * @brief  This function sends the GetSession command to the M24SR device
+ * @retval NFC_OK : the function is succesful.
+ * @retval Status (SW1&SW2) : if operation does not complete.
+ */
+NFC_StatusTypeDef M24SR::M24SR_GetSession(void) {
+	uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND;
+
+	errchk(M24SR_IO_SendI2Ccommand(sizeof(commandBuffer), commandBuffer));
+
+	/* Insure no access will be done just after open session */
+	/* The only way here is to poll I2C to know when M24SR is ready */
+	/* GPO can not be use with GetSession command */
+	errchk(M24SR_IO_PollI2C());
+
+	return NFC_SUCCESS;
+
+}
+
+/**
+ * @brief  This function sends the SelectCCFile command
+ * @retval NFC_OK : the function is succesful.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ * @retval Status (SW1&SW2) : if operation does not complete for another reason.
+ */
+NFC_StatusTypeDef M24SR::M24SR_SelectCCfile(void) {
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
+	uint8_t pDataOut[] = CC_FILE_ID_BYTES;
+	NFC_StatusTypeDef status;
+	uint16_t uP1P2 =0x000C,
+	NbByte;
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_SELECT_FILE;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(uP1P2);
+	command.Header.P2 = GETLSB(uP1P2);
+	/* copy the number of byte of the data field */
+	command.Body.LC = sizeof(pDataOut);
+	command.Body.pData = pDataOut;
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
+
+	status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function sends the SelectSystemFile command
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_SelectSystemfile(void) {
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
+	uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES;
+	NFC_StatusTypeDef status;
+	uint16_t uP1P2 =0x000C,
+	NbByte;
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_SELECT_FILE;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(uP1P2);
+	command.Header.P2 = GETLSB(uP1P2);
+	/* copy the number of byte of the data field */
+	command.Body.LC = sizeof(pDataOut);
+	command.Body.pData = pDataOut;
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
+
+	status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function sends the SelectNDEFfile command
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_SelectNDEFfile(uint16_t NDEFfileId) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE];
+	uint8_t pDataOut[] = { GETMSB(NDEFfileId), GETLSB(NDEFfileId) };
+	NFC_StatusTypeDef status;
+	uint16_t uP1P2 = 0x000C, NbByte;
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_SELECT_FILE;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(uP1P2);
+	command.Header.P2 = GETLSB(uP1P2);
+	/* copy the number of byte of the data field */
+	command.Body.LC = sizeof(pDataOut);
+	command.Body.pData = pDataOut;
+	/* copy the offset */
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTNDEFFILE, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn));
+
+	status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn));
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+
+}
+
+/**
+ * @brief  This function sends a read binary command
+ * @param	Offset : first byte to read
+ * @param	NbByteToRead : number of byte to read
+ * @param	pBufferRead : pointer of the buffer read from the M24SR device
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_ReadBinary(uint16_t Offset, uint8_t NbByteToRead,
+		uint8_t *pBufferRead) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status;
+	uint16_t NbByte;
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_READ_BINARY;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(Offset);
+	command.Header.P2 = GETLSB(Offset);
+	/* copy the number of byte to read */
+	command.Body.LE = NbByteToRead;
+
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer,
+			NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE);
+	if(status != NFC_COMMAND_SUCCESS)
+		return status;
+	/* retrieve the data without SW1 & SW2 as provided as return value of the function */
+	memcpy(pBufferRead, &pBuffer[1], NbByteToRead);
+	return NFC_SUCCESS;
+
+}
+
+/**
+ * @brief  This function sends a ST read binary command (no error if access is not inside NDEF file)
+ * @param	Offset : first byte to read
+ * @param	NbByteToRead : number of byte to read
+ * @param	pBufferRead : pointer of the buffer read from the M24SR device
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. 
+ */
+NFC_StatusTypeDef M24SR::M24SR_STReadBinary(uint16_t Offset,
+		uint8_t NbByteToRead, uint8_t *pBufferRead) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status;
+	uint16_t NbByte;
 
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_ST;
+	command.Header.INS = C_APDU_READ_BINARY;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(Offset);
+	command.Header.P2 = GETLSB(Offset);
+	/* copy the number of byte to read */
+	command.Body.LE = NbByteToRead;
+
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_READBINARY, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer,
+			NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status != NFC_COMMAND_SUCCESS)
+		return status;
+	/* retrieve the data without SW1 & SW2 as provided as return value of the function */
+	memcpy(pBufferRead, &pBuffer[1], NbByteToRead);
+	return NFC_SUCCESS;
+}
+
+/**
+ * @brief  This function sends a Update binary command
+ * @param	Offset : first byte to read
+ * @param	NbByteToWrite : number of byte to write
+ * @param	pBufferRead : pointer of the buffer read from the M24SR device
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_UpdateBinary(uint16_t Offset,
+		uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
+	//TODO check the length of the data to write
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status;
+	uint16_t NbByte;
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_UPDATE_BINARY;
+	/* copy the offset */
+	command.Header.P1 = GETMSB(Offset);
+	command.Header.P2 = GETLSB(Offset);
+	/* copy the number of byte of the data field */
+	command.Body.LC = NbByteToWrite;
+	command.Body.pData = pDataToWrite;
+	/* copy the File Id */
+	//memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite );
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_UPDATEBINARY, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+	/* if the response is a Watiting frame extenstion request */
+
+	if (IsSBlock(pBuffer) == NFC_SUCCESS) {
+		/*check the CRC */
+		status =M24SR_IsCorrectCRC16Residue(pBuffer,
+				M24SR_WATINGTIMEEXTRESPONSE_NBBYTE);
+		// TODO: why if we check ==NFC_Commandsuccess it fail?
+		if (status != NFC_IO_ERROR_CRC) {
+			/* send the FrameExension response*/
+			errchk(M24SR_FWTExtension(pBuffer[M24SR_OFFSET_PCB + 1]));
+		}else
+			return status;
+	} else {
+		status = M24SR_IsCorrectCRC16Residue(pBuffer,
+				M24SR_STATUSRESPONSE_NBBYTE);
+		if(status!=NFC_COMMAND_SUCCESS)
+			return status;
+	}
+
+	return NFC_SUCCESS;
+
+}
+
+/**
+ * @brief  This function sends the Verify command
+ * @param	uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
+ * @param	NbPwdByte : Number of byte ( 0x00 or 0x10)
+ * @param	pPwd : pointer on the passwaord
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_Verify(uint16_t uPwdId, uint8_t NbPwdByte,
+		const uint8_t *pPwd) {
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if (uPwdId > 0x0003) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+	if ((NbPwdByte != 0x00) && (NbPwdByte != 0x10)) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_VERIFY;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uPwdId);
+	command.Header.P2 = GETLSB(uPwdId);
+	/* copy the number of byte of the data field */
+	command.Body.LC = NbPwdByte;
+
+	if (NbPwdByte == 0x10) {
+		/* copy the password */
+		command.Body.pData = pPwd;
+		/* build the I2C command */
+		M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,
+				uDIDbyte, &NbByte, pBuffer);
+	} else {
+		command.Body.pData = NULL;
+		/* build the I2C command */
+		M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,
+				uDIDbyte, &NbByte, pBuffer);
+	}
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	/* wait for answer ready */
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+
+}
+
+/**
+ * @brief  This function sends the ChangeReferenceData command
+ * @param	uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd)
+ * @param	pPwd : pointer on the passwaord
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_ChangeReferenceData(uint16_t uPwdId,
+		uint8_t *pPwd) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if (uPwdId > 0x0003) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_CHANGE;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uPwdId);
+	command.Header.P2 = GETLSB(uPwdId);
+	/* copy the number of byte of the data field */
+	command.Body.LC = M24SR_PASSWORD_NBBYTE;
+	/* copy the password */
+	command.Body.pData = pPwd;
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_CHANGEREFDATA, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function sends the EnableVerificationRequirement command
+ * @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_EnableVerificationRequirement(
+		uint16_t uReadOrWrite) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_ENABLE;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uReadOrWrite);
+	command.Header.P2 = GETLSB(uReadOrWrite);
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,
+			uDIDbyte, &NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	/* The right access to be updated in EEPROM need at least 6ms */
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function sends the DisableVerificationRequirement command
+ * @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_DisableVerificationRequirement(
+		uint16_t uReadOrWrite) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_DEFAULT;
+	command.Header.INS = C_APDU_DISABLE;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uReadOrWrite);
+	command.Header.P2 = GETLSB(uReadOrWrite);
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
+			uDIDbyte, &NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	/* The right access to be updated in EEPROM need at least 6ms */
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+
+}
+
+/**
+ * @brief  This function sends the EnablePermananentState command
+ * @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_EnablePermanentState(uint16_t uReadOrWrite) {
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_ST;
+	command.Header.INS = C_APDU_ENABLE;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uReadOrWrite);
+	command.Header.P2 = GETLSB(uReadOrWrite);
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function sends the DisablePermanentState command
+ * @param	uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write  )
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_DisablePermanentState(uint16_t uReadOrWrite) {
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if ((uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_ST;
+	command.Header.INS = C_APDU_DISABLE;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uReadOrWrite);
+	command.Header.P2 = GETLSB(uReadOrWrite);
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,
+			uDIDbyte, &NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function generates a interrupt on GPO pin
+ * @param	None
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_SendInterrupt(void) {
+	C_APDU command;
+
+	uint8_t *pBuffer = uM24SRbuffer;
+	uint16_t uP1P2 = 0x001E;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	status = M24SR_ManageI2CGPO(INTERRUPT);
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_ST;
+	command.Header.INS = C_APDU_INTERRUPT;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uP1P2);
+	command.Header.P2 = GETLSB(uP1P2);
+	command.Body.LC = 0x00;
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SENDINTERRUPT, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+
+}
+
+/**
+ * @brief  This function force GPO pin to low state or high Z
+ * @param	uSetOrReset : select if GPO must be low (reset) or HiZ
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured.
+ */
+NFC_StatusTypeDef M24SR::M24SR_StateControl(uint8_t uSetOrReset) {
+	C_APDU command;
+	uint8_t *pBuffer = uM24SRbuffer;
+	uint16_t uP1P2 = 0x001F;
+	NFC_StatusTypeDef status = NFC_SUCCESS;
+	uint16_t NbByte;
+
+	/*check the parameters */
+	if ((uSetOrReset != 0x01) && (uSetOrReset != 0x00)) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	status = M24SR_ManageI2CGPO(STATE_CONTROL);
+
+	/* build the command */
+	command.Header.CLA = C_APDU_CLA_ST;
+	command.Header.INS = C_APDU_INTERRUPT;
+	/* copy the Password Id */
+	command.Header.P1 = GETMSB(uP1P2);
+	command.Header.P2 = GETLSB(uP1P2);
+	command.Body.LC = 0x01;
+	command.Body.pData = &uSetOrReset;
+	/* copy the data */
+	//memcpy(command.Body.pData , &uSetOrReset, 0x01 );
+	//command.Body.LE = 0x00 ;
+	/* build the I²C command */
+	M24SR_BuildIBlockCommand( M24SR_CMDSTRUCT_GPOSTATE, &command, uDIDbyte,
+			&NbByte, pBuffer);
+
+	/* send the request */
+	errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer));
+	errchk(M24SR_IO_IsAnswerReady());
+	/* read the response */
+	errchk(
+			M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer ));
+
+	status = M24SR_IsCorrectCRC16Residue(pBuffer, M24SR_STATUSRESPONSE_NBBYTE);
+
+	if(status == NFC_COMMAND_SUCCESS)
+		return NFC_SUCCESS;
+	else
+		return status;
+}
+
+/**
+ * @brief  This function configure GPO purpose for I2C session
+ * @param	GPO_I2Cconfig: GPO configuration to set
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ */
+NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO(M24SR_GPO_MGMT GPO_I2Cconfig) {
+	uint8_t GPO_config = 0;
+
+	if (GPO_I2Cconfig > STATE_CONTROL) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	/* we must not be in interrupt mode for I2C synchro as we will change GPO purpose */
+	M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING);
+
+	errchk(M24SR_SelectApplication());
+
+	errchk(M24SR_SelectSystemfile());
+
+	errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config))
+
+	/* Update only GPO purpose for I2C */
+	GPO_config = (GPO_config & 0xF0) | GPO_I2Cconfig;
+
+	errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD));
+
+	errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config)));
+
+	/* if we have set interrupt mode for I2C synchro we can enable interrupt mode */
+	if (GPO_I2Cconfig == I2C_ANSWER_READY)
+		M24SR_IO_SetI2CSynchroMode(M24SR_INTERRUPT_GPO);
+
+	return NFC_SUCCESS;
+}
+
+/**
+ * @brief  This function configure GPO purpose for RF session
+ *
+ * @param	GPO_RFconfig: GPO configuration to set
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ */
+NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(M24SR_GPO_MGMT GPO_RFconfig) {
+	uint8_t GPO_config;
+
+	if (GPO_RFconfig > STATE_CONTROL) {
+		return NFC_IO_ERROR_PARAMETER;
+	}
+
+	errchk(M24SR_SelectApplication())
+	errchk(M24SR_SelectSystemfile())
+	errchk(M24SR_ReadBinary(0x0004, 0x01, &GPO_config))
+
+	/* Update only GPO purpose for I2C */
+	GPO_config = (GPO_config & 0x0F) | (GPO_RFconfig << 4);
+
+	errchk(M24SR_SelectSystemfile())
+	errchk(M24SR_Verify(I2C_PWD, 0x10, DEFAULT_PASSWORD))
+	errchk(M24SR_UpdateBinary(0x0004, 0x01, &(GPO_config)))
+
+	return NFC_SUCCESS;
+}
+
+/**
+ * @brief  This function enable or disable RF communication
+ * @param	OnOffChoice: GPO configuration to set
+ * @retval Status (SW1&SW2) : Status of the operation to complete.
+ */
+NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) {
+	/* Disable RF */
+	if (OnOffChoice != 0) {
+		M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET);
+	} else {
+		M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET);
+	}
+	return NFC_SUCCESS;
+}
+
+NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte,
+		uint8_t *pBuffer) {
+	int ret = dev_i2c.write(address, (char*) pBuffer, NbByte);
+	if (ret == 0)
+		return NFC_SUCCESS;
+	return NFC_IO_ERROR_I2CTIMEOUT;
+}
+
+NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
+		uint8_t *pBuffer) {
+	int ret = dev_i2c.read(address, (char*) pBuffer, NbByte);
+	if (ret == 0)
+		return NFC_SUCCESS;
+
+	return NFC_IO_ERROR_I2CTIMEOUT;
+}
+
+#define M24SR_POLL_DELAY 10
+#define M24SR_I2C_POLLING       200 /* In case M24SR will reply ACK failed allow to perform retry before returning error (HAL option not used) */
+
+NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) {
+
+	int status = 1;
+	uint32_t nbTry = 0;
+	char buffer;
+	//
+	wait_ms(M24SR_POLL_DELAY);
+	while (status != 0 && nbTry < M24SR_I2C_POLLING) {
+		status = dev_i2c.read(address, &buffer, 1, false);
+		nbTry++;
+	}
+
+	if (status == 0)
+		return NFC_SUCCESS;
+	//else
+	return NFC_IO_ERROR_I2CTIMEOUT;
+}
+
+NFC_StatusTypeDef M24SR::M24SR_IO_IsAnswerReady(void) {
+	uint32_t retry = 0xFFFFF;
+	int8_t stable = 0;
+	GPIO_PinState PinState;
+
+	switch (syncMode) {
+	case M24SR_WAITINGTIME_POLLING:
+		return M24SR_IO_PollI2C();
+
+	case M24SR_WAITINGTIME_TIMEOUT:
+		// M24SR FWI=5 => (256*16/fc)*2^5=9.6ms but M24SR ask for extended time to program up to 246Bytes.
+		// can be improved by
+		wait_ms(80);
+		return NFC_SUCCESS;
+
+	case M24SR_WAITINGTIME_GPO:
+		do {
+			M24SR_IO_GPO_ReadPin(&PinState);
+			if (PinState == GPIO_PIN_RESET) {
+				stable++;
+			}
+			retry--;
+		} while (stable < 5 && retry > 0);
+		if (!retry)
+			goto Error;
+		return NFC_SUCCESS;
+
+	case M24SR_INTERRUPT_GPO:
+
+		/* Check if the GPIO is not already low before calling this function */
+		M24SR_IO_GPO_ReadPin(&PinState);
+		answerReadyInterrupt.enable_irq();
+		if (PinState == GPIO_PIN_SET) {
+			while (!interruptIsFired)
+				__WFE();
+		}
+		//the interrupt is disable insde the interrupt callback
+		//answerReadyInterrupt.disable_irq();
+		interruptIsFired = false;
+		return NFC_SUCCESS;
+
+	default:
+		return NFC_IO_ERROR_I2CTIMEOUT;
+	}
+
+	Error: return NFC_IO_ERROR_I2CTIMEOUT;
+}
+
+/******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/
--- a/m24sr/m24sr_class.h	Thu Nov 19 08:50:18 2015 +0000
+++ b/m24sr/m24sr_class.h	Fri Nov 27 15:10:25 2015 +0000
@@ -1,441 +1,431 @@
-/**
-  ******************************************************************************
-  * @file    m24sr_class.h
-  * @author  MMY Application Team
-  * @version V1.2.0
-  * @date    20-October-2014
-  * @brief   This file provides a set of functions to interface with the M24SR
-  *          device.
-  ******************************************************************************
-  * @attention
-  *
-  * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
-  *
-  * Redistribution and use in source and binary forms, with or without modification,
-  * are permitted provided that the following conditions are met:
-  *   1. Redistributions of source code must retain the above copyright notice,
-  *      this list of conditions and the following disclaimer.
-  *   2. Redistributions in binary form must reproduce the above copyright notice,
-  *      this list of conditions and the following disclaimer in the documentation
-  *      and/or other materials provided with the distribution.
-  *   3. Neither the name of STMicroelectronics nor the names of its contributors
-  *      may be used to endorse or promote products derived from this software
-  *      without specific prior written permission.
-  *
-  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
-  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-  *
-  ******************************************************************************
-  */
-
-
-/* Generated with Stm32CubeTOO -----------------------------------------------*/
-
-
-/* Revision ------------------------------------------------------------------*/
-/*
-	Repository:       http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
-	Branch/Trunk/Tag: trunk
-	Based on:         X-CUBE-MEMS1/trunk/Drivers/BSP/Components/m24sr/m24sr.h
-	Revision:         402
-*/
-
-
-/* Define to prevent recursive inclusion -------------------------------------*/
-
-#ifndef __M24SR_CLASS_H
-#define __M24SR_CLASS_H
-
-
-/* Includes ------------------------------------------------------------------*/
-
-/* ACTION 1 ------------------------------------------------------------------*
- * Include here platform specific header files.                               *
- *----------------------------------------------------------------------------*/		
-#include "mbed.h"
-#include "I2C.h"
-/* ACTION 2 ------------------------------------------------------------------*
- * Include here component specific header files.                              *
- *----------------------------------------------------------------------------*/		
-#include "m24sr.h"
-/* ACTION 3 ------------------------------------------------------------------*
- * Include here interface specific header files.                              *
- *                                                                            *
- * Example:                                                                   *
- *   #include "../Interfaces/Humidity_class.h"                                *
- *   #include "../Interfaces/Temperature_class.h"                             *
- *----------------------------------------------------------------------------*/
-#include "Interfaces/Nfc_class.h"
-
-
-/* Classes -------------------------------------------------------------------*/
-
-/** Class representing a M24SR component.
- */
-class M24SR : public Nfc
-{
-
-public:
-
-	/*** Constructor and Destructor Methods ***/
-
-	/**
-	 * @brief Constructor.
-	 * @param address I2C address of the component.
-	 * @param i2c     I2C device to be used for communication.
-	 */
-	M24SR(const uint8_t address, I2C &i2c, const PinName& GPOPinName,const PinName& RFDISPinName) :
-		Nfc(), address(address), dev_i2c(i2c), GPOPin(GPOPinName),RFDisablePin(RFDISPinName),answerReadyInterrupt(GPOPinName)
-	{
-		/* ACTION 4 ----------------------------------------------------------*
-		 * Initialize here the component's member variables, one variable per *
-		 * line.                                                              *
-		 *                                                                    *
-		 * Example:                                                           *
-		 *   T0_out = 0;                                                      *
-		 *   T1_out = 0;                                                      *
-		 *   T0_degC = 0;                                                     *
-		 *   T1_degC = 0;                                                     *
-		 *--------------------------------------------------------------------*/
-		memset(&command, 0, sizeof(C_APDU));
-		M24SR_InitCommandStructure();
-		memset(dataBuffer, 0, 0xFF * sizeof(int8_t));
-		memset(uM24SRbuffer, 0, 0xFF * sizeof(int8_t));
-		M24SR_ManageI2CGPO(I2C_ANSWER_READY);
-		uDIDbyte = 0;
-		RFDisablePin=0;
-		GPOPin.mode(PullNone);
-		answerReadyInterrupt.disable_irq();
-		answerReadyInterrupt.fall(this,&M24SR::M24SR_AnswerReadyInterruptCallback);
-		answerReadyInterrupt.mode(PullNone);
-	}
-	
-	/**
-	 * @brief Destructor.
-	 */
-	virtual ~M24SR(void) {}
-	
-
-	/*** Public Component Related Methods ***/
-
-	/* ACTION 5 --------------------------------------------------------------*
-	 * Implement here the component's public methods, as wrappers of the C    *
-	 * component's functions.                                                 *
-	 * They should be:                                                        *
-	 *   + Methods with the same name of the C component's virtual table's    *
-	 *     functions (1);                                                     *
-	 *   + Methods with the same name of the C component's extended virtual   *
-	 *     table's functions, if any (2).                                     *
-	 *                                                                        *
-	 * Example:                                                               *
-	 *   virtual int GetValue(float *pData) //(1)                             *
-	 *   {                                                                    *
-	 *     return COMPONENT_GetValue(float *pfData);                          *
-	 *   }                                                                    *
-	 *                                                                        *
-	 *   virtual int EnableFeature(void) //(2)                                *
-	 *   {                                                                    *
-	 *     return COMPONENT_EnableFeature();                                  *
-	 *   }                                                                    *
-	 *------------------------------------------------------------------------*/
-	virtual int Init(void *init)
-	{
-		//use the gpo for notfy when a response is ready
-
-		return NFC_OK;
-	}
-
-	virtual int ReadID(uint8_t *id)
-	{
-		return (NFC_StatusTypeDef) M24SR_ReadID((uint8_t *) id);
-	}
-
-	virtual NFC_StatusTypeDef SendInterrupt(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_SendInterrupt();
-	}
-
-	virtual NFC_StatusTypeDef GetSession(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_GetSession();
-	}
-
-	virtual NFC_StatusTypeDef KillSession(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_KillSession();
-	}
-
-	virtual NFC_StatusTypeDef Deselect(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_Deselect();
-	}
-
-	virtual NFC_StatusTypeDef SelectApplication(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_SelectApplication();
-	}
-
-	virtual NFC_StatusTypeDef SelectCCfile(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_SelectCCfile();
-	}
-
-	virtual NFC_StatusTypeDef SelectNDEFfile(uint16_t NDEFfileId)
-	{
-		return (NFC_StatusTypeDef) M24SR_SelectNDEFfile((uint16_t) NDEFfileId);
-	}
-
-	virtual NFC_StatusTypeDef SelectSystemfile(void)
-	{
-		return (NFC_StatusTypeDef) M24SR_SelectSystemfile();
-	}
-
-	virtual NFC_StatusTypeDef ReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead)
-	{
-		return (NFC_StatusTypeDef) M24SR_ReadBinary((uint16_t) Offset, (uint8_t) NbByteToRead, (uint8_t *) pBufferRead);
-	}
-
-	virtual NFC_StatusTypeDef UpdateBinary(uint16_t Offset, uint8_t NbByteToWrite, uint8_t *pDataToWrite)
-	{
-		return (NFC_StatusTypeDef) M24SR_UpdateBinary((uint16_t) Offset, (uint8_t) NbByteToWrite, (uint8_t *) pDataToWrite);
-	}
-
-	virtual NFC_StatusTypeDef Verify(uint16_t uPwdId, uint8_t NbPwdByte, uint8_t *pPwd)
-	{
-		return (NFC_StatusTypeDef) M24SR_Verify((uint16_t) uPwdId, (uint8_t) NbPwdByte, (uint8_t *) pPwd);
-	}
-
-	virtual NFC_StatusTypeDef ChangeReferenceData(uint16_t uPwdId, uint8_t *pPwd)
-	{
-		return (NFC_StatusTypeDef) M24SR_ChangeReferenceData((uint16_t) uPwdId, (uint8_t *) pPwd);
-	}
-
-	virtual NFC_StatusTypeDef EnableVerificationRequirement(uint16_t uReadOrWrite)
-	{
-		return (NFC_StatusTypeDef) M24SR_EnableVerificationRequirement((uint16_t) uReadOrWrite);
-	}
-
-	virtual NFC_StatusTypeDef DisableVerificationRequirement(uint16_t uReadOrWrite)
-	{
-		return (NFC_StatusTypeDef) M24SR_DisableVerificationRequirement((uint16_t) uReadOrWrite);
-	}
-
-	virtual NFC_StatusTypeDef STReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead)
-	{
-		return (NFC_StatusTypeDef) M24SR_STReadBinary((uint16_t) Offset, (uint8_t) NbByteToRead, (uint8_t *) pBufferRead);
-	}
-
-	virtual NFC_StatusTypeDef EnablePermanentState(uint16_t uReadOrWrite)
-	{
-		return (NFC_StatusTypeDef) M24SR_EnablePermanentState((uint16_t) uReadOrWrite);
-	}
-
-	virtual NFC_StatusTypeDef DisablePermanentState(uint16_t uReadOrWrite)
-	{
-		return (NFC_StatusTypeDef) M24SR_DisablePermanentState((uint16_t) uReadOrWrite);
-	}
-
-	virtual NFC_StatusTypeDef StateControl(uint8_t uSetOrReset)
-	{
-		return (NFC_StatusTypeDef) M24SR_StateControl((uint8_t) uSetOrReset);
-	}
-
-	virtual NFC_StatusTypeDef ManageI2CGPO(uint8_t GPO_I2Cconfig)
-	{
-		return (NFC_StatusTypeDef) M24SR_ManageI2CGPO((uint8_t) GPO_I2Cconfig);
-	}
-
-	virtual NFC_StatusTypeDef ManageRFGPO(uint8_t GPO_RFconfig)
-	{
-		return (NFC_StatusTypeDef) M24SR_ManageRFGPO((uint8_t) GPO_RFconfig);
-	}
-
-	virtual NFC_StatusTypeDef RFConfig(uint8_t OnOffChoice)
-	{
-		return (NFC_StatusTypeDef) M24SR_RFConfig((uint8_t) OnOffChoice);
-	}
-
-
-	/*** Public Interrupt Related Methods ***/
-
-	/* ACTION 6 --------------------------------------------------------------*
-	 * Implement here interrupt related methods, if any.                      *
-	 * Note that interrupt handling is platform dependent, e.g.:              *
-	 *   + mbed:                                                              *
-	 *     InterruptIn feature_int(pin); //Interrupt object.                  *
-	 *     feature_int.rise(callback);   //Attach a callback.                 *
-	 *     feature_int.mode(PullNone);   //Set interrupt mode.                *
-	 *     feature_int.enable_irq();     //Enable interrupt.                  *
-	 *     feature_int.disable_irq();    //Disable interrupt.                 *
-	 *   + Arduino:                                                           *
-	 *     attachInterrupt(pin, callback, RISING); //Attach a callback.       *
-	 *     detachInterrupt(pin);                   //Detach a callback.       *
-	 *                                                                        *
-	 * Example (mbed):                                                        *
-	 *   void Attach_Feature_IRQ(void (*fptr) (void))                         *
-	 *   {                                                                    *
-	 *     feature_int.rise(fptr);                                            *
-	 *   }                                                                    *
-	 *                                                                        *
-	 *   void Enable_Feature_IRQ(void)                                        *
-	 *   {                                                                    *
-	 *     feature_int.enable_irq();                                          *
-	 *   }                                                                    *
-	 *                                                                        *
-	 *   void Disable_Feature_IRQ(void)                                       *
-	 *   {                                                                    *
-	 *     feature_int.disable_irq();                                         *
-	 *   }                                                                    *
-	 *------------------------------------------------------------------------*/
-
-
-protected:
-
-	/*** Protected Component Related Methods ***/
-
-	/* ACTION 7 --------------------------------------------------------------*
-	 * Declare here the component's specific methods.                         *
-	 * They should be:                                                        *
-	 *   + Methods with the same name of the C component's virtual table's    *
-	 *     functions (1);                                                     *
-	 *   + Methods with the same name of the C component's extended virtual   *
-	 *     table's functions, if any (2);                                     *
-	 *   + Helper methods, if any, like functions declared in the component's *
-	 *     source files but not pointed by the component's virtual table (3). *
-	 *                                                                        *
-	 * Example:                                                               *
-	 *   DrvStatusTypeDef COMPONENT_GetValue(float* pfData); //(1)            *
-	 *   DrvStatusTypeDef COMPONENT_EnableFeature(void);     //(2)            *
-	 *   DrvStatusTypeDef COMPONENT_ComputeAverage(void);    //(3)            *
-	 *------------------------------------------------------------------------*/
-	NFC_StatusTypeDef M24SR_Init(NFC_InitTypeDef *);
-	void M24SR_InitCommandStructure ( void );
-	NFC_StatusTypeDef M24SR_ReadID(uint8_t *nfc_id);
-	NFC_StatusTypeDef M24SR_GetSession(void);
-	NFC_StatusTypeDef M24SR_KillSession(void);
-	NFC_StatusTypeDef M24SR_Deselect(void);
-	NFC_StatusTypeDef M24SR_SelectApplication(void);
-	NFC_StatusTypeDef M24SR_SelectCCfile(void);
-	NFC_StatusTypeDef M24SR_SelectNDEFfile(uint16_t NDEFfileId);
-	NFC_StatusTypeDef M24SR_SelectSystemfile(void);
-	NFC_StatusTypeDef M24SR_ReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead);
-	NFC_StatusTypeDef M24SR_STReadBinary(uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead);
-	NFC_StatusTypeDef M24SR_UpdateBinary(uint16_t Offset, uint8_t NbByteToWrite, uint8_t *pDataToWrite);
-	NFC_StatusTypeDef M24SR_Verify(uint16_t uPwdId, uint8_t NbPwdByte, uint8_t *pPwd);
-	NFC_StatusTypeDef M24SR_ChangeReferenceData(uint16_t uPwdId, uint8_t *pPwd);
-	NFC_StatusTypeDef M24SR_EnableVerificationRequirement(uint16_t uReadOrWrite);
-	NFC_StatusTypeDef M24SR_DisableVerificationRequirement(uint16_t uReadOrWrite);
-	NFC_StatusTypeDef M24SR_EnablePermanentState(uint16_t uReadOrWrite);
-	NFC_StatusTypeDef M24SR_DisablePermanentState(uint16_t uReadOrWrite);
-	NFC_StatusTypeDef M24SR_SendInterrupt(void);
-	NFC_StatusTypeDef M24SR_StateControl(uint8_t uSetOrReset);
-	NFC_StatusTypeDef M24SR_ManageI2CGPO(uint8_t GPO_I2Cconfig);
-	NFC_StatusTypeDef M24SR_ManageRFGPO(uint8_t GPO_RFconfig);
-	NFC_StatusTypeDef M24SR_RFConfig(uint8_t OnOffChoice);
-	NFC_StatusTypeDef M24SR_FWTExtension(uint8_t FWTbyte );
-
-
-	/* ACTION 8 --------------------------------------------------------------*
-	 * Implement here other I/O methods beyond those already implemented      *
-	 * above, which are declared extern within the component's header file.   *
-	 *------------------------------------------------------------------------*/
-
-
-	NFC_StatusTypeDef M24SR_IO_IsAnswerReady(void);
-
-	NFC_StatusTypeDef M24SR_IO_SendI2Ccommand(uint8_t NbByte , uint8_t *pBuffer);
-
-	NFC_StatusTypeDef M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte , uint8_t *pBuffer);
-
-
-	NFC_StatusTypeDef M24SR_IO_PollI2C(void);
-
-	void M24SR_IO_GPO_ReadPin(GPIO_PinState *pPinState)
-	{
-		if(GPOPin==0)
-			(*pPinState)=GPIO_PIN_RESET;
-		else
-			(*pPinState)=GPIO_PIN_SET;
-	}
-
-	void M24SR_IO_RFDIS_WritePin(GPIO_PinState PinState)
-	{
-		if(PinState==GPIO_PIN_RESET)
-			RFDisablePin=0;
-		else
-			RFDisablePin=1;
-	}
-
-	void M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_MGMT mode)
-	{
-		syncMode=mode;
-	}
-
-	void M24SR_AnswerReadyInterruptCallback(){
-		interruptIsFired=true;
-	}
-
-	/*** Component's Instance Variables ***/
-
-	/* Identity */
-	uint8_t who_am_i;
-
-	/* ACTION 9 --------------------------------------------------------------*
-	 * There should be only a unique identifier for each component, which     *
-	 * should be the "who_am_i" parameter, hence this parameter is optional.  *
-	 *------------------------------------------------------------------------*/
-	/* Type. */
-	uint8_t type;
-
-	/* Configuration. */
-	uint8_t address;
-
-	/* IO Device. */
-	I2C &dev_i2c;
-
-	/* GPIO */
-	DigitalIn GPOPin;
-	DigitalOut RFDisablePin;
-	InterruptIn answerReadyInterrupt;
-	M24SR_WAITINGTIME_MGMT syncMode;
-
-	/* Interrupts. */
-	/* ACTION 10 -------------------------------------------------------------*
-	 * Put here interrupt related objects, if needed.                         *
-	 * Note that interrupt handling is platform dependent, see                *
-	 * "Interrupt Related Methods" above.                                     *
-	 *                                                                        *
-	 * Example:                                                               *
-	 *   + mbed:                                                              *
-	 *     InterruptIn feature_int;                                           *
-	 *------------------------------------------------------------------------*/
-
-	/* Data. */
-	/* ACTION 11 -------------------------------------------------------------*
-	 * Declare here the component's data, one variable per line.              *
-	 *                                                                        *
-	 * Example:                                                               *
-	 *   int T0_out;                                                          *
-	 *   int T1_out;                                                          *
-	 *   float T0_degC;                                                       *
-	 *   float T1_degC;                                                       *
-	 *------------------------------------------------------------------------*/
-	C_APDU	command;
-	uint8_t	dataBuffer[0xFF];
-	uint8_t	uM24SRbuffer [0xFF];
-	uint8_t	uDIDbyte;
-	bool interruptIsFired;
-};
-
-#endif // __M24SR_CLASS_H
-
-/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ 
+/**
+ ******************************************************************************
+ * @file    m24sr_class.h
+ * @author  MMY Application Team
+ * @version V1.2.0
+ * @date    20-October-2014
+ * @brief   This file provides a set of functions to interface with the M24SR
+ *          device.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of STMicroelectronics nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************
+ */
+
+/* Generated with Stm32CubeTOO -----------------------------------------------*/
+
+/* Revision ------------------------------------------------------------------*/
+/*
+ Repository:       http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
+ Branch/Trunk/Tag: trunk
+ Based on:         X-CUBE-MEMS1/trunk/Drivers/BSP/Components/m24sr/m24sr.h
+ Revision:         402
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+
+#ifndef __M24SR_CLASS_H
+#define __M24SR_CLASS_H
+
+/* Includes ------------------------------------------------------------------*/
+
+/* ACTION 1 ------------------------------------------------------------------*
+ * Include here platform specific header files.                               *
+ *----------------------------------------------------------------------------*/
+#include "mbed.h"
+#include "I2C.h"
+/* ACTION 2 ------------------------------------------------------------------*
+ * Include here component specific header files.                              *
+ *----------------------------------------------------------------------------*/
+#include "m24sr.h"
+/* ACTION 3 ------------------------------------------------------------------*
+ * Include here interface specific header files.                              *
+ *                                                                            *
+ * Example:                                                                   *
+ *   #include "../Interfaces/Humidity_class.h"                                *
+ *   #include "../Interfaces/Temperature_class.h"                             *
+ *----------------------------------------------------------------------------*/
+#include "Interfaces/Nfc_class.h"
+
+/* Classes -------------------------------------------------------------------*/
+
+/** Class representing a M24SR component.
+ */
+class M24SR: public Nfc {
+
+public:
+
+	static const uint8_t DEFAULT_PASSWORD[16];
+	/*** Constructor and Destructor Methods ***/
+
+	/**
+	 * @brief Constructor.
+	 * @param address I2C address of the component.
+	 * @param i2c     I2C device to be used for communication.
+	 */
+	M24SR(const uint8_t address, I2C &i2c, const PinName& GPOPinName,
+			const PinName& RFDISPinName) :
+			Nfc(), address(address), dev_i2c(i2c), GPOPin(GPOPinName), RFDisablePin(
+					RFDISPinName), answerReadyInterrupt(GPOPinName), interruptIsFired(
+					false) {
+		/* ACTION 4 ----------------------------------------------------------*
+		 * Initialize here the component's member variables, one variable per *
+		 * line.                                                              *
+		 *                                                                    *
+		 * Example:                                                           *
+		 *   T0_out = 0;                                                      *
+		 *   T1_out = 0;                                                      *
+		 *   T0_degC = 0;                                                     *
+		 *   T1_degC = 0;                                                     *
+		 *--------------------------------------------------------------------*/
+		memset(uM24SRbuffer, 0, 0xFF * sizeof(int8_t));
+		syncMode = M24SR_WAITINGTIME_POLLING;
+		uDIDbyte = 0;
+		RFDisablePin = 0;
+		GPOPin.mode(PullNone);
+		answerReadyInterrupt.disable_irq();
+		answerReadyInterrupt.fall(this,
+				&M24SR::M24SR_AnswerReadyInterruptCallback);
+		answerReadyInterrupt.mode(PullUp);
+
+	}
+
+	/**
+	 * @brief Destructor.
+	 */
+	virtual ~M24SR(void) {
+	}
+
+	/*** Public Component Related Methods ***/
+
+	/* ACTION 5 --------------------------------------------------------------*
+	 * Implement here the component's public methods, as wrappers of the C    *
+	 * component's functions.                                                 *
+	 * They should be:                                                        *
+	 *   + Methods with the same name of the C component's virtual table's    *
+	 *     functions (1);                                                     *
+	 *   + Methods with the same name of the C component's extended virtual   *
+	 *     table's functions, if any (2).                                     *
+	 *                                                                        *
+	 * Example:                                                               *
+	 *   virtual int GetValue(float *pData) //(1)                             *
+	 *   {                                                                    *
+	 *     return COMPONENT_GetValue(float *pfData);                          *
+	 *   }                                                                    *
+	 *                                                                        *
+	 *   virtual int EnableFeature(void) //(2)                                *
+	 *   {                                                                    *
+	 *     return COMPONENT_EnableFeature();                                  *
+	 *   }                                                                    *
+	 *------------------------------------------------------------------------*/
+	virtual int Init(void *ptr) {
+		return (NFC_StatusTypeDef) M24SR_Init((NFC_InitTypeDef*)ptr);
+	}
+
+	virtual int ReadID(uint8_t *id) {
+		return (NFC_StatusTypeDef) M24SR_ReadID((uint8_t *) id);
+	}
+
+	/** lock the tag channel */
+	virtual NFC_StatusTypeDef GetSession(void) {
+		return (NFC_StatusTypeDef) M24SR_GetSession();
+	}
+
+	virtual NFC_StatusTypeDef KillSession(void) {
+		return (NFC_StatusTypeDef) M24SR_KillSession();
+	}
+
+	virtual NFC_StatusTypeDef Deselect(void) {
+		return (NFC_StatusTypeDef) M24SR_Deselect();
+	}
+
+	/** tag4 command */
+	virtual NFC_StatusTypeDef SelectApplication(void) {
+		return (NFC_StatusTypeDef) M24SR_SelectApplication();
+	}
+
+	virtual NFC_StatusTypeDef SelectCCfile(void) {
+		return (NFC_StatusTypeDef) M24SR_SelectCCfile();
+	}
+
+	virtual NFC_StatusTypeDef SelectNDEFfile(uint16_t NDEFfileId) {
+		return (NFC_StatusTypeDef) M24SR_SelectNDEFfile((uint16_t) NDEFfileId);
+	}
+
+	virtual NFC_StatusTypeDef SelectSystemfile(void) {
+		return (NFC_StatusTypeDef) M24SR_SelectSystemfile();
+	}
+
+	virtual NFC_StatusTypeDef ReadBinary(uint16_t Offset, uint8_t NbByteToRead,
+			uint8_t *pBufferRead) {
+		return (NFC_StatusTypeDef) M24SR_ReadBinary((uint16_t) Offset,
+				(uint8_t) NbByteToRead, (uint8_t *) pBufferRead);
+	}
+
+	virtual NFC_StatusTypeDef UpdateBinary(uint16_t Offset,
+			uint8_t NbByteToWrite, uint8_t *pDataToWrite) {
+		return (NFC_StatusTypeDef) M24SR_UpdateBinary((uint16_t) Offset,
+				(uint8_t) NbByteToWrite, (uint8_t *) pDataToWrite);
+	}
+
+	/** iso 7816-4 commands */
+	virtual NFC_StatusTypeDef Verify(PasswordType_t pwdId, uint8_t NbPwdByte,
+			const uint8_t *pPwd) {
+		return (NFC_StatusTypeDef) M24SR_Verify((uint16_t) pwdId,
+				(uint8_t) NbPwdByte, pPwd);
+	}
+
+	virtual NFC_StatusTypeDef ChangeReferenceData(PasswordType_t pwdId,
+			const uint8_t *pPwd) {
+		return (NFC_StatusTypeDef) M24SR_ChangeReferenceData((uint16_t) pwdId,
+				(uint8_t *) pPwd);
+	}
+
+	virtual NFC_StatusTypeDef EnableVerificationRequirement(
+			PasswordType_t uReadOrWrite) {
+		return (NFC_StatusTypeDef) M24SR_EnableVerificationRequirement(
+				(uint16_t) uReadOrWrite);
+	}
 
+	virtual NFC_StatusTypeDef DisableVerificationRequirement(
+			PasswordType_t uReadOrWrite) {
+		return (NFC_StatusTypeDef) M24SR_DisableVerificationRequirement(
+				(uint16_t) uReadOrWrite);
+	}
+
+	/** st propietary */
+	virtual NFC_StatusTypeDef STReadBinary(uint16_t Offset,
+			uint8_t NbByteToRead, uint8_t *pBufferRead) {
+		return (NFC_StatusTypeDef) M24SR_STReadBinary((uint16_t) Offset,
+				(uint8_t) NbByteToRead, (uint8_t *) pBufferRead);
+	}
+
+	virtual NFC_StatusTypeDef EnablePermanentState(PasswordType_t uReadOrWrite) {
+		return (NFC_StatusTypeDef) M24SR_EnablePermanentState(
+				(uint16_t) uReadOrWrite);
+	}
+
+	virtual NFC_StatusTypeDef DisablePermanentState(PasswordType_t uReadOrWrite) {
+		return (NFC_StatusTypeDef) M24SR_DisablePermanentState(
+				(uint16_t) uReadOrWrite);
+	}
+
+	/** chip configuration */
+	virtual NFC_StatusTypeDef StateControl(uint8_t uSetOrReset) {
+		return (NFC_StatusTypeDef) M24SR_StateControl((uint8_t) uSetOrReset);
+	}
+
+	virtual NFC_StatusTypeDef ManageI2CGPO(uint8_t GPO_I2Cconfig) {
+		return (NFC_StatusTypeDef) M24SR_ManageI2CGPO(
+				(M24SR_GPO_MGMT) GPO_I2Cconfig);
+	}
+
+	virtual NFC_StatusTypeDef ManageRFGPO(uint8_t GPO_RFconfig) {
+		return (NFC_StatusTypeDef) M24SR_ManageRFGPO(
+				(M24SR_GPO_MGMT) GPO_RFconfig);
+	}
+
+	virtual NFC_StatusTypeDef RFConfig(uint8_t OnOffChoice) {
+		return (NFC_StatusTypeDef) M24SR_RFConfig((uint8_t) OnOffChoice);
+	}
+
+	virtual NFC_StatusTypeDef SendInterrupt(void) {
+		return (NFC_StatusTypeDef) M24SR_SendInterrupt();
+	}
+
+	/*** Public Interrupt Related Methods ***/
+
+	/* ACTION 6 --------------------------------------------------------------*
+	 * Implement here interrupt related methods, if any.                      *
+	 * Note that interrupt handling is platform dependent, e.g.:              *
+	 *   + mbed:                                                              *
+	 *     InterruptIn feature_int(pin); //Interrupt object.                  *
+	 *     feature_int.rise(callback);   //Attach a callback.                 *
+	 *     feature_int.mode(PullNone);   //Set interrupt mode.                *
+	 *     feature_int.enable_irq();     //Enable interrupt.                  *
+	 *     feature_int.disable_irq();    //Disable interrupt.                 *
+	 *   + Arduino:                                                           *
+	 *     attachInterrupt(pin, callback, RISING); //Attach a callback.       *
+	 *     detachInterrupt(pin);                   //Detach a callback.       *
+	 *                                                                        *
+	 * Example (mbed):                                                        *
+	 *   void Attach_Feature_IRQ(void (*fptr) (void))                         *
+	 *   {                                                                    *
+	 *     feature_int.rise(fptr);                                            *
+	 *   }                                                                    *
+	 *                                                                        *
+	 *   void Enable_Feature_IRQ(void)                                        *
+	 *   {                                                                    *
+	 *     feature_int.enable_irq();                                          *
+	 *   }                                                                    *
+	 *                                                                        *
+	 *   void Disable_Feature_IRQ(void)                                       *
+	 *   {                                                                    *
+	 *     feature_int.disable_irq();                                         *
+	 *   }                                                                    *
+	 *------------------------------------------------------------------------*/
+
+protected:
+
+	/*** Protected Component Related Methods ***/
+
+	/* ACTION 7 --------------------------------------------------------------*
+	 * Declare here the component's specific methods.                         *
+	 * They should be:                                                        *
+	 *   + Methods with the same name of the C component's virtual table's    *
+	 *     functions (1);                                                     *
+	 *   + Methods with the same name of the C component's extended virtual   *
+	 *     table's functions, if any (2);                                     *
+	 *   + Helper methods, if any, like functions declared in the component's *
+	 *     source files but not pointed by the component's virtual table (3). *
+	 *                                                                        *
+	 * Example:                                                               *
+	 *   DrvStatusTypeDef COMPONENT_GetValue(float* pfData); //(1)            *
+	 *   DrvStatusTypeDef COMPONENT_EnableFeature(void);     //(2)            *
+	 *   DrvStatusTypeDef COMPONENT_ComputeAverage(void);    //(3)            *
+	 *------------------------------------------------------------------------*/
+	NFC_StatusTypeDef M24SR_Init(NFC_InitTypeDef *);
+	NFC_StatusTypeDef M24SR_ReadID(uint8_t *nfc_id);
+	NFC_StatusTypeDef M24SR_GetSession(void);
+	NFC_StatusTypeDef M24SR_KillSession(void);
+	NFC_StatusTypeDef M24SR_Deselect(void);
+	NFC_StatusTypeDef M24SR_SelectApplication(void);
+	NFC_StatusTypeDef M24SR_SelectCCfile(void);
+	NFC_StatusTypeDef M24SR_SelectNDEFfile(uint16_t NDEFfileId);
+	NFC_StatusTypeDef M24SR_SelectSystemfile(void);
+	NFC_StatusTypeDef M24SR_ReadBinary(uint16_t Offset, uint8_t NbByteToRead,
+			uint8_t *pBufferRead);
+	NFC_StatusTypeDef M24SR_STReadBinary(uint16_t Offset, uint8_t NbByteToRead,
+			uint8_t *pBufferRead);
+	NFC_StatusTypeDef M24SR_UpdateBinary(uint16_t Offset, uint8_t NbByteToWrite,
+			uint8_t *pDataToWrite);
+	NFC_StatusTypeDef M24SR_Verify(uint16_t uPwdId, uint8_t NbPwdByte,
+			const uint8_t *pPwd);
+	NFC_StatusTypeDef M24SR_ChangeReferenceData(uint16_t uPwdId, uint8_t *pPwd);
+	NFC_StatusTypeDef M24SR_EnableVerificationRequirement(
+			uint16_t uReadOrWrite);
+	NFC_StatusTypeDef M24SR_DisableVerificationRequirement(
+			uint16_t uReadOrWrite);
+	NFC_StatusTypeDef M24SR_EnablePermanentState(uint16_t uReadOrWrite);
+	NFC_StatusTypeDef M24SR_DisablePermanentState(uint16_t uReadOrWrite);
+	NFC_StatusTypeDef M24SR_SendInterrupt(void);
+	NFC_StatusTypeDef M24SR_StateControl(uint8_t uSetOrReset);
+	NFC_StatusTypeDef M24SR_ManageI2CGPO(M24SR_GPO_MGMT GPO_I2Cconfig);
+	NFC_StatusTypeDef M24SR_ManageRFGPO(M24SR_GPO_MGMT GPO_RFconfig);
+	NFC_StatusTypeDef M24SR_RFConfig(uint8_t OnOffChoice);
+	NFC_StatusTypeDef M24SR_FWTExtension(uint8_t FWTbyte);
+
+	/* ACTION 8 --------------------------------------------------------------*
+	 * Implement here other I/O methods beyond those already implemented      *
+	 * above, which are declared extern within the component's header file.   *
+	 *------------------------------------------------------------------------*/
+
+	NFC_StatusTypeDef M24SR_IO_IsAnswerReady(void);
+
+	NFC_StatusTypeDef M24SR_IO_SendI2Ccommand(uint8_t NbByte, uint8_t *pBuffer);
+
+	NFC_StatusTypeDef M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte,
+			uint8_t *pBuffer);
+
+	NFC_StatusTypeDef M24SR_IO_PollI2C(void);
+
+	void M24SR_IO_GPO_ReadPin(GPIO_PinState *pPinState) {
+		if (GPOPin == 0)
+			(*pPinState) = GPIO_PIN_RESET;
+		else
+			(*pPinState) = GPIO_PIN_SET;
+	}
+
+	void M24SR_IO_RFDIS_WritePin(GPIO_PinState PinState) {
+		if (PinState == GPIO_PIN_RESET)
+			RFDisablePin = 0;
+		else
+			RFDisablePin = 1;
+	}
+
+	void M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_MGMT mode) {
+		syncMode = mode;
+	}
+
+	void M24SR_AnswerReadyInterruptCallback() {
+		interruptIsFired = true;
+		answerReadyInterrupt.disable_irq();
+	}
+
+	/*** Component's Instance Variables ***/
+
+	/* Identity */
+	uint8_t who_am_i;
+
+	/* ACTION 9 --------------------------------------------------------------*
+	 * There should be only a unique identifier for each component, which     *
+	 * should be the "who_am_i" parameter, hence this parameter is optional.  *
+	 *------------------------------------------------------------------------*/
+	/* Type. */
+	uint8_t type;
+
+	/* Configuration. */
+	uint8_t address;
+
+	/* IO Device. */
+	I2C &dev_i2c;
+
+	/* GPIO */
+	DigitalIn GPOPin;
+	DigitalOut RFDisablePin;
+	InterruptIn answerReadyInterrupt;
+	M24SR_WAITINGTIME_MGMT syncMode;
+
+	/* Interrupts. */
+	/* ACTION 10 -------------------------------------------------------------*
+	 * Put here interrupt related objects, if needed.                         *
+	 * Note that interrupt handling is platform dependent, see                *
+	 * "Interrupt Related Methods" above.                                     *
+	 *                                                                        *
+	 * Example:                                                               *
+	 *   + mbed:                                                              *
+	 *     InterruptIn feature_int;                                           *
+	 *------------------------------------------------------------------------*/
+
+	/* Data. */
+	/* ACTION 11 -------------------------------------------------------------*
+	 * Declare here the component's data, one variable per line.              *
+	 *                                                                        *
+	 * Example:                                                               *
+	 *   int T0_out;                                                          *
+	 *   int T1_out;                                                          *
+	 *   float T0_degC;                                                       *
+	 *   float T1_degC;                                                       *
+	 *------------------------------------------------------------------------*/
+	uint8_t uM24SRbuffer[0xFF];
+	uint8_t uDIDbyte;
+	bool interruptIsFired;
+};
+
+#endif // __M24SR_CLASS_H
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- a/main.cpp	Thu Nov 19 08:50:18 2015 +0000
+++ b/main.cpp	Fri Nov 27 15:10:25 2015 +0000
@@ -9,10 +9,11 @@
 #include "NDefLib/RecordType/RecordAAR.h"
 #include "NDefLib/RecordType/RecordSMS.h"
 #include "NDefLib/RecordType/RecordGeo.h"
-#include "NDefLib/RecordType/RecordUri.h"
+#include "NDefLib/RecordType/RecordURI.h"
 #include "NDefLib/RecordType/RecordMail.h"
 #include "NDefLib/RecordType/RecordText.h"
 #include "NDefLib/RecordType/RecordMimeType.h"
+#include "NDefLib/RecordType/RecordVCard.h"
 
 #include "X_NUCLEO_NFC01A1.h"
 
@@ -33,7 +34,7 @@
 static const PinName M24SR_SDA=D14;
 static const PinName M24SR_SDL=D15;
 
-static const uint32_t MAX_WRITE_TRY=5;
+static const uint32_t MAX_WRITE_TRY=1;
 
 I2C i2cChannel(M24SR_SDA,M24SR_SDL);
 M24SR *m24srDrv;
@@ -54,21 +55,40 @@
 		NDefLib::RecordGeo rGeo("123.123","456.789");
 		msg.addRecord(&rGeo);
 
-		NDefLib::RecordUri rUri(NDefLib::RecordUri::HTTP_WWW,"http://www.st.com");
+		NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTP_WWW,"http://www.st.com");
 		msg.addRecord(&rUri);
 
 		NDefLib::RecordMail rMail("mail@st.com","ciao","da nfc tag");
 		msg.addRecord(&rMail);
 
-		NDefLib::RecordMimeType rText1("text/plain",(const uint8_t*)"ciao",4);
+		NDefLib::RecordMimeType rText1("text/plain","ciao");
 		msg.addRecord(&rText1);
 
-		NDefLib::RecordText rText2("ciao");
-		msg.addRecord(&rText2);
-
 		NDefLib::RecordText rText3(NDefLib::RecordText::UTF8,"it","ciao");
 		msg.addRecord(&rText3);
 
+
+		NDefLib::RecordVCard::VCardInfo_t cardInfo;
+		cardInfo[NDefLib::RecordVCard::FORMATTED_NAME]="prova2 prova1";
+		cardInfo[NDefLib::RecordVCard::ADDRESS_HOME]=";;1 Main St.;Springfield;IL;12345;USA";
+		cardInfo[NDefLib::RecordVCard::ADDRESS_WORK]=";;2 Main St.;Springfield;IL;12345;USA";
+		cardInfo[NDefLib::RecordVCard::EMAIL_WORK]="workmail@st.com";
+		cardInfo[NDefLib::RecordVCard::EMAIL_HOME]="homemail@st.com";
+		cardInfo[NDefLib::RecordVCard::GEO]="39.95;-75.1667";
+		cardInfo[NDefLib::RecordVCard::IMPP]="aim:johndoe@aol.com";
+		cardInfo[NDefLib::RecordVCard::NAME]="prova4;prova5";
+		cardInfo[NDefLib::RecordVCard::NICKNAME]="test";
+		cardInfo[NDefLib::RecordVCard::NOTE]="A good test";
+		cardInfo[NDefLib::RecordVCard::ORGANIZATION]="STM";
+		cardInfo[NDefLib::RecordVCard::TEL_HOME]="123";
+		cardInfo[NDefLib::RecordVCard::TEL_MOBILE]="456";
+		cardInfo[NDefLib::RecordVCard::TEL_WORK]="789";
+		cardInfo[NDefLib::RecordVCard::TITLE]="King";
+		cardInfo[NDefLib::RecordVCard::URL]="www.st.com";
+		cardInfo[NDefLib::RecordVCard::PHOTO_URI]="http://www.st.com/st-web-ui/static/active/en/fragment/multimedia/image/picture/customer_focus.jpg";
+		NDefLib::RecordVCard rVCard(cardInfo);
+		msg.addRecord(&rVCard);
+
 		uint32_t writeTry=0;
 		do{
 			writeStatus = tag.write(msg);
@@ -117,21 +137,101 @@
 */
 }
 
+void printRecord(NDefLib::Record *r){
+	using namespace NDefLib;
+	switch(r->getType()){
+		case Record::TYPE_TEXT:	{
+			RecordText *temp = (RecordText*)r;
+			pc.printf("Read Text: %s\r\n",temp->getText().c_str());
+			break; }
+		case Record::TYPE_AAR:{
+			RecordAAR *temp = (RecordAAR*)r;
+			pc.printf("Read ARR: %s\r\n",temp->getPackage().c_str());
+			break; }
+		case Record::TYPE_MIME:{
+			RecordMimeType *temp = (RecordMimeType*)r;
+			pc.printf("Read mimeType: %s\r\n",temp->getMimeType().c_str());
+			pc.printf("Read mimeData: %s\r\n",
+					std::string((const char*)temp->getMimeData(),
+							temp->getMimeDataLenght()).c_str());
+			break;}
+		case Record::TYPE_URI:{
+			RecordURI *temp = (RecordURI*)r;
+			pc.printf("Read uriId: %d\r\n",temp->getUriId());
+			pc.printf("Read uriType: %s\r\n",temp->getUriType().c_str());
+			pc.printf("Read uriContent: %s\r\n",temp->getContent().c_str());
+			break;}
+		case Record::TYPE_URI_MAIL:{
+			RecordMail *temp = (RecordMail*)r;
+			pc.printf("Read Dest: %s\r\n",temp->getDest().c_str());
+			pc.printf("Read Subject: %s\r\n",temp->getSubject().c_str());
+			pc.printf("Read Body: %s\r\n",temp->getBody().c_str());
+			break;}
+		case Record::TYPE_SMS:{
+			RecordSMS *temp = (RecordSMS*)r;
+			pc.printf("Read number: %s\r\n",temp->getNumber().c_str());
+			pc.printf("Read message: %s\r\n",temp->getMessagge().c_str());
+			break;}
+		case Record::TYPE_GEOLOCATION:{
+			RecordGeo *temp = (RecordGeo*)r;
+			pc.printf("Read lat: %s\r\n",temp->getLatitude().c_str());
+			pc.printf("Read long: %s\r\n",temp->getLongitude().c_str());
+			break;}
+		case Record::TYPE_MIME_VCARD:{
+			RecordVCard *temp = (RecordVCard*)r;
+			pc.printf("Read Name: %s\r\n",(*temp)[RecordVCard::NAME].c_str());
+			pc.printf("Read Mail: %s\r\n",(*temp)[RecordVCard::EMAIL_WORK].c_str());
+			pc.printf("Read org: %s\r\n",(*temp)[RecordVCard::ORGANIZATION].c_str());
+			break;}
+		case Record::TYPE_UNKNOWN:{
+			pc.printf("Unknown record\r\n");
+			break;}
+	}//switch
+}
+
+void readNfcTag(){
+	using namespace NDefLib;
+	Type4NfcTagSTM24SR tag(*m24srDrv);
+	if(tag.openSession()){
+		NDefLib::Message readMsg;
+
+		tag.read(&readMsg);
+
+		if(readMsg.getNRecords()==0){
+			pc.printf("Error Read\r\n");
+		}else{
+			for(uint32_t i=0;i<readMsg.getNRecords();i++){
+				Record *r = readMsg.getRecord(i);
+				printRecord(r);
+				delete r;
+			}//for
+		}//if-else
+
+		tag.closeSession();
+	}else{
+		pc.printf("Error open Session2\n\r");
+	}
+}
+
 int main() {
 	i2cChannel.frequency(400000);
 	X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(i2cChannel);
 	m24srDrv=&nfcNucleo->getM24SR();
 
-	pc.printf("Hello World !\n");
+	pc.printf("Hello World !\n\r");
 	nfcNucleo->getLed1()=1;
 	nfcNucleo->getLed2()=0;
 	nfcNucleo->getLed3()=0;
 
 	setNFCTag();
+	readNfcTag();
+	//pc.printf("2!\n\r");
+	//setNFCTag();
+	//readNfcTag();
 	while(1) {
 		wait(1);
 		myled = !myled;
 		shiftLed(nfcNucleo->getLed1(),nfcNucleo->getLed2(),nfcNucleo->getLed3());
-  }
+	}
+
 }
-