Firmware library for the X-NUCLEO-NFC01A1 Dynamic NFC Tag board.

Dependencies:   M24SR

Dependents:   NFC M2M_2016_STM32 MyongjiElec_capstone1 IDW01M1_Cloud_IBM ... more

Fork of X_NUCLEO_NFC01A1 by ST Expansion SW Team

X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers, Board Support Package and example applications for STMicroelectronics X-NUCLEO-NFC01A1 Dynamic NFC Tag Expansion Board based on M24SR.

Firmware Library

Class X_NUCLEO_NFC01A1 is intended to represent the Dynamic NFC Tag Expansion Board with the same name.
It provides an API to access to the M24SR component and to the three onboard LEDs.
It is intentionally implemented as a singleton because only one X_NUCLEO_NFC01A1 at a time might be deployed in a HW component stack.
The library also provides an implementation of the NDEF library API for M24SR, providing an simple way to read/write NDEF formatted messages from/to the M24SR dynamic NFC tag.

Example applications

1. Hello World
2. Asynchronous Hello World

Committer:
giovannivisentini
Date:
Thu Dec 03 13:44:06 2015 +0000
Revision:
0:969a2be49f41
Child:
1:15d4a123ef6b
move the driver files in a separate library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 0:969a2be49f41 1 /*
giovannivisentini 0:969a2be49f41 2 * Type4NfcTagSTM24SR.h
giovannivisentini 0:969a2be49f41 3 *
giovannivisentini 0:969a2be49f41 4 * Created on: Nov 5, 2015
giovannivisentini 0:969a2be49f41 5 * Author: giovanni visentini
giovannivisentini 0:969a2be49f41 6 */
giovannivisentini 0:969a2be49f41 7
giovannivisentini 0:969a2be49f41 8 #ifndef TYPE4NFCTAGSTM24SR_H_
giovannivisentini 0:969a2be49f41 9 #define TYPE4NFCTAGSTM24SR_H_
giovannivisentini 0:969a2be49f41 10 #include <stdint.h>
giovannivisentini 0:969a2be49f41 11 #include "m24sr/m24sr_class.h"
giovannivisentini 0:969a2be49f41 12
giovannivisentini 0:969a2be49f41 13 #include "NDefLib/Type4NfcTag.h"
giovannivisentini 0:969a2be49f41 14
giovannivisentini 0:969a2be49f41 15 /**
giovannivisentini 0:969a2be49f41 16 * implement the abstract method for use the NDefLib
giovannivisentini 0:969a2be49f41 17 */
giovannivisentini 0:969a2be49f41 18 class Type4NfcTagSTM24SR: public NDefLib::Type4NfcTag {
giovannivisentini 0:969a2be49f41 19
giovannivisentini 0:969a2be49f41 20 public:
giovannivisentini 0:969a2be49f41 21 /**
giovannivisentini 0:969a2be49f41 22 *
giovannivisentini 0:969a2be49f41 23 * @param device device where write the Ndef tags
giovannivisentini 0:969a2be49f41 24 */
giovannivisentini 0:969a2be49f41 25 Type4NfcTagSTM24SR(M24SR &device) :
giovannivisentini 0:969a2be49f41 26 mDevice(device), mMaxReadBytes(0xFF), mMaxWriteBytes(
giovannivisentini 0:969a2be49f41 27 0xFF) {
giovannivisentini 0:969a2be49f41 28 }
giovannivisentini 0:969a2be49f41 29
giovannivisentini 0:969a2be49f41 30
giovannivisentini 0:969a2be49f41 31 virtual bool openSession(bool force = false);
giovannivisentini 0:969a2be49f41 32 virtual bool closeSession();
giovannivisentini 0:969a2be49f41 33
giovannivisentini 0:969a2be49f41 34 /**
giovannivisentini 0:969a2be49f41 35 * close the open session
giovannivisentini 0:969a2be49f41 36 */
giovannivisentini 0:969a2be49f41 37 virtual ~Type4NfcTagSTM24SR() {
giovannivisentini 0:969a2be49f41 38 if(isSessionOpen())
giovannivisentini 0:969a2be49f41 39 closeSession();
giovannivisentini 0:969a2be49f41 40 }//~Type4NfcTagSTM24SR
giovannivisentini 0:969a2be49f41 41
giovannivisentini 0:969a2be49f41 42 bool enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 0:969a2be49f41 43 const uint8_t* pNewPassword) {
giovannivisentini 0:969a2be49f41 44 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 45 return false;
giovannivisentini 0:969a2be49f41 46
giovannivisentini 0:969a2be49f41 47 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 48 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 49 /* Set new password */
giovannivisentini 0:969a2be49f41 50 if (mDevice.ChangeReferenceData(M24SR::ReadPwd, pNewPassword)
giovannivisentini 0:969a2be49f41 51 == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 52 return mDevice.EnableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 0:969a2be49f41 53 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 54 } //else
giovannivisentini 0:969a2be49f41 55 /* M24SR already lock but password not known */
giovannivisentini 0:969a2be49f41 56 return false;
giovannivisentini 0:969a2be49f41 57
giovannivisentini 0:969a2be49f41 58 }
giovannivisentini 0:969a2be49f41 59
giovannivisentini 0:969a2be49f41 60 bool disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 61 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 62 return false;
giovannivisentini 0:969a2be49f41 63
giovannivisentini 0:969a2be49f41 64 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 65 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 66 /* Set new password */
giovannivisentini 0:969a2be49f41 67 return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 0:969a2be49f41 68 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 69 } else {
giovannivisentini 0:969a2be49f41 70 /* M24SR already lock but password not known */
giovannivisentini 0:969a2be49f41 71 return false;
giovannivisentini 0:969a2be49f41 72 }
giovannivisentini 0:969a2be49f41 73 }
giovannivisentini 0:969a2be49f41 74
giovannivisentini 0:969a2be49f41 75 bool enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 0:969a2be49f41 76 uint8_t* pNewPassword) {
giovannivisentini 0:969a2be49f41 77 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 78 return false;
giovannivisentini 0:969a2be49f41 79
giovannivisentini 0:969a2be49f41 80 /* check we have the good password */
giovannivisentini 0:969a2be49f41 81 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 82 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 83 /* Set new password */
giovannivisentini 0:969a2be49f41 84 if (mDevice.ChangeReferenceData(M24SR::WritePwd, pNewPassword)
giovannivisentini 0:969a2be49f41 85 == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 86 return mDevice.EnableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 0:969a2be49f41 87 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 88 }
giovannivisentini 0:969a2be49f41 89 return false;
giovannivisentini 0:969a2be49f41 90 }
giovannivisentini 0:969a2be49f41 91
giovannivisentini 0:969a2be49f41 92 bool disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 93 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 94 return false;
giovannivisentini 0:969a2be49f41 95
giovannivisentini 0:969a2be49f41 96 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 97 == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 98 return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 0:969a2be49f41 99 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 100 return false;
giovannivisentini 0:969a2be49f41 101 }
giovannivisentini 0:969a2be49f41 102
giovannivisentini 0:969a2be49f41 103 /**
giovannivisentini 0:969a2be49f41 104 * @brief This fonction desactivate the need of read and write password for next access
giovannivisentini 0:969a2be49f41 105 * @param pSuperUserPassword : I2C super user password to overwrite read and write password
giovannivisentini 0:969a2be49f41 106 * @retval SUCCESS : M24SR access is now free (no password needed)
giovannivisentini 0:969a2be49f41 107 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 108 */
giovannivisentini 0:969a2be49f41 109 bool disableAllPassword(const uint8_t* pSuperUserPassword) {
giovannivisentini 0:969a2be49f41 110 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 111 return false;
giovannivisentini 0:969a2be49f41 112
giovannivisentini 0:969a2be49f41 113 if (mDevice.Verify(M24SR::WritePwd, 0x10, pSuperUserPassword)
giovannivisentini 0:969a2be49f41 114 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 115 mDevice.DisablePermanentState(M24SR::ReadPwd);
giovannivisentini 0:969a2be49f41 116 mDevice.DisablePermanentState(M24SR::WritePwd);
giovannivisentini 0:969a2be49f41 117
giovannivisentini 0:969a2be49f41 118 mDevice.DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 0:969a2be49f41 119 mDevice.DisableVerificationRequirement(M24SR::WritePwd);
giovannivisentini 0:969a2be49f41 120
giovannivisentini 0:969a2be49f41 121 /* reset password */
giovannivisentini 0:969a2be49f41 122 mDevice.ChangeReferenceData(M24SR::ReadPwd, pSuperUserPassword);
giovannivisentini 0:969a2be49f41 123 mDevice.ChangeReferenceData(M24SR::WritePwd, pSuperUserPassword);
giovannivisentini 0:969a2be49f41 124 return true;
giovannivisentini 0:969a2be49f41 125 }
giovannivisentini 0:969a2be49f41 126 return false;
giovannivisentini 0:969a2be49f41 127 }
giovannivisentini 0:969a2be49f41 128
giovannivisentini 0:969a2be49f41 129 /**
giovannivisentini 0:969a2be49f41 130 * @brief This fonction enable read only mode
giovannivisentini 0:969a2be49f41 131 * @param pCurrentWritePassword : Write password is needed to have right to enable read only mode
giovannivisentini 0:969a2be49f41 132 * @retval SUCCESS : M24SR access is now forbidden in write mode
giovannivisentini 0:969a2be49f41 133 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 134 */
giovannivisentini 0:969a2be49f41 135 bool enableReadOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 136 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 137 return false;
giovannivisentini 0:969a2be49f41 138
giovannivisentini 0:969a2be49f41 139 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 140 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 141 /* lock write to have read only */
giovannivisentini 0:969a2be49f41 142 return mDevice.EnablePermanentState(M24SR::WritePwd) == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 143 }
giovannivisentini 0:969a2be49f41 144 return false;
giovannivisentini 0:969a2be49f41 145 }
giovannivisentini 0:969a2be49f41 146
giovannivisentini 0:969a2be49f41 147 /**
giovannivisentini 0:969a2be49f41 148 * @brief This fonction disable read only mode
giovannivisentini 0:969a2be49f41 149 * @param pCurrentWritePassword : Write password is needed to have right to disable read only mode
giovannivisentini 0:969a2be49f41 150 * @retval SUCCESS : M24SR write access is now allowed
giovannivisentini 0:969a2be49f41 151 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 152 */
giovannivisentini 0:969a2be49f41 153 bool disableReadOnly() {
giovannivisentini 0:969a2be49f41 154 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 155 return false;
giovannivisentini 0:969a2be49f41 156
giovannivisentini 0:969a2be49f41 157 if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
giovannivisentini 0:969a2be49f41 158 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 159 /* disable write protection to disable read only mode */
giovannivisentini 0:969a2be49f41 160 if (mDevice.DisablePermanentState(M24SR::WritePwd) == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 161 return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 0:969a2be49f41 162 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 163 } //if
giovannivisentini 0:969a2be49f41 164 return false;
giovannivisentini 0:969a2be49f41 165 }
giovannivisentini 0:969a2be49f41 166
giovannivisentini 0:969a2be49f41 167 /**
giovannivisentini 0:969a2be49f41 168 * @brief This fonction enable write only mode
giovannivisentini 0:969a2be49f41 169 * @param pCurrentWritePassword : Write password is needed to have right to enable write only mode
giovannivisentini 0:969a2be49f41 170 * @retval SUCCESS : M24SR access is now forbidden in read mode
giovannivisentini 0:969a2be49f41 171 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 172 */
giovannivisentini 0:969a2be49f41 173 bool enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 174 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 175 return false;
giovannivisentini 0:969a2be49f41 176
giovannivisentini 0:969a2be49f41 177 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 178 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 179 /* disable read access and keep write */
giovannivisentini 0:969a2be49f41 180 return mDevice.EnablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 181 }
giovannivisentini 0:969a2be49f41 182 return false;
giovannivisentini 0:969a2be49f41 183 }
giovannivisentini 0:969a2be49f41 184
giovannivisentini 0:969a2be49f41 185 /**
giovannivisentini 0:969a2be49f41 186 * @brief This fonction disable write only mode
giovannivisentini 0:969a2be49f41 187 * @param pCurrentWritePassword : Write password is needed to have right to disable write only mode
giovannivisentini 0:969a2be49f41 188 * @retval SUCCESS : M24SR read access is now allowed
giovannivisentini 0:969a2be49f41 189 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 190 */
giovannivisentini 0:969a2be49f41 191 bool disableWriteOnly() {
giovannivisentini 0:969a2be49f41 192 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 193 return false;
giovannivisentini 0:969a2be49f41 194
giovannivisentini 0:969a2be49f41 195 if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
giovannivisentini 0:969a2be49f41 196 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 197 /* disable write only -> enable write acces */
giovannivisentini 0:969a2be49f41 198 if (mDevice.DisablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 199 return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 0:969a2be49f41 200 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 201 }
giovannivisentini 0:969a2be49f41 202 return false;
giovannivisentini 0:969a2be49f41 203 }
giovannivisentini 0:969a2be49f41 204
giovannivisentini 0:969a2be49f41 205 protected:
giovannivisentini 0:969a2be49f41 206 virtual bool writeByte(const uint8_t *buffer, const uint16_t length, uint16_t offset);
giovannivisentini 0:969a2be49f41 207 virtual bool readByte(const uint16_t byteOffset, const uint16_t byteLength,
giovannivisentini 0:969a2be49f41 208 uint8_t *buffer);
giovannivisentini 0:969a2be49f41 209
giovannivisentini 0:969a2be49f41 210 private:
giovannivisentini 0:969a2be49f41 211
giovannivisentini 0:969a2be49f41 212 M24SR &mDevice;
giovannivisentini 0:969a2be49f41 213
giovannivisentini 0:969a2be49f41 214 /**
giovannivisentini 0:969a2be49f41 215 * max length for a read operation
giovannivisentini 0:969a2be49f41 216 */
giovannivisentini 0:969a2be49f41 217 uint16_t mMaxReadBytes;
giovannivisentini 0:969a2be49f41 218
giovannivisentini 0:969a2be49f41 219 /**
giovannivisentini 0:969a2be49f41 220 * max length for a write operation
giovannivisentini 0:969a2be49f41 221 */
giovannivisentini 0:969a2be49f41 222 uint16_t mMaxWriteBytes;
giovannivisentini 0:969a2be49f41 223 };
giovannivisentini 0:969a2be49f41 224
giovannivisentini 0:969a2be49f41 225 #endif /* TYPE4NFCTAGSTM24SR_H_ */