From 9fd11d331bebe0f79e58487bf63a63f24776232a Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Fri, 7 Feb 2014 00:53:35 +0100 Subject: [PATCH] nfc_initiator_target_is_present(): Support B2 ASK CT --- libnfc/chips/pn53x.c | 66 ++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 20 deletions(-) diff --git a/libnfc/chips/pn53x.c b/libnfc/chips/pn53x.c index bc7994f..a90b5bf 100644 --- a/libnfc/chips/pn53x.c +++ b/libnfc/chips/pn53x.c @@ -1939,28 +1939,52 @@ static int pn53x_ISO14443B_I_is_present(struct nfc_device *pnd) { int ret; log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "target_is_present(): Ping B'"); - // Sending R(NACK) in raw: - if ((ret = pn53x_set_property_bool(pnd, NP_EASY_FRAMING, false)) < 0) - return ret; - uint8_t abtCmd[6] = {0x01, 0x0f}; // ATTRIB - memcpy(abtCmd+2, CHIP_DATA(pnd)->current_target->nti.nii.abtDIV, 4); - int failures = 0; - while (failures < 2) { - if ((ret = nfc_initiator_transceive_bytes(pnd, abtCmd, sizeof(abtCmd), NULL, 0, 300)) < 1) { - if ((ret == NFC_ERFTRANS) && (CHIP_DATA(pnd)->last_status_byte == 0x01)) { // Timeout - ret = NFC_ETGRELEASED; - break; - } else { // Other errors can appear when card is tired-off, let's try again - failures++; - } - } else { - ret = NFC_SUCCESS; + // Sending ATTRIB in raw: + if ((ret = pn53x_set_property_bool(pnd, NP_EASY_FRAMING, false)) < 0) + return ret; + uint8_t abtCmd[6] = {0x01, 0x0f}; + memcpy(abtCmd + 2, CHIP_DATA(pnd)->current_target->nti.nii.abtDIV, 4); + int failures = 0; + while (failures < 2) { + if ((ret = nfc_initiator_transceive_bytes(pnd, abtCmd, sizeof(abtCmd), NULL, 0, 300)) < 1) { + if ((ret == NFC_ERFTRANS) && (CHIP_DATA(pnd)->last_status_byte == 0x01)) { // Timeout + ret = NFC_ETGRELEASED; break; + } else { // Other errors can appear when card is tired-off, let's try again + failures++; } + } else { + ret = NFC_SUCCESS; + break; } - int ret2; - if ((ret2 = pn53x_set_property_bool(pnd, NP_EASY_FRAMING, true)) < 0) - ret = ret2; + } + int ret2; + if ((ret2 = pn53x_set_property_bool(pnd, NP_EASY_FRAMING, true)) < 0) + ret = ret2; + return ret; +} + +static int pn53x_ISO14443B_CT_is_present(struct nfc_device *pnd) +{ + int ret; + log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "target_is_present(): Ping B2 ASK CT"); + // Sending SELECT in raw: (EASY_FRAMING is already supposed to be false) + uint8_t abtCmd[3] = {0x9f}; + memcpy(abtCmd + 1, CHIP_DATA(pnd)->current_target->nti.nci.abtUID, 2); + int failures = 0; + while (failures < 2) { + if ((ret = nfc_initiator_transceive_bytes(pnd, abtCmd, sizeof(abtCmd), NULL, 0, 300)) < 1) { + if ((ret == NFC_ERFTRANS) && (CHIP_DATA(pnd)->last_status_byte == 0x01)) { // Timeout + ret = NFC_ETGRELEASED; + break; + } else { // Other errors can appear when card is tired-off, let's try again + failures++; + } + } else { + ret = NFC_SUCCESS; + break; + } + } return ret; } @@ -2011,8 +2035,10 @@ pn53x_initiator_target_is_present(struct nfc_device *pnd, const nfc_target *pnt) case NMT_ISO14443BI: ret = pn53x_ISO14443B_I_is_present(pnd); break; - case NMT_ISO14443B2SR: case NMT_ISO14443B2CT: + ret = pn53x_ISO14443B_CT_is_present(pnd); + break; + case NMT_ISO14443B2SR: default: log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "target_is_present(): card type not supported"); ret = NFC_EDEVNOTSUPP;