Some optimisations in initialisation of registers
This commit is contained in:
parent
2a9f876363
commit
21dfe81d0b
5 changed files with 59 additions and 48 deletions
|
@ -127,11 +127,11 @@ main (int argc, const char *argv[])
|
||||||
|
|
||||||
printf ("Connected to NFC device: %s\n", pnd->acName);
|
printf ("Connected to NFC device: %s\n", pnd->acName);
|
||||||
|
|
||||||
|
nfc_modulation_t nm;
|
||||||
|
|
||||||
|
nm.nmt = NMT_ISO14443A;
|
||||||
|
nm.nbr = NBR_106;
|
||||||
// List ISO14443A targets
|
// List ISO14443A targets
|
||||||
nfc_modulation_t nm = {
|
|
||||||
.nmt = NMT_ISO14443A,
|
|
||||||
.nbr = NBR_106,
|
|
||||||
};
|
|
||||||
if (nfc_initiator_list_passive_targets (pnd, nm, ant, MAX_TARGET_COUNT, &szTargetFound)) {
|
if (nfc_initiator_list_passive_targets (pnd, nm, ant, MAX_TARGET_COUNT, &szTargetFound)) {
|
||||||
size_t n;
|
size_t n;
|
||||||
if (verbose || (szTargetFound > 0)) {
|
if (verbose || (szTargetFound > 0)) {
|
||||||
|
|
|
@ -49,11 +49,12 @@ typedef struct {
|
||||||
char acName[DEVICE_NAME_LENGTH];
|
char acName[DEVICE_NAME_LENGTH];
|
||||||
/** Is the crc automaticly added, checked and removed from the frames */
|
/** Is the crc automaticly added, checked and removed from the frames */
|
||||||
bool bCrc;
|
bool bCrc;
|
||||||
/** Does the PN53x chip handles parity bits, all parities are handled as data */
|
/** Does the chip handle parity bits, all parities are handled as data */
|
||||||
bool bPar;
|
bool bPar;
|
||||||
/** Should the PN53x chip handle frames encapsulation and chaining */
|
/** Should the chip handle frames encapsulation and chaining */
|
||||||
bool bEasyFraming;
|
bool bEasyFraming;
|
||||||
/** Should the PN53x chip switch automatically in ISO14443-4 when ISO14443 */
|
/** Should the chip switch automatically activate ISO14443-4 when
|
||||||
|
selecting tags supporting it? */
|
||||||
bool bAutoIso14443_4;
|
bool bAutoIso14443_4;
|
||||||
/** Supported modulation encoded in a byte */
|
/** Supported modulation encoded in a byte */
|
||||||
byte_t btSupportByte;
|
byte_t btSupportByte;
|
||||||
|
|
|
@ -292,12 +292,11 @@ typedef struct {
|
||||||
|
|
||||||
#define PN53X_SFR_P3 0xFFB0
|
#define PN53X_SFR_P3 0xFFB0
|
||||||
|
|
||||||
#define PN53X_SFR_P3CFGA 0xFFFC
|
#define PN53X_SFR_P3CFGA 0xFFFC
|
||||||
#define PN53X_SFR_P3CFGB 0xFFFD
|
#define PN53X_SFR_P3CFGB 0xFFFD
|
||||||
#define PN53X_SFR_P3 0xFFB0
|
#define PN53X_SFR_P7CFGA 0xFFF4
|
||||||
#define PN53X_SFR_P7CFGA 0xFFF4
|
#define PN53X_SFR_P7CFGB 0xFFF5
|
||||||
#define PN53X_SFR_P7CFGB 0xFFF5
|
#define PN53X_SFR_P7 0xFFF7
|
||||||
#define PN53X_SFR_P7 0xFFF7
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
|
@ -69,10 +69,10 @@ pn53x_init(nfc_device_t * pnd)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// CRC handling is enabled by default
|
// CRC handling should be enabled by default as declared in nfc_device_new
|
||||||
pnd->bCrc = true;
|
// which is the case by default for pn53x, so nothing to do here
|
||||||
// Parity handling is enabled by default
|
// Parity handling should be enabled by default as declared in nfc_device_new
|
||||||
pnd->bPar = true;
|
// which is the case by default for pn53x, so nothing to do here
|
||||||
|
|
||||||
// We can't read these parameters, so we set a default config by using the SetParameters wrapper
|
// 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
|
// Note: pn53x_SetParameters() will save the sent value in pnd->ui8Parameters cache
|
||||||
|
@ -512,11 +512,11 @@ pn53x_writeback_register (nfc_device_t * pnd)
|
||||||
BUFFER_INIT (abtReadRegisterCmd, PN53x_EXTENDED_FRAME__DATA_MAX_LEN);
|
BUFFER_INIT (abtReadRegisterCmd, PN53x_EXTENDED_FRAME__DATA_MAX_LEN);
|
||||||
BUFFER_APPEND (abtReadRegisterCmd, ReadRegister);
|
BUFFER_APPEND (abtReadRegisterCmd, ReadRegister);
|
||||||
|
|
||||||
// First step, it looks for registers to be readed before applying the requested mask
|
// First step, it looks for registers to be read before applying the requested mask
|
||||||
CHIP_DATA (pnd)->wb_trigged = false;
|
CHIP_DATA (pnd)->wb_trigged = false;
|
||||||
for (size_t n = 0; n < PN53X_CACHE_REGISTER_SIZE; n++) {
|
for (size_t n = 0; n < PN53X_CACHE_REGISTER_SIZE; n++) {
|
||||||
if ((CHIP_DATA (pnd)->wb_mask[n]) && (CHIP_DATA (pnd)->wb_mask[n] != 0xff)) {
|
if ((CHIP_DATA (pnd)->wb_mask[n]) && (CHIP_DATA (pnd)->wb_mask[n] != 0xff)) {
|
||||||
// This register needs to be readed: mask is present but does not cover full data width (ie. mask != 0xff)
|
// This register needs to be read: mask is present but does not cover full data width (ie. mask != 0xff)
|
||||||
const uint16_t pn53x_register_address = PN53X_CACHE_REGISTER_MIN_ADDRESS + n;
|
const uint16_t pn53x_register_address = PN53X_CACHE_REGISTER_MIN_ADDRESS + n;
|
||||||
BUFFER_APPEND (abtReadRegisterCmd, pn53x_register_address >> 8);
|
BUFFER_APPEND (abtReadRegisterCmd, pn53x_register_address >> 8);
|
||||||
BUFFER_APPEND (abtReadRegisterCmd, pn53x_register_address & 0xff);
|
BUFFER_APPEND (abtReadRegisterCmd, pn53x_register_address & 0xff);
|
||||||
|
@ -620,10 +620,13 @@ bool
|
||||||
pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool bEnable)
|
pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool bEnable)
|
||||||
{
|
{
|
||||||
byte_t btValue;
|
byte_t btValue;
|
||||||
|
|
||||||
switch (ndo) {
|
switch (ndo) {
|
||||||
case NDO_HANDLE_CRC:
|
case NDO_HANDLE_CRC:
|
||||||
// Enable or disable automatic receiving/sending of CRC bytes
|
// Enable or disable automatic receiving/sending of CRC bytes
|
||||||
|
if (bEnable == pnd->bCrc) {
|
||||||
|
// Nothing to do
|
||||||
|
return true;
|
||||||
|
}
|
||||||
// TX and RX are both represented by the symbol 0x80
|
// TX and RX are both represented by the symbol 0x80
|
||||||
btValue = (bEnable) ? 0x80 : 0x00;
|
btValue = (bEnable) ? 0x80 : 0x00;
|
||||||
if (!pn53x_write_register (pnd, PN53X_REG_CIU_TxMode, SYMBOL_TX_CRC_ENABLE, btValue))
|
if (!pn53x_write_register (pnd, PN53X_REG_CIU_TxMode, SYMBOL_TX_CRC_ENABLE, btValue))
|
||||||
|
@ -635,6 +638,9 @@ pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool b
|
||||||
|
|
||||||
case NDO_HANDLE_PARITY:
|
case NDO_HANDLE_PARITY:
|
||||||
// Handle parity bit by PN53X chip or parse it as data bit
|
// Handle parity bit by PN53X chip or parse it as data bit
|
||||||
|
if (bEnable == pnd->bPar)
|
||||||
|
// Nothing to do
|
||||||
|
return true;
|
||||||
btValue = (bEnable) ? 0x00 : SYMBOL_PARITY_DISABLE;
|
btValue = (bEnable) ? 0x00 : SYMBOL_PARITY_DISABLE;
|
||||||
if (!pn53x_write_register (pnd, PN53X_REG_CIU_ManualRCV, SYMBOL_PARITY_DISABLE, btValue))
|
if (!pn53x_write_register (pnd, PN53X_REG_CIU_ManualRCV, SYMBOL_PARITY_DISABLE, btValue))
|
||||||
return false;
|
return false;
|
||||||
|
@ -691,7 +697,9 @@ pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool b
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case NDO_AUTO_ISO14443_4:
|
case NDO_AUTO_ISO14443_4:
|
||||||
// TODO Cache activated/disactivated options
|
if (bEnable == pnd->bAutoIso14443_4)
|
||||||
|
// Nothing to do
|
||||||
|
return true;
|
||||||
pnd->bAutoIso14443_4 = bEnable;
|
pnd->bAutoIso14443_4 = bEnable;
|
||||||
return pn53x_set_parameters (pnd, PARAM_AUTO_RATS, bEnable);
|
return pn53x_set_parameters (pnd, PARAM_AUTO_RATS, bEnable);
|
||||||
break;
|
break;
|
||||||
|
|
57
libnfc/nfc.c
57
libnfc/nfc.c
|
@ -74,18 +74,8 @@ const struct nfc_driver_t *nfc_drivers[] = {
|
||||||
* When it has successfully claimed a NFC device, memory is allocated to save the device information. It will return a pointer to a \a nfc_device_t struct.
|
* When it has successfully claimed a NFC device, memory is allocated to save the device information. It will return a pointer to a \a nfc_device_t struct.
|
||||||
* This pointer should be supplied by every next functions of libnfc that should perform an action with this device.
|
* This pointer should be supplied by every next functions of libnfc that should perform an action with this device.
|
||||||
*
|
*
|
||||||
* @note During this function, the device will be configured with default initiator options, cf nfc_initiator_init:
|
* @note Depending on the desired operation mode, the device needs to be configured
|
||||||
* - Crc is handled by the device (NDO_HANDLE_CRC = true)
|
* by using nfc_initiator_init() or nfc_target_init(), optionally followed by manual tuning of the parameters if the default parameters are not suiting your goals.
|
||||||
* - Parity is handled the device (NDO_HANDLE_PARITY = true)
|
|
||||||
* - Cryto1 cipher is disabled (NDO_ACTIVATE_CRYPTO1 = false)
|
|
||||||
* - Easy framing is enabled (NDO_EASY_FRAMING = true)
|
|
||||||
* - Auto-switching in ISO14443-4 mode is enabled (NDO_AUTO_ISO14443_4 = true)
|
|
||||||
* - Invalid frames are not accepted (NDO_ACCEPT_INVALID_FRAMES = false)
|
|
||||||
* - Multiple frames are not accepted (NDO_ACCEPT_MULTIPLE_FRAMES = false)
|
|
||||||
* - 14443-A mode is activated (NDO_FORCE_ISO14443_A = true)
|
|
||||||
* - speed is set to 106 kbps (NDO_FORCE_SPEED_106 = true)
|
|
||||||
* - Let the device try forever to find a target (NDO_INFINITE_SELECT = true)
|
|
||||||
* - RF field is shortly dropped (if it was enabled) then activated again
|
|
||||||
*/
|
*/
|
||||||
nfc_device_t *
|
nfc_device_t *
|
||||||
nfc_connect (nfc_device_desc_t * pndd)
|
nfc_connect (nfc_device_desc_t * pndd)
|
||||||
|
@ -113,11 +103,6 @@ nfc_connect (nfc_device_desc_t * pndd)
|
||||||
// Test if the connection was successful
|
// Test if the connection was successful
|
||||||
if (pnd != NULL) {
|
if (pnd != NULL) {
|
||||||
DBG ("[%s] has been claimed.", pnd->acName);
|
DBG ("[%s] has been claimed.", pnd->acName);
|
||||||
|
|
||||||
// Set default configuration options
|
|
||||||
if (!nfc_initiator_init(pnd))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return pnd;
|
return pnd;
|
||||||
} else {
|
} else {
|
||||||
DBG ("No device found using driver: %s", ndr->name);
|
DBG ("No device found using driver: %s", ndr->name);
|
||||||
|
@ -230,6 +215,17 @@ nfc_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool bEn
|
||||||
* The NFC device is configured to function as RFID reader.
|
* The NFC device is configured to function as RFID reader.
|
||||||
* After initialization it can be used to communicate to passive RFID tags and active NFC devices.
|
* After initialization it can be used to communicate to passive RFID tags and active NFC devices.
|
||||||
* The reader will act as initiator to communicate peer 2 peer (NFCIP) to other active NFC devices.
|
* The reader will act as initiator to communicate peer 2 peer (NFCIP) to other active NFC devices.
|
||||||
|
* - Crc is handled by the device (NDO_HANDLE_CRC = true)
|
||||||
|
* - Parity is handled the device (NDO_HANDLE_PARITY = true)
|
||||||
|
* - Cryto1 cipher is disabled (NDO_ACTIVATE_CRYPTO1 = false)
|
||||||
|
* - Easy framing is enabled (NDO_EASY_FRAMING = true)
|
||||||
|
* - Auto-switching in ISO14443-4 mode is enabled (NDO_AUTO_ISO14443_4 = true)
|
||||||
|
* - Invalid frames are not accepted (NDO_ACCEPT_INVALID_FRAMES = false)
|
||||||
|
* - Multiple frames are not accepted (NDO_ACCEPT_MULTIPLE_FRAMES = false)
|
||||||
|
* - 14443-A mode is activated (NDO_FORCE_ISO14443_A = true)
|
||||||
|
* - speed is set to 106 kbps (NDO_FORCE_SPEED_106 = true)
|
||||||
|
* - Let the device try forever to find a target (NDO_INFINITE_SELECT = true)
|
||||||
|
* - RF field is shortly dropped (if it was enabled) then activated again
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
nfc_initiator_init (nfc_device_t * pnd)
|
nfc_initiator_init (nfc_device_t * pnd)
|
||||||
|
@ -237,6 +233,15 @@ nfc_initiator_init (nfc_device_t * pnd)
|
||||||
// Drop the field for a while
|
// Drop the field for a while
|
||||||
if (!nfc_configure (pnd, NDO_ACTIVATE_FIELD, false))
|
if (!nfc_configure (pnd, NDO_ACTIVATE_FIELD, false))
|
||||||
return false;
|
return false;
|
||||||
|
// Enable field so more power consuming cards can power themselves up
|
||||||
|
if (!nfc_configure (pnd, NDO_ACTIVATE_FIELD, true))
|
||||||
|
return false;
|
||||||
|
// Let the device try forever to find a target/tag
|
||||||
|
if (!nfc_configure (pnd, NDO_INFINITE_SELECT, true))
|
||||||
|
return false;
|
||||||
|
// Activate auto ISO14443-4 switching by default
|
||||||
|
if (!nfc_configure (pnd, NDO_AUTO_ISO14443_4, true))
|
||||||
|
return false;
|
||||||
// Force 14443-A mode
|
// Force 14443-A mode
|
||||||
if (!nfc_configure (pnd, NDO_FORCE_ISO14443_A, true))
|
if (!nfc_configure (pnd, NDO_FORCE_ISO14443_A, true))
|
||||||
return false;
|
return false;
|
||||||
|
@ -257,18 +262,9 @@ nfc_initiator_init (nfc_device_t * pnd)
|
||||||
// Activate "easy framing" feature by default
|
// Activate "easy framing" feature by default
|
||||||
if (!nfc_configure (pnd, NDO_EASY_FRAMING, true))
|
if (!nfc_configure (pnd, NDO_EASY_FRAMING, true))
|
||||||
return false;
|
return false;
|
||||||
// Activate auto ISO14443-4 switching by default
|
|
||||||
if (!nfc_configure (pnd, NDO_AUTO_ISO14443_4, true))
|
|
||||||
return false;
|
|
||||||
// Deactivate the CRYPTO1 cipher, it may could cause problems when still active
|
// Deactivate the CRYPTO1 cipher, it may could cause problems when still active
|
||||||
if (!nfc_configure (pnd, NDO_ACTIVATE_CRYPTO1, false))
|
if (!nfc_configure (pnd, NDO_ACTIVATE_CRYPTO1, false))
|
||||||
return false;
|
return false;
|
||||||
// Let the device try forever to find a target/tag
|
|
||||||
if (!nfc_configure (pnd, NDO_INFINITE_SELECT, true))
|
|
||||||
return false;
|
|
||||||
// Enable field so more power consuming cards can power themselves up
|
|
||||||
if (!nfc_configure (pnd, NDO_ACTIVATE_FIELD, true))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
HAL (initiator_init, pnd);
|
HAL (initiator_init, pnd);
|
||||||
}
|
}
|
||||||
|
@ -608,8 +604,15 @@ nfc_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx, c
|
||||||
* @param[out] pbtRx Rx buffer pointer
|
* @param[out] pbtRx Rx buffer pointer
|
||||||
* @param[out] pszRx received bytes count
|
* @param[out] pszRx received bytes count
|
||||||
*
|
*
|
||||||
* This function initialize NFC device in \e target mode in order to emulate a
|
* This function initializes NFC device in \e target mode in order to emulate a
|
||||||
* tag using the specified \a nfc_target_mode_t.
|
* tag using the specified \a nfc_target_mode_t.
|
||||||
|
* - Crc is handled by the device (NDO_HANDLE_CRC = true)
|
||||||
|
* - Parity is handled the device (NDO_HANDLE_PARITY = true)
|
||||||
|
* - Cryto1 cipher is disabled (NDO_ACTIVATE_CRYPTO1 = false)
|
||||||
|
* - Easy framing is disabled (NDO_EASY_FRAMING = false)
|
||||||
|
* - Invalid frames are not accepted (NDO_ACCEPT_INVALID_FRAMES = false)
|
||||||
|
* - Multiple frames are not accepted (NDO_ACCEPT_MULTIPLE_FRAMES = false)
|
||||||
|
* - RF field is dropped
|
||||||
*
|
*
|
||||||
* @warning Be aware that this function will wait (hang) until a command is
|
* @warning Be aware that this function will wait (hang) until a command is
|
||||||
* received that is not part of the anti-collision. The RATS command for
|
* received that is not part of the anti-collision. The RATS command for
|
||||||
|
|
Loading…
Add table
Reference in a new issue