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 14:56:13 2015 +0000
Revision:
1:15d4a123ef6b
Parent:
0:969a2be49f41
Add License

Who changed what in which revision?

UserRevisionLine numberNew contents of line
giovannivisentini 1:15d4a123ef6b 1 /**
giovannivisentini 1:15d4a123ef6b 2 ******************************************************************************
giovannivisentini 1:15d4a123ef6b 3 * @file Type4NfcTagSTM24SR.h
giovannivisentini 1:15d4a123ef6b 4 * @date 05/11/2015
giovannivisentini 1:15d4a123ef6b 5 * @brief wrapper class for use the NDefLib library for write/read ndef message
giovannivisentini 1:15d4a123ef6b 6 ******************************************************************************
giovannivisentini 1:15d4a123ef6b 7 *
giovannivisentini 1:15d4a123ef6b 8 * COPYRIGHT(c) 2015 STMicroelectronics
giovannivisentini 1:15d4a123ef6b 9 *
giovannivisentini 1:15d4a123ef6b 10 * Redistribution and use in source and binary forms, with or without modification,
giovannivisentini 1:15d4a123ef6b 11 * are permitted provided that the following conditions are met:
giovannivisentini 1:15d4a123ef6b 12 * 1. Redistributions of source code must retain the above copyright notice,
giovannivisentini 1:15d4a123ef6b 13 * this list of conditions and the following disclaimer.
giovannivisentini 1:15d4a123ef6b 14 * 2. Redistributions in binary form must reproduce the above copyright notice,
giovannivisentini 1:15d4a123ef6b 15 * this list of conditions and the following disclaimer in the documentation
giovannivisentini 1:15d4a123ef6b 16 * and/or other materials provided with the distribution.
giovannivisentini 1:15d4a123ef6b 17 * 3. Neither the name of STMicroelectronics nor the names of its contributors
giovannivisentini 1:15d4a123ef6b 18 * may be used to endorse or promote products derived from this software
giovannivisentini 1:15d4a123ef6b 19 * without specific prior written permission.
giovannivisentini 1:15d4a123ef6b 20 *
giovannivisentini 1:15d4a123ef6b 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
giovannivisentini 1:15d4a123ef6b 22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
giovannivisentini 1:15d4a123ef6b 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
giovannivisentini 1:15d4a123ef6b 24 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
giovannivisentini 1:15d4a123ef6b 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
giovannivisentini 1:15d4a123ef6b 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
giovannivisentini 1:15d4a123ef6b 27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
giovannivisentini 1:15d4a123ef6b 28 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
giovannivisentini 1:15d4a123ef6b 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
giovannivisentini 1:15d4a123ef6b 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
giovannivisentini 1:15d4a123ef6b 31 *
giovannivisentini 1:15d4a123ef6b 32 ******************************************************************************
giovannivisentini 1:15d4a123ef6b 33 */
giovannivisentini 0:969a2be49f41 34
giovannivisentini 0:969a2be49f41 35 #ifndef TYPE4NFCTAGSTM24SR_H_
giovannivisentini 0:969a2be49f41 36 #define TYPE4NFCTAGSTM24SR_H_
giovannivisentini 0:969a2be49f41 37 #include <stdint.h>
giovannivisentini 0:969a2be49f41 38 #include "m24sr/m24sr_class.h"
giovannivisentini 0:969a2be49f41 39
giovannivisentini 0:969a2be49f41 40 #include "NDefLib/Type4NfcTag.h"
giovannivisentini 0:969a2be49f41 41
giovannivisentini 0:969a2be49f41 42 /**
giovannivisentini 0:969a2be49f41 43 * implement the abstract method for use the NDefLib
giovannivisentini 0:969a2be49f41 44 */
giovannivisentini 0:969a2be49f41 45 class Type4NfcTagSTM24SR: public NDefLib::Type4NfcTag {
giovannivisentini 0:969a2be49f41 46
giovannivisentini 0:969a2be49f41 47 public:
giovannivisentini 0:969a2be49f41 48 /**
giovannivisentini 0:969a2be49f41 49 *
giovannivisentini 0:969a2be49f41 50 * @param device device where write the Ndef tags
giovannivisentini 0:969a2be49f41 51 */
giovannivisentini 0:969a2be49f41 52 Type4NfcTagSTM24SR(M24SR &device) :
giovannivisentini 0:969a2be49f41 53 mDevice(device), mMaxReadBytes(0xFF), mMaxWriteBytes(
giovannivisentini 0:969a2be49f41 54 0xFF) {
giovannivisentini 0:969a2be49f41 55 }
giovannivisentini 0:969a2be49f41 56
giovannivisentini 0:969a2be49f41 57
giovannivisentini 0:969a2be49f41 58 virtual bool openSession(bool force = false);
giovannivisentini 0:969a2be49f41 59 virtual bool closeSession();
giovannivisentini 0:969a2be49f41 60
giovannivisentini 0:969a2be49f41 61 /**
giovannivisentini 0:969a2be49f41 62 * close the open session
giovannivisentini 0:969a2be49f41 63 */
giovannivisentini 0:969a2be49f41 64 virtual ~Type4NfcTagSTM24SR() {
giovannivisentini 0:969a2be49f41 65 if(isSessionOpen())
giovannivisentini 0:969a2be49f41 66 closeSession();
giovannivisentini 0:969a2be49f41 67 }//~Type4NfcTagSTM24SR
giovannivisentini 0:969a2be49f41 68
giovannivisentini 0:969a2be49f41 69 bool enableReadPassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 0:969a2be49f41 70 const uint8_t* pNewPassword) {
giovannivisentini 0:969a2be49f41 71 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 72 return false;
giovannivisentini 0:969a2be49f41 73
giovannivisentini 0:969a2be49f41 74 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 75 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 76 /* Set new password */
giovannivisentini 0:969a2be49f41 77 if (mDevice.ChangeReferenceData(M24SR::ReadPwd, pNewPassword)
giovannivisentini 0:969a2be49f41 78 == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 79 return mDevice.EnableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 0:969a2be49f41 80 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 81 } //else
giovannivisentini 0:969a2be49f41 82 /* M24SR already lock but password not known */
giovannivisentini 0:969a2be49f41 83 return false;
giovannivisentini 0:969a2be49f41 84
giovannivisentini 0:969a2be49f41 85 }
giovannivisentini 0:969a2be49f41 86
giovannivisentini 0:969a2be49f41 87 bool disableReadPassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 88 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 89 return false;
giovannivisentini 0:969a2be49f41 90
giovannivisentini 0:969a2be49f41 91 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 92 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 93 /* Set new password */
giovannivisentini 0:969a2be49f41 94 return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 0:969a2be49f41 95 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 96 } else {
giovannivisentini 0:969a2be49f41 97 /* M24SR already lock but password not known */
giovannivisentini 0:969a2be49f41 98 return false;
giovannivisentini 0:969a2be49f41 99 }
giovannivisentini 0:969a2be49f41 100 }
giovannivisentini 0:969a2be49f41 101
giovannivisentini 0:969a2be49f41 102 bool enableWritePassword(const uint8_t* pCurrentWritePassword,
giovannivisentini 0:969a2be49f41 103 uint8_t* pNewPassword) {
giovannivisentini 0:969a2be49f41 104 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 105 return false;
giovannivisentini 0:969a2be49f41 106
giovannivisentini 0:969a2be49f41 107 /* check we have the good password */
giovannivisentini 0:969a2be49f41 108 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 109 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 110 /* Set new password */
giovannivisentini 0:969a2be49f41 111 if (mDevice.ChangeReferenceData(M24SR::WritePwd, pNewPassword)
giovannivisentini 0:969a2be49f41 112 == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 113 return mDevice.EnableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 0:969a2be49f41 114 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 115 }
giovannivisentini 0:969a2be49f41 116 return false;
giovannivisentini 0:969a2be49f41 117 }
giovannivisentini 0:969a2be49f41 118
giovannivisentini 0:969a2be49f41 119 bool disableWritePassword(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 120 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 121 return false;
giovannivisentini 0:969a2be49f41 122
giovannivisentini 0:969a2be49f41 123 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 124 == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 125 return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 0:969a2be49f41 126 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 127 return false;
giovannivisentini 0:969a2be49f41 128 }
giovannivisentini 0:969a2be49f41 129
giovannivisentini 0:969a2be49f41 130 /**
giovannivisentini 0:969a2be49f41 131 * @brief This fonction desactivate the need of read and write password for next access
giovannivisentini 0:969a2be49f41 132 * @param pSuperUserPassword : I2C super user password to overwrite read and write password
giovannivisentini 0:969a2be49f41 133 * @retval SUCCESS : M24SR access is now free (no password needed)
giovannivisentini 0:969a2be49f41 134 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 135 */
giovannivisentini 0:969a2be49f41 136 bool disableAllPassword(const uint8_t* pSuperUserPassword) {
giovannivisentini 0:969a2be49f41 137 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 138 return false;
giovannivisentini 0:969a2be49f41 139
giovannivisentini 0:969a2be49f41 140 if (mDevice.Verify(M24SR::WritePwd, 0x10, pSuperUserPassword)
giovannivisentini 0:969a2be49f41 141 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 142 mDevice.DisablePermanentState(M24SR::ReadPwd);
giovannivisentini 0:969a2be49f41 143 mDevice.DisablePermanentState(M24SR::WritePwd);
giovannivisentini 0:969a2be49f41 144
giovannivisentini 0:969a2be49f41 145 mDevice.DisableVerificationRequirement(M24SR::ReadPwd);
giovannivisentini 0:969a2be49f41 146 mDevice.DisableVerificationRequirement(M24SR::WritePwd);
giovannivisentini 0:969a2be49f41 147
giovannivisentini 0:969a2be49f41 148 /* reset password */
giovannivisentini 0:969a2be49f41 149 mDevice.ChangeReferenceData(M24SR::ReadPwd, pSuperUserPassword);
giovannivisentini 0:969a2be49f41 150 mDevice.ChangeReferenceData(M24SR::WritePwd, pSuperUserPassword);
giovannivisentini 0:969a2be49f41 151 return true;
giovannivisentini 0:969a2be49f41 152 }
giovannivisentini 0:969a2be49f41 153 return false;
giovannivisentini 0:969a2be49f41 154 }
giovannivisentini 0:969a2be49f41 155
giovannivisentini 0:969a2be49f41 156 /**
giovannivisentini 0:969a2be49f41 157 * @brief This fonction enable read only mode
giovannivisentini 0:969a2be49f41 158 * @param pCurrentWritePassword : Write password is needed to have right to enable read only mode
giovannivisentini 0:969a2be49f41 159 * @retval SUCCESS : M24SR access is now forbidden in write mode
giovannivisentini 0:969a2be49f41 160 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 161 */
giovannivisentini 0:969a2be49f41 162 bool enableReadOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 163 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 164 return false;
giovannivisentini 0:969a2be49f41 165
giovannivisentini 0:969a2be49f41 166 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 167 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 168 /* lock write to have read only */
giovannivisentini 0:969a2be49f41 169 return mDevice.EnablePermanentState(M24SR::WritePwd) == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 170 }
giovannivisentini 0:969a2be49f41 171 return false;
giovannivisentini 0:969a2be49f41 172 }
giovannivisentini 0:969a2be49f41 173
giovannivisentini 0:969a2be49f41 174 /**
giovannivisentini 0:969a2be49f41 175 * @brief This fonction disable read only mode
giovannivisentini 0:969a2be49f41 176 * @param pCurrentWritePassword : Write password is needed to have right to disable read only mode
giovannivisentini 0:969a2be49f41 177 * @retval SUCCESS : M24SR write access is now allowed
giovannivisentini 0:969a2be49f41 178 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 179 */
giovannivisentini 0:969a2be49f41 180 bool disableReadOnly() {
giovannivisentini 0:969a2be49f41 181 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 182 return false;
giovannivisentini 0:969a2be49f41 183
giovannivisentini 0:969a2be49f41 184 if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
giovannivisentini 0:969a2be49f41 185 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 186 /* disable write protection to disable read only mode */
giovannivisentini 0:969a2be49f41 187 if (mDevice.DisablePermanentState(M24SR::WritePwd) == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 188 return mDevice.DisableVerificationRequirement(M24SR::WritePwd)
giovannivisentini 0:969a2be49f41 189 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 190 } //if
giovannivisentini 0:969a2be49f41 191 return false;
giovannivisentini 0:969a2be49f41 192 }
giovannivisentini 0:969a2be49f41 193
giovannivisentini 0:969a2be49f41 194 /**
giovannivisentini 0:969a2be49f41 195 * @brief This fonction enable write only mode
giovannivisentini 0:969a2be49f41 196 * @param pCurrentWritePassword : Write password is needed to have right to enable write only mode
giovannivisentini 0:969a2be49f41 197 * @retval SUCCESS : M24SR access is now forbidden in read mode
giovannivisentini 0:969a2be49f41 198 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 199 */
giovannivisentini 0:969a2be49f41 200 bool enableWriteOnly(const uint8_t* pCurrentWritePassword) {
giovannivisentini 0:969a2be49f41 201 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 202 return false;
giovannivisentini 0:969a2be49f41 203
giovannivisentini 0:969a2be49f41 204 if (mDevice.Verify(M24SR::WritePwd, 0x10, pCurrentWritePassword)
giovannivisentini 0:969a2be49f41 205 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 206 /* disable read access and keep write */
giovannivisentini 0:969a2be49f41 207 return mDevice.EnablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 208 }
giovannivisentini 0:969a2be49f41 209 return false;
giovannivisentini 0:969a2be49f41 210 }
giovannivisentini 0:969a2be49f41 211
giovannivisentini 0:969a2be49f41 212 /**
giovannivisentini 0:969a2be49f41 213 * @brief This fonction disable write only mode
giovannivisentini 0:969a2be49f41 214 * @param pCurrentWritePassword : Write password is needed to have right to disable write only mode
giovannivisentini 0:969a2be49f41 215 * @retval SUCCESS : M24SR read access is now allowed
giovannivisentini 0:969a2be49f41 216 * @retval ERROR : operation does not complete
giovannivisentini 0:969a2be49f41 217 */
giovannivisentini 0:969a2be49f41 218 bool disableWriteOnly() {
giovannivisentini 0:969a2be49f41 219 if (!isSessionOpen())
giovannivisentini 0:969a2be49f41 220 return false;
giovannivisentini 0:969a2be49f41 221
giovannivisentini 0:969a2be49f41 222 if (mDevice.Verify(M24SR::I2CPwd, 0x10, M24SR::DEFAULT_PASSWORD)
giovannivisentini 0:969a2be49f41 223 == NFC_SUCCESS) {
giovannivisentini 0:969a2be49f41 224 /* disable write only -> enable write acces */
giovannivisentini 0:969a2be49f41 225 if (mDevice.DisablePermanentState(M24SR::ReadPwd) == NFC_SUCCESS)
giovannivisentini 0:969a2be49f41 226 return mDevice.DisableVerificationRequirement(M24SR::ReadPwd)
giovannivisentini 0:969a2be49f41 227 == NFC_SUCCESS;
giovannivisentini 0:969a2be49f41 228 }
giovannivisentini 0:969a2be49f41 229 return false;
giovannivisentini 0:969a2be49f41 230 }
giovannivisentini 0:969a2be49f41 231
giovannivisentini 0:969a2be49f41 232 protected:
giovannivisentini 0:969a2be49f41 233 virtual bool writeByte(const uint8_t *buffer, const uint16_t length, uint16_t offset);
giovannivisentini 0:969a2be49f41 234 virtual bool readByte(const uint16_t byteOffset, const uint16_t byteLength,
giovannivisentini 0:969a2be49f41 235 uint8_t *buffer);
giovannivisentini 0:969a2be49f41 236
giovannivisentini 0:969a2be49f41 237 private:
giovannivisentini 0:969a2be49f41 238
giovannivisentini 0:969a2be49f41 239 M24SR &mDevice;
giovannivisentini 0:969a2be49f41 240
giovannivisentini 0:969a2be49f41 241 /**
giovannivisentini 0:969a2be49f41 242 * max length for a read operation
giovannivisentini 0:969a2be49f41 243 */
giovannivisentini 0:969a2be49f41 244 uint16_t mMaxReadBytes;
giovannivisentini 0:969a2be49f41 245
giovannivisentini 0:969a2be49f41 246 /**
giovannivisentini 0:969a2be49f41 247 * max length for a write operation
giovannivisentini 0:969a2be49f41 248 */
giovannivisentini 0:969a2be49f41 249 uint16_t mMaxWriteBytes;
giovannivisentini 0:969a2be49f41 250 };
giovannivisentini 0:969a2be49f41 251
giovannivisentini 0:969a2be49f41 252 #endif /* TYPE4NFCTAGSTM24SR_H_ */