00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #if !defined(_FEDM_NO_TAG_HANDLER_ISO15693)
00040
00041 #include "FedmIscTagHandler_ISO15693_STM_M24LR64R.h"
00042 #include "../FEDM_ISCReader.h"
00043 #include "../FEDM_ISOTabItem.h"
00044 #include "../FEDM_ISCReaderID.h"
00045 #include "../FEDM_ISC.h"
00046 #include "../../FEDM_Functions.h"
00047
00048
00049 #if _MSC_VER >= 1400
00050 #pragma warning(disable : 4996)
00051 #endif
00052
00053
00054
00055
00056
00057
00058
00059
00060 FedmIscTagHandler_ISO15693_STM_M24LR64R::FedmIscTagHandler_ISO15693_STM_M24LR64R(
00061 FEDM_ISCReader* pReader,
00062 FEDM_ISOTabItem* pTabItem )
00063 : FedmIscTagHandler_ISO15693_STM(pReader, FedmIscTagHandler::TYPE_ISO15693_STM_M24LR64R, pTabItem)
00064 {
00065 m_sTagName = "ISO 15693 : ";
00066 m_sTagName += FEDM_TabItem::GetISO15693Manufacturer(FEDM_ISC_ISO_MFR_STM);
00067 m_sTagName += " M24LR64-R";
00068 }
00069
00070 FedmIscTagHandler_ISO15693_STM_M24LR64R::FedmIscTagHandler_ISO15693_STM_M24LR64R(
00071 FEDM_ISCReader* pReader,
00072 unsigned int uiTagHandlerType,
00073 FEDM_ISOTabItem* pTabItem )
00074 : FedmIscTagHandler_ISO15693_STM(pReader, uiTagHandlerType, pTabItem)
00075 {
00076 m_sTagName = "ISO 15693 : ";
00077 m_sTagName += FEDM_TabItem::GetISO15693Manufacturer(FEDM_ISC_ISO_MFR_STM);
00078 m_sTagName += " M24LR64-R";
00079 }
00080
00081 FedmIscTagHandler_ISO15693_STM_M24LR64R::~FedmIscTagHandler_ISO15693_STM_M24LR64R()
00082 {
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 int FedmIscTagHandler_ISO15693_STM_M24LR64R::ReadMultipleBlocks(
00110 unsigned int uiFirstDataBlock,
00111 unsigned int uiNoOfDataBlocks,
00112 unsigned int& uiBlockSize,
00113 unsigned char* pucSecurityStatus,
00114 unsigned char* pucData )
00115 {
00116 int iErr = 0;
00117 unsigned int uiBank = FEDM_ISC_ISO_BANK_USER_MEMORY;
00118
00119
00120 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00121 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00122
00123 if(m_bNonAddressedMode)
00124 {
00125
00126 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00127 }
00128 else
00129 {
00130 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00131 if(m_pTabItem->m_ucSnrLen != 8)
00132 {
00133 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_UID_LF, true));
00134 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID_LEN, m_pTabItem->m_ucSnrLen));
00135 }
00136 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00137 }
00138
00139 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)0));
00140 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_BANK_NR, uiBank));
00141
00142 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiFirstDataBlock));
00143 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00144
00145 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x23));
00146
00147
00148 int iBack = m_pReader->SendProtocol(0xB0);
00149 if(iBack == 0)
00150 {
00151
00152 uiBlockSize = m_pTabItem->m_ucBlockSize;
00153 memcpy(pucSecurityStatus, &m_pTabItem->m_ucSecStatus[uiFirstDataBlock], uiNoOfDataBlocks);
00154 memcpy(pucData, &m_pTabItem->m_ucRxDB[uiFirstDataBlock*m_pTabItem->m_ucBlockSize], uiNoOfDataBlocks * m_pTabItem->m_ucBlockSize);
00155 }
00156
00157 return iBack;
00158 }
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179 int FedmIscTagHandler_ISO15693_STM_M24LR64R::WriteMultipleBlocks(
00180 unsigned int uiFirstDataBlock,
00181 unsigned int uiNoOfDataBlocks,
00182 unsigned int uiBlockSize,
00183 unsigned char* pucData )
00184 {
00185 int iErr = 0;
00186 unsigned int uiBank = FEDM_ISC_ISO_BANK_USER_MEMORY;
00187
00188
00189 if( (uiFirstDataBlock + uiNoOfDataBlocks) * uiBlockSize > m_pTabItem->m_ucTxDB.size() )
00190 return FEDM_ERROR_ARRAY_BOUNDARY;
00191
00192
00193 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00194 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00195
00196 if(m_bNonAddressedMode)
00197 {
00198
00199 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00200 }
00201 else
00202 {
00203 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00204 if(m_pTabItem->m_ucSnrLen != 8)
00205 {
00206 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_UID_LF, true));
00207 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID_LEN, m_pTabItem->m_ucSnrLen));
00208 }
00209 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00210 }
00211
00212 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)0));
00213 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK_BANK_NR, uiBank));
00214
00215 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiFirstDataBlock));
00216 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00217 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_SIZE, (unsigned char)uiBlockSize));
00218
00219 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x24));
00220
00221 m_pTabItem->m_ucBlockSize = (unsigned char)uiBlockSize;
00222
00223
00224 memcpy(&m_pTabItem->m_ucTxDB[uiFirstDataBlock*uiBlockSize], pucData, uiNoOfDataBlocks * uiBlockSize);
00225
00226
00227 int iBack = m_pReader->SendProtocol(0xB0);
00228 if(iBack == 0x03)
00229 {
00230
00231
00232 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_RSP_DB_EXT_ADR_E, &m_uiErrorDBAddress));
00233 }
00234
00235 return iBack;
00236 }
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 int FedmIscTagHandler_ISO15693_STM_M24LR64R::LockMultipleBlocks(
00255 unsigned int uiFirstDataBlock,
00256 unsigned int uiNoOfDataBlocks )
00257 {
00258 int iErr = 0;
00259
00260 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00261 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00262
00263 if(m_bNonAddressedMode)
00264 {
00265 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00266 }
00267 else
00268 {
00269 if(m_pTabItem->m_bIsSelected)
00270 {
00271 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00272 }
00273 else
00274 {
00275 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00276 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00277 }
00278 }
00279
00280 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)3));
00281 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiFirstDataBlock));
00282 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00283
00284 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x22));
00285
00286 m_ucISOErrorCode = 0;
00287
00288
00289 int iBack = m_pReader->SendProtocol(0xB0);
00290 if(iBack == 0x95)
00291 {
00292 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00293 }
00294
00295 return iBack;
00296 }
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315 int FedmIscTagHandler_ISO15693_STM_M24LR64R::GetMultipleBlockSecurityStatus(
00316 unsigned int uiFirstDataBlock,
00317 unsigned int uiNoOfDataBlocks,
00318 unsigned char* pucSecurityStatus )
00319 {
00320 int iErr = 0;
00321
00322 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE, (unsigned char)0));
00323 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_EXT_ADR, true));
00324
00325 if(m_bNonAddressedMode)
00326 {
00327 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00328 }
00329 else
00330 {
00331 if(m_pTabItem->m_bIsSelected)
00332 {
00333 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00334 }
00335 else
00336 {
00337 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00338 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00339 }
00340 }
00341
00342 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_BANK, (unsigned char)3));
00343 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DB_ADR_EXT, uiFirstDataBlock));
00344 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_REQ_DBN, uiNoOfDataBlocks));
00345 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B0_CMD, (unsigned char)0x2C));
00346
00347 m_ucISOErrorCode = 0;
00348
00349
00350 int iBack = m_pReader->SendProtocol(0xB0);
00351 if(iBack == 0)
00352 {
00353
00354 memcpy(pucSecurityStatus, &m_pTabItem->m_ucSecStatus[uiFirstDataBlock], uiNoOfDataBlocks);
00355 }
00356 else if(iBack == 0x95)
00357 {
00358 FEDM_CHK1(iErr, m_pReader->GetData(FEDM_ISC_TMP_B0_ISO_ERROR, &m_ucISOErrorCode));
00359 }
00360
00361 return iBack;
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379 int FedmIscTagHandler_ISO15693_STM_M24LR64R::WriteSectorPassword(
00380 unsigned char ucPasswordNumber,
00381 string sPassword)
00382 {
00383 int iErr = 0;
00384
00385 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_CMD, (unsigned char)0xB1));
00386 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE, (unsigned char)0));
00387
00388 if(m_bNonAddressedMode)
00389 {
00390 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00391 }
00392 else if(m_pTabItem->m_bIsSelected)
00393 {
00394 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00395 }
00396 else
00397 {
00398 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00399 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00400 }
00401
00402 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_PASSWORD_NO, ucPasswordNumber));
00403 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_PASSWORD, sPassword));
00404
00405 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MFR, (unsigned char)FEDM_ISC_ISO_MFR_STM));
00406
00407
00408 return m_pReader->SendProtocol(0xB1);
00409 }
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425 int FedmIscTagHandler_ISO15693_STM_M24LR64R::LockSectorPassword(
00426 unsigned char ucSectorNumber,
00427 unsigned char ucSectorSecurityStatus)
00428 {
00429 int iErr = 0;
00430
00431 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_CMD, (unsigned char)0xB2));
00432 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE, (unsigned char)0));
00433
00434 if(m_bNonAddressedMode)
00435 {
00436 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00437 }
00438 else if(m_pTabItem->m_bIsSelected)
00439 {
00440 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00441 }
00442 else
00443 {
00444 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00445 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00446 }
00447
00448 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_INFO_BYTE, (unsigned char)0x02));
00449 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_BLOCK_NO, ucSectorNumber));
00450 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_PROTECT_STATUS, ucSectorSecurityStatus));
00451 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MFR, (unsigned char)FEDM_ISC_ISO_MFR_STM));
00452
00453
00454 return m_pReader->SendProtocol(0xB1);
00455 }
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471 int FedmIscTagHandler_ISO15693_STM_M24LR64R::PresentSectorPassword(
00472 unsigned char ucPasswordNumber,
00473 string sPassword)
00474 {
00475 int iErr = 0;
00476
00477 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_CMD, (unsigned char)0xB3));
00478 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE, (unsigned char)0));
00479
00480 if(m_bNonAddressedMode)
00481 {
00482 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_NONADR));
00483 }
00484 else if(m_pTabItem->m_bIsSelected)
00485 {
00486 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_SEL));
00487 }
00488 else
00489 {
00490 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MODE_ADR, (unsigned char)FEDM_ISC_ISO_MODE_ADR));
00491 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_UID, m_pTabItem->m_ucSnr, m_pTabItem->m_ucSnrLen));
00492 }
00493
00494 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_PASSWORD_NO, ucPasswordNumber));
00495 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_REQ_STM_PASSWORD, sPassword));
00496
00497 FEDM_CHK1(iErr, m_pReader->SetData(FEDM_ISC_TMP_B1_MFR, (unsigned char)FEDM_ISC_ISO_MFR_STM));
00498
00499
00500 return m_pReader->SendProtocol(0xB1);
00501 }
00502
00503 #endif // #if !defined(_FEDM_NO_TAG_HANDLER_ISO15693)