From 4e50bf7a8bc0d9fc4bd03a0263e5e95abb4e0277 Mon Sep 17 00:00:00 2001 From: Romain Tartiere Date: Tue, 24 Nov 2009 17:58:07 +0000 Subject: [PATCH] Fix ACR122 with firmware > 2.0 support. --- src/lib/drivers/acr122.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/lib/drivers/acr122.c b/src/lib/drivers/acr122.c index 17a5352..f307138 100644 --- a/src/lib/drivers/acr122.c +++ b/src/lib/drivers/acr122.c @@ -141,7 +141,6 @@ acr122_list_devices(nfc_device_desc_t pnddDevices[], size_t szDevices, size_t *p // Test if context succeeded if (!(pscc = acr122_get_scardcontext ())) return false; - //if (SCardEstablishContext(SCARD_SCOPE_USER,NULL,NULL,&(pscc)) != SCARD_S_SUCCESS) return false; // Retrieve the string array of all available pcsc readers if (SCardListReaders(*pscc,NULL,acDeviceNames,(void*)&szDeviceNamesLen) != SCARD_S_SUCCESS) return false; @@ -154,8 +153,16 @@ acr122_list_devices(nfc_device_desc_t pnddDevices[], size_t szDevices, size_t *p DBG("- %s (pos=%d)", acDeviceNames + szPos, szPos); // Test if we were able to connect to the "emulator" card - if (SCardConnect(*pscc,acDeviceNames + szPos,SCARD_SHARE_EXCLUSIVE,SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,&(as.hCard),(void*)&(as.ioCard.dwProtocol)) == SCARD_S_SUCCESS) + if (SCardConnect(*pscc,acDeviceNames + szPos,SCARD_SHARE_EXCLUSIVE,SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,&(as.hCard),(void*)&(as.ioCard.dwProtocol)) != SCARD_S_SUCCESS) { + // Connect to ACR122 firmware version >2.0 + if (SCardConnect(*pscc,pndd->acDevice,SCARD_SHARE_DIRECT,0,&(as.hCard),(void*)&(as.ioCard.dwProtocol)) != SCARD_S_SUCCESS) + { + // We can not connect to this device. + continue; + } + } + // Configure I/O settings for card communication as.ioCard.cbPciLength = sizeof(SCARD_IO_REQUEST); @@ -175,17 +182,11 @@ acr122_list_devices(nfc_device_desc_t pnddDevices[], size_t szDevices, size_t *p DBG("%s", "Firmware version mismatch"); } SCardDisconnect(as.hCard,SCARD_LEAVE_CARD); - } - else - { - DBG("%s", "Can't contact emulator card"); - } // Find next device name position while (acDeviceNames[szPos++] != '\0'); } acr122_free_scardcontext (); - //SCardReleaseContext(pscc); return true; } @@ -200,8 +201,6 @@ nfc_device_t* acr122_connect(const nfc_device_desc_t* pndd) // Test if context succeeded if (!(pscc = acr122_get_scardcontext ())) return NULL; - //if (SCardEstablishContext(SCARD_SCOPE_USER,NULL,NULL,&(pscc)) != SCARD_S_SUCCESS) return NULL; - // Test if we were able to connect to the "emulator" card if (SCardConnect(*pscc,pndd->acDevice,SCARD_SHARE_EXCLUSIVE,SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,&(as.hCard),(void*)&(as.ioCard.dwProtocol)) != SCARD_S_SUCCESS) {