Better handling of SetParameters command, use a cache, prevent from double set, adjust comments, remove junk code.
This commit is contained in:
parent
623c8bbeef
commit
d9505bbbcc
8 changed files with 65 additions and 38 deletions
|
@ -69,8 +69,10 @@ typedef struct {
|
|||
bool bPar;
|
||||
/** Should the PN53x chip handle frames encapsulation and chaining */
|
||||
bool bEasyFraming;
|
||||
/** 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;
|
||||
/** Register cache for SetParameters function. */
|
||||
uint8_t ui8Parameters;
|
||||
/** Last error reported by the PCD / encountered by the PCD driver
|
||||
* MSB LSB
|
||||
* | 00 | 00 |
|
||||
|
|
|
@ -81,6 +81,29 @@ static const byte_t pn53x_ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
|
|||
static const byte_t pn53x_nack_frame[] = { 0x00, 0x00, 0xff, 0xff, 0x00, 0x00 };
|
||||
static const byte_t pn53x_error_frame[] = { 0x00, 0x00, 0xff, 0x01, 0xff, 0x7f, 0x81, 0x00 };
|
||||
|
||||
bool
|
||||
pn53x_init(nfc_device_t * pnd)
|
||||
{
|
||||
// CRC handling is enabled by default
|
||||
pnd->bCrc = true;
|
||||
// Parity handling is enabled by default
|
||||
pnd->bPar = true;
|
||||
|
||||
// Reset the ending transmission bits register, it is unknown what the last tranmission used there
|
||||
pnd->ui8TxBits = 0;
|
||||
if (!pn53x_set_reg (pnd, REG_CIU_BIT_FRAMING, SYMBOL_TX_LAST_BITS, 0x00)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// We can't read these parameters, so we set a default config by using the SetParameters wrapper
|
||||
// Note: pn53x_SetParameters() will save the sent value in pnd->ui8Parameters cache
|
||||
if(!pn53x_SetParameters(pnd, PARAM_AUTO_ATR_RES | PARAM_AUTO_RATS)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// XXX: Is this function correctly named ?
|
||||
bool
|
||||
pn53x_transceive_check_ack_frame_callback (nfc_device_t * pnd, const byte_t * pbtRxFrame, const size_t szRxFrameLen)
|
||||
|
@ -203,17 +226,32 @@ pn53x_set_reg (nfc_device_t * pnd, uint16_t ui16Reg, uint8_t ui8SymbolMask, uint
|
|||
}
|
||||
|
||||
bool
|
||||
pn53x_set_parameters (nfc_device_t * pnd, uint8_t ui8Value)
|
||||
pn53x_set_parameter (nfc_device_t * pnd, const uint8_t ui8Parameter, const bool bEnable)
|
||||
{
|
||||
uint8_t ui8Value = (bEnable) ? (pnd->ui8Parameters | ui8Parameter) : (pnd->ui8Parameters & ~(ui8Parameter));
|
||||
if (ui8Value != pnd->ui8Parameters) {
|
||||
return pn53x_SetParameters(pnd, ui8Value);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
pn53x_SetParameters (nfc_device_t * pnd, const uint8_t ui8Value)
|
||||
{
|
||||
byte_t abtCmd[sizeof (pncmd_set_parameters)];
|
||||
memcpy (abtCmd, pncmd_set_parameters, sizeof (pncmd_set_parameters));
|
||||
|
||||
abtCmd[2] = ui8Value;
|
||||
return pn53x_transceive (pnd, abtCmd, sizeof (pncmd_set_parameters), NULL, NULL);
|
||||
if(!pn53x_transceive (pnd, abtCmd, sizeof (pncmd_set_parameters), NULL, NULL)) {
|
||||
return false;
|
||||
}
|
||||
// We save last parameters in register cache
|
||||
pnd->ui8Parameters = ui8Value;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
pn53x_set_tx_bits (nfc_device_t * pnd, uint8_t ui8Bits)
|
||||
pn53x_set_tx_bits (nfc_device_t * pnd, const uint8_t ui8Bits)
|
||||
{
|
||||
// Test if we need to update the transmission bits register setting
|
||||
if (pnd->ui8TxBits != ui8Bits) {
|
||||
|
@ -228,8 +266,8 @@ pn53x_set_tx_bits (nfc_device_t * pnd, uint8_t ui8Bits)
|
|||
}
|
||||
|
||||
bool
|
||||
pn53x_wrap_frame (const byte_t * pbtTx, const size_t szTxBits, const byte_t * pbtTxPar, byte_t * pbtFrame,
|
||||
size_t * pszFrameBits)
|
||||
pn53x_wrap_frame (const byte_t * pbtTx, const size_t szTxBits, const byte_t * pbtTxPar,
|
||||
byte_t * pbtFrame, size_t * pszFrameBits)
|
||||
{
|
||||
byte_t btFrame;
|
||||
byte_t btData;
|
||||
|
@ -759,12 +797,7 @@ pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool b
|
|||
break;
|
||||
|
||||
case NDO_AUTO_ISO14443_4:
|
||||
// TODO: PN53x parameters could not be read, so we have to buffered current value in order to prevent from configuration overwrite
|
||||
// ATM, buffered current value is not needed due to a single usage of these parameters
|
||||
btValue = (bEnable) ? (SYMBOL_PARAM_fAutomaticRATS | SYMBOL_PARAM_fAutomaticATR_RES) : SYMBOL_PARAM_fAutomaticATR_RES;
|
||||
if (!pn53x_set_parameters (pnd, btValue))
|
||||
return false;
|
||||
return true;
|
||||
return pn53x_set_parameter(pnd, PARAM_AUTO_RATS, bEnable);
|
||||
break;
|
||||
|
||||
case NDO_FORCE_ISO14443_A:
|
||||
|
@ -958,15 +991,16 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta
|
|||
bool bPar = pnd->bPar;
|
||||
|
||||
// Configure the target corresponding to the requested mode
|
||||
// XXX I (Romuald) don't think that a good thing to select NDO_EASY_FRAMING here, that's a user choice...
|
||||
switch(ntm)
|
||||
{
|
||||
case NTM_PASSIVE:
|
||||
pn53x_set_parameters(pnd, 0);
|
||||
pn53x_set_parameter(pnd, PARAM_AUTO_ATR_RES, false);
|
||||
pn53x_configure(pnd, NDO_EASY_FRAMING, false);
|
||||
break;
|
||||
|
||||
case NTM_DEP:
|
||||
pn53x_set_parameters(pnd, SYMBOL_PARAM_fAutomaticATR_RES);
|
||||
pn53x_set_parameter(pnd, PARAM_AUTO_ATR_RES, true);
|
||||
pn53x_configure(pnd, NDO_EASY_FRAMING, true);
|
||||
break;
|
||||
|
||||
|
@ -976,7 +1010,7 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta
|
|||
pnd->iLastError = DENOTSUP;
|
||||
return false;
|
||||
}
|
||||
pn53x_set_parameters(pnd, SYMBOL_PARAM_fISO14443_4_PICC);
|
||||
pn53x_set_parameter(pnd, PARAM_14443_4_PICC, true);
|
||||
pn53x_configure(pnd, NDO_EASY_FRAMING, true);
|
||||
break;
|
||||
|
||||
|
|
|
@ -64,18 +64,15 @@
|
|||
# define REG_CIU_BIT_FRAMING 0x633D
|
||||
# define SYMBOL_TX_LAST_BITS 0x07
|
||||
|
||||
# define SYMBOL_PARAM_fAutomaticRATS 0x10
|
||||
# define SYMBOL_PARAM_fAutomaticATR_RES 0x04
|
||||
# define SYMBOL_PARAM_fISO14443_4_PICC 0x20
|
||||
|
||||
// Internal parameters flags
|
||||
# define PARAM_NONE 0x00
|
||||
# define PARAM_NAD_USED 0x01
|
||||
# define PARAM_DID_USED 0x02
|
||||
# define PARAM_AUTO_ATR_RES 0x04
|
||||
# define PARAM_AUTO_RATS 0x10
|
||||
# define PARAM_14443_4_PICC 0x20
|
||||
# define PARAM_NO_AMBLE 0x40
|
||||
# define PARAM_14443_4_PICC 0x20 /* Only for PN532 */
|
||||
# define PARAM_NFC_SECURE 0x20 /* Only for PN533 */
|
||||
# define PARAM_NO_AMBLE 0x40 /* Only for PN532 */
|
||||
|
||||
// Radio Field Configure Items // Configuration Data length
|
||||
# define RFCI_FIELD 0x01 // 1
|
||||
|
@ -93,6 +90,7 @@
|
|||
# define DEISERRFRAME 0x0300/* Error frame */
|
||||
# define DENOTSUP 0x0400/* Not supported */
|
||||
|
||||
bool pn53x_init(nfc_device_t * pnd);
|
||||
bool pn53x_transceive_check_ack_frame_callback (nfc_device_t * pnd, const byte_t * pbtRxFrame,
|
||||
const size_t szRxFrameLen);
|
||||
bool pn53x_transceive_check_error_frame_callback (nfc_device_t * pnd, const byte_t * pbtRxFrame,
|
||||
|
@ -101,8 +99,8 @@ bool pn53x_transceive (nfc_device_t * pnd, const byte_t * pbtTx, const size_t
|
|||
size_t * pszRxLen);
|
||||
bool pn53x_get_reg (nfc_device_t * pnd, uint16_t ui16Reg, uint8_t * ui8Value);
|
||||
bool pn53x_set_reg (nfc_device_t * pnd, uint16_t ui16Reg, uint8_t ui8SymbolMask, uint8_t ui8Value);
|
||||
bool pn53x_set_parameters (nfc_device_t * pnd, uint8_t ui8Value);
|
||||
bool pn53x_set_tx_bits (nfc_device_t * pnd, uint8_t ui8Bits);
|
||||
bool pn53x_set_parameter (nfc_device_t * pnd, const uint8_t ui8Value, const bool bEnable);
|
||||
bool pn53x_set_tx_bits (nfc_device_t * pnd, const uint8_t ui8Bits);
|
||||
bool pn53x_wrap_frame (const byte_t * pbtTx, const size_t szTxBits, const byte_t * pbtTxPar, byte_t * pbtFrame,
|
||||
size_t * pszFrameBits);
|
||||
bool pn53x_unwrap_frame (const byte_t * pbtFrame, const size_t szFrameBits, byte_t * pbtRx, size_t * pszRxBits,
|
||||
|
@ -137,6 +135,7 @@ static const struct chip_callbacks pn53x_callbacks_list = {
|
|||
};
|
||||
|
||||
// C wrappers for PN53x commands
|
||||
bool pn53x_SetParameters (nfc_device_t * pnd, const uint8_t ui8Value);
|
||||
bool pn53x_InListPassiveTarget (nfc_device_t * pnd, const nfc_modulation_t nmInitModulation,
|
||||
const byte_t szMaxTargets, const byte_t * pbtInitiatorData,
|
||||
const size_t szInitiatorDataLen, byte_t * pbtTargetsData, size_t * pszTargetsData);
|
||||
|
|
|
@ -240,9 +240,7 @@ acr122_connect (const nfc_device_desc_t * pndd)
|
|||
pnd->nc = NC_PN532;
|
||||
pnd->nds = (nfc_device_spec_t) pas;
|
||||
pnd->bActive = true;
|
||||
pnd->bCrc = true;
|
||||
pnd->bPar = true;
|
||||
pnd->ui8TxBits = 0;
|
||||
|
||||
return pnd;
|
||||
}
|
||||
|
||||
|
|
|
@ -183,9 +183,7 @@ arygon_connect (const nfc_device_desc_t * pndd)
|
|||
pnd->nc = NC_PN532;
|
||||
pnd->nds = (nfc_device_spec_t) sp;
|
||||
pnd->bActive = true;
|
||||
pnd->bCrc = true;
|
||||
pnd->bPar = true;
|
||||
pnd->ui8TxBits = 0;
|
||||
|
||||
return pnd;
|
||||
}
|
||||
|
||||
|
|
|
@ -166,9 +166,7 @@ pn532_uart_connect (const nfc_device_desc_t * pndd)
|
|||
pnd->nc = NC_PN532;
|
||||
pnd->nds = (nfc_device_spec_t) sp;
|
||||
pnd->bActive = true;
|
||||
pnd->bCrc = true;
|
||||
pnd->bPar = true;
|
||||
pnd->ui8TxBits = 0;
|
||||
|
||||
return pnd;
|
||||
}
|
||||
|
||||
|
|
|
@ -194,11 +194,8 @@ pn53x_usb_connect (const nfc_device_desc_t * pndd, const char *target_name, int
|
|||
pnd->nc = target_chip;
|
||||
pnd->nds = (nfc_device_spec_t) pus;
|
||||
pnd->bActive = true;
|
||||
pnd->bCrc = true;
|
||||
pnd->bPar = true;
|
||||
pnd->ui8TxBits = 0;
|
||||
|
||||
// TODO Move this HACK1 into an upper level in rder to benefit to other devices that use PN53x
|
||||
// TODO Move this HACK1 into an upper level in order to benefit to other devices that use PN53x
|
||||
// HACK1: Send first an ACK as Abort command, to reset chip before talking to it:
|
||||
uint8_t ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
|
||||
#ifdef DEBUG
|
||||
|
@ -249,6 +246,7 @@ pn53x_usb_connect (const nfc_device_desc_t * pndd, const char *target_name, int
|
|||
PRINT_HEX ("RX", abtRx, ret);
|
||||
#endif
|
||||
}
|
||||
|
||||
return pnd;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,11 +99,11 @@ nfc_connect (nfc_device_desc_t * pndd)
|
|||
// Great we have claimed a device
|
||||
pnd->pdc = &(drivers_callbacks_list[uiDriver]);
|
||||
|
||||
// FIXME Why do we do this ?
|
||||
if (!pn53x_get_firmware_version (pnd))
|
||||
return NULL;
|
||||
|
||||
// Reset the ending transmission bits register, it is unknown what the last tranmission used there
|
||||
if (!pn53x_set_reg (pnd, REG_CIU_BIT_FRAMING, SYMBOL_TX_LAST_BITS, 0x00))
|
||||
if (!pn53x_init (pnd))
|
||||
return NULL;
|
||||
|
||||
// Set default configuration options
|
||||
|
|
Loading…
Reference in a new issue