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
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 .
m24sr/m24sr_class.cpp@0:674813bd5ec9, 2015-11-19 (annotated)
- Committer:
- giovannivisentini
- Date:
- Thu Nov 19 08:50:18 2015 +0000
- Revision:
- 0:674813bd5ec9
- Child:
- 1:6d202b62ed68
first commit,
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| giovannivisentini | 0:674813bd5ec9 | 1 | /** |
| giovannivisentini | 0:674813bd5ec9 | 2 | ****************************************************************************** |
| giovannivisentini | 0:674813bd5ec9 | 3 | * @file m24sr_class.cpp |
| giovannivisentini | 0:674813bd5ec9 | 4 | * @author MMY Application Team |
| giovannivisentini | 0:674813bd5ec9 | 5 | * @version V1.2.0 |
| giovannivisentini | 0:674813bd5ec9 | 6 | * @date 20-October-2014 |
| giovannivisentini | 0:674813bd5ec9 | 7 | * @brief This file provides a set of functions to interface with the M24SR |
| giovannivisentini | 0:674813bd5ec9 | 8 | * device. |
| giovannivisentini | 0:674813bd5ec9 | 9 | ****************************************************************************** |
| giovannivisentini | 0:674813bd5ec9 | 10 | * @attention |
| giovannivisentini | 0:674813bd5ec9 | 11 | * |
| giovannivisentini | 0:674813bd5ec9 | 12 | * <h2><center>© COPYRIGHT(c) 2014 STMicroelectronics</center></h2> |
| giovannivisentini | 0:674813bd5ec9 | 13 | * |
| giovannivisentini | 0:674813bd5ec9 | 14 | * Redistribution and use in source and binary forms, with or without modification, |
| giovannivisentini | 0:674813bd5ec9 | 15 | * are permitted provided that the following conditions are met: |
| giovannivisentini | 0:674813bd5ec9 | 16 | * 1. Redistributions of source code must retain the above copyright notice, |
| giovannivisentini | 0:674813bd5ec9 | 17 | * this list of conditions and the following disclaimer. |
| giovannivisentini | 0:674813bd5ec9 | 18 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
| giovannivisentini | 0:674813bd5ec9 | 19 | * this list of conditions and the following disclaimer in the documentation |
| giovannivisentini | 0:674813bd5ec9 | 20 | * and/or other materials provided with the distribution. |
| giovannivisentini | 0:674813bd5ec9 | 21 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
| giovannivisentini | 0:674813bd5ec9 | 22 | * may be used to endorse or promote products derived from this software |
| giovannivisentini | 0:674813bd5ec9 | 23 | * without specific prior written permission. |
| giovannivisentini | 0:674813bd5ec9 | 24 | * |
| giovannivisentini | 0:674813bd5ec9 | 25 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| giovannivisentini | 0:674813bd5ec9 | 26 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| giovannivisentini | 0:674813bd5ec9 | 27 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| giovannivisentini | 0:674813bd5ec9 | 28 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
| giovannivisentini | 0:674813bd5ec9 | 29 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| giovannivisentini | 0:674813bd5ec9 | 30 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| giovannivisentini | 0:674813bd5ec9 | 31 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| giovannivisentini | 0:674813bd5ec9 | 32 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| giovannivisentini | 0:674813bd5ec9 | 33 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| giovannivisentini | 0:674813bd5ec9 | 34 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| giovannivisentini | 0:674813bd5ec9 | 35 | * |
| giovannivisentini | 0:674813bd5ec9 | 36 | ****************************************************************************** |
| giovannivisentini | 0:674813bd5ec9 | 37 | */ |
| giovannivisentini | 0:674813bd5ec9 | 38 | |
| giovannivisentini | 0:674813bd5ec9 | 39 | |
| giovannivisentini | 0:674813bd5ec9 | 40 | /* Generated with Stm32CubeTOO -----------------------------------------------*/ |
| giovannivisentini | 0:674813bd5ec9 | 41 | |
| giovannivisentini | 0:674813bd5ec9 | 42 | |
| giovannivisentini | 0:674813bd5ec9 | 43 | /* Revision ------------------------------------------------------------------*/ |
| giovannivisentini | 0:674813bd5ec9 | 44 | /* |
| giovannivisentini | 0:674813bd5ec9 | 45 | Repository: http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev |
| giovannivisentini | 0:674813bd5ec9 | 46 | Branch/Trunk/Tag: trunk |
| giovannivisentini | 0:674813bd5ec9 | 47 | Based on: X-CUBE-MEMS1/trunk/Drivers/BSP/Components/m24sr/m24sr.c |
| giovannivisentini | 0:674813bd5ec9 | 48 | Revision: :410 |
| giovannivisentini | 0:674813bd5ec9 | 49 | */ |
| giovannivisentini | 0:674813bd5ec9 | 50 | |
| giovannivisentini | 0:674813bd5ec9 | 51 | /* Includes ------------------------------------------------------------------*/ |
| giovannivisentini | 0:674813bd5ec9 | 52 | #include "m24sr_class.h" |
| giovannivisentini | 0:674813bd5ec9 | 53 | #include "m24sr.h" |
| giovannivisentini | 0:674813bd5ec9 | 54 | |
| giovannivisentini | 0:674813bd5ec9 | 55 | /** @addtogroup M24SR_Driver |
| giovannivisentini | 0:674813bd5ec9 | 56 | * @{ |
| giovannivisentini | 0:674813bd5ec9 | 57 | * @brief <b>This folder contains the driver layer of M24SR family (M24SR64, M24SR16, M24SR04, M24SR02)</b> |
| giovannivisentini | 0:674813bd5ec9 | 58 | */ |
| giovannivisentini | 0:674813bd5ec9 | 59 | |
| giovannivisentini | 0:674813bd5ec9 | 60 | |
| giovannivisentini | 0:674813bd5ec9 | 61 | /** @defgroup drv_M24SR |
| giovannivisentini | 0:674813bd5ec9 | 62 | * @{ |
| giovannivisentini | 0:674813bd5ec9 | 63 | * @brief This file contains the driver which implements all the M24SR commands. |
| giovannivisentini | 0:674813bd5ec9 | 64 | */ |
| giovannivisentini | 0:674813bd5ec9 | 65 | |
| giovannivisentini | 0:674813bd5ec9 | 66 | #ifndef errchk |
| giovannivisentini | 0:674813bd5ec9 | 67 | #define errchk(fCall) if (status = (fCall), status != NFC_IO_SUCCESS) \ |
| giovannivisentini | 0:674813bd5ec9 | 68 | {goto Error;} else |
| giovannivisentini | 0:674813bd5ec9 | 69 | #endif |
| giovannivisentini | 0:674813bd5ec9 | 70 | |
| giovannivisentini | 0:674813bd5ec9 | 71 | |
| giovannivisentini | 0:674813bd5ec9 | 72 | /** |
| giovannivisentini | 0:674813bd5ec9 | 73 | * @brief This function updates the CRC |
| giovannivisentini | 0:674813bd5ec9 | 74 | * @param None |
| giovannivisentini | 0:674813bd5ec9 | 75 | * @retval None |
| giovannivisentini | 0:674813bd5ec9 | 76 | */ |
| giovannivisentini | 0:674813bd5ec9 | 77 | uint16_t M24SR_UpdateCrc (uint8_t ch, uint16_t *lpwCrc) |
| giovannivisentini | 0:674813bd5ec9 | 78 | { |
| giovannivisentini | 0:674813bd5ec9 | 79 | ch = (ch^(uint8_t)((*lpwCrc) & 0x00FF)); |
| giovannivisentini | 0:674813bd5ec9 | 80 | ch = (ch^(ch<<4)); |
| giovannivisentini | 0:674813bd5ec9 | 81 | *lpwCrc = (*lpwCrc >> 8)^((uint16_t)ch << 8)^((uint16_t)ch<<3)^((uint16_t)ch>>4); |
| giovannivisentini | 0:674813bd5ec9 | 82 | |
| giovannivisentini | 0:674813bd5ec9 | 83 | return (*lpwCrc); |
| giovannivisentini | 0:674813bd5ec9 | 84 | } |
| giovannivisentini | 0:674813bd5ec9 | 85 | |
| giovannivisentini | 0:674813bd5ec9 | 86 | /** |
| giovannivisentini | 0:674813bd5ec9 | 87 | * @brief This function returns the CRC 16 |
| giovannivisentini | 0:674813bd5ec9 | 88 | * @param Data : pointer on the data used to compute the CRC16 |
| giovannivisentini | 0:674813bd5ec9 | 89 | * @param Length : number of byte of the data |
| giovannivisentini | 0:674813bd5ec9 | 90 | * @retval CRC16 |
| giovannivisentini | 0:674813bd5ec9 | 91 | */ |
| giovannivisentini | 0:674813bd5ec9 | 92 | uint16_t M24SR_ComputeCrc(uint8_t *Data, uint8_t Length) |
| giovannivisentini | 0:674813bd5ec9 | 93 | { |
| giovannivisentini | 0:674813bd5ec9 | 94 | uint8_t chBlock; |
| giovannivisentini | 0:674813bd5ec9 | 95 | uint16_t wCrc = 0x6363; // ITU-V.41 |
| giovannivisentini | 0:674813bd5ec9 | 96 | |
| giovannivisentini | 0:674813bd5ec9 | 97 | do { |
| giovannivisentini | 0:674813bd5ec9 | 98 | chBlock = *Data++; |
| giovannivisentini | 0:674813bd5ec9 | 99 | M24SR_UpdateCrc(chBlock, &wCrc); |
| giovannivisentini | 0:674813bd5ec9 | 100 | } while (--Length); |
| giovannivisentini | 0:674813bd5ec9 | 101 | |
| giovannivisentini | 0:674813bd5ec9 | 102 | return wCrc ; |
| giovannivisentini | 0:674813bd5ec9 | 103 | } |
| giovannivisentini | 0:674813bd5ec9 | 104 | |
| giovannivisentini | 0:674813bd5ec9 | 105 | |
| giovannivisentini | 0:674813bd5ec9 | 106 | /** |
| giovannivisentini | 0:674813bd5ec9 | 107 | * @brief This function computes the CRC16 residue as defined by CRC ISO/IEC 13239 |
| giovannivisentini | 0:674813bd5ec9 | 108 | * @param DataIn : input to data |
| giovannivisentini | 0:674813bd5ec9 | 109 | * @param Length : Number of bits of DataIn |
| giovannivisentini | 0:674813bd5ec9 | 110 | * @retval Status (SW1&SW2) : CRC16 residue is correct |
| giovannivisentini | 0:674813bd5ec9 | 111 | * @retval M24SR_ERROR_CRC : CRC16 residue is false |
| giovannivisentini | 0:674813bd5ec9 | 112 | */ |
| giovannivisentini | 0:674813bd5ec9 | 113 | NFC_StatusTypeDef M24SR_IsCorrectCRC16Residue (uint8_t *DataIn,uint8_t Length) |
| giovannivisentini | 0:674813bd5ec9 | 114 | { |
| giovannivisentini | 0:674813bd5ec9 | 115 | uint16_t ResCRC=0x0000; |
| giovannivisentini | 0:674813bd5ec9 | 116 | |
| giovannivisentini | 0:674813bd5ec9 | 117 | /* check the CRC16 Residue */ |
| giovannivisentini | 0:674813bd5ec9 | 118 | if (Length !=0) |
| giovannivisentini | 0:674813bd5ec9 | 119 | ResCRC= M24SR_ComputeCrc (DataIn, Length); |
| giovannivisentini | 0:674813bd5ec9 | 120 | |
| giovannivisentini | 0:674813bd5ec9 | 121 | if ( ResCRC == 0x0000) |
| giovannivisentini | 0:674813bd5ec9 | 122 | { |
| giovannivisentini | 0:674813bd5ec9 | 123 | /* Good CRC, but error status from M24SR */ |
| giovannivisentini | 0:674813bd5ec9 | 124 | return(NFC_StatusTypeDef)(((DataIn[Length-UB_STATUS_OFFSET]<<8) & 0xFF00) | (DataIn[Length-LB_STATUS_OFFSET] & 0x00FF) ); |
| giovannivisentini | 0:674813bd5ec9 | 125 | } |
| giovannivisentini | 0:674813bd5ec9 | 126 | else |
| giovannivisentini | 0:674813bd5ec9 | 127 | { |
| giovannivisentini | 0:674813bd5ec9 | 128 | ResCRC=0x0000; |
| giovannivisentini | 0:674813bd5ec9 | 129 | ResCRC= M24SR_ComputeCrc (DataIn, 5); |
| giovannivisentini | 0:674813bd5ec9 | 130 | if ( ResCRC != 0x0000) |
| giovannivisentini | 0:674813bd5ec9 | 131 | { |
| giovannivisentini | 0:674813bd5ec9 | 132 | /* Bad CRC */ |
| giovannivisentini | 0:674813bd5ec9 | 133 | return NFC_IO_ERROR_CRC; |
| giovannivisentini | 0:674813bd5ec9 | 134 | } |
| giovannivisentini | 0:674813bd5ec9 | 135 | else |
| giovannivisentini | 0:674813bd5ec9 | 136 | { |
| giovannivisentini | 0:674813bd5ec9 | 137 | /* Good CRC, but error status from M24SR */ |
| giovannivisentini | 0:674813bd5ec9 | 138 | return (NFC_StatusTypeDef)( ((DataIn[1]<<8) & 0xFF00) | (DataIn[2] & 0x00FF) ); |
| giovannivisentini | 0:674813bd5ec9 | 139 | } |
| giovannivisentini | 0:674813bd5ec9 | 140 | } |
| giovannivisentini | 0:674813bd5ec9 | 141 | } |
| giovannivisentini | 0:674813bd5ec9 | 142 | |
| giovannivisentini | 0:674813bd5ec9 | 143 | /** |
| giovannivisentini | 0:674813bd5ec9 | 144 | * @brief Initialize the command and response structure |
| giovannivisentini | 0:674813bd5ec9 | 145 | * @param None |
| giovannivisentini | 0:674813bd5ec9 | 146 | * @retval None |
| giovannivisentini | 0:674813bd5ec9 | 147 | */ |
| giovannivisentini | 0:674813bd5ec9 | 148 | void M24SR::M24SR_InitCommandStructure ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 149 | { |
| giovannivisentini | 0:674813bd5ec9 | 150 | |
| giovannivisentini | 0:674813bd5ec9 | 151 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 152 | command.Header.CLA = 0x00; |
| giovannivisentini | 0:674813bd5ec9 | 153 | command.Header.INS = 0x00; |
| giovannivisentini | 0:674813bd5ec9 | 154 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 155 | command.Header.P1 = 0x00 ; |
| giovannivisentini | 0:674813bd5ec9 | 156 | command.Header.P2 = 0x00 ; |
| giovannivisentini | 0:674813bd5ec9 | 157 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 158 | command.Body.LC = 0x00 ; |
| giovannivisentini | 0:674813bd5ec9 | 159 | /* copy the number of byte to read */ |
| giovannivisentini | 0:674813bd5ec9 | 160 | command.Body.LE = 0x00 ; |
| giovannivisentini | 0:674813bd5ec9 | 161 | command.Body.pData = dataBuffer; |
| giovannivisentini | 0:674813bd5ec9 | 162 | |
| giovannivisentini | 0:674813bd5ec9 | 163 | // /* initializes the response structure*/ |
| giovannivisentini | 0:674813bd5ec9 | 164 | // Response.pData = contex->DataBuffer; |
| giovannivisentini | 0:674813bd5ec9 | 165 | // Response.SW1 = 0x00; |
| giovannivisentini | 0:674813bd5ec9 | 166 | // Response.SW2 = 0x00; |
| giovannivisentini | 0:674813bd5ec9 | 167 | } |
| giovannivisentini | 0:674813bd5ec9 | 168 | |
| giovannivisentini | 0:674813bd5ec9 | 169 | /** |
| giovannivisentini | 0:674813bd5ec9 | 170 | * @brief This functions creates an I block command according to the structures CommandStructure and data->command. |
| giovannivisentini | 0:674813bd5ec9 | 171 | * @param Command : structue which contains the field of the different parameter |
| giovannivisentini | 0:674813bd5ec9 | 172 | * @param CommandStructure : structure that contain the structure of the command (if the different field are presnet or not |
| giovannivisentini | 0:674813bd5ec9 | 173 | * @param NbByte : number of byte of the command |
| giovannivisentini | 0:674813bd5ec9 | 174 | * @param pCommand : pointer of the command created |
| giovannivisentini | 0:674813bd5ec9 | 175 | */ |
| giovannivisentini | 0:674813bd5ec9 | 176 | void M24SR_BuildIBlockCommand (uint16_t CommandStructure,C_APDU *Command,uint8_t uDIDbyte, uint16_t *NbByte , uint8_t *pCommand) |
| giovannivisentini | 0:674813bd5ec9 | 177 | { |
| giovannivisentini | 0:674813bd5ec9 | 178 | uint16_t uCRC16; |
| giovannivisentini | 0:674813bd5ec9 | 179 | static uint8_t BlockNumber = 0x01; |
| giovannivisentini | 0:674813bd5ec9 | 180 | |
| giovannivisentini | 0:674813bd5ec9 | 181 | (*NbByte) = 0; |
| giovannivisentini | 0:674813bd5ec9 | 182 | |
| giovannivisentini | 0:674813bd5ec9 | 183 | /* add the PCD byte */ |
| giovannivisentini | 0:674813bd5ec9 | 184 | if ((CommandStructure & M24SR_PCB_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 185 | { |
| giovannivisentini | 0:674813bd5ec9 | 186 | /* toggle the block number */ |
| giovannivisentini | 0:674813bd5ec9 | 187 | BlockNumber = TOGGLE ( BlockNumber ); |
| giovannivisentini | 0:674813bd5ec9 | 188 | /* Add the I block byte */ |
| giovannivisentini | 0:674813bd5ec9 | 189 | pCommand[(*NbByte)++] = 0x02 | BlockNumber; |
| giovannivisentini | 0:674813bd5ec9 | 190 | } |
| giovannivisentini | 0:674813bd5ec9 | 191 | |
| giovannivisentini | 0:674813bd5ec9 | 192 | /* add the DID byte */ |
| giovannivisentini | 0:674813bd5ec9 | 193 | if ((BlockNumber & M24SR_DID_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 194 | { |
| giovannivisentini | 0:674813bd5ec9 | 195 | /* Add the I block byte */ |
| giovannivisentini | 0:674813bd5ec9 | 196 | pCommand[(*NbByte)++] = uDIDbyte; |
| giovannivisentini | 0:674813bd5ec9 | 197 | } |
| giovannivisentini | 0:674813bd5ec9 | 198 | |
| giovannivisentini | 0:674813bd5ec9 | 199 | /* add the Class byte */ |
| giovannivisentini | 0:674813bd5ec9 | 200 | if ((CommandStructure & M24SR_CLA_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 201 | { |
| giovannivisentini | 0:674813bd5ec9 | 202 | pCommand[(*NbByte)++] = Command->Header.CLA ; |
| giovannivisentini | 0:674813bd5ec9 | 203 | } |
| giovannivisentini | 0:674813bd5ec9 | 204 | /* add the instruction byte byte */ |
| giovannivisentini | 0:674813bd5ec9 | 205 | if ( (CommandStructure & M24SR_INS_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 206 | { |
| giovannivisentini | 0:674813bd5ec9 | 207 | pCommand[(*NbByte)++] = Command->Header.INS ; |
| giovannivisentini | 0:674813bd5ec9 | 208 | } |
| giovannivisentini | 0:674813bd5ec9 | 209 | /* add the Selection Mode byte */ |
| giovannivisentini | 0:674813bd5ec9 | 210 | if ((CommandStructure & M24SR_P1_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 211 | { |
| giovannivisentini | 0:674813bd5ec9 | 212 | pCommand[(*NbByte)++] = Command->Header.P1 ; |
| giovannivisentini | 0:674813bd5ec9 | 213 | } |
| giovannivisentini | 0:674813bd5ec9 | 214 | /* add the Selection Mode byte */ |
| giovannivisentini | 0:674813bd5ec9 | 215 | if ((CommandStructure & M24SR_P2_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 216 | { |
| giovannivisentini | 0:674813bd5ec9 | 217 | pCommand[(*NbByte)++] = Command->Header.P2 ; |
| giovannivisentini | 0:674813bd5ec9 | 218 | } |
| giovannivisentini | 0:674813bd5ec9 | 219 | /* add Data field lengthbyte */ |
| giovannivisentini | 0:674813bd5ec9 | 220 | if ((CommandStructure & M24SR_LC_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 221 | { |
| giovannivisentini | 0:674813bd5ec9 | 222 | pCommand[(*NbByte)++] = Command->Body.LC ; |
| giovannivisentini | 0:674813bd5ec9 | 223 | } |
| giovannivisentini | 0:674813bd5ec9 | 224 | /* add Data field */ |
| giovannivisentini | 0:674813bd5ec9 | 225 | if ((CommandStructure & M24SR_DATA_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 226 | { |
| giovannivisentini | 0:674813bd5ec9 | 227 | memcpy(&(pCommand[(*NbByte)]) ,Command->Body.pData,Command->Body.LC ) ; |
| giovannivisentini | 0:674813bd5ec9 | 228 | (*NbByte) += Command->Body.LC ; |
| giovannivisentini | 0:674813bd5ec9 | 229 | } |
| giovannivisentini | 0:674813bd5ec9 | 230 | /* add Le field */ |
| giovannivisentini | 0:674813bd5ec9 | 231 | if ((CommandStructure & M24SR_LE_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 232 | { |
| giovannivisentini | 0:674813bd5ec9 | 233 | pCommand[(*NbByte)++] = Command->Body.LE ; |
| giovannivisentini | 0:674813bd5ec9 | 234 | } |
| giovannivisentini | 0:674813bd5ec9 | 235 | /* add CRC field */ |
| giovannivisentini | 0:674813bd5ec9 | 236 | if ((CommandStructure & M24SR_CRC_NEEDED) !=0) |
| giovannivisentini | 0:674813bd5ec9 | 237 | { |
| giovannivisentini | 0:674813bd5ec9 | 238 | uCRC16 = M24SR_ComputeCrc (pCommand,(uint8_t) (*NbByte)); |
| giovannivisentini | 0:674813bd5ec9 | 239 | /* append the CRC16 */ |
| giovannivisentini | 0:674813bd5ec9 | 240 | pCommand [(*NbByte)++] = GETLSB (uCRC16 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 241 | pCommand [(*NbByte)++] = GETMSB (uCRC16 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 242 | } |
| giovannivisentini | 0:674813bd5ec9 | 243 | |
| giovannivisentini | 0:674813bd5ec9 | 244 | } |
| giovannivisentini | 0:674813bd5ec9 | 245 | |
| giovannivisentini | 0:674813bd5ec9 | 246 | #if 0 |
| giovannivisentini | 0:674813bd5ec9 | 247 | /** |
| giovannivisentini | 0:674813bd5ec9 | 248 | * @brief This function return M24SR_STATUS_SUCCESS if the pBuffer is an I-block |
| giovannivisentini | 0:674813bd5ec9 | 249 | * @param pBuffer : pointer of the data |
| giovannivisentini | 0:674813bd5ec9 | 250 | * @retval M24SR_STATUS_SUCCESS : the data is a I-Block |
| giovannivisentini | 0:674813bd5ec9 | 251 | * @retval M24SR_ERROR_DEFAULT : the data is not a I-Block |
| giovannivisentini | 0:674813bd5ec9 | 252 | */ |
| giovannivisentini | 0:674813bd5ec9 | 253 | static int8_t IsIBlock (uint8_t *pBuffer) |
| giovannivisentini | 0:674813bd5ec9 | 254 | { |
| giovannivisentini | 0:674813bd5ec9 | 255 | |
| giovannivisentini | 0:674813bd5ec9 | 256 | if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_IBLOCK) |
| giovannivisentini | 0:674813bd5ec9 | 257 | { |
| giovannivisentini | 0:674813bd5ec9 | 258 | return M24SR_STATUS_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 259 | } |
| giovannivisentini | 0:674813bd5ec9 | 260 | else |
| giovannivisentini | 0:674813bd5ec9 | 261 | { |
| giovannivisentini | 0:674813bd5ec9 | 262 | return M24SR_ERROR_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 263 | } |
| giovannivisentini | 0:674813bd5ec9 | 264 | |
| giovannivisentini | 0:674813bd5ec9 | 265 | } |
| giovannivisentini | 0:674813bd5ec9 | 266 | |
| giovannivisentini | 0:674813bd5ec9 | 267 | /** |
| giovannivisentini | 0:674813bd5ec9 | 268 | * @brief This function return M24SR_STATUS_SUCCESS if the pBuffer is an R-block |
| giovannivisentini | 0:674813bd5ec9 | 269 | * @param pBuffer : pointer of the data |
| giovannivisentini | 0:674813bd5ec9 | 270 | * @retval M24SR_STATUS_SUCCESS : the data is a R-Block |
| giovannivisentini | 0:674813bd5ec9 | 271 | * @retval M24SR_ERROR_DEFAULT : the data is not a R-Block |
| giovannivisentini | 0:674813bd5ec9 | 272 | */ |
| giovannivisentini | 0:674813bd5ec9 | 273 | static int8_t IsRBlock (uint8_t *pBuffer) |
| giovannivisentini | 0:674813bd5ec9 | 274 | { |
| giovannivisentini | 0:674813bd5ec9 | 275 | |
| giovannivisentini | 0:674813bd5ec9 | 276 | if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_RBLOCK) |
| giovannivisentini | 0:674813bd5ec9 | 277 | { |
| giovannivisentini | 0:674813bd5ec9 | 278 | return M24SR_STATUS_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 279 | } |
| giovannivisentini | 0:674813bd5ec9 | 280 | else |
| giovannivisentini | 0:674813bd5ec9 | 281 | { |
| giovannivisentini | 0:674813bd5ec9 | 282 | return M24SR_ERROR_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 283 | } |
| giovannivisentini | 0:674813bd5ec9 | 284 | |
| giovannivisentini | 0:674813bd5ec9 | 285 | } |
| giovannivisentini | 0:674813bd5ec9 | 286 | #endif |
| giovannivisentini | 0:674813bd5ec9 | 287 | |
| giovannivisentini | 0:674813bd5ec9 | 288 | /** |
| giovannivisentini | 0:674813bd5ec9 | 289 | * @brief This function return M24SR_STATUS_SUCCESS if the pBuffer is an s-block |
| giovannivisentini | 0:674813bd5ec9 | 290 | * @param pBuffer : pointer of the data |
| giovannivisentini | 0:674813bd5ec9 | 291 | * @retval M24SR_STATUS_SUCCESS : the data is a S-Block |
| giovannivisentini | 0:674813bd5ec9 | 292 | * @retval M24SR_ERROR_DEFAULT : the data is not a S-Block |
| giovannivisentini | 0:674813bd5ec9 | 293 | */ |
| giovannivisentini | 0:674813bd5ec9 | 294 | static int8_t IsSBlock (uint8_t *pBuffer) |
| giovannivisentini | 0:674813bd5ec9 | 295 | { |
| giovannivisentini | 0:674813bd5ec9 | 296 | |
| giovannivisentini | 0:674813bd5ec9 | 297 | if ((pBuffer[M24SR_OFFSET_PCB] & M24SR_MASK_BLOCK) == M24SR_MASK_SBLOCK) |
| giovannivisentini | 0:674813bd5ec9 | 298 | { |
| giovannivisentini | 0:674813bd5ec9 | 299 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 300 | } |
| giovannivisentini | 0:674813bd5ec9 | 301 | else |
| giovannivisentini | 0:674813bd5ec9 | 302 | { |
| giovannivisentini | 0:674813bd5ec9 | 303 | return NFC_IO_ERROR_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 304 | } |
| giovannivisentini | 0:674813bd5ec9 | 305 | |
| giovannivisentini | 0:674813bd5ec9 | 306 | } |
| giovannivisentini | 0:674813bd5ec9 | 307 | |
| giovannivisentini | 0:674813bd5ec9 | 308 | /** |
| giovannivisentini | 0:674813bd5ec9 | 309 | * @brief This function sends the FWT extension command (S-Block format) |
| giovannivisentini | 0:674813bd5ec9 | 310 | * @param FWTbyte : FWT value |
| giovannivisentini | 0:674813bd5ec9 | 311 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 312 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 313 | */ |
| giovannivisentini | 0:674813bd5ec9 | 314 | NFC_StatusTypeDef M24SR::M24SR_FWTExtension (uint8_t FWTbyte ) |
| giovannivisentini | 0:674813bd5ec9 | 315 | { |
| giovannivisentini | 0:674813bd5ec9 | 316 | uint8_t pBuffer[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 0:674813bd5ec9 | 317 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 318 | uint8_t NthByte = 0; |
| giovannivisentini | 0:674813bd5ec9 | 319 | uint16_t uCRC16; |
| giovannivisentini | 0:674813bd5ec9 | 320 | |
| giovannivisentini | 0:674813bd5ec9 | 321 | /* create the response */ |
| giovannivisentini | 0:674813bd5ec9 | 322 | pBuffer[NthByte++] = 0xF2 ; |
| giovannivisentini | 0:674813bd5ec9 | 323 | pBuffer[NthByte++] = FWTbyte ; |
| giovannivisentini | 0:674813bd5ec9 | 324 | /* compute the CRC */ |
| giovannivisentini | 0:674813bd5ec9 | 325 | uCRC16 = M24SR_ComputeCrc (pBuffer,0x02); |
| giovannivisentini | 0:674813bd5ec9 | 326 | /* append the CRC16 */ |
| giovannivisentini | 0:674813bd5ec9 | 327 | pBuffer [NthByte++] = GETLSB (uCRC16 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 328 | pBuffer [NthByte++]= GETMSB (uCRC16 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 329 | |
| giovannivisentini | 0:674813bd5ec9 | 330 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 331 | errchk( M24SR_IO_SendI2Ccommand (NthByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 332 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 333 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 334 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 335 | |
| giovannivisentini | 0:674813bd5ec9 | 336 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 337 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 338 | |
| giovannivisentini | 0:674813bd5ec9 | 339 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 340 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 341 | } |
| giovannivisentini | 0:674813bd5ec9 | 342 | |
| giovannivisentini | 0:674813bd5ec9 | 343 | /** |
| giovannivisentini | 0:674813bd5ec9 | 344 | * @brief This function sends the KillSession command to the M24SR device |
| giovannivisentini | 0:674813bd5ec9 | 345 | * @param None |
| giovannivisentini | 0:674813bd5ec9 | 346 | * @retval NFC_OK : the function is succesful. |
| giovannivisentini | 0:674813bd5ec9 | 347 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 348 | */ |
| giovannivisentini | 0:674813bd5ec9 | 349 | NFC_StatusTypeDef M24SR::M24SR_KillSession ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 350 | { |
| giovannivisentini | 0:674813bd5ec9 | 351 | uint8_t commandBuffer[] = M24SR_KILLSESSION_COMMAND; |
| giovannivisentini | 0:674813bd5ec9 | 352 | int8_t status; |
| giovannivisentini | 0:674813bd5ec9 | 353 | |
| giovannivisentini | 0:674813bd5ec9 | 354 | errchk(M24SR_IO_SendI2Ccommand (sizeof(commandBuffer) , commandBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 355 | |
| giovannivisentini | 0:674813bd5ec9 | 356 | /* Insure no access will be done just after open session */ |
| giovannivisentini | 0:674813bd5ec9 | 357 | /* The only way here is to poll I2C to know when M24SR is ready */ |
| giovannivisentini | 0:674813bd5ec9 | 358 | /* GPO can not be use with KillSession command */ |
| giovannivisentini | 0:674813bd5ec9 | 359 | errchk(M24SR_IO_PollI2C ()); |
| giovannivisentini | 0:674813bd5ec9 | 360 | |
| giovannivisentini | 0:674813bd5ec9 | 361 | return NFC_OK; |
| giovannivisentini | 0:674813bd5ec9 | 362 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 363 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 364 | } |
| giovannivisentini | 0:674813bd5ec9 | 365 | |
| giovannivisentini | 0:674813bd5ec9 | 366 | |
| giovannivisentini | 0:674813bd5ec9 | 367 | /** |
| giovannivisentini | 0:674813bd5ec9 | 368 | * @brief This function sends the Deselect command (S-Block format) |
| giovannivisentini | 0:674813bd5ec9 | 369 | * @retval NFC_OK : the function is succesful. |
| giovannivisentini | 0:674813bd5ec9 | 370 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 371 | */ |
| giovannivisentini | 0:674813bd5ec9 | 372 | NFC_StatusTypeDef M24SR::M24SR_Deselect ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 373 | { |
| giovannivisentini | 0:674813bd5ec9 | 374 | uint8_t pBuffer[] = M24SR_DESELECTREQUEST_COMMAND ; |
| giovannivisentini | 0:674813bd5ec9 | 375 | int8_t status ; |
| giovannivisentini | 0:674813bd5ec9 | 376 | |
| giovannivisentini | 0:674813bd5ec9 | 377 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 378 | errchk( M24SR_IO_SendI2Ccommand (sizeof(pBuffer) , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 379 | |
| giovannivisentini | 0:674813bd5ec9 | 380 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 381 | /* flush the M24SR buffer */ |
| giovannivisentini | 0:674813bd5ec9 | 382 | errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pBuffer) , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 383 | |
| giovannivisentini | 0:674813bd5ec9 | 384 | return NFC_OK; |
| giovannivisentini | 0:674813bd5ec9 | 385 | |
| giovannivisentini | 0:674813bd5ec9 | 386 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 387 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 388 | } |
| giovannivisentini | 0:674813bd5ec9 | 389 | |
| giovannivisentini | 0:674813bd5ec9 | 390 | |
| giovannivisentini | 0:674813bd5ec9 | 391 | |
| giovannivisentini | 0:674813bd5ec9 | 392 | |
| giovannivisentini | 0:674813bd5ec9 | 393 | /** |
| giovannivisentini | 0:674813bd5ec9 | 394 | * @brief This function sends the SelectApplication command |
| giovannivisentini | 0:674813bd5ec9 | 395 | * @retval NFC_OK : the function is succesful. |
| giovannivisentini | 0:674813bd5ec9 | 396 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 397 | */ |
| giovannivisentini | 0:674813bd5ec9 | 398 | NFC_StatusTypeDef M24SR::M24SR_SelectApplication ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 399 | { |
| giovannivisentini | 0:674813bd5ec9 | 400 | |
| giovannivisentini | 0:674813bd5ec9 | 401 | C_APDU command; |
| giovannivisentini | 0:674813bd5ec9 | 402 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 403 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 0:674813bd5ec9 | 404 | uint8_t pDataOut[] = M24SR_SELECTAPPLICATION_COMMAND; |
| giovannivisentini | 0:674813bd5ec9 | 405 | uint8_t uLe = 0x00; |
| giovannivisentini | 0:674813bd5ec9 | 406 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 407 | uint16_t uP1P2 =0x0400, NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 408 | |
| giovannivisentini | 0:674813bd5ec9 | 409 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 410 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 411 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 0:674813bd5ec9 | 412 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 413 | command.Header.P1 = GETMSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 414 | command.Header.P2 = GETLSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 415 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 416 | command.Body.LC = sizeof(pDataOut) ; |
| giovannivisentini | 0:674813bd5ec9 | 417 | /* copy the data */ |
| giovannivisentini | 0:674813bd5ec9 | 418 | command.Body.pData=pDataOut; |
| giovannivisentini | 0:674813bd5ec9 | 419 | /* copy the number of byte to read */ |
| giovannivisentini | 0:674813bd5ec9 | 420 | command.Body.LE = uLe ; |
| giovannivisentini | 0:674813bd5ec9 | 421 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 422 | M24SR_BuildIBlockCommand ( M24SR_CMDSTRUCT_SELECTAPPLICATION, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 423 | |
| giovannivisentini | 0:674813bd5ec9 | 424 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 425 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 426 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 427 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 428 | errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pDataIn) , pDataIn )); |
| giovannivisentini | 0:674813bd5ec9 | 429 | |
| giovannivisentini | 0:674813bd5ec9 | 430 | status = M24SR_IsCorrectCRC16Residue (pDataIn,sizeof(pDataIn)); |
| giovannivisentini | 0:674813bd5ec9 | 431 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 432 | |
| giovannivisentini | 0:674813bd5ec9 | 433 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 434 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 435 | } |
| giovannivisentini | 0:674813bd5ec9 | 436 | |
| giovannivisentini | 0:674813bd5ec9 | 437 | |
| giovannivisentini | 0:674813bd5ec9 | 438 | /** |
| giovannivisentini | 0:674813bd5ec9 | 439 | * @brief This function initialize the M24SR device |
| giovannivisentini | 0:674813bd5ec9 | 440 | * @retval None |
| giovannivisentini | 0:674813bd5ec9 | 441 | */ |
| giovannivisentini | 0:674813bd5ec9 | 442 | NFC_StatusTypeDef M24SR::M24SR_Init(NFC_InitTypeDef *notUsed) |
| giovannivisentini | 0:674813bd5ec9 | 443 | { |
| giovannivisentini | 0:674813bd5ec9 | 444 | (void)notUsed; |
| giovannivisentini | 0:674813bd5ec9 | 445 | |
| giovannivisentini | 0:674813bd5ec9 | 446 | M24SR_InitCommandStructure(); |
| giovannivisentini | 0:674813bd5ec9 | 447 | |
| giovannivisentini | 0:674813bd5ec9 | 448 | /* |
| giovannivisentini | 0:674813bd5ec9 | 449 | if( M24SR_KillSession() == NFC_OK) |
| giovannivisentini | 0:674813bd5ec9 | 450 | { |
| giovannivisentini | 0:674813bd5ec9 | 451 | M24SR_ManageI2CGPO(I2C_ANSWER_READY); |
| giovannivisentini | 0:674813bd5ec9 | 452 | M24SR_Deselect (); |
| giovannivisentini | 0:674813bd5ec9 | 453 | } |
| giovannivisentini | 0:674813bd5ec9 | 454 | */ |
| giovannivisentini | 0:674813bd5ec9 | 455 | return NFC_OK; |
| giovannivisentini | 0:674813bd5ec9 | 456 | } |
| giovannivisentini | 0:674813bd5ec9 | 457 | |
| giovannivisentini | 0:674813bd5ec9 | 458 | NFC_StatusTypeDef M24SR::M24SR_ReadID(uint8_t *nfc_id){ |
| giovannivisentini | 0:674813bd5ec9 | 459 | if(!nfc_id){ |
| giovannivisentini | 0:674813bd5ec9 | 460 | return NFC_ERROR; |
| giovannivisentini | 0:674813bd5ec9 | 461 | } |
| giovannivisentini | 0:674813bd5ec9 | 462 | NFC_StatusTypeDef error = M24SR_SelectApplication(); |
| giovannivisentini | 0:674813bd5ec9 | 463 | if(error!=NFC_IO_SUCCESS) |
| giovannivisentini | 0:674813bd5ec9 | 464 | return error; |
| giovannivisentini | 0:674813bd5ec9 | 465 | |
| giovannivisentini | 0:674813bd5ec9 | 466 | return M24SR_ReadBinary(0x0011,1,nfc_id); |
| giovannivisentini | 0:674813bd5ec9 | 467 | } |
| giovannivisentini | 0:674813bd5ec9 | 468 | |
| giovannivisentini | 0:674813bd5ec9 | 469 | |
| giovannivisentini | 0:674813bd5ec9 | 470 | /** |
| giovannivisentini | 0:674813bd5ec9 | 471 | * @brief This function sends the GetSession command to the M24SR device |
| giovannivisentini | 0:674813bd5ec9 | 472 | * @retval NFC_OK : the function is succesful. |
| giovannivisentini | 0:674813bd5ec9 | 473 | * @retval Status (SW1&SW2) : if operation does not complete. |
| giovannivisentini | 0:674813bd5ec9 | 474 | */ |
| giovannivisentini | 0:674813bd5ec9 | 475 | NFC_StatusTypeDef M24SR::M24SR_GetSession ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 476 | { |
| giovannivisentini | 0:674813bd5ec9 | 477 | uint8_t commandBuffer[] = M24SR_OPENSESSION_COMMAND; |
| giovannivisentini | 0:674813bd5ec9 | 478 | int16_t status; |
| giovannivisentini | 0:674813bd5ec9 | 479 | |
| giovannivisentini | 0:674813bd5ec9 | 480 | errchk(M24SR_IO_SendI2Ccommand (sizeof(commandBuffer) , commandBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 481 | |
| giovannivisentini | 0:674813bd5ec9 | 482 | /* Insure no access will be done just after open session */ |
| giovannivisentini | 0:674813bd5ec9 | 483 | /* The only way here is to poll I2C to know when M24SR is ready */ |
| giovannivisentini | 0:674813bd5ec9 | 484 | /* GPO can not be use with GetSession command */ |
| giovannivisentini | 0:674813bd5ec9 | 485 | errchk(M24SR_IO_PollI2C ()); |
| giovannivisentini | 0:674813bd5ec9 | 486 | |
| giovannivisentini | 0:674813bd5ec9 | 487 | return NFC_OK; |
| giovannivisentini | 0:674813bd5ec9 | 488 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 489 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 490 | } |
| giovannivisentini | 0:674813bd5ec9 | 491 | |
| giovannivisentini | 0:674813bd5ec9 | 492 | |
| giovannivisentini | 0:674813bd5ec9 | 493 | |
| giovannivisentini | 0:674813bd5ec9 | 494 | |
| giovannivisentini | 0:674813bd5ec9 | 495 | /** |
| giovannivisentini | 0:674813bd5ec9 | 496 | * @brief This function sends the SelectCCFile command |
| giovannivisentini | 0:674813bd5ec9 | 497 | * @retval NFC_OK : the function is succesful. |
| giovannivisentini | 0:674813bd5ec9 | 498 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 499 | * @retval Status (SW1&SW2) : if operation does not complete for another reason. |
| giovannivisentini | 0:674813bd5ec9 | 500 | */ |
| giovannivisentini | 0:674813bd5ec9 | 501 | NFC_StatusTypeDef M24SR::M24SR_SelectCCfile ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 502 | { |
| giovannivisentini | 0:674813bd5ec9 | 503 | C_APDU command; |
| giovannivisentini | 0:674813bd5ec9 | 504 | |
| giovannivisentini | 0:674813bd5ec9 | 505 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 506 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 0:674813bd5ec9 | 507 | uint8_t pDataOut[] = CC_FILE_ID_BYTES; |
| giovannivisentini | 0:674813bd5ec9 | 508 | NFC_StatusTypeDef status; |
| giovannivisentini | 0:674813bd5ec9 | 509 | uint16_t uP1P2 =0x000C, NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 510 | |
| giovannivisentini | 0:674813bd5ec9 | 511 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 512 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 513 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 0:674813bd5ec9 | 514 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 515 | command.Header.P1 = GETMSB(uP1P2); |
| giovannivisentini | 0:674813bd5ec9 | 516 | command.Header.P2 = GETLSB(uP1P2); |
| giovannivisentini | 0:674813bd5ec9 | 517 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 518 | command.Body.LC = sizeof(pDataOut); |
| giovannivisentini | 0:674813bd5ec9 | 519 | command.Body.pData = pDataOut; |
| giovannivisentini | 0:674813bd5ec9 | 520 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 521 | M24SR_BuildIBlockCommand(M24SR_CMDSTRUCT_SELECTCCFILE, &command, uDIDbyte, |
| giovannivisentini | 0:674813bd5ec9 | 522 | &NbByte, pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 523 | |
| giovannivisentini | 0:674813bd5ec9 | 524 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 525 | errchk(M24SR_IO_SendI2Ccommand(NbByte, pBuffer)); |
| giovannivisentini | 0:674813bd5ec9 | 526 | errchk(M24SR_IO_IsAnswerReady()); |
| giovannivisentini | 0:674813bd5ec9 | 527 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 528 | errchk(M24SR_IO_ReceiveI2Cresponse(sizeof(pDataIn), pDataIn)); |
| giovannivisentini | 0:674813bd5ec9 | 529 | |
| giovannivisentini | 0:674813bd5ec9 | 530 | status = M24SR_IsCorrectCRC16Residue(pDataIn, sizeof(pDataIn)); |
| giovannivisentini | 0:674813bd5ec9 | 531 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 532 | |
| giovannivisentini | 0:674813bd5ec9 | 533 | Error: |
| giovannivisentini | 0:674813bd5ec9 | 534 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 535 | } |
| giovannivisentini | 0:674813bd5ec9 | 536 | |
| giovannivisentini | 0:674813bd5ec9 | 537 | |
| giovannivisentini | 0:674813bd5ec9 | 538 | /** |
| giovannivisentini | 0:674813bd5ec9 | 539 | * @brief This function sends the SelectSystemFile command |
| giovannivisentini | 0:674813bd5ec9 | 540 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 541 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 542 | */ |
| giovannivisentini | 0:674813bd5ec9 | 543 | NFC_StatusTypeDef M24SR::M24SR_SelectSystemfile ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 544 | { |
| giovannivisentini | 0:674813bd5ec9 | 545 | C_APDU command; |
| giovannivisentini | 0:674813bd5ec9 | 546 | |
| giovannivisentini | 0:674813bd5ec9 | 547 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 548 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 0:674813bd5ec9 | 549 | uint8_t pDataOut[] = SYSTEM_FILE_ID_BYTES; |
| giovannivisentini | 0:674813bd5ec9 | 550 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 551 | uint16_t uP1P2 =0x000C, NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 552 | |
| giovannivisentini | 0:674813bd5ec9 | 553 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 554 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 555 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 0:674813bd5ec9 | 556 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 557 | command.Header.P1 = GETMSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 558 | command.Header.P2 = GETLSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 559 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 560 | command.Body.LC = sizeof(pDataOut); |
| giovannivisentini | 0:674813bd5ec9 | 561 | command.Body.pData=pDataOut; |
| giovannivisentini | 0:674813bd5ec9 | 562 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 563 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_SELECTCCFILE, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 564 | |
| giovannivisentini | 0:674813bd5ec9 | 565 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 566 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 567 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 568 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 569 | errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pDataIn) , pDataIn )); |
| giovannivisentini | 0:674813bd5ec9 | 570 | |
| giovannivisentini | 0:674813bd5ec9 | 571 | status = M24SR_IsCorrectCRC16Residue (pDataIn,sizeof(pDataIn)); |
| giovannivisentini | 0:674813bd5ec9 | 572 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 573 | |
| giovannivisentini | 0:674813bd5ec9 | 574 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 575 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 576 | } |
| giovannivisentini | 0:674813bd5ec9 | 577 | |
| giovannivisentini | 0:674813bd5ec9 | 578 | /** |
| giovannivisentini | 0:674813bd5ec9 | 579 | * @brief This function sends the SelectNDEFfile command |
| giovannivisentini | 0:674813bd5ec9 | 580 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 581 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 582 | */ |
| giovannivisentini | 0:674813bd5ec9 | 583 | NFC_StatusTypeDef M24SR::M24SR_SelectNDEFfile (uint16_t NDEFfileId ) |
| giovannivisentini | 0:674813bd5ec9 | 584 | { |
| giovannivisentini | 0:674813bd5ec9 | 585 | C_APDU command; |
| giovannivisentini | 0:674813bd5ec9 | 586 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 587 | uint8_t pDataIn[M24SR_STATUSRESPONSE_NBBYTE]; |
| giovannivisentini | 0:674813bd5ec9 | 588 | uint8_t pDataOut[]={GETMSB(NDEFfileId ), GETLSB(NDEFfileId )}; |
| giovannivisentini | 0:674813bd5ec9 | 589 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 590 | uint16_t uP1P2 =0x000C, NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 591 | |
| giovannivisentini | 0:674813bd5ec9 | 592 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 593 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 594 | command.Header.INS = C_APDU_SELECT_FILE; |
| giovannivisentini | 0:674813bd5ec9 | 595 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 596 | command.Header.P1 = GETMSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 597 | command.Header.P2 = GETLSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 598 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 599 | command.Body.LC = sizeof(pDataOut) ; |
| giovannivisentini | 0:674813bd5ec9 | 600 | command.Body.pData = pDataOut; |
| giovannivisentini | 0:674813bd5ec9 | 601 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 602 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 603 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_SELECTNDEFFILE, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 604 | |
| giovannivisentini | 0:674813bd5ec9 | 605 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 606 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 607 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 608 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 609 | errchk( M24SR_IO_ReceiveI2Cresponse (sizeof(pDataIn) , pDataIn )); |
| giovannivisentini | 0:674813bd5ec9 | 610 | |
| giovannivisentini | 0:674813bd5ec9 | 611 | return M24SR_IsCorrectCRC16Residue (pDataIn,sizeof(pDataIn)); |
| giovannivisentini | 0:674813bd5ec9 | 612 | |
| giovannivisentini | 0:674813bd5ec9 | 613 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 614 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 615 | |
| giovannivisentini | 0:674813bd5ec9 | 616 | } |
| giovannivisentini | 0:674813bd5ec9 | 617 | |
| giovannivisentini | 0:674813bd5ec9 | 618 | /** |
| giovannivisentini | 0:674813bd5ec9 | 619 | * @brief This function sends a read binary command |
| giovannivisentini | 0:674813bd5ec9 | 620 | * @param Offset : first byte to read |
| giovannivisentini | 0:674813bd5ec9 | 621 | * @param NbByteToRead : number of byte to read |
| giovannivisentini | 0:674813bd5ec9 | 622 | * @param pBufferRead : pointer of the buffer read from the M24SR device |
| giovannivisentini | 0:674813bd5ec9 | 623 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 624 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 625 | */ |
| giovannivisentini | 0:674813bd5ec9 | 626 | NFC_StatusTypeDef M24SR::M24SR_ReadBinary (uint16_t Offset ,uint8_t NbByteToRead , uint8_t *pBufferRead ) |
| giovannivisentini | 0:674813bd5ec9 | 627 | { |
| giovannivisentini | 0:674813bd5ec9 | 628 | uint8_t *pBuffer = uM24SRbuffer ; |
| giovannivisentini | 0:674813bd5ec9 | 629 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 630 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 631 | |
| giovannivisentini | 0:674813bd5ec9 | 632 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 633 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 634 | command.Header.INS = C_APDU_READ_BINARY; |
| giovannivisentini | 0:674813bd5ec9 | 635 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 636 | command.Header.P1 = GETMSB (Offset ) ; |
| giovannivisentini | 0:674813bd5ec9 | 637 | command.Header.P2 = GETLSB (Offset ) ; |
| giovannivisentini | 0:674813bd5ec9 | 638 | /* copy the number of byte to read */ |
| giovannivisentini | 0:674813bd5ec9 | 639 | command.Body.LE = NbByteToRead ; |
| giovannivisentini | 0:674813bd5ec9 | 640 | |
| giovannivisentini | 0:674813bd5ec9 | 641 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_READBINARY, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 642 | |
| giovannivisentini | 0:674813bd5ec9 | 643 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 644 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 645 | errchk( M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 646 | |
| giovannivisentini | 0:674813bd5ec9 | 647 | status = M24SR_IsCorrectCRC16Residue (pBuffer,NbByteToRead+ M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 648 | /* retrieve the data without SW1 & SW2 as provided as return value of the function */ |
| giovannivisentini | 0:674813bd5ec9 | 649 | memcpy(pBufferRead ,&pBuffer[1],NbByteToRead); |
| giovannivisentini | 0:674813bd5ec9 | 650 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 651 | |
| giovannivisentini | 0:674813bd5ec9 | 652 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 653 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 654 | |
| giovannivisentini | 0:674813bd5ec9 | 655 | } |
| giovannivisentini | 0:674813bd5ec9 | 656 | |
| giovannivisentini | 0:674813bd5ec9 | 657 | |
| giovannivisentini | 0:674813bd5ec9 | 658 | |
| giovannivisentini | 0:674813bd5ec9 | 659 | /** |
| giovannivisentini | 0:674813bd5ec9 | 660 | * @brief This function sends a ST read binary command (no error if access is not inside NDEF file) |
| giovannivisentini | 0:674813bd5ec9 | 661 | * @param Offset : first byte to read |
| giovannivisentini | 0:674813bd5ec9 | 662 | * @param NbByteToRead : number of byte to read |
| giovannivisentini | 0:674813bd5ec9 | 663 | * @param pBufferRead : pointer of the buffer read from the M24SR device |
| giovannivisentini | 0:674813bd5ec9 | 664 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 665 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 666 | */ |
| giovannivisentini | 0:674813bd5ec9 | 667 | NFC_StatusTypeDef M24SR::M24SR_STReadBinary (uint16_t Offset, uint8_t NbByteToRead, uint8_t *pBufferRead ) |
| giovannivisentini | 0:674813bd5ec9 | 668 | { |
| giovannivisentini | 0:674813bd5ec9 | 669 | uint8_t *pBuffer = uM24SRbuffer ; |
| giovannivisentini | 0:674813bd5ec9 | 670 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 671 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 672 | |
| giovannivisentini | 0:674813bd5ec9 | 673 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 674 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 0:674813bd5ec9 | 675 | command.Header.INS = C_APDU_READ_BINARY; |
| giovannivisentini | 0:674813bd5ec9 | 676 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 677 | command.Header.P1 = GETMSB (Offset ) ; |
| giovannivisentini | 0:674813bd5ec9 | 678 | command.Header.P2 = GETLSB (Offset ) ; |
| giovannivisentini | 0:674813bd5ec9 | 679 | /* copy the number of byte to read */ |
| giovannivisentini | 0:674813bd5ec9 | 680 | command.Body.LE = NbByteToRead ; |
| giovannivisentini | 0:674813bd5ec9 | 681 | |
| giovannivisentini | 0:674813bd5ec9 | 682 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_READBINARY, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 683 | |
| giovannivisentini | 0:674813bd5ec9 | 684 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 685 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 686 | errchk( M24SR_IO_ReceiveI2Cresponse (NbByteToRead + M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 687 | |
| giovannivisentini | 0:674813bd5ec9 | 688 | status = M24SR_IsCorrectCRC16Residue (pBuffer,NbByteToRead+ M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 689 | /* retrieve the data without SW1 & SW2 as provided as return value of the function */ |
| giovannivisentini | 0:674813bd5ec9 | 690 | memcpy(pBufferRead ,&pBuffer[1],NbByteToRead); |
| giovannivisentini | 0:674813bd5ec9 | 691 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 692 | |
| giovannivisentini | 0:674813bd5ec9 | 693 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 694 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 695 | |
| giovannivisentini | 0:674813bd5ec9 | 696 | } |
| giovannivisentini | 0:674813bd5ec9 | 697 | |
| giovannivisentini | 0:674813bd5ec9 | 698 | /** |
| giovannivisentini | 0:674813bd5ec9 | 699 | * @brief This function sends a Update binary command |
| giovannivisentini | 0:674813bd5ec9 | 700 | * @param Offset : first byte to read |
| giovannivisentini | 0:674813bd5ec9 | 701 | * @param NbByteToWrite : number of byte to write |
| giovannivisentini | 0:674813bd5ec9 | 702 | * @param pBufferRead : pointer of the buffer read from the M24SR device |
| giovannivisentini | 0:674813bd5ec9 | 703 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 704 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 705 | */ |
| giovannivisentini | 0:674813bd5ec9 | 706 | NFC_StatusTypeDef M24SR::M24SR_UpdateBinary (uint16_t Offset ,uint8_t NbByteToWrite,uint8_t *pDataToWrite ) |
| giovannivisentini | 0:674813bd5ec9 | 707 | { |
| giovannivisentini | 0:674813bd5ec9 | 708 | //TODO check the length of the data to write |
| giovannivisentini | 0:674813bd5ec9 | 709 | uint8_t *pBuffer = uM24SRbuffer ; |
| giovannivisentini | 0:674813bd5ec9 | 710 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 711 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 712 | |
| giovannivisentini | 0:674813bd5ec9 | 713 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 714 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 715 | command.Header.INS = C_APDU_UPDATE_BINARY; |
| giovannivisentini | 0:674813bd5ec9 | 716 | /* copy the offset */ |
| giovannivisentini | 0:674813bd5ec9 | 717 | command.Header.P1 = GETMSB (Offset ) ; |
| giovannivisentini | 0:674813bd5ec9 | 718 | command.Header.P2 = GETLSB (Offset ) ; |
| giovannivisentini | 0:674813bd5ec9 | 719 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 720 | command.Body.LC = NbByteToWrite ; |
| giovannivisentini | 0:674813bd5ec9 | 721 | /* copy the File Id */ |
| giovannivisentini | 0:674813bd5ec9 | 722 | memcpy(command.Body.pData ,pDataToWrite, NbByteToWrite ); |
| giovannivisentini | 0:674813bd5ec9 | 723 | |
| giovannivisentini | 0:674813bd5ec9 | 724 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_UPDATEBINARY, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 725 | |
| giovannivisentini | 0:674813bd5ec9 | 726 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 727 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 728 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 729 | /* if the response is a Watiting frame extenstion request */ |
| giovannivisentini | 0:674813bd5ec9 | 730 | if (IsSBlock (pBuffer) == NFC_IO_SUCCESS) |
| giovannivisentini | 0:674813bd5ec9 | 731 | { |
| giovannivisentini | 0:674813bd5ec9 | 732 | /*check the CRC */ |
| giovannivisentini | 0:674813bd5ec9 | 733 | if (M24SR_IsCorrectCRC16Residue (pBuffer , M24SR_WATINGTIMEEXTRESPONSE_NBBYTE) != NFC_IO_ERROR_CRC) |
| giovannivisentini | 0:674813bd5ec9 | 734 | { |
| giovannivisentini | 0:674813bd5ec9 | 735 | /* send the FrameExension response*/ |
| giovannivisentini | 0:674813bd5ec9 | 736 | status = M24SR_FWTExtension (pBuffer [M24SR_OFFSET_PCB+1] ); |
| giovannivisentini | 0:674813bd5ec9 | 737 | } |
| giovannivisentini | 0:674813bd5ec9 | 738 | } |
| giovannivisentini | 0:674813bd5ec9 | 739 | else |
| giovannivisentini | 0:674813bd5ec9 | 740 | { |
| giovannivisentini | 0:674813bd5ec9 | 741 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 742 | } |
| giovannivisentini | 0:674813bd5ec9 | 743 | |
| giovannivisentini | 0:674813bd5ec9 | 744 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 745 | |
| giovannivisentini | 0:674813bd5ec9 | 746 | |
| giovannivisentini | 0:674813bd5ec9 | 747 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 748 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 749 | } |
| giovannivisentini | 0:674813bd5ec9 | 750 | |
| giovannivisentini | 0:674813bd5ec9 | 751 | |
| giovannivisentini | 0:674813bd5ec9 | 752 | /** |
| giovannivisentini | 0:674813bd5ec9 | 753 | * @brief This function sends the Verify command |
| giovannivisentini | 0:674813bd5ec9 | 754 | * @param uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd) |
| giovannivisentini | 0:674813bd5ec9 | 755 | * @param NbPwdByte : Number of byte ( 0x00 or 0x10) |
| giovannivisentini | 0:674813bd5ec9 | 756 | * @param pPwd : pointer on the passwaord |
| giovannivisentini | 0:674813bd5ec9 | 757 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 758 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 759 | */ |
| giovannivisentini | 0:674813bd5ec9 | 760 | NFC_StatusTypeDef M24SR::M24SR_Verify (uint16_t uPwdId,uint8_t NbPwdByte ,uint8_t *pPwd ) |
| giovannivisentini | 0:674813bd5ec9 | 761 | { |
| giovannivisentini | 0:674813bd5ec9 | 762 | uint8_t *pBuffer = uM24SRbuffer ; |
| giovannivisentini | 0:674813bd5ec9 | 763 | NFC_StatusTypeDef status = NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 764 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 765 | |
| giovannivisentini | 0:674813bd5ec9 | 766 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 767 | if (uPwdId > 0x0003) |
| giovannivisentini | 0:674813bd5ec9 | 768 | { |
| giovannivisentini | 0:674813bd5ec9 | 769 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 770 | } |
| giovannivisentini | 0:674813bd5ec9 | 771 | if ( (NbPwdByte != 0x00) && (NbPwdByte != 0x10)) |
| giovannivisentini | 0:674813bd5ec9 | 772 | { |
| giovannivisentini | 0:674813bd5ec9 | 773 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 774 | } |
| giovannivisentini | 0:674813bd5ec9 | 775 | |
| giovannivisentini | 0:674813bd5ec9 | 776 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 777 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 778 | command.Header.INS = C_APDU_VERIFY; |
| giovannivisentini | 0:674813bd5ec9 | 779 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 780 | command.Header.P1 = GETMSB (uPwdId ) ; |
| giovannivisentini | 0:674813bd5ec9 | 781 | command.Header.P2 = GETLSB (uPwdId ) ; |
| giovannivisentini | 0:674813bd5ec9 | 782 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 783 | command.Body.LC = NbPwdByte ; |
| giovannivisentini | 0:674813bd5ec9 | 784 | |
| giovannivisentini | 0:674813bd5ec9 | 785 | if (NbPwdByte == 0x10) |
| giovannivisentini | 0:674813bd5ec9 | 786 | { |
| giovannivisentini | 0:674813bd5ec9 | 787 | /* copy the password */ |
| giovannivisentini | 0:674813bd5ec9 | 788 | memcpy(command.Body.pData, pPwd, NbPwdByte); |
| giovannivisentini | 0:674813bd5ec9 | 789 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 790 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_VERIFYBINARYWITHPWD, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 791 | } |
| giovannivisentini | 0:674813bd5ec9 | 792 | else |
| giovannivisentini | 0:674813bd5ec9 | 793 | { |
| giovannivisentini | 0:674813bd5ec9 | 794 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 795 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_VERIFYBINARYWOPWD, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 796 | } |
| giovannivisentini | 0:674813bd5ec9 | 797 | |
| giovannivisentini | 0:674813bd5ec9 | 798 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 799 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 800 | /* wait for answer ready */ |
| giovannivisentini | 0:674813bd5ec9 | 801 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 802 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 803 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 804 | |
| giovannivisentini | 0:674813bd5ec9 | 805 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 806 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 807 | |
| giovannivisentini | 0:674813bd5ec9 | 808 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 809 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 810 | } |
| giovannivisentini | 0:674813bd5ec9 | 811 | |
| giovannivisentini | 0:674813bd5ec9 | 812 | |
| giovannivisentini | 0:674813bd5ec9 | 813 | /** |
| giovannivisentini | 0:674813bd5ec9 | 814 | * @brief This function sends the ChangeReferenceData command |
| giovannivisentini | 0:674813bd5ec9 | 815 | * @param uPwdId : PasswordId ( 0x0001 : Read NDEF pwd or 0x0002 : Write NDEF pwd or 0x0003 : I2C pwd) |
| giovannivisentini | 0:674813bd5ec9 | 816 | * @param pPwd : pointer on the passwaord |
| giovannivisentini | 0:674813bd5ec9 | 817 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 818 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 819 | */ |
| giovannivisentini | 0:674813bd5ec9 | 820 | NFC_StatusTypeDef M24SR::M24SR_ChangeReferenceData (uint16_t uPwdId,uint8_t *pPwd ) |
| giovannivisentini | 0:674813bd5ec9 | 821 | { |
| giovannivisentini | 0:674813bd5ec9 | 822 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 823 | NFC_StatusTypeDef status ; |
| giovannivisentini | 0:674813bd5ec9 | 824 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 825 | |
| giovannivisentini | 0:674813bd5ec9 | 826 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 827 | if (uPwdId > 0x0003) |
| giovannivisentini | 0:674813bd5ec9 | 828 | { |
| giovannivisentini | 0:674813bd5ec9 | 829 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 830 | } |
| giovannivisentini | 0:674813bd5ec9 | 831 | |
| giovannivisentini | 0:674813bd5ec9 | 832 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 833 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 834 | command.Header.INS = C_APDU_CHANGE; |
| giovannivisentini | 0:674813bd5ec9 | 835 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 836 | command.Header.P1 = GETMSB (uPwdId ) ; |
| giovannivisentini | 0:674813bd5ec9 | 837 | command.Header.P2 = GETLSB (uPwdId ) ; |
| giovannivisentini | 0:674813bd5ec9 | 838 | /* copy the number of byte of the data field */ |
| giovannivisentini | 0:674813bd5ec9 | 839 | command.Body.LC = M24SR_PASSWORD_NBBYTE ; |
| giovannivisentini | 0:674813bd5ec9 | 840 | /* copy the password */ |
| giovannivisentini | 0:674813bd5ec9 | 841 | memcpy(command.Body.pData, pPwd, M24SR_PASSWORD_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 842 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 843 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_CHANGEREFDATA, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 844 | |
| giovannivisentini | 0:674813bd5ec9 | 845 | |
| giovannivisentini | 0:674813bd5ec9 | 846 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 847 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 848 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 849 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 850 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 851 | |
| giovannivisentini | 0:674813bd5ec9 | 852 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 853 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 854 | |
| giovannivisentini | 0:674813bd5ec9 | 855 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 856 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 857 | } |
| giovannivisentini | 0:674813bd5ec9 | 858 | |
| giovannivisentini | 0:674813bd5ec9 | 859 | |
| giovannivisentini | 0:674813bd5ec9 | 860 | /** |
| giovannivisentini | 0:674813bd5ec9 | 861 | * @brief This function sends the EnableVerificationRequirement command |
| giovannivisentini | 0:674813bd5ec9 | 862 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 0:674813bd5ec9 | 863 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 864 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 865 | */ |
| giovannivisentini | 0:674813bd5ec9 | 866 | NFC_StatusTypeDef M24SR::M24SR_EnableVerificationRequirement (uint16_t uReadOrWrite ) |
| giovannivisentini | 0:674813bd5ec9 | 867 | { |
| giovannivisentini | 0:674813bd5ec9 | 868 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 869 | NFC_StatusTypeDef status= NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 870 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 871 | |
| giovannivisentini | 0:674813bd5ec9 | 872 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 873 | if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) |
| giovannivisentini | 0:674813bd5ec9 | 874 | { |
| giovannivisentini | 0:674813bd5ec9 | 875 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 876 | } |
| giovannivisentini | 0:674813bd5ec9 | 877 | |
| giovannivisentini | 0:674813bd5ec9 | 878 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 879 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 880 | command.Header.INS = C_APDU_ENABLE; |
| giovannivisentini | 0:674813bd5ec9 | 881 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 882 | command.Header.P1 = GETMSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 883 | command.Header.P2 = GETLSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 884 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 885 | M24SR_BuildIBlockCommand ( M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 886 | |
| giovannivisentini | 0:674813bd5ec9 | 887 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 888 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 889 | /* The right access to be updated in EEPROM need at least 6ms */ |
| giovannivisentini | 0:674813bd5ec9 | 890 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 891 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 892 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 893 | |
| giovannivisentini | 0:674813bd5ec9 | 894 | status = M24SR_IsCorrectCRC16Residue ( pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 895 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 896 | |
| giovannivisentini | 0:674813bd5ec9 | 897 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 898 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 899 | } |
| giovannivisentini | 0:674813bd5ec9 | 900 | |
| giovannivisentini | 0:674813bd5ec9 | 901 | /** |
| giovannivisentini | 0:674813bd5ec9 | 902 | * @brief This function sends the DisableVerificationRequirement command |
| giovannivisentini | 0:674813bd5ec9 | 903 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 0:674813bd5ec9 | 904 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 905 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 906 | */ |
| giovannivisentini | 0:674813bd5ec9 | 907 | NFC_StatusTypeDef M24SR::M24SR_DisableVerificationRequirement (uint16_t uReadOrWrite ) |
| giovannivisentini | 0:674813bd5ec9 | 908 | { |
| giovannivisentini | 0:674813bd5ec9 | 909 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 910 | NFC_StatusTypeDef status= NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 911 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 912 | |
| giovannivisentini | 0:674813bd5ec9 | 913 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 914 | if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) |
| giovannivisentini | 0:674813bd5ec9 | 915 | { |
| giovannivisentini | 0:674813bd5ec9 | 916 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 917 | } |
| giovannivisentini | 0:674813bd5ec9 | 918 | |
| giovannivisentini | 0:674813bd5ec9 | 919 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 920 | command.Header.CLA = C_APDU_CLA_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 921 | command.Header.INS = C_APDU_DISABLE; |
| giovannivisentini | 0:674813bd5ec9 | 922 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 923 | command.Header.P1 = GETMSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 924 | command.Header.P2 = GETLSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 925 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 926 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 927 | |
| giovannivisentini | 0:674813bd5ec9 | 928 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 929 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 930 | /* The right access to be updated in EEPROM need at least 6ms */ |
| giovannivisentini | 0:674813bd5ec9 | 931 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 932 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 933 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 934 | |
| giovannivisentini | 0:674813bd5ec9 | 935 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 936 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 937 | |
| giovannivisentini | 0:674813bd5ec9 | 938 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 939 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 940 | } |
| giovannivisentini | 0:674813bd5ec9 | 941 | |
| giovannivisentini | 0:674813bd5ec9 | 942 | /** |
| giovannivisentini | 0:674813bd5ec9 | 943 | * @brief This function sends the EnablePermananentState command |
| giovannivisentini | 0:674813bd5ec9 | 944 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 0:674813bd5ec9 | 945 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 946 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 947 | */ |
| giovannivisentini | 0:674813bd5ec9 | 948 | NFC_StatusTypeDef M24SR::M24SR_EnablePermanentState (uint16_t uReadOrWrite ) |
| giovannivisentini | 0:674813bd5ec9 | 949 | { |
| giovannivisentini | 0:674813bd5ec9 | 950 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 951 | NFC_StatusTypeDef status= NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 952 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 953 | |
| giovannivisentini | 0:674813bd5ec9 | 954 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 955 | if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) |
| giovannivisentini | 0:674813bd5ec9 | 956 | { |
| giovannivisentini | 0:674813bd5ec9 | 957 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 958 | } |
| giovannivisentini | 0:674813bd5ec9 | 959 | |
| giovannivisentini | 0:674813bd5ec9 | 960 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 961 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 0:674813bd5ec9 | 962 | command.Header.INS = C_APDU_ENABLE; |
| giovannivisentini | 0:674813bd5ec9 | 963 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 964 | command.Header.P1 = GETMSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 965 | command.Header.P2 = GETLSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 966 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 967 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_ENABLEVERIFREQ, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 968 | |
| giovannivisentini | 0:674813bd5ec9 | 969 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 970 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 971 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 972 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 973 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 974 | |
| giovannivisentini | 0:674813bd5ec9 | 975 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 976 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 977 | |
| giovannivisentini | 0:674813bd5ec9 | 978 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 979 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 980 | } |
| giovannivisentini | 0:674813bd5ec9 | 981 | |
| giovannivisentini | 0:674813bd5ec9 | 982 | /** |
| giovannivisentini | 0:674813bd5ec9 | 983 | * @brief This function sends the DisablePermanentState command |
| giovannivisentini | 0:674813bd5ec9 | 984 | * @param uReadOrWrite : enable the read or write protection ( 0x0001 : Read or 0x0002 : Write ) |
| giovannivisentini | 0:674813bd5ec9 | 985 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 986 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 987 | */ |
| giovannivisentini | 0:674813bd5ec9 | 988 | NFC_StatusTypeDef M24SR::M24SR_DisablePermanentState (uint16_t uReadOrWrite ) |
| giovannivisentini | 0:674813bd5ec9 | 989 | { |
| giovannivisentini | 0:674813bd5ec9 | 990 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 991 | NFC_StatusTypeDef status= NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 992 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 993 | |
| giovannivisentini | 0:674813bd5ec9 | 994 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 995 | if ( (uReadOrWrite != 0x0001) && (uReadOrWrite != 0x0002)) |
| giovannivisentini | 0:674813bd5ec9 | 996 | { |
| giovannivisentini | 0:674813bd5ec9 | 997 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 998 | } |
| giovannivisentini | 0:674813bd5ec9 | 999 | |
| giovannivisentini | 0:674813bd5ec9 | 1000 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 1001 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 0:674813bd5ec9 | 1002 | command.Header.INS = C_APDU_DISABLE; |
| giovannivisentini | 0:674813bd5ec9 | 1003 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 1004 | command.Header.P1 = GETMSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 1005 | command.Header.P2 = GETLSB (uReadOrWrite ) ; |
| giovannivisentini | 0:674813bd5ec9 | 1006 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 1007 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_DISABLEVERIFREQ, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 1008 | |
| giovannivisentini | 0:674813bd5ec9 | 1009 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 1010 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 1011 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 1012 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 1013 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 1014 | |
| giovannivisentini | 0:674813bd5ec9 | 1015 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 1016 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 1017 | |
| giovannivisentini | 0:674813bd5ec9 | 1018 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 1019 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 1020 | } |
| giovannivisentini | 0:674813bd5ec9 | 1021 | |
| giovannivisentini | 0:674813bd5ec9 | 1022 | /** |
| giovannivisentini | 0:674813bd5ec9 | 1023 | * @brief This function generates a interrupt on GPO pin |
| giovannivisentini | 0:674813bd5ec9 | 1024 | * @param None |
| giovannivisentini | 0:674813bd5ec9 | 1025 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 1026 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 1027 | */ |
| giovannivisentini | 0:674813bd5ec9 | 1028 | NFC_StatusTypeDef M24SR::M24SR_SendInterrupt ( void ) |
| giovannivisentini | 0:674813bd5ec9 | 1029 | { |
| giovannivisentini | 0:674813bd5ec9 | 1030 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 1031 | uint16_t uP1P2 =0x001E; |
| giovannivisentini | 0:674813bd5ec9 | 1032 | NFC_StatusTypeDef status= NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 1033 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 1034 | |
| giovannivisentini | 0:674813bd5ec9 | 1035 | status = M24SR_ManageI2CGPO(INTERRUPT); |
| giovannivisentini | 0:674813bd5ec9 | 1036 | |
| giovannivisentini | 0:674813bd5ec9 | 1037 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 1038 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 0:674813bd5ec9 | 1039 | command.Header.INS = C_APDU_INTERRUPT; |
| giovannivisentini | 0:674813bd5ec9 | 1040 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 1041 | command.Header.P1 = GETMSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 1042 | command.Header.P2 = GETLSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 1043 | command.Body.LC = 0x00 ; |
| giovannivisentini | 0:674813bd5ec9 | 1044 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 1045 | M24SR_BuildIBlockCommand (M24SR_CMDSTRUCT_SENDINTERRUPT, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 1046 | |
| giovannivisentini | 0:674813bd5ec9 | 1047 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 1048 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 1049 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 1050 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 1051 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 1052 | |
| giovannivisentini | 0:674813bd5ec9 | 1053 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 1054 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 1055 | |
| giovannivisentini | 0:674813bd5ec9 | 1056 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 1057 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 1058 | } |
| giovannivisentini | 0:674813bd5ec9 | 1059 | |
| giovannivisentini | 0:674813bd5ec9 | 1060 | /** |
| giovannivisentini | 0:674813bd5ec9 | 1061 | * @brief This function force GPO pin to low state or high Z |
| giovannivisentini | 0:674813bd5ec9 | 1062 | * @param uSetOrReset : select if GPO must be low (reset) or HiZ |
| giovannivisentini | 0:674813bd5ec9 | 1063 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 1064 | * @retval M24SR_ERROR_I2CTIMEOUT : The I2C timeout occured. |
| giovannivisentini | 0:674813bd5ec9 | 1065 | */ |
| giovannivisentini | 0:674813bd5ec9 | 1066 | NFC_StatusTypeDef M24SR::M24SR_StateControl (uint8_t uSetOrReset ) |
| giovannivisentini | 0:674813bd5ec9 | 1067 | { |
| giovannivisentini | 0:674813bd5ec9 | 1068 | uint8_t *pBuffer = uM24SRbuffer; |
| giovannivisentini | 0:674813bd5ec9 | 1069 | uint16_t uP1P2 =0x001F; |
| giovannivisentini | 0:674813bd5ec9 | 1070 | NFC_StatusTypeDef status= NFC_IO_SUCCESS ; |
| giovannivisentini | 0:674813bd5ec9 | 1071 | uint16_t NbByte; |
| giovannivisentini | 0:674813bd5ec9 | 1072 | |
| giovannivisentini | 0:674813bd5ec9 | 1073 | /*check the parameters */ |
| giovannivisentini | 0:674813bd5ec9 | 1074 | if ( (uSetOrReset != 0x01) && (uSetOrReset != 0x00)) |
| giovannivisentini | 0:674813bd5ec9 | 1075 | { |
| giovannivisentini | 0:674813bd5ec9 | 1076 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 1077 | } |
| giovannivisentini | 0:674813bd5ec9 | 1078 | |
| giovannivisentini | 0:674813bd5ec9 | 1079 | status = M24SR_ManageI2CGPO(STATE_CONTROL); |
| giovannivisentini | 0:674813bd5ec9 | 1080 | |
| giovannivisentini | 0:674813bd5ec9 | 1081 | /* build the command */ |
| giovannivisentini | 0:674813bd5ec9 | 1082 | command.Header.CLA = C_APDU_CLA_ST; |
| giovannivisentini | 0:674813bd5ec9 | 1083 | command.Header.INS = C_APDU_INTERRUPT; |
| giovannivisentini | 0:674813bd5ec9 | 1084 | /* copy the Password Id */ |
| giovannivisentini | 0:674813bd5ec9 | 1085 | command.Header.P1 = GETMSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 1086 | command.Header.P2 = GETLSB (uP1P2 ) ; |
| giovannivisentini | 0:674813bd5ec9 | 1087 | command.Body.LC = 0x01 ; |
| giovannivisentini | 0:674813bd5ec9 | 1088 | /* copy the data */ |
| giovannivisentini | 0:674813bd5ec9 | 1089 | memcpy(command.Body.pData , &uSetOrReset, 0x01 ); |
| giovannivisentini | 0:674813bd5ec9 | 1090 | //command.Body.LE = 0x00 ; |
| giovannivisentini | 0:674813bd5ec9 | 1091 | /* build the I²C command */ |
| giovannivisentini | 0:674813bd5ec9 | 1092 | M24SR_BuildIBlockCommand ( M24SR_CMDSTRUCT_GPOSTATE, &command,uDIDbyte, &NbByte , pBuffer); |
| giovannivisentini | 0:674813bd5ec9 | 1093 | |
| giovannivisentini | 0:674813bd5ec9 | 1094 | /* send the request */ |
| giovannivisentini | 0:674813bd5ec9 | 1095 | errchk( M24SR_IO_SendI2Ccommand (NbByte , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 1096 | errchk( M24SR_IO_IsAnswerReady ()); |
| giovannivisentini | 0:674813bd5ec9 | 1097 | /* read the response */ |
| giovannivisentini | 0:674813bd5ec9 | 1098 | errchk( M24SR_IO_ReceiveI2Cresponse (M24SR_STATUSRESPONSE_NBBYTE , pBuffer )); |
| giovannivisentini | 0:674813bd5ec9 | 1099 | |
| giovannivisentini | 0:674813bd5ec9 | 1100 | status = M24SR_IsCorrectCRC16Residue (pBuffer, M24SR_STATUSRESPONSE_NBBYTE); |
| giovannivisentini | 0:674813bd5ec9 | 1101 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 1102 | |
| giovannivisentini | 0:674813bd5ec9 | 1103 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 1104 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 1105 | } |
| giovannivisentini | 0:674813bd5ec9 | 1106 | |
| giovannivisentini | 0:674813bd5ec9 | 1107 | |
| giovannivisentini | 0:674813bd5ec9 | 1108 | |
| giovannivisentini | 0:674813bd5ec9 | 1109 | /** |
| giovannivisentini | 0:674813bd5ec9 | 1110 | * @brief This function configure GPO purpose for I2C session |
| giovannivisentini | 0:674813bd5ec9 | 1111 | * @param GPO_I2Cconfig: GPO configuration to set |
| giovannivisentini | 0:674813bd5ec9 | 1112 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 1113 | */ |
| giovannivisentini | 0:674813bd5ec9 | 1114 | NFC_StatusTypeDef M24SR::M24SR_ManageI2CGPO( uint8_t GPO_I2Cconfig) |
| giovannivisentini | 0:674813bd5ec9 | 1115 | { |
| giovannivisentini | 0:674813bd5ec9 | 1116 | NFC_StatusTypeDef status; |
| giovannivisentini | 0:674813bd5ec9 | 1117 | uint8_t GPO_config; |
| giovannivisentini | 0:674813bd5ec9 | 1118 | uint8_t DefaultPassword[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| giovannivisentini | 0:674813bd5ec9 | 1119 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
| giovannivisentini | 0:674813bd5ec9 | 1120 | |
| giovannivisentini | 0:674813bd5ec9 | 1121 | if( GPO_I2Cconfig > STATE_CONTROL) |
| giovannivisentini | 0:674813bd5ec9 | 1122 | { |
| giovannivisentini | 0:674813bd5ec9 | 1123 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 1124 | } |
| giovannivisentini | 0:674813bd5ec9 | 1125 | |
| giovannivisentini | 0:674813bd5ec9 | 1126 | /* we must not be in interrupt mode for I2C synchro as we will change GPO purpose */ |
| giovannivisentini | 0:674813bd5ec9 | 1127 | M24SR_IO_SetI2CSynchroMode(M24SR_WAITINGTIME_POLLING); |
| giovannivisentini | 0:674813bd5ec9 | 1128 | |
| giovannivisentini | 0:674813bd5ec9 | 1129 | M24SR_SelectApplication(); |
| giovannivisentini | 0:674813bd5ec9 | 1130 | M24SR_SelectSystemfile(); |
| giovannivisentini | 0:674813bd5ec9 | 1131 | M24SR_ReadBinary (0x0004 , 0x01 , &GPO_config ); |
| giovannivisentini | 0:674813bd5ec9 | 1132 | |
| giovannivisentini | 0:674813bd5ec9 | 1133 | /* Update only GPO purpose for I2C */ |
| giovannivisentini | 0:674813bd5ec9 | 1134 | GPO_config = (GPO_config & 0xF0) | GPO_I2Cconfig; |
| giovannivisentini | 0:674813bd5ec9 | 1135 | M24SR_SelectSystemfile(); |
| giovannivisentini | 0:674813bd5ec9 | 1136 | M24SR_Verify(I2C_PWD ,0x10 ,DefaultPassword ); |
| giovannivisentini | 0:674813bd5ec9 | 1137 | status = M24SR_UpdateBinary (0x0004 ,0x01, &(GPO_config) ); |
| giovannivisentini | 0:674813bd5ec9 | 1138 | |
| giovannivisentini | 0:674813bd5ec9 | 1139 | M24SR_Deselect(); |
| giovannivisentini | 0:674813bd5ec9 | 1140 | |
| giovannivisentini | 0:674813bd5ec9 | 1141 | /* if we have set interrupt mode for I2C synchro we can enable interrupt mode */ |
| giovannivisentini | 0:674813bd5ec9 | 1142 | if ( GPO_I2Cconfig == I2C_ANSWER_READY && status == NFC_OK) |
| giovannivisentini | 0:674813bd5ec9 | 1143 | M24SR_IO_SetI2CSynchroMode(M24SR_INTERRUPT_GPO); |
| giovannivisentini | 0:674813bd5ec9 | 1144 | |
| giovannivisentini | 0:674813bd5ec9 | 1145 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 1146 | } |
| giovannivisentini | 0:674813bd5ec9 | 1147 | |
| giovannivisentini | 0:674813bd5ec9 | 1148 | /** |
| giovannivisentini | 0:674813bd5ec9 | 1149 | * @brief This function configure GPO purpose for RF session |
| giovannivisentini | 0:674813bd5ec9 | 1150 | * @param GPO_RFconfig: GPO configuration to set |
| giovannivisentini | 0:674813bd5ec9 | 1151 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 1152 | */ |
| giovannivisentini | 0:674813bd5ec9 | 1153 | NFC_StatusTypeDef M24SR::M24SR_ManageRFGPO(uint8_t GPO_RFconfig) |
| giovannivisentini | 0:674813bd5ec9 | 1154 | { |
| giovannivisentini | 0:674813bd5ec9 | 1155 | NFC_StatusTypeDef status; |
| giovannivisentini | 0:674813bd5ec9 | 1156 | uint8_t GPO_config; |
| giovannivisentini | 0:674813bd5ec9 | 1157 | uint8_t DefaultPassword[16]={0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
| giovannivisentini | 0:674813bd5ec9 | 1158 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
| giovannivisentini | 0:674813bd5ec9 | 1159 | |
| giovannivisentini | 0:674813bd5ec9 | 1160 | if( GPO_RFconfig > STATE_CONTROL) |
| giovannivisentini | 0:674813bd5ec9 | 1161 | { |
| giovannivisentini | 0:674813bd5ec9 | 1162 | return NFC_IO_ERROR_PARAMETER; |
| giovannivisentini | 0:674813bd5ec9 | 1163 | } |
| giovannivisentini | 0:674813bd5ec9 | 1164 | |
| giovannivisentini | 0:674813bd5ec9 | 1165 | M24SR_SelectApplication(); |
| giovannivisentini | 0:674813bd5ec9 | 1166 | M24SR_SelectSystemfile(); |
| giovannivisentini | 0:674813bd5ec9 | 1167 | M24SR_ReadBinary (0x0004 , 0x01 , &GPO_config ); |
| giovannivisentini | 0:674813bd5ec9 | 1168 | |
| giovannivisentini | 0:674813bd5ec9 | 1169 | /* Update only GPO purpose for I2C */ |
| giovannivisentini | 0:674813bd5ec9 | 1170 | GPO_config = (GPO_config & 0x0F) | (GPO_RFconfig<<4); |
| giovannivisentini | 0:674813bd5ec9 | 1171 | M24SR_SelectSystemfile(); |
| giovannivisentini | 0:674813bd5ec9 | 1172 | M24SR_Verify(I2C_PWD ,0x10 ,DefaultPassword ); |
| giovannivisentini | 0:674813bd5ec9 | 1173 | status = M24SR_UpdateBinary (0x0004 ,0x01, &(GPO_config) ); |
| giovannivisentini | 0:674813bd5ec9 | 1174 | |
| giovannivisentini | 0:674813bd5ec9 | 1175 | return status; |
| giovannivisentini | 0:674813bd5ec9 | 1176 | } |
| giovannivisentini | 0:674813bd5ec9 | 1177 | |
| giovannivisentini | 0:674813bd5ec9 | 1178 | |
| giovannivisentini | 0:674813bd5ec9 | 1179 | /** |
| giovannivisentini | 0:674813bd5ec9 | 1180 | * @brief This function enable or disable RF communication |
| giovannivisentini | 0:674813bd5ec9 | 1181 | * @param OnOffChoice: GPO configuration to set |
| giovannivisentini | 0:674813bd5ec9 | 1182 | * @retval Status (SW1&SW2) : Status of the operation to complete. |
| giovannivisentini | 0:674813bd5ec9 | 1183 | */ |
| giovannivisentini | 0:674813bd5ec9 | 1184 | NFC_StatusTypeDef M24SR::M24SR_RFConfig(uint8_t OnOffChoice) |
| giovannivisentini | 0:674813bd5ec9 | 1185 | { |
| giovannivisentini | 0:674813bd5ec9 | 1186 | /* Disable RF */ |
| giovannivisentini | 0:674813bd5ec9 | 1187 | if ( OnOffChoice != 0 ) |
| giovannivisentini | 0:674813bd5ec9 | 1188 | { |
| giovannivisentini | 0:674813bd5ec9 | 1189 | M24SR_IO_RFDIS_WritePin(GPIO_PIN_RESET); |
| giovannivisentini | 0:674813bd5ec9 | 1190 | } |
| giovannivisentini | 0:674813bd5ec9 | 1191 | else |
| giovannivisentini | 0:674813bd5ec9 | 1192 | { |
| giovannivisentini | 0:674813bd5ec9 | 1193 | M24SR_IO_RFDIS_WritePin(GPIO_PIN_SET); |
| giovannivisentini | 0:674813bd5ec9 | 1194 | } |
| giovannivisentini | 0:674813bd5ec9 | 1195 | return NFC_OK; |
| giovannivisentini | 0:674813bd5ec9 | 1196 | } |
| giovannivisentini | 0:674813bd5ec9 | 1197 | |
| giovannivisentini | 0:674813bd5ec9 | 1198 | |
| giovannivisentini | 0:674813bd5ec9 | 1199 | |
| giovannivisentini | 0:674813bd5ec9 | 1200 | NFC_StatusTypeDef M24SR::M24SR_IO_SendI2Ccommand(uint8_t NbByte , uint8_t *pBuffer){ |
| giovannivisentini | 0:674813bd5ec9 | 1201 | int ret = dev_i2c.write(address,(char*)pBuffer,NbByte); |
| giovannivisentini | 0:674813bd5ec9 | 1202 | if(ret==0) |
| giovannivisentini | 0:674813bd5ec9 | 1203 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 1204 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 1205 | } |
| giovannivisentini | 0:674813bd5ec9 | 1206 | |
| giovannivisentini | 0:674813bd5ec9 | 1207 | NFC_StatusTypeDef M24SR::M24SR_IO_ReceiveI2Cresponse(uint8_t NbByte , uint8_t *pBuffer){ |
| giovannivisentini | 0:674813bd5ec9 | 1208 | int ret = dev_i2c.read(address,(char*)pBuffer,NbByte); |
| giovannivisentini | 0:674813bd5ec9 | 1209 | if(ret==0) |
| giovannivisentini | 0:674813bd5ec9 | 1210 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 1211 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 1212 | } |
| giovannivisentini | 0:674813bd5ec9 | 1213 | |
| giovannivisentini | 0:674813bd5ec9 | 1214 | |
| giovannivisentini | 0:674813bd5ec9 | 1215 | #define M24SR_POLL_DELAY 10 |
| giovannivisentini | 0:674813bd5ec9 | 1216 | #define M24SR_I2C_POLLING 1 /* In case M24SR will reply ACK failed allow to perform retry before returning error (HAL option not used) */ |
| giovannivisentini | 0:674813bd5ec9 | 1217 | |
| giovannivisentini | 0:674813bd5ec9 | 1218 | |
| giovannivisentini | 0:674813bd5ec9 | 1219 | NFC_StatusTypeDef M24SR::M24SR_IO_PollI2C(void) |
| giovannivisentini | 0:674813bd5ec9 | 1220 | { |
| giovannivisentini | 0:674813bd5ec9 | 1221 | int status = 1; |
| giovannivisentini | 0:674813bd5ec9 | 1222 | uint32_t nbTry = 0; |
| giovannivisentini | 0:674813bd5ec9 | 1223 | char buffer; |
| giovannivisentini | 0:674813bd5ec9 | 1224 | // |
| giovannivisentini | 0:674813bd5ec9 | 1225 | wait_ms(M24SR_POLL_DELAY); |
| giovannivisentini | 0:674813bd5ec9 | 1226 | while (status != 0 && nbTry < M24SR_I2C_POLLING) |
| giovannivisentini | 0:674813bd5ec9 | 1227 | { |
| giovannivisentini | 0:674813bd5ec9 | 1228 | status = dev_i2c.read(address, &buffer, 1, false); |
| giovannivisentini | 0:674813bd5ec9 | 1229 | nbTry++; |
| giovannivisentini | 0:674813bd5ec9 | 1230 | } |
| giovannivisentini | 0:674813bd5ec9 | 1231 | if (status == 0) |
| giovannivisentini | 0:674813bd5ec9 | 1232 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 1233 | //else |
| giovannivisentini | 0:674813bd5ec9 | 1234 | return NFC_IO_ERROR_I2CTIMEOUT; |
| giovannivisentini | 0:674813bd5ec9 | 1235 | } |
| giovannivisentini | 0:674813bd5ec9 | 1236 | |
| giovannivisentini | 0:674813bd5ec9 | 1237 | NFC_StatusTypeDef M24SR::M24SR_IO_IsAnswerReady(void){ |
| giovannivisentini | 0:674813bd5ec9 | 1238 | uint32_t retry = 0xFFFFF; |
| giovannivisentini | 0:674813bd5ec9 | 1239 | int8_t stable = 0; |
| giovannivisentini | 0:674813bd5ec9 | 1240 | GPIO_PinState PinState; |
| giovannivisentini | 0:674813bd5ec9 | 1241 | |
| giovannivisentini | 0:674813bd5ec9 | 1242 | switch (syncMode){ |
| giovannivisentini | 0:674813bd5ec9 | 1243 | case M24SR_WAITINGTIME_POLLING : |
| giovannivisentini | 0:674813bd5ec9 | 1244 | return M24SR_IO_PollI2C (); |
| giovannivisentini | 0:674813bd5ec9 | 1245 | |
| giovannivisentini | 0:674813bd5ec9 | 1246 | case M24SR_WAITINGTIME_TIMEOUT : |
| giovannivisentini | 0:674813bd5ec9 | 1247 | // M24SR FWI=5 => (256*16/fc)*2^5=9.6ms but M24SR ask for extended time to program up to 246Bytes. |
| giovannivisentini | 0:674813bd5ec9 | 1248 | // can be improved by |
| giovannivisentini | 0:674813bd5ec9 | 1249 | wait_ms(80); |
| giovannivisentini | 0:674813bd5ec9 | 1250 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 1251 | |
| giovannivisentini | 0:674813bd5ec9 | 1252 | case M24SR_WAITINGTIME_GPO : |
| giovannivisentini | 0:674813bd5ec9 | 1253 | do{ |
| giovannivisentini | 0:674813bd5ec9 | 1254 | M24SR_IO_GPO_ReadPin(&PinState); |
| giovannivisentini | 0:674813bd5ec9 | 1255 | if( PinState == GPIO_PIN_RESET){ |
| giovannivisentini | 0:674813bd5ec9 | 1256 | stable ++; |
| giovannivisentini | 0:674813bd5ec9 | 1257 | } |
| giovannivisentini | 0:674813bd5ec9 | 1258 | retry --; |
| giovannivisentini | 0:674813bd5ec9 | 1259 | } |
| giovannivisentini | 0:674813bd5ec9 | 1260 | while(stable <5 && retry>0); |
| giovannivisentini | 0:674813bd5ec9 | 1261 | if(!retry) |
| giovannivisentini | 0:674813bd5ec9 | 1262 | goto Error; |
| giovannivisentini | 0:674813bd5ec9 | 1263 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 1264 | |
| giovannivisentini | 0:674813bd5ec9 | 1265 | case M24SR_INTERRUPT_GPO : |
| giovannivisentini | 0:674813bd5ec9 | 1266 | |
| giovannivisentini | 0:674813bd5ec9 | 1267 | /* Check if the GPIO is not already low before calling this function */ |
| giovannivisentini | 0:674813bd5ec9 | 1268 | M24SR_IO_GPO_ReadPin(&PinState); |
| giovannivisentini | 0:674813bd5ec9 | 1269 | answerReadyInterrupt.enable_irq(); |
| giovannivisentini | 0:674813bd5ec9 | 1270 | if(PinState == GPIO_PIN_SET){ |
| giovannivisentini | 0:674813bd5ec9 | 1271 | while (!interruptIsFired) |
| giovannivisentini | 0:674813bd5ec9 | 1272 | __WFE(); |
| giovannivisentini | 0:674813bd5ec9 | 1273 | } |
| giovannivisentini | 0:674813bd5ec9 | 1274 | interruptIsFired=false; |
| giovannivisentini | 0:674813bd5ec9 | 1275 | answerReadyInterrupt.disable_irq(); |
| giovannivisentini | 0:674813bd5ec9 | 1276 | return NFC_IO_SUCCESS; |
| giovannivisentini | 0:674813bd5ec9 | 1277 | |
| giovannivisentini | 0:674813bd5ec9 | 1278 | default : |
| giovannivisentini | 0:674813bd5ec9 | 1279 | return NFC_IO_ERROR_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 1280 | } |
| giovannivisentini | 0:674813bd5ec9 | 1281 | |
| giovannivisentini | 0:674813bd5ec9 | 1282 | Error : |
| giovannivisentini | 0:674813bd5ec9 | 1283 | return NFC_IO_ERROR_DEFAULT; |
| giovannivisentini | 0:674813bd5ec9 | 1284 | } |
| giovannivisentini | 0:674813bd5ec9 | 1285 | |
| giovannivisentini | 0:674813bd5ec9 | 1286 | |
| giovannivisentini | 0:674813bd5ec9 | 1287 | /******************* (C) COPYRIGHT 2013 STMicroelectronics *****END OF FILE****/ |
| giovannivisentini | 0:674813bd5ec9 | 1288 |
