Some optimisations in initialisation of registers

This commit is contained in:
Philippe Teuwen 2011-05-10 23:44:27 +00:00
parent 2a9f876363
commit 21dfe81d0b
5 changed files with 59 additions and 48 deletions

View file

@ -127,11 +127,11 @@ main (int argc, const char *argv[])
printf ("Connected to NFC device: %s\n", pnd->acName);
nfc_modulation_t nm;
nm.nmt = NMT_ISO14443A;
nm.nbr = NBR_106;
// 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)) {
size_t n;
if (verbose || (szTargetFound > 0)) {

View file

@ -49,11 +49,12 @@ typedef struct {
char acName[DEVICE_NAME_LENGTH];
/** Is the crc automaticly added, checked and removed from the frames */
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;
/** Should the PN53x chip handle frames encapsulation and chaining */
/** Should the chip handle frames encapsulation and chaining */
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;
/** Supported modulation encoded in a byte */
byte_t btSupportByte;

View file

@ -292,12 +292,11 @@ typedef struct {
#define PN53X_SFR_P3 0xFFB0
#define PN53X_SFR_P3CFGA 0xFFFC
#define PN53X_SFR_P3CFGB 0xFFFD
#define PN53X_SFR_P3 0xFFB0
#define PN53X_SFR_P7CFGA 0xFFF4
#define PN53X_SFR_P7CFGB 0xFFF5
#define PN53X_SFR_P7 0xFFF7
#define PN53X_SFR_P3CFGA 0xFFFC
#define PN53X_SFR_P3CFGB 0xFFFD
#define PN53X_SFR_P7CFGA 0xFFF4
#define PN53X_SFR_P7CFGB 0xFFF5
#define PN53X_SFR_P7 0xFFF7
#ifdef DEBUG

View file

@ -69,10 +69,10 @@ pn53x_init(nfc_device_t * pnd)
return false;
}
// CRC handling is enabled by default
pnd->bCrc = true;
// Parity handling is enabled by default
pnd->bPar = true;
// CRC handling should be enabled by default as declared in nfc_device_new
// which is the case by default for pn53x, so nothing to do here
// Parity handling should be enabled by default as declared in nfc_device_new
// 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
// 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_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;
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)) {
// 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;
BUFFER_APPEND (abtReadRegisterCmd, pn53x_register_address >> 8);
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)
{
byte_t btValue;
switch (ndo) {
case NDO_HANDLE_CRC:
// 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
btValue = (bEnable) ? 0x80 : 0x00;
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:
// 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;
if (!pn53x_write_register (pnd, PN53X_REG_CIU_ManualRCV, SYMBOL_PARITY_DISABLE, btValue))
return false;
@ -691,7 +697,9 @@ pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool b
break;
case NDO_AUTO_ISO14443_4:
// TODO Cache activated/disactivated options
if (bEnable == pnd->bAutoIso14443_4)
// Nothing to do
return true;
pnd->bAutoIso14443_4 = bEnable;
return pn53x_set_parameters (pnd, PARAM_AUTO_RATS, bEnable);
break;

View file

@ -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.
* 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:
* - 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
* @note Depending on the desired operation mode, the device needs to be configured
* 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.
*/
nfc_device_t *
nfc_connect (nfc_device_desc_t * pndd)
@ -113,11 +103,6 @@ nfc_connect (nfc_device_desc_t * pndd)
// Test if the connection was successful
if (pnd != NULL) {
DBG ("[%s] has been claimed.", pnd->acName);
// Set default configuration options
if (!nfc_initiator_init(pnd))
return NULL;
return pnd;
} else {
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.
* 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.
* - 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
nfc_initiator_init (nfc_device_t * pnd)
@ -237,6 +233,15 @@ nfc_initiator_init (nfc_device_t * pnd)
// Drop the field for a while
if (!nfc_configure (pnd, NDO_ACTIVATE_FIELD, 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
if (!nfc_configure (pnd, NDO_FORCE_ISO14443_A, true))
return false;
@ -257,18 +262,9 @@ nfc_initiator_init (nfc_device_t * pnd)
// Activate "easy framing" feature by default
if (!nfc_configure (pnd, NDO_EASY_FRAMING, true))
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
if (!nfc_configure (pnd, NDO_ACTIVATE_CRYPTO1, 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);
}
@ -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] 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.
* - 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
* received that is not part of the anti-collision. The RATS command for