Revision: 9fd11d331beb
Author: Philippe Teuwen <
yob...@gmail.com>
Date: Thu Feb 6 23:53:35 2014 UTC
Log: nfc_initiator_target_is_present(): Support B2 ASK CT
http://code.google.com/p/libnfc/source/detail?r=9fd11d331beb
Modified:
/libnfc/chips/pn53x.c
=======================================
--- /libnfc/chips/pn53x.c Thu Feb 6 23:31:31 2014 UTC
+++ /libnfc/chips/pn53x.c Thu Feb 6 23:53:35 2014 UTC
@@ -1939,30 +1939,54 @@
{
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;
+}
int
pn53x_initiator_target_is_present(struct nfc_device *pnd, const nfc_target
*pnt)
@@ -2011,8 +2035,10 @@
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;