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 .

Committer:
giovannivisentini
Date:
Fri Nov 27 15:10:25 2015 +0000
Revision:
1:6d202b62ed68
Parent:
0:674813bd5ec9
Child:
2:0648c1561eb2
add the enable/disable read/write function

Who changed what in which revision?

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