_timed() fcts: allow 32b cycles counter & prescaler!=0
This commit is contained in:
parent
520e64c095
commit
53f1acfdcb
5 changed files with 35 additions and 24 deletions
|
@ -77,8 +77,8 @@ extern "C" {
|
||||||
NFC_EXPORT bool nfc_initiator_deselect_target (nfc_device_t * pnd);
|
NFC_EXPORT bool nfc_initiator_deselect_target (nfc_device_t * pnd);
|
||||||
NFC_EXPORT bool nfc_initiator_transceive_bytes (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx);
|
NFC_EXPORT bool nfc_initiator_transceive_bytes (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx);
|
||||||
NFC_EXPORT bool nfc_initiator_transceive_bits (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);
|
NFC_EXPORT bool nfc_initiator_transceive_bits (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);
|
||||||
NFC_EXPORT bool nfc_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx, uint16_t * cycles);
|
NFC_EXPORT bool nfc_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx, uint32_t * cycles);
|
||||||
NFC_EXPORT bool nfc_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);
|
NFC_EXPORT bool nfc_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, uint32_t * cycles);
|
||||||
|
|
||||||
/* NFC target: act as tag (i.e. MIFARE Classic) or NFC target device. */
|
/* NFC target: act as tag (i.e. MIFARE Classic) or NFC target device. */
|
||||||
NFC_EXPORT bool nfc_target_init (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_t * pszRx);
|
NFC_EXPORT bool nfc_target_init (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_t * pszRx);
|
||||||
|
|
|
@ -1085,22 +1085,30 @@ pn53x_initiator_transceive_bytes (nfc_device_t * pnd, const byte_t * pbtTx, cons
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// For _timer() functions, the prescaler will dictate what will
|
||||||
|
// be the precision and the largest delay to measure before saturation
|
||||||
|
// prescaler = 0 => precision: ~73ns timer saturates at ~5ms
|
||||||
|
// prescaler = 1 => precision: ~221ns timer saturates at ~15ms
|
||||||
|
// prescaler = 2 => precision: ~369ns timer saturates at ~25ms
|
||||||
|
// prescaler = 10 => precision: ~1.5us timer saturates at ~100ms
|
||||||
|
static uint16_t __timer_prescaler = 0;
|
||||||
|
|
||||||
void __pn53x_init_timer(nfc_device_t * pnd)
|
void __pn53x_init_timer(nfc_device_t * pnd)
|
||||||
{
|
{
|
||||||
uint16_t prescaler = 0;
|
|
||||||
uint16_t reloadval = 0xFFFF;
|
uint16_t reloadval = 0xFFFF;
|
||||||
// Initialize timer
|
// Initialize timer
|
||||||
pn53x_write_register (pnd, PN53X_REG_CIU_TMode, 0xFF, SYMBOL_TAUTO | ((prescaler >> 8) & SYMBOL_TPRESCALERHI));
|
pn53x_write_register (pnd, PN53X_REG_CIU_TMode, 0xFF, SYMBOL_TAUTO | ((__timer_prescaler >> 8) & SYMBOL_TPRESCALERHI));
|
||||||
pn53x_write_register (pnd, PN53X_REG_CIU_TPrescaler, 0xFF, (prescaler & SYMBOL_TPRESCALERLO));
|
pn53x_write_register (pnd, PN53X_REG_CIU_TPrescaler, 0xFF, (__timer_prescaler & SYMBOL_TPRESCALERLO));
|
||||||
pn53x_write_register (pnd, PN53X_REG_CIU_TReloadVal_hi, 0xFF, (reloadval >> 8) & 0xFF);
|
pn53x_write_register (pnd, PN53X_REG_CIU_TReloadVal_hi, 0xFF, (reloadval >> 8) & 0xFF);
|
||||||
pn53x_write_register (pnd, PN53X_REG_CIU_TReloadVal_lo, 0xFF, reloadval & 0xFF);
|
pn53x_write_register (pnd, PN53X_REG_CIU_TReloadVal_lo, 0xFF, reloadval & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t __pn53x_get_timer(nfc_device_t * pnd, const uint8_t last_cmd_byte)
|
uint32_t __pn53x_get_timer(nfc_device_t * pnd, const uint8_t last_cmd_byte)
|
||||||
{
|
{
|
||||||
uint8_t parity;
|
uint8_t parity;
|
||||||
uint8_t counter_hi, counter_lo;
|
uint8_t counter_hi, counter_lo;
|
||||||
uint16_t counter, cycles;
|
uint16_t counter, u16cycles;
|
||||||
|
uint32_t u32cycles;
|
||||||
size_t off = 0;
|
size_t off = 0;
|
||||||
if (CHIP_DATA(pnd)->type == PN533) {
|
if (CHIP_DATA(pnd)->type == PN533) {
|
||||||
// PN533 prepends its answer by a status byte
|
// PN533 prepends its answer by a status byte
|
||||||
|
@ -1125,15 +1133,18 @@ uint16_t __pn53x_get_timer(nfc_device_t * pnd, const uint8_t last_cmd_byte)
|
||||||
counter = (counter << 8) + counter_lo;
|
counter = (counter << 8) + counter_lo;
|
||||||
if (counter == 0) {
|
if (counter == 0) {
|
||||||
// counter saturated
|
// counter saturated
|
||||||
cycles = 0xFFFF;
|
u32cycles = 0xFFFFFFFF;
|
||||||
} else {
|
} else {
|
||||||
cycles = 0xFFFF - counter + 1;
|
u16cycles = 0xFFFF - counter;
|
||||||
|
u32cycles = u16cycles;
|
||||||
|
u32cycles *= (__timer_prescaler * 2 + 1);
|
||||||
|
u32cycles++;
|
||||||
// Correction depending on PN53x Rx detection handling:
|
// Correction depending on PN53x Rx detection handling:
|
||||||
// timer stops after 5 (or 2 for PN531) bits are received
|
// timer stops after 5 (or 2 for PN531) bits are received
|
||||||
if(CHIP_DATA(pnd)->type == PN531) {
|
if(CHIP_DATA(pnd)->type == PN531) {
|
||||||
cycles -= (2 * 128);
|
u32cycles -= (2 * 128);
|
||||||
} else {
|
} else {
|
||||||
cycles -= (5 * 128);
|
u32cycles -= (5 * 128);
|
||||||
}
|
}
|
||||||
// Correction depending on last parity bit sent
|
// Correction depending on last parity bit sent
|
||||||
parity = (last_cmd_byte >> 7) ^ ((last_cmd_byte >> 6) & 1) ^
|
parity = (last_cmd_byte >> 7) ^ ((last_cmd_byte >> 6) & 1) ^
|
||||||
|
@ -1144,17 +1155,17 @@ uint16_t __pn53x_get_timer(nfc_device_t * pnd, const uint8_t last_cmd_byte)
|
||||||
// When sent ...YY (cmd ends with logical 1, so when last parity bit is 1):
|
// When sent ...YY (cmd ends with logical 1, so when last parity bit is 1):
|
||||||
if (parity) {
|
if (parity) {
|
||||||
// it finishes 64us sooner than a ...ZY signal
|
// it finishes 64us sooner than a ...ZY signal
|
||||||
cycles += 64;
|
u32cycles += 64;
|
||||||
}
|
}
|
||||||
// Correction depending on device design
|
// Correction depending on device design
|
||||||
cycles += CHIP_DATA(pnd)->timer_correction;
|
u32cycles += CHIP_DATA(pnd)->timer_correction;
|
||||||
}
|
}
|
||||||
return cycles;
|
return u32cycles;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
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, uint32_t * cycles)
|
||||||
{
|
{
|
||||||
// TODO Do something with these bytes...
|
// TODO Do something with these bytes...
|
||||||
(void) pbtTxPar;
|
(void) pbtTxPar;
|
||||||
|
@ -1214,7 +1225,7 @@ pn53x_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx,
|
||||||
// our PN53x timer saturates after 4.8ms so this function shouldn't be used for
|
// our PN53x timer saturates after 4.8ms so this function shouldn't be used for
|
||||||
// responses coming very late anyway.
|
// responses coming very late anyway.
|
||||||
// Ideally we should implement a real timer here too but looping a few times is good enough.
|
// Ideally we should implement a real timer here too but looping a few times is good enough.
|
||||||
for (i=0; i<4; i++) {
|
for (i=0; i<(3 *(__timer_prescaler * 2 + 1)); i++) {
|
||||||
pn53x_read_register (pnd, PN53X_REG_CIU_FIFOLevel, &sz);
|
pn53x_read_register (pnd, PN53X_REG_CIU_FIFOLevel, &sz);
|
||||||
if (sz > 0)
|
if (sz > 0)
|
||||||
break;
|
break;
|
||||||
|
@ -1257,7 +1268,7 @@ pn53x_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx,
|
||||||
|
|
||||||
bool
|
bool
|
||||||
pn53x_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx,
|
pn53x_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx,
|
||||||
size_t * pszRx, uint16_t * cycles)
|
size_t * pszRx, uint32_t * cycles)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint8_t sz;
|
uint8_t sz;
|
||||||
|
@ -1309,7 +1320,7 @@ pn53x_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx
|
||||||
// our PN53x timer saturates after 4.8ms so this function shouldn't be used for
|
// our PN53x timer saturates after 4.8ms so this function shouldn't be used for
|
||||||
// responses coming very late anyway.
|
// responses coming very late anyway.
|
||||||
// Ideally we should implement a real timer here too but looping a few times is good enough.
|
// Ideally we should implement a real timer here too but looping a few times is good enough.
|
||||||
for (i=0; i<4; i++) {
|
for (i=0; i<(3 *(__timer_prescaler * 2 + 1)); i++) {
|
||||||
pn53x_read_register (pnd, PN53X_REG_CIU_FIFOLevel, &sz);
|
pn53x_read_register (pnd, PN53X_REG_CIU_FIFOLevel, &sz);
|
||||||
if (sz > 0)
|
if (sz > 0)
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -288,9 +288,9 @@ bool pn53x_initiator_transceive_bytes (nfc_device_t * pnd, const byte_t * pbt
|
||||||
byte_t * pbtRx, size_t * pszRx);
|
byte_t * pbtRx, size_t * pszRx);
|
||||||
bool pn53x_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxBits,
|
bool 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,
|
const byte_t * pbtTxPar, byte_t * pbtRx, size_t * pszRxBits,
|
||||||
byte_t * pbtRxPar, uint16_t * cycles);
|
byte_t * pbtRxPar, uint32_t * cycles);
|
||||||
bool pn53x_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx,
|
bool pn53x_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx,
|
||||||
byte_t * pbtRx, size_t * pszRx, uint16_t * cycles);
|
byte_t * pbtRx, size_t * pszRx, uint32_t * cycles);
|
||||||
bool pn53x_initiator_deselect_target (nfc_device_t * pnd);
|
bool pn53x_initiator_deselect_target (nfc_device_t * pnd);
|
||||||
|
|
||||||
// NFC device as Target functions
|
// NFC device as Target functions
|
||||||
|
|
|
@ -195,8 +195,8 @@ struct nfc_driver_t {
|
||||||
bool (*initiator_deselect_target) (nfc_device_t * pnd);
|
bool (*initiator_deselect_target) (nfc_device_t * pnd);
|
||||||
bool (*initiator_transceive_bytes) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx);
|
bool (*initiator_transceive_bytes) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx);
|
||||||
bool (*initiator_transceive_bits) (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);
|
bool (*initiator_transceive_bits) (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);
|
||||||
bool (*initiator_transceive_bytes_timed) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx, uint16_t * cycles);
|
bool (*initiator_transceive_bytes_timed) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx, size_t * pszRx, uint32_t * cycles);
|
||||||
bool (*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);
|
bool (*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, uint32_t * cycles);
|
||||||
|
|
||||||
bool (*target_init) (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_t * pszRx);
|
bool (*target_init) (nfc_device_t * pnd, nfc_target_t * pnt, byte_t * pbtRx, size_t * pszRx);
|
||||||
bool (*target_send_bytes) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx);
|
bool (*target_send_bytes) (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx);
|
||||||
|
|
|
@ -565,7 +565,7 @@ nfc_initiator_transceive_bits (nfc_device_t * pnd, const byte_t * pbtTx, const s
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
nfc_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx,
|
nfc_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, byte_t * pbtRx,
|
||||||
size_t * pszRx, uint16_t * cycles)
|
size_t * pszRx, uint32_t * cycles)
|
||||||
{
|
{
|
||||||
HAL (initiator_transceive_bytes_timed, pnd, pbtTx, szTx, pbtRx, pszRx, cycles)
|
HAL (initiator_transceive_bytes_timed, pnd, pbtTx, szTx, pbtRx, pszRx, cycles)
|
||||||
}
|
}
|
||||||
|
@ -585,7 +585,7 @@ nfc_initiator_transceive_bytes_timed (nfc_device_t * pnd, const byte_t * pbtTx,
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
nfc_initiator_transceive_bits_timed (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTxBits, const byte_t * pbtTxPar,
|
nfc_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)
|
byte_t * pbtRx, size_t * pszRxBits, byte_t * pbtRxPar, uint32_t * cycles)
|
||||||
{
|
{
|
||||||
HAL (initiator_transceive_bits_timed, pnd, pbtTx, szTxBits, pbtTxPar, pbtRx, pszRxBits, pbtRxPar, cycles);
|
HAL (initiator_transceive_bits_timed, pnd, pbtTx, szTxBits, pbtTxPar, pbtRx, pszRxBits, pbtRxPar, cycles);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue