Use a new current target pointer to choose correctly the sending/receiving method (ie. TgSetData/TgGetData or TgResponseToInitiator/TgGetInitiatorCommand).

This commit is contained in:
Romuald Conty 2011-04-27 14:42:27 +00:00
parent 1107b226ac
commit 6fc4a5b70a
2 changed files with 35 additions and 6 deletions

View file

@ -68,6 +68,9 @@ pn53x_init(nfc_device_t * pnd)
return false; return false;
} }
// Set current target to NULL
CHIP_DATA (pnd)->current_target = NULL;
// CRC handling is enabled by default // CRC handling is enabled by default
pnd->bCrc = true; pnd->bCrc = true;
// Parity handling is enabled by default // Parity handling is enabled by default
@ -1244,6 +1247,9 @@ bool
pn53x_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxBits, pn53x_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxBits,
const byte_t * pbtTxPar, byte_t * pbtRx, size_t * pszRxBits, byte_t * pbtRxPar, uint16_t * cycles) const byte_t * pbtTxPar, byte_t * pbtRx, size_t * pszRxBits, byte_t * pbtRxPar, uint16_t * cycles)
{ {
// TODO Do something with these bytes...
(void) pbtTxPar;
(void) pbtRxPar;
unsigned int i; unsigned int i;
uint8_t sz; uint8_t sz;
@ -1559,6 +1565,12 @@ pn53x_target_init (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_
if (pnt->nm.nmt == NMT_DEP) { if (pnt->nm.nmt == NMT_DEP) {
pnt->nti.ndi.ndm = ndm; // Update DEP mode pnt->nti.ndi.ndm = ndm; // Update DEP mode
} }
// Keep the current nfc_target for further commands
if (CHIP_DATA (pnd)->current_target) {
free (CHIP_DATA (pnd)->current_target);
}
CHIP_DATA (pnd)->current_target = malloc (sizeof(nfc_target_t));
memcpy (CHIP_DATA (pnd)->current_target, pnt, sizeof(nfc_target_t));
} }
} }
@ -1682,10 +1694,17 @@ pn53x_target_receive_bytes (nfc_device_t * pnd, byte_t * pbtRx, size_t * pszRx)
{ {
byte_t abtCmd[1]; byte_t abtCmd[1];
// FIXME In DEP mode we MUST use TgGetData but we don't known the current mode. if (pnd->bEasyFraming) {
// DEP mode && EasyFramming || EasyFramming && ISO14443-4 && PN532 if ((CHIP_DATA (pnd)->current_target->nm.nmt == NMT_DEP) || // If DEP mode
if (pnd->bEasyFraming && (CHIP_DATA(pnd)->type == PN532)) { ((CHIP_DATA(pnd)->type == PN532) && (pnd->bAutoIso14443_4) &&
(CHIP_DATA (pnd)->current_target->nm.nmt == NMT_ISO14443A) && (CHIP_DATA (pnd)->current_target->nti.nai.btSak & SAK_ISO14443_4_COMPLIANT)) // If ISO14443-4 PICC emulation
) {
abtCmd[0] = TgGetData; abtCmd[0] = TgGetData;
} else {
// TODO Support EasyFraming for other cases by software
pnd->iLastError = DENOTSUP;
return false;
}
} else { } else {
abtCmd[0] = TgGetInitiatorCommand; abtCmd[0] = TgGetInitiatorCommand;
} }
@ -1755,8 +1774,17 @@ pn53x_target_send_bytes (nfc_device_t * pnd, const byte_t * pbtTx, const size_t
if (!pnd->bPar) if (!pnd->bPar)
return false; return false;
if (pnd->bEasyFraming && (CHIP_DATA(pnd)->type == PN532)) { if (pnd->bEasyFraming) {
if ((CHIP_DATA (pnd)->current_target->nm.nmt == NMT_DEP) || // If DEP mode
((CHIP_DATA(pnd)->type == PN532) && (pnd->bAutoIso14443_4) &&
(CHIP_DATA (pnd)->current_target->nm.nmt == NMT_ISO14443A) && (CHIP_DATA (pnd)->current_target->nti.nai.btSak & SAK_ISO14443_4_COMPLIANT)) // If ISO14443-4 PICC emulation
) {
abtCmd[0] = TgSetData; abtCmd[0] = TgSetData;
} else {
// TODO Support EasyFraming for other cases by software
pnd->iLastError = DENOTSUP;
return false;
}
} else { } else {
abtCmd[0] = TgResponseToInitiator; abtCmd[0] = TgResponseToInitiator;
} }

View file

@ -150,6 +150,7 @@ struct pn53x_io {
struct pn53x_data { struct pn53x_data {
pn53x_type type; pn53x_type type;
pn53x_power_mode power_mode; pn53x_power_mode power_mode;
nfc_target_t* current_target;
const struct pn53x_io * io; const struct pn53x_io * io;
/** Register cache for REG_CIU_BIT_FRAMING, SYMBOL_TX_LAST_BITS: The last TX bits setting, we need to reset this if it does not apply anymore */ /** Register cache for REG_CIU_BIT_FRAMING, SYMBOL_TX_LAST_BITS: The last TX bits setting, we need to reset this if it does not apply anymore */
uint8_t ui8TxBits; uint8_t ui8TxBits;