Astyle formatting

pull/7822/head
Donatien Garnier 2018-08-21 15:19:51 +01:00
parent ce39e77f3d
commit 0e2484f7f3
74 changed files with 5018 additions and 5438 deletions

View File

@ -37,8 +37,7 @@ extern "C" {
#include "stddef.h" #include "stddef.h"
#include "stdbool.h" #include "stdbool.h"
typedef struct __ac_buffer typedef struct __ac_buffer {
{
const uint8_t *data; const uint8_t *data;
size_t size; size_t size;
struct __ac_buffer *pNext; struct __ac_buffer *pNext;

View File

@ -39,8 +39,7 @@ extern "C" {
#include "acore/buffer.h" #include "acore/buffer.h"
typedef struct __ac_buffer_builder typedef struct __ac_buffer_builder {
{
ac_buffer_t ac_buffer; ac_buffer_t ac_buffer;
uint8_t *data; uint8_t *data;
size_t size; size_t size;
@ -113,8 +112,7 @@ static inline size_t ac_buffer_builder_length(ac_buffer_builder_t* pBuilder)
*/ */
static inline void ac_buffer_builder_set_length(ac_buffer_builder_t *pBuilder, size_t length) static inline void ac_buffer_builder_set_length(ac_buffer_builder_t *pBuilder, size_t length)
{ {
if( ac_buffer_data(&pBuilder->ac_buffer) + length > pBuilder->data + pBuilder->size ) if (ac_buffer_data(&pBuilder->ac_buffer) + length > pBuilder->data + pBuilder->size) {
{
return; return;
} }
pBuilder->ac_buffer.size = length; pBuilder->ac_buffer.size = length;
@ -144,16 +142,12 @@ static inline size_t ac_buffer_builder_write_offset(ac_buffer_builder_t* pBuilde
*/ */
static inline void ac_buffer_builder_set_write_offset(ac_buffer_builder_t *pBuilder, size_t off) static inline void ac_buffer_builder_set_write_offset(ac_buffer_builder_t *pBuilder, size_t off)
{ {
if( off > pBuilder->size ) if (off > pBuilder->size) {
{
return; return;
} }
if( pBuilder->data + off > pBuilder->ac_buffer.data ) if (pBuilder->data + off > pBuilder->ac_buffer.data) {
{
pBuilder->ac_buffer.size = off - (pBuilder->ac_buffer.data - pBuilder->data); pBuilder->ac_buffer.size = off - (pBuilder->ac_buffer.data - pBuilder->data);
} } else {
else
{
pBuilder->ac_buffer.size = 0; pBuilder->ac_buffer.size = 0;
} }
} }
@ -173,16 +167,12 @@ static inline size_t ac_buffer_builder_read_offset(ac_buffer_builder_t* pBuilder
*/ */
static inline void ac_buffer_builder_set_read_offset(ac_buffer_builder_t *pBuilder, size_t off) static inline void ac_buffer_builder_set_read_offset(ac_buffer_builder_t *pBuilder, size_t off)
{ {
if( off > pBuilder->size ) if (off > pBuilder->size) {
{
return; return;
} }
if( pBuilder->data + off < pBuilder->ac_buffer.data + pBuilder->ac_buffer.size ) if (pBuilder->data + off < pBuilder->ac_buffer.data + pBuilder->ac_buffer.size) {
{
pBuilder->ac_buffer.size = pBuilder->ac_buffer.data - (pBuilder->data + off); pBuilder->ac_buffer.size = pBuilder->ac_buffer.data - (pBuilder->data + off);
} } else {
else
{
pBuilder->ac_buffer.size = 0; pBuilder->ac_buffer.size = 0;
} }
pBuilder->ac_buffer.data = pBuilder->data + off; pBuilder->ac_buffer.data = pBuilder->data + off;

View File

@ -43,15 +43,13 @@ typedef void (*ac_istream_fn)(ac_buffer_t* pDataIn, bool* pClose, size_t maxLeng
typedef void (*ac_ostream_fn)(ac_buffer_t *pDataOut, bool closed, void *pUserParam); typedef void (*ac_ostream_fn)(ac_buffer_t *pDataOut, bool closed, void *pUserParam);
//Input stream -- pulled by consumer //Input stream -- pulled by consumer
struct __ac_istream struct __ac_istream {
{
ac_istream_fn fn; ac_istream_fn fn;
void *pUserParam; void *pUserParam;
}; };
//Output stream -- pushed by supplier //Output stream -- pushed by supplier
struct __ac_ostream struct __ac_ostream {
{
ac_ostream_fn fn; ac_ostream_fn fn;
void *pUserParam; void *pUserParam;
}; };

View File

@ -39,16 +39,14 @@ void ac_buffer_init(ac_buffer_t* pBuf, const uint8_t* data, size_t size)
void ac_buffer_dup(ac_buffer_t *pBuf, const ac_buffer_t *pBufIn) void ac_buffer_dup(ac_buffer_t *pBuf, const ac_buffer_t *pBufIn)
{ {
if(pBuf != pBufIn) if (pBuf != pBufIn) {
{
memcpy(pBuf, pBufIn, sizeof(ac_buffer_t)); memcpy(pBuf, pBufIn, sizeof(ac_buffer_t));
} }
} }
void ac_buffer_append(ac_buffer_t *pBuf, ac_buffer_t *pAppBuf) void ac_buffer_append(ac_buffer_t *pBuf, ac_buffer_t *pAppBuf)
{ {
while(pBuf->pNext != NULL) while (pBuf->pNext != NULL) {
{
pBuf = pBuf->pNext; pBuf = pBuf->pNext;
} }
pBuf->pNext = pAppBuf; pBuf->pNext = pAppBuf;
@ -61,8 +59,7 @@ void ac_buffer_split(ac_buffer_t* pStartBuf, ac_buffer_t* pEndBuf, ac_buffer_t*
ac_buffer_read_n_skip(pEndBuf, length); ac_buffer_read_n_skip(pEndBuf, length);
while( length > ac_buffer_size(pStartBuf) ) while (length > ac_buffer_size(pStartBuf)) {
{
length -= pStartBuf->size; length -= pStartBuf->size;
pStartBuf = pStartBuf->pNext; pStartBuf = pStartBuf->pNext;
} }
@ -78,23 +75,19 @@ void ac_buffer_dump(ac_buffer_t* pBuf)
{ {
#if !defined(NDEBUG) #if !defined(NDEBUG)
ACORE_STDIO_LOCK(); ACORE_STDIO_LOCK();
while(pBuf != NULL) while (pBuf != NULL) {
{
size_t r = ac_buffer_size(pBuf); size_t r = ac_buffer_size(pBuf);
size_t i = 0; size_t i = 0;
size_t j = 0; size_t j = 0;
while(i < r) while (i < r) {
{ for (j = i; j < MIN(i + 16, r); j++) {
for(j = i; j < MIN(i + 16, r); j++)
{
ACORE_STDIO_PRINT("%02x ", ac_buffer_data(pBuf)[j]); ACORE_STDIO_PRINT("%02x ", ac_buffer_data(pBuf)[j]);
} }
ACORE_STDIO_PRINT("\r\n"); ACORE_STDIO_PRINT("\r\n");
i = j; i = j;
} }
pBuf = ac_buffer_next(pBuf); pBuf = ac_buffer_next(pBuf);
if(pBuf != NULL) if (pBuf != NULL) {
{
ACORE_STDIO_PRINT("->\r\n"); ACORE_STDIO_PRINT("->\r\n");
} }
} }

View File

@ -57,8 +57,7 @@ void ac_buffer_builder_write_be(ac_buffer_builder_t* pBuilder, const uint8_t* bu
{ {
ENSURE_WRITE_LENGTH(pBuilder, size); ENSURE_WRITE_LENGTH(pBuilder, size);
buf += size; buf += size;
while(size > 0) while (size > 0) {
{
buf--; buf--;
*ac_buffer_builder_write_position(pBuilder) = *buf; *ac_buffer_builder_write_position(pBuilder) = *buf;
pBuilder->ac_buffer.size++; pBuilder->ac_buffer.size++;
@ -98,12 +97,10 @@ void ac_buffer_builder_write_n_skip(ac_buffer_builder_t* pBuilder, size_t size)
void ac_buffer_builder_copy_n_bytes(ac_buffer_builder_t *pBuilderOut, ac_buffer_t *pBufIn, size_t size) void ac_buffer_builder_copy_n_bytes(ac_buffer_builder_t *pBuilderOut, ac_buffer_t *pBufIn, size_t size)
{ {
ENSURE_WRITE_LENGTH(pBuilderOut, size); ENSURE_WRITE_LENGTH(pBuilderOut, size);
if( ac_buffer_reader_readable(pBufIn) < size ) if (ac_buffer_reader_readable(pBufIn) < size) {
{
return; return;
} }
while(size > 0) while (size > 0) {
{
size_t cpy = ac_buffer_reader_current_buffer_length(pBufIn); size_t cpy = ac_buffer_reader_current_buffer_length(pBufIn);
cpy = MIN(cpy, size); cpy = MIN(cpy, size);
ac_buffer_builder_write_n_bytes(pBuilderOut, ac_buffer_reader_current_buffer_pointer(pBufIn), cpy); ac_buffer_builder_write_n_bytes(pBuilderOut, ac_buffer_reader_current_buffer_pointer(pBufIn), cpy);

View File

@ -30,20 +30,14 @@
static inline void update_buf(ac_buffer_t *pBuf) static inline void update_buf(ac_buffer_t *pBuf)
{ {
while( ac_buffer_size(pBuf) == 0 ) while (ac_buffer_size(pBuf) == 0) {
{ if (ac_buffer_next(pBuf) != NULL) {
if( ac_buffer_next(pBuf) != NULL )
{
ac_buffer_t *pNext = ac_buffer_next(pBuf); ac_buffer_t *pNext = ac_buffer_next(pBuf);
ac_buffer_init(pBuf, ac_buffer_data(pNext), ac_buffer_size(pNext)); ac_buffer_init(pBuf, ac_buffer_data(pNext), ac_buffer_size(pNext));
pBuf->pNext = ac_buffer_next(pNext); pBuf->pNext = ac_buffer_next(pNext);
} } else if (pBuf->data != NULL) {
else if( pBuf->data != NULL )
{
ac_buffer_init(pBuf, NULL, 0); ac_buffer_init(pBuf, NULL, 0);
} } else {
else
{
return; return;
} }
} }
@ -53,8 +47,7 @@ void ac_buffer_read_be(ac_buffer_t* pBuf, uint8_t* buf, size_t size)
{ {
ENSURE_READ_LENGTH(pBuf, size); ENSURE_READ_LENGTH(pBuf, size);
buf += size; buf += size;
while(size > 0) while (size > 0) {
{
buf--; buf--;
*buf = *ac_buffer_data(pBuf); *buf = *ac_buffer_data(pBuf);
pBuf->data++; pBuf->data++;
@ -67,8 +60,7 @@ void ac_buffer_read_be(ac_buffer_t* pBuf, uint8_t* buf, size_t size)
void ac_buffer_read_le(ac_buffer_t *pBuf, uint8_t *buf, size_t size) void ac_buffer_read_le(ac_buffer_t *pBuf, uint8_t *buf, size_t size)
{ {
ENSURE_READ_LENGTH(pBuf, size); ENSURE_READ_LENGTH(pBuf, size);
while(size > 0) while (size > 0) {
{
size_t cpy = ac_buffer_size(pBuf); size_t cpy = ac_buffer_size(pBuf);
cpy = MIN(cpy, size); cpy = MIN(cpy, size);
memcpy(buf, ac_buffer_data(pBuf), cpy); memcpy(buf, ac_buffer_data(pBuf), cpy);
@ -83,8 +75,7 @@ void ac_buffer_read_le(ac_buffer_t* pBuf, uint8_t* buf, size_t size)
void ac_buffer_read_n_skip(ac_buffer_t *pBuf, size_t size) void ac_buffer_read_n_skip(ac_buffer_t *pBuf, size_t size)
{ {
ENSURE_READ_LENGTH(pBuf, size); ENSURE_READ_LENGTH(pBuf, size);
while(size > 0) while (size > 0) {
{
size_t cpy = ac_buffer_size(pBuf); size_t cpy = ac_buffer_size(pBuf);
cpy = MIN(cpy, size); cpy = MIN(cpy, size);
pBuf->data += cpy; pBuf->data += cpy;
@ -97,8 +88,7 @@ void ac_buffer_read_n_skip(ac_buffer_t* pBuf, size_t size)
size_t ac_buffer_reader_readable(const ac_buffer_t *pBuf) size_t ac_buffer_reader_readable(const ac_buffer_t *pBuf)
{ {
size_t r = 0; size_t r = 0;
while( pBuf != NULL ) while (pBuf != NULL) {
{
r += ac_buffer_size(pBuf); r += ac_buffer_size(pBuf);
pBuf = ac_buffer_next(pBuf); pBuf = ac_buffer_next(pBuf);
} }
@ -121,23 +111,19 @@ bool ac_buffer_reader_cmp_bytes(const ac_buffer_t* pBuf, const uint8_t* bytes, s
{ {
ac_buffer_t reader; ac_buffer_t reader;
if( length > ac_buffer_reader_readable(pBuf) ) if (length > ac_buffer_reader_readable(pBuf)) {
{
return false; return false;
} }
ac_buffer_dup(&reader, pBuf); ac_buffer_dup(&reader, pBuf);
while(length > 0) while (length > 0) {
{
size_t sz = ac_buffer_reader_current_buffer_length(&reader); size_t sz = ac_buffer_reader_current_buffer_length(&reader);
if( sz > length ) if (sz > length) {
{
sz = length; sz = length;
} }
int c = memcmp(ac_buffer_reader_current_buffer_pointer(&reader), bytes, sz); int c = memcmp(ac_buffer_reader_current_buffer_pointer(&reader), bytes, sz);
if(c) if (c) {
{
return false; return false;
} }
length -= sz; length -= sz;
@ -153,8 +139,7 @@ bool ac_buffer_reader_cmp(const ac_buffer_t* pBuf1, const ac_buffer_t* pBuf2)
ac_buffer_t reader1; ac_buffer_t reader1;
ac_buffer_t reader2; ac_buffer_t reader2;
if( ac_buffer_reader_readable(pBuf1) != ac_buffer_reader_readable(pBuf2) ) if (ac_buffer_reader_readable(pBuf1) != ac_buffer_reader_readable(pBuf2)) {
{
return false; return false;
} }
@ -162,16 +147,14 @@ bool ac_buffer_reader_cmp(const ac_buffer_t* pBuf1, const ac_buffer_t* pBuf2)
ac_buffer_dup(&reader2, pBuf2); ac_buffer_dup(&reader2, pBuf2);
size_t length = ac_buffer_reader_readable(pBuf1); size_t length = ac_buffer_reader_readable(pBuf1);
while(length > 0) while (length > 0) {
{
size_t sz1 = ac_buffer_reader_current_buffer_length(&reader1); size_t sz1 = ac_buffer_reader_current_buffer_length(&reader1);
size_t sz2 = ac_buffer_reader_current_buffer_length(&reader2); size_t sz2 = ac_buffer_reader_current_buffer_length(&reader2);
size_t sz = MIN(sz1, sz2); size_t sz = MIN(sz1, sz2);
int c = memcmp(ac_buffer_reader_current_buffer_pointer(&reader1), ac_buffer_reader_current_buffer_pointer(&reader2), sz); int c = memcmp(ac_buffer_reader_current_buffer_pointer(&reader1), ac_buffer_reader_current_buffer_pointer(&reader2), sz);
if(c) if (c) {
{
return false; return false;
} }
length -= sz; length -= sz;

View File

@ -44,8 +44,7 @@ namespace nfc {
/** /**
* A Command APDU (Application Protocol Data Unit) . * A Command APDU (Application Protocol Data Unit) .
*/ */
struct CAPDU struct CAPDU {
{
uint8_t cla; ///< CLA - Instruction class uint8_t cla; ///< CLA - Instruction class
uint8_t ins; ///< INS - Instruction code uint8_t ins; ///< INS - Instruction code
uint8_t p1; ///< P1 - First parameter uint8_t p1; ///< P1 - First parameter
@ -57,8 +56,7 @@ namespace nfc {
/** /**
* A Response APDU (Application Protocol Data Unit) * A Response APDU (Application Protocol Data Unit)
*/ */
struct RAPDU struct RAPDU {
{
ac_buffer_t dataOut; ///< Response data ac_buffer_t dataOut; ///< Response data
uint16_t sw; ///< Status word uint16_t sw; ///< Status word
}; };

View File

@ -24,8 +24,7 @@
namespace mbed { namespace mbed {
namespace nfc { namespace nfc {
struct nfc_rf_protocols_bitmask_t struct nfc_rf_protocols_bitmask_t {
{
uint8_t initiator_t1t : 1; uint8_t initiator_t1t : 1;
uint8_t initiator_t2t : 1; uint8_t initiator_t2t : 1;
uint8_t initiator_t3t : 1; uint8_t initiator_t3t : 1;

View File

@ -46,7 +46,10 @@ namespace nfc {
* *
* @return whether NDEF content is supported * @return whether NDEF content is supported
*/ */
virtual bool is_ndef_supported() const { return false; } virtual bool is_ndef_supported() const
{
return false;
}
struct Delegate { struct Delegate {
/** /**
@ -64,7 +67,10 @@ namespace nfc {
* @param[in] capacity the buffer's capacity * @param[in] capacity the buffer's capacity
* @return the number of bytes actually used * @return the number of bytes actually used
*/ */
virtual size_t build_ndef_message(uint8_t* buffer, size_t capacity) { return 0; } virtual size_t build_ndef_message(uint8_t *buffer, size_t capacity)
{
return 0;
}
}; };
/** /**

View File

@ -16,17 +16,18 @@
#include "PN512Driver.h" #include "PN512Driver.h"
PN512Driver::PN512Driver(PN512TransportDriver* transport_driver) : NFCControllerDriver(), _transport_driver(transport_driver) { PN512Driver::PN512Driver(PN512TransportDriver *transport_driver) : NFCControllerDriver(), _transport_driver(transport_driver)
{
_transport_driver->set_delegate(this); _transport_driver->set_delegate(this);
} }
nfc_transceiver_t* PN512Driver::initialize(nfc_scheduler_timer_t* scheduler_timer) { nfc_transceiver_t *PN512Driver::initialize(nfc_scheduler_timer_t *scheduler_timer)
{
// Initialize transport // Initialize transport
_transport_driver->initialize(); _transport_driver->initialize();
nfc_err_t ret = pn512_init(&pn512, _transport_driver->get_transport(), scheduler_timer); nfc_err_t ret = pn512_init(&pn512, _transport_driver->get_transport(), scheduler_timer);
if( ret != NFC_OK ) if (ret != NFC_OK) {
{
NFC_ERR("PN512 init error (%d)", ret); NFC_ERR("PN512 init error (%d)", ret);
return NULL; return NULL;
} }
@ -35,7 +36,8 @@ nfc_transceiver_t* PN512Driver::initialize(nfc_scheduler_timer_t* scheduler_time
return pn512_get_transceiver(&pn512); return pn512_get_transceiver(&pn512);
} }
void PN512Driver::get_supported_nfc_techs(nfc_tech_t* initiator, nfc_tech_t* target) const { void PN512Driver::get_supported_nfc_techs(nfc_tech_t *initiator, nfc_tech_t *target) const
{
initiator->nfc_type1 = 0; initiator->nfc_type1 = 0;
initiator->nfc_type2 = 1; initiator->nfc_type2 = 1;
initiator->nfc_type3 = 1; initiator->nfc_type3 = 1;
@ -55,6 +57,7 @@ void PN512Driver::get_supported_nfc_techs(nfc_tech_t* initiator, nfc_tech_t* tar
target->nfc_nfc_dep_f_424 = 1; target->nfc_nfc_dep_f_424 = 1;
} }
void PN512Driver::on_hw_interrupt() { void PN512Driver::on_hw_interrupt()
{
hw_interrupt(); // Propagate interrupt signal hw_interrupt(); // Propagate interrupt signal
} }

View File

@ -26,7 +26,8 @@ PN512SPITransportDriver::PN512SPITransportDriver(PinName mosi, PinName miso, Pin
_spi(mosi, miso, sclk), _spi(mosi, miso, sclk),
_ssel(ssel, 1), _ssel(ssel, 1),
_irq(irq, PullNone), _irq(irq, PullNone),
_rst(rst, 1) { _rst(rst, 1)
{
// Use SPI mode 0 // Use SPI mode 0
_spi.format(8, 0); _spi.format(8, 0);
@ -38,7 +39,8 @@ PN512SPITransportDriver::PN512SPITransportDriver(PinName mosi, PinName miso, Pin
nfc_transport_init(&_nfc_transport, &PN512SPITransportDriver::s_transport_write, &PN512SPITransportDriver::s_transport_read, this); nfc_transport_init(&_nfc_transport, &PN512SPITransportDriver::s_transport_write, &PN512SPITransportDriver::s_transport_read, this);
} }
void PN512SPITransportDriver::initialize() { void PN512SPITransportDriver::initialize()
{
// Deactivate IRQ // Deactivate IRQ
_irq.rise(callback(NULL)); _irq.rise(callback(NULL));
@ -53,11 +55,13 @@ void PN512SPITransportDriver::initialize() {
_irq.rise(callback(this, &PN512SPITransportDriver::hw_interrupt)); _irq.rise(callback(this, &PN512SPITransportDriver::hw_interrupt));
} }
nfc_transport_t* PN512SPITransportDriver::get_transport() const { nfc_transport_t *PN512SPITransportDriver::get_transport() const
{
return &_nfc_transport; return &_nfc_transport;
} }
void PN512SPITransportDriver::transport_write( uint8_t address, const uint8_t* outBuf, size_t outLen ) { void PN512SPITransportDriver::transport_write(uint8_t address, const uint8_t *outBuf, size_t outLen)
{
if (outLen == 0) { if (outLen == 0) {
return; return;
} }
@ -70,7 +74,8 @@ void PN512SPITransportDriver::transport_write( uint8_t address, const uint8_t* o
_ssel = 1; _ssel = 1;
} }
void PN512SPITransportDriver::transport_read( uint8_t address, uint8_t* inBuf, size_t inLen ) { void PN512SPITransportDriver::transport_read(uint8_t address, uint8_t *inBuf, size_t inLen)
{
if (inLen == 0) { if (inLen == 0) {
return; return;
} }
@ -93,12 +98,14 @@ void PN512SPITransportDriver::transport_read( uint8_t address, uint8_t* inBuf, s
} }
// Callbacks from munfc // Callbacks from munfc
static void PN512SPITransportDriver::s_transport_write( uint8_t address, const uint8_t* outBuf, size_t outLen, void* pUser ) { static void PN512SPITransportDriver::s_transport_write(uint8_t address, const uint8_t *outBuf, size_t outLen, void *pUser)
{
PN512SPITransportDriver *self = (PN512SPITransportDriver *)pUser; PN512SPITransportDriver *self = (PN512SPITransportDriver *)pUser;
self->transport_write(address, outBuf, outLen); self->transport_write(address, outBuf, outLen);
} }
static void PN512SPITransportDriver::s_transport_read( uint8_t address, uint8_t* inBuf, size_t inLen, void* pUser ) { static void PN512SPITransportDriver::s_transport_read(uint8_t address, uint8_t *inBuf, size_t inLen, void *pUser)
{
PN512SPITransportDriver *self = (PN512SPITransportDriver *)pUser; PN512SPITransportDriver *self = (PN512SPITransportDriver *)pUser;
self->transport_read(address, inBuf, inLen); self->transport_read(address, inBuf, inLen);
} }

View File

@ -19,15 +19,18 @@
using namespace mbed; using namespace mbed;
using namespace mbed::nfc; using namespace mbed::nfc;
PN512TransportDriver::PN512TransportDriver() : _delegate(NULL) { PN512TransportDriver::PN512TransportDriver() : _delegate(NULL)
{
} }
void PN512TransportDriver::set_delegate(Delegate* delegate) { void PN512TransportDriver::set_delegate(Delegate *delegate)
{
_delegate = delegate; _delegate = delegate;
} }
void PN512TransportDriver::hw_interrupt() { void PN512TransportDriver::hw_interrupt()
{
if (_delegate != NULL) { if (_delegate != NULL) {
_delegate->on_hw_interrupt(); _delegate->on_hw_interrupt();
} }

View File

@ -168,7 +168,8 @@ void NFCController::polling_callback(nfc_err_t ret)
} }
} }
void NFCController::scheduler_process(bool hw_interrupt) { void NFCController::scheduler_process(bool hw_interrupt)
{
_timer.detach(); // Cancel timeout - if it triggers, it's ok as we'll have an "early" iteration which will likely be a no-op _timer.detach(); // Cancel timeout - if it triggers, it's ok as we'll have an "early" iteration which will likely be a no-op
// Process stack events // Process stack events
@ -177,13 +178,15 @@ void NFCController::scheduler_process(bool hw_interrupt) {
_timer.attach(callback(this, &NFCController::on_timeout)); _timer.attach(callback(this, &NFCController::on_timeout));
} }
void NFCController::on_hw_interrupt() { void NFCController::on_hw_interrupt()
{
// Run scheduler - this is called in interrupt context // Run scheduler - this is called in interrupt context
_timer.detach(); // Cancel timeout - if it triggers anyways, it's ok _timer.detach(); // Cancel timeout - if it triggers anyways, it's ok
_queue->call(this, NFCController::scheduler_process, true); _queue->call(this, NFCController::scheduler_process, true);
} }
void NFCController::on_timeout() { void NFCController::on_timeout()
{
// Run scheduler - this is called in interrupt context // Run scheduler - this is called in interrupt context
_queue->call(this, NFCController::scheduler_process, false); _queue->call(this, NFCController::scheduler_process, false);
} }
@ -195,26 +198,31 @@ static void NFCController::s_polling_callback(nfc_transceiver_t* pTransceiver, n
} }
// Implementation nfc_scheduler_timer_t // Implementation nfc_scheduler_timer_t
void nfc_scheduler_timer_init(nfc_scheduler_timer_t* timer) { void nfc_scheduler_timer_init(nfc_scheduler_timer_t *timer)
{
(void)timer; // This is a no-op (void)timer; // This is a no-op
} }
void nfc_scheduler_timer_start(nfc_scheduler_timer_t* timer) { void nfc_scheduler_timer_start(nfc_scheduler_timer_t *timer)
{
Timer *mbed_timer = (Timer *)timer; Timer *mbed_timer = (Timer *)timer;
mbed_timer->start(); mbed_timer->start();
} }
uint32_t nfc_scheduler_timer_get(nfc_scheduler_timer_t* timer) { uint32_t nfc_scheduler_timer_get(nfc_scheduler_timer_t *timer)
{
Timer *mbed_timer = (Timer *)timer; Timer *mbed_timer = (Timer *)timer;
return (uint32_t)mbed_timer->read_ms(); return (uint32_t)mbed_timer->read_ms();
} }
void nfc_scheduler_timer_stop(nfc_scheduler_timer_t* timer) { void nfc_scheduler_timer_stop(nfc_scheduler_timer_t *timer)
{
Timer *mbed_timer = (Timer *)timer; Timer *mbed_timer = (Timer *)timer;
mbed_timer->stop(); mbed_timer->stop();
} }
void nfc_scheduler_timer_reset(nfc_scheduler_timer_t* timer) { void nfc_scheduler_timer_reset(nfc_scheduler_timer_t *timer)
{
Timer *mbed_timer = (Timer *)timer; Timer *mbed_timer = (Timer *)timer;
mbed_timer->reset(); mbed_timer->reset();
} }

View File

@ -19,15 +19,18 @@
using namespace mbed; using namespace mbed;
using namespace mbed::nfc; using namespace mbed::nfc;
NFCControllerDriver::NFCControllerDriver() : _delegate(NULL) { NFCControllerDriver::NFCControllerDriver() : _delegate(NULL)
{
} }
void NFCControllerDriver::set_delegate(Delegate* delegate) { void NFCControllerDriver::set_delegate(Delegate *delegate)
{
_delegate = delegate; _delegate = delegate;
} }
void NFCControllerDriver::hw_interrupt() { void NFCControllerDriver::hw_interrupt()
{
if (_delegate != NULL) { if (_delegate != NULL) {
_delegate->on_hw_interrupt(); _delegate->on_hw_interrupt();
} }

View File

@ -26,7 +26,8 @@ NFCEEPROM(NFCEEPROMDriver* driver, events::EventQueue* queue, uint8_t* ndef_buff
_driver->set_delegate(this); _driver->set_delegate(this);
} }
nfc_err_t NFCEEPROM::initialize() { nfc_err_t NFCEEPROM::initialize()
{
MBED_ASSERT(_initialized == false); // Initialize should only be called once MBED_ASSERT(_initialized == false); // Initialize should only be called once
// Initialize driver // Initialize driver
@ -34,11 +35,13 @@ nfc_err_t NFCEEPROM::initialize() {
_initialized = true; _initialized = true;
} }
void NFCEEPROM::set_delegate(NFCEEPROM::Delegate* delegate) { void NFCEEPROM::set_delegate(NFCEEPROM::Delegate *delegate)
{
_delegate = delegate; _delegate = delegate;
} }
void NFCEEPROM::write_ndef_message() { void NFCEEPROM::write_ndef_message()
{
MBED_ASSERT(_initialized == true); MBED_ASSERT(_initialized == true);
if (_current_op != nfc_eeprom_idle) { if (_current_op != nfc_eeprom_idle) {
if (_delegate != NULL) { if (_delegate != NULL) {
@ -73,7 +76,8 @@ void NFCEEPROM::write_ndef_message() {
// 4 - End session // 4 - End session
} }
void NFCEEPROM::read_ndef_message() { void NFCEEPROM::read_ndef_message()
{
MBED_ASSERT(_initialized == true); MBED_ASSERT(_initialized == true);
if (_current_op != nfc_eeprom_idle) { if (_current_op != nfc_eeprom_idle) {
if (_delegate != NULL) { if (_delegate != NULL) {
@ -96,7 +100,8 @@ void NFCEEPROM::read_ndef_message() {
// 4 - End session // 4 - End session
} }
void NFCEEPROM::erase_ndef_message() { void NFCEEPROM::erase_ndef_message()
{
// We don't want to take any risks, so erase the whole address space // We don't want to take any risks, so erase the whole address space
// And set the message size to 0 // And set the message size to 0
@ -122,7 +127,8 @@ void NFCEEPROM::erase_ndef_message() {
// 4 - End session // 4 - End session
} }
void NFCEEPROM::on_session_started(bool success) { void NFCEEPROM::on_session_started(bool success)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_write_start_session: case nfc_eeprom_write_start_session:
if (!success) { if (!success) {
@ -158,7 +164,8 @@ void NFCEEPROM::on_session_started(bool success) {
} }
} }
void NFCEEPROM::on_session_ended(bool success) { void NFCEEPROM::on_session_ended(bool success)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_write_end_session: case nfc_eeprom_write_end_session:
if (!success) { if (!success) {
@ -204,7 +211,8 @@ void NFCEEPROM::on_session_ended(bool success) {
} }
} }
void NFCEEPROM::on_bytes_read(size_t count) { void NFCEEPROM::on_bytes_read(size_t count)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_read_read_bytes: case nfc_eeprom_read_read_bytes:
if (count == 0) { if (count == 0) {
@ -227,7 +235,8 @@ void NFCEEPROM::on_bytes_read(size_t count) {
} }
} }
void NFCEEPROM::on_bytes_written(size_t count) { void NFCEEPROM::on_bytes_written(size_t count)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_write_write_bytes: case nfc_eeprom_write_write_bytes:
if (count == 0) { if (count == 0) {
@ -249,7 +258,8 @@ void NFCEEPROM::on_bytes_written(size_t count) {
} }
} }
void NFCEEPROM::on_size_written(bool success) { void NFCEEPROM::on_size_written(bool success)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_write_write_size: case nfc_eeprom_write_write_size:
if (!success) { if (!success) {
@ -280,7 +290,8 @@ void NFCEEPROM::on_size_written(bool success) {
} }
} }
void NFCEEPROM::on_size_read(bool success, size_t size) { void NFCEEPROM::on_size_read(bool success, size_t size)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_read_read_size: case nfc_eeprom_read_read_size:
if (!success) { if (!success) {
@ -293,8 +304,7 @@ void NFCEEPROM::on_size_read(bool success, size_t size) {
ac_buffer_builder_reset(buffer_builder); ac_buffer_builder_reset(buffer_builder);
// Check that we have a big enough buffer to read the message // Check that we have a big enough buffer to read the message
if( size > ac_buffer_builder_writable(buffer_builder) ) if (size > ac_buffer_builder_writable(buffer_builder)) {
{
// Not enough space, close session // Not enough space, close session
_current_op = nfc_eeprom_read_end_session; _current_op = nfc_eeprom_read_end_session;
_operation_result = NFC_ERR_BUFFER_TOO_SMALL; _operation_result = NFC_ERR_BUFFER_TOO_SMALL;
@ -317,7 +327,8 @@ void NFCEEPROM::on_size_read(bool success, size_t size) {
} }
} }
void NFCEEPROM::on_bytes_erased(size_t count) { void NFCEEPROM::on_bytes_erased(size_t count)
{
switch (_current_op) { switch (_current_op) {
case nfc_eeprom_erase_erase_bytes: case nfc_eeprom_erase_erase_bytes:
if (count == 0) { if (count == 0) {
@ -338,49 +349,51 @@ void NFCEEPROM::on_bytes_erased(size_t count) {
} }
} }
void NFCEEPROM::on_event() { void NFCEEPROM::on_event()
{
// Just schedule a task on event queue // Just schedule a task on event queue
_queue->call(_driver, NFCEEPROMDriver::process_events); _queue->call(_driver, NFCEEPROMDriver::process_events);
} }
void NFCEEPROM::continue_write() { void NFCEEPROM::continue_write()
{
if (ac_buffer_reader_readable(&_ndef_buffer_reader) > 0) { if (ac_buffer_reader_readable(&_ndef_buffer_reader) > 0) {
// Continue writing // Continue writing
_driver->write_bytes(_eeprom_address, ac_buffer_reader_current_buffer_pointer(&_ndef_buffer_reader), ac_buffer_reader_current_buffer_length(&_ndef_buffer_reader)); _driver->write_bytes(_eeprom_address, ac_buffer_reader_current_buffer_pointer(&_ndef_buffer_reader), ac_buffer_reader_current_buffer_length(&_ndef_buffer_reader));
} } else {
else {
// Now update size // Now update size
_current_op = nfc_eeprom_write_write_size; _current_op = nfc_eeprom_write_write_size;
_driver->write_size(_eeprom_address); _driver->write_size(_eeprom_address);
} }
} }
void NFCEEPROM::continue_erase() { void NFCEEPROM::continue_erase()
{
if (_eeprom_address < _driver->get_max_size()) { if (_eeprom_address < _driver->get_max_size()) {
// Continue erasing // Continue erasing
_driver->erase_bytes(_eeprom_address, _driver->get_max_size() - _eeprom_address); _driver->erase_bytes(_eeprom_address, _driver->get_max_size() - _eeprom_address);
} } else {
else {
// Now update size // Now update size
_current_op = nfc_eeprom_erase_write_size; _current_op = nfc_eeprom_erase_write_size;
_driver->write_size(0); _driver->write_size(0);
} }
} }
void NFCEEPROM::continue_read() { void NFCEEPROM::continue_read()
{
if (_eeprom_address < _ndef_buffer_read_sz) { if (_eeprom_address < _ndef_buffer_read_sz) {
// Continue reading // Continue reading
ac_buffer_builder_t *buffer_builder = ndef_msg_buffer_builder(ndef_message()); ac_buffer_builder_t *buffer_builder = ndef_msg_buffer_builder(ndef_message());
_driver->read_bytes(_eeprom_address, ac_buffer_builder_write_position(buffer_builder), _ndef_buffer_read_sz - _eeprom_address); _driver->read_bytes(_eeprom_address, ac_buffer_builder_write_position(buffer_builder), _ndef_buffer_read_sz - _eeprom_address);
} } else {
else {
// Done, close session // Done, close session
_operation_result = NFC_OK; _operation_result = NFC_OK;
_driver->end_session(); _driver->end_session();
} }
} }
void NFCEEPROM::handle_error(nfc_err_t ret) { void NFCEEPROM::handle_error(nfc_err_t ret)
{
// Save & reset current op // Save & reset current op
nfc_eeprom_operation_t last_op = _current_op; nfc_eeprom_operation_t last_op = _current_op;
_current_op = nfc_eeprom_idle; _current_op = nfc_eeprom_idle;
@ -388,11 +401,9 @@ void NFCEEPROM::handle_error(nfc_err_t ret) {
if (_delegate != NULL) { if (_delegate != NULL) {
if (last_op <= nfc_eeprom_write_end_session) { if (last_op <= nfc_eeprom_write_end_session) {
_delegate->on_ndef_message_written(ret); _delegate->on_ndef_message_written(ret);
} } else if (last_op <= nfc_eeprom_read_end_session) {
else if(last_op <= nfc_eeprom_read_end_session) {
_delegate->on_ndef_message_read(ret); _delegate->on_ndef_message_read(ret);
} } else if (last_op <= nfc_eeprom_erase_end_session) {
else if(last_op <= nfc_eeprom_erase_end_session) {
_delegate->on_ndef_message_erased(ret); _delegate->on_ndef_message_erased(ret);
} }
} }

View File

@ -19,10 +19,12 @@
using namespace mbed; using namespace mbed;
using namespace mbed::nfc; using namespace mbed::nfc;
NFCEEPROMDriver::NFCEEPROMDriver() : _delegate(NULL) { NFCEEPROMDriver::NFCEEPROMDriver() : _delegate(NULL)
{
} }
void NFCEEPROMDriver::set_delegate(Delegate* delegate) { void NFCEEPROMDriver::set_delegate(Delegate *delegate)
{
_delegate = delegate; _delegate = delegate;
} }

View File

@ -52,22 +52,26 @@ void NFCNDEFCapable::build_ndef_message(ac_buffer_builder_t& buffer_builder)
} }
} }
nfc_err_t NFCNDEFCapable::s_ndef_encode(ndef_msg_t* pTag, buffer_builder_t* pBufferBldr, void* pUserData) { nfc_err_t NFCNDEFCapable::s_ndef_encode(ndef_msg_t *pTag, buffer_builder_t *pBufferBldr, void *pUserData)
{
NFCNDEFCapable *self = (NFCNDEFCapable *)pUserData; NFCNDEFCapable *self = (NFCNDEFCapable *)pUserData;
self->ndef_encode(pBufferBldr); self->ndef_encode(pBufferBldr);
} }
nfc_err_t NFCNDEFCapable::s_ndef_decode(ndef_msg_t* pTag, buffer_t* pBuffer, void* pUserData) { nfc_err_t NFCNDEFCapable::s_ndef_decode(ndef_msg_t *pTag, buffer_t *pBuffer, void *pUserData)
{
NFCNDEFCapable *self = (NFCNDEFCapable *)pUserData; NFCNDEFCapable *self = (NFCNDEFCapable *)pUserData;
self->ndef_decode(pBuffer); self->ndef_decode(pBuffer);
} }
nfc_err_t NFCNDEFCapable::ndef_encode(buffer_builder_t* pBufferBldr) { nfc_err_t NFCNDEFCapable::ndef_encode(buffer_builder_t *pBufferBldr)
{
build_ndef_message(buffer_builder); build_ndef_message(buffer_builder);
return NFC_OK; return NFC_OK;
} }
nfc_err_t NFCNDEFCapable::ndef_decode(buffer_t* pBuffer) { nfc_err_t NFCNDEFCapable::ndef_decode(buffer_t *pBuffer)
{
parse_ndef_message(pBuffer); parse_ndef_message(pBuffer);
return NFC_OK; return NFC_OK;
} }

View File

@ -25,19 +25,21 @@
using namespace mbed; using namespace mbed;
using namespace mbed::nfc; using namespace mbed::nfc;
NFCRemoteEndpoint::NFCRemoteEndpoint(NFCController* controller) : _controller(controller), _is_lost(false) { NFCRemoteEndpoint::NFCRemoteEndpoint(NFCController *controller) : _controller(controller), _is_lost(false)
{
} }
bool NFCRemoteEndpoint::is_lost() const { bool NFCRemoteEndpoint::is_lost() const
{
return _is_lost; return _is_lost;
} }
nfc_rf_protocols_bitmask_t NFCRemoteEndpoint::rf_protocols() { nfc_rf_protocols_bitmask_t NFCRemoteEndpoint::rf_protocols()
{
nfc_rf_protocols_bitmask_t rf_protocols = {0}; nfc_rf_protocols_bitmask_t rf_protocols = {0};
nfc_tech_t active_tech = transceiver_get_active_techs(_transceiver); nfc_tech_t active_tech = transceiver_get_active_techs(_transceiver);
if(!transceiver_is_initiator_mode(_transceiver)) if (!transceiver_is_initiator_mode(_transceiver)) {
{
// Note: We only support ISO-DEP for now // Note: We only support ISO-DEP for now
rf_protocols.target_iso_dep = active_tech.nfc_iso_dep_a || active_tech.nfc_iso_dep_b; rf_protocols.target_iso_dep = active_tech.nfc_iso_dep_a || active_tech.nfc_iso_dep_b;
} }
@ -45,11 +47,13 @@ nfc_rf_protocols_bitmask_t NFCRemoteEndpoint::rf_protocols() {
return rf_protocols; return rf_protocols;
} }
void NFCRemoteEndpoint::set_lost() { void NFCRemoteEndpoint::set_lost()
{
_is_lost = true; _is_lost = true;
} }
NFCController* NFCRemoteEndpoint::nfc_controller() const { NFCController *NFCRemoteEndpoint::nfc_controller() const
{
return _controller; return _controller;
} }

View File

@ -20,11 +20,13 @@ using namespace mbed;
using namespace mbed::nfc; using namespace mbed::nfc;
NFCRemoteInitiator::NFCRemoteInitiator(NFCController *controller, uint8_t *buffer, size_t buffer_size) : NFCRemoteInitiator::NFCRemoteInitiator(NFCController *controller, uint8_t *buffer, size_t buffer_size) :
NFCRemoteEndpoint(controller), NFCNDEFCapable(buffer, buffer_size) { NFCRemoteEndpoint(controller), NFCNDEFCapable(buffer, buffer_size)
{
} }
NFCRemoteInitiator::~NFCRemoteInitiator() { NFCRemoteInitiator::~NFCRemoteInitiator()
{
} }

View File

@ -20,10 +20,12 @@ using namespace mbed;
using namespace mbed::nfc; using namespace mbed::nfc;
NFCTarget::NFCTarget(uint8_t *buffer, size_t buffer_size) : NFCTarget::NFCTarget(uint8_t *buffer, size_t buffer_size) :
NFCNDEFCapable(buffer, buffer_size) { NFCNDEFCapable(buffer, buffer_size)
{
} }
NFCTarget::~NFCTarget() { NFCTarget::~NFCTarget()
{
} }

View File

@ -30,7 +30,8 @@ using namespace mbed::nfc;
Type4RemoteInitiator::Type4RemoteInitiator(NFCController *controller, uint8_t *buffer, size_t buffer_size) : Type4RemoteInitiator::Type4RemoteInitiator(NFCController *controller, uint8_t *buffer, size_t buffer_size) :
NFCRemoteInitiator(ndef_buffer, ndef_buffer_sz), NFCRemoteInitiator(ndef_buffer, ndef_buffer_sz),
_controller(controller), _is_connected(false) , _is_disconnected(false), _apps(NULL) { _controller(controller), _is_connected(false), _is_disconnected(false), _apps(NULL)
{
// Init ISO7816 // Init ISO7816
nfc_tech_iso7816_init(&_iso7816, _controller->transceiver(), &Type4RemoteInitiator::s_disconnected_callback, this); nfc_tech_iso7816_init(&_iso7816, _controller->transceiver(), &Type4RemoteInitiator::s_disconnected_callback, this);
@ -38,7 +39,8 @@ Type4RemoteInitiator::Type4RemoteInitiator(NFCController* controller, uint8_t* b
nfc_tech_type4_target_init(&_type4, &_iso7816, ndef_message()); nfc_tech_type4_target_init(&_type4, &_iso7816, ndef_message());
} }
nfc_err_t Type4RemoteInitiator::connect() { nfc_err_t Type4RemoteInitiator::connect()
{
if (_is_connected) { if (_is_connected) {
return NFC_BUSY; return NFC_BUSY;
} }
@ -54,7 +56,8 @@ nfc_err_t Type4RemoteInitiator::connect() {
connected(); connected();
} }
nfc_err_t Type4RemoteInitiator::disconnect() { nfc_err_t Type4RemoteInitiator::disconnect()
{
if (!_is_connected) { if (!_is_connected) {
return NFC_OK; return NFC_OK;
} }
@ -67,19 +70,21 @@ nfc_err_t Type4RemoteInitiator::disconnect() {
nfc_tech_iso7816_disconnect(&_iso7816); nfc_tech_iso7816_disconnect(&_iso7816);
} }
bool Type4RemoteInitiator::is_connected() const { bool Type4RemoteInitiator::is_connected() const
{
return _is_connected; return _is_connected;
} }
bool Type4RemoteInitiator::is_disconnected() const { bool Type4RemoteInitiator::is_disconnected() const
{
return _is_disconnected; return _is_disconnected;
} }
nfc_rf_protocols_bitmask_t Type4RemoteInitiator::rf_protocols() { nfc_rf_protocols_bitmask_t Type4RemoteInitiator::rf_protocols()
{
nfc_rf_protocols_bitmask_t rf_protocols = {0}; nfc_rf_protocols_bitmask_t rf_protocols = {0};
nfc_tech_t active_tech = transceiver_get_active_techs(_transceiver); nfc_tech_t active_tech = transceiver_get_active_techs(_transceiver);
if(!transceiver_is_initiator_mode(_transceiver)) if (!transceiver_is_initiator_mode(_transceiver)) {
{
// We only support ISO-DEP // We only support ISO-DEP
rf_protocols.target_iso_dep = active_tech.nfc_iso_dep_a || active_tech.nfc_iso_dep_b; rf_protocols.target_iso_dep = active_tech.nfc_iso_dep_a || active_tech.nfc_iso_dep_b;
} }
@ -87,24 +92,27 @@ nfc_rf_protocols_bitmask_t Type4RemoteInitiator::rf_protocols() {
return rf_protocols; return rf_protocols;
} }
virtual nfc_tag_type_t Type4RemoteInitiator::nfc_tag_type() const { virtual nfc_tag_type_t Type4RemoteInitiator::nfc_tag_type() const
{
nfc_tech_t active_tech = transceiver_get_active_techs(_transceiver); nfc_tech_t active_tech = transceiver_get_active_techs(_transceiver);
if (active_tech.nfc_iso_dep_a) { if (active_tech.nfc_iso_dep_a) {
return nfc_tag_type_4a; return nfc_tag_type_4a;
} } else { // if(active_tech.nfc_iso_dep_b)
else { // if(active_tech.nfc_iso_dep_b)
return nfc_tag_type_4b; return nfc_tag_type_4b;
} }
} }
virtual bool Type4RemoteInitiator::is_iso7816_supported() const { virtual bool Type4RemoteInitiator::is_iso7816_supported() const
{
return true; return true;
} }
virtual void Type4RemoteInitiator::add_iso7816_application(ISO7816App* application) { virtual void Type4RemoteInitiator::add_iso7816_application(ISO7816App *application)
{
nfc_tech_iso7816_add_app(&_iso7816, application->_iso7816_app); nfc_tech_iso7816_add_app(&_iso7816, application->_iso7816_app);
} }
virtual bool Type4RemoteInitiator::is_ndef_supported() const { virtual bool Type4RemoteInitiator::is_ndef_supported() const
{
return true; return true;
} }

View File

@ -51,8 +51,7 @@ typedef nfc_err_t (*ndef_encode_fn_t)(ndef_msg_t* pTag, buffer_builder_t* pBuffe
*/ */
typedef nfc_err_t (*ndef_decode_fn_t)(ndef_msg_t *pTag, buffer_t *pBuffer, void *pUserData); typedef nfc_err_t (*ndef_decode_fn_t)(ndef_msg_t *pTag, buffer_t *pBuffer, void *pUserData);
typedef struct __ndef_msg typedef struct __ndef_msg {
{
ndef_encode_fn_t encode; ndef_encode_fn_t encode;
ndef_decode_fn_t decode; ndef_decode_fn_t decode;
buffer_builder_t bufferBldr; buffer_builder_t bufferBldr;
@ -63,8 +62,7 @@ void ndef_msg_init( ndef_msg_t* pNdef, ndef_encode_fn_t encode, ndef_decode_fn_t
static inline nfc_err_t ndef_msg_encode(ndef_msg_t *pNdef) static inline nfc_err_t ndef_msg_encode(ndef_msg_t *pNdef)
{ {
if(pNdef->encode == NULL) if (pNdef->encode == NULL) {
{
return NFC_OK; return NFC_OK;
} }
return pNdef->encode(pNdef, &pNdef->bufferBldr, pNdef->pUserData); return pNdef->encode(pNdef, &pNdef->bufferBldr, pNdef->pUserData);
@ -72,8 +70,7 @@ static inline nfc_err_t ndef_msg_encode(ndef_msg_t* pNdef)
static inline nfc_err_t ndef_msg_decode(ndef_msg_t *pNdef) static inline nfc_err_t ndef_msg_decode(ndef_msg_t *pNdef)
{ {
if(pNdef->decode == NULL) if (pNdef->decode == NULL) {
{
return NFC_OK; return NFC_OK;
} }
return pNdef->decode(pNdef, buffer_builder_buffer(&pNdef->bufferBldr), pNdef->pUserData); return pNdef->decode(pNdef, buffer_builder_buffer(&pNdef->bufferBldr), pNdef->pUserData);

View File

@ -21,7 +21,8 @@
#if NFC_DEBUG && !defined(NDEBUG) #if NFC_DEBUG && !defined(NDEBUG)
#include "stdio.h" #include "stdio.h"
#include "stdarg.h" #include "stdarg.h"
static inline void nfc_dbg_print(const char* type, const char* module, unsigned int line, const char* fmt, ...) { static inline void nfc_dbg_print(const char *type, const char *module, unsigned int line, const char *fmt, ...)
{
#if !defined(NDEBUG) #if !defined(NDEBUG)
printf("NFC [%s] %s:%u ", type, module, line); printf("NFC [%s] %s:%u ", type, module, line);
va_list args; va_list args;

View File

@ -41,8 +41,7 @@ void nfc_scheduler_init(nfc_scheduler_t* pScheduler, nfc_scheduler_timer_t* pTim
uint32_t nfc_scheduler_iteration(nfc_scheduler_t *pScheduler, uint32_t events) uint32_t nfc_scheduler_iteration(nfc_scheduler_t *pScheduler, uint32_t events)
{ {
bool triggered = false; bool triggered = false;
while(true) while (true) {
{
nfc_task_t *pPrioTask = NULL; nfc_task_t *pPrioTask = NULL;
nfc_task_t *pPrioTaskPrevious = NULL; nfc_task_t *pPrioTaskPrevious = NULL;
uint32_t prioTaskEvent = 0; uint32_t prioTaskEvent = 0;
@ -50,8 +49,7 @@ uint32_t nfc_scheduler_iteration(nfc_scheduler_t* pScheduler, uint32_t events)
nfc_task_t *pPreviousTask = NULL; nfc_task_t *pPreviousTask = NULL;
nfc_task_t *pTask = pScheduler->pNext; nfc_task_t *pTask = pScheduler->pNext;
if( pTask == NULL ) if (pTask == NULL) {
{
NFC_DBG("Empty queue, %lu ms elapsed", nfc_scheduler_timer_get(pScheduler->pTimer)); NFC_DBG("Empty queue, %lu ms elapsed", nfc_scheduler_timer_get(pScheduler->pTimer));
//Empty queue, return //Empty queue, return
return MAX_TIMEOUT; return MAX_TIMEOUT;
@ -62,11 +60,9 @@ uint32_t nfc_scheduler_iteration(nfc_scheduler_t* pScheduler, uint32_t events)
NFC_DBG("%lu ms elapsed", timeElapsed); NFC_DBG("%lu ms elapsed", timeElapsed);
nfc_scheduler_timer_reset(pScheduler->pTimer); nfc_scheduler_timer_reset(pScheduler->pTimer);
do do {
{
//Apply timeouts //Apply timeouts
if( pTask->events & EVENT_TIMEOUT ) if (pTask->events & EVENT_TIMEOUT) {
{
pTask->timeout -= timeElapsed; pTask->timeout -= timeElapsed;
} }
pPreviousTask = pTask; pPreviousTask = pTask;
@ -76,11 +72,9 @@ uint32_t nfc_scheduler_iteration(nfc_scheduler_t* pScheduler, uint32_t events)
pTask = pScheduler->pNext; pTask = pScheduler->pNext;
pPreviousTask = NULL; pPreviousTask = NULL;
timeout = MAX_TIMEOUT; timeout = MAX_TIMEOUT;
do do {
{
//Check which task should be woken up first //Check which task should be woken up first
if( (events & EVENT_HW_INTERRUPT) && (pTask->events & EVENT_HW_INTERRUPT) ) if ((events & EVENT_HW_INTERRUPT) && (pTask->events & EVENT_HW_INTERRUPT)) {
{
//Hardware interrupts have prio //Hardware interrupts have prio
pPrioTask = pTask; pPrioTask = pTask;
pPrioTaskPrevious = pPreviousTask; pPrioTaskPrevious = pPreviousTask;
@ -88,9 +82,7 @@ uint32_t nfc_scheduler_iteration(nfc_scheduler_t* pScheduler, uint32_t events)
events &= ~EVENT_HW_INTERRUPT; //Only one task gets triggered per event events &= ~EVENT_HW_INTERRUPT; //Only one task gets triggered per event
prioTaskEvent = EVENT_HW_INTERRUPT; prioTaskEvent = EVENT_HW_INTERRUPT;
break; break;
} } else if ((pTask->events & EVENT_TIMEOUT) && (pTask->timeout < timeout)) {
else if( (pTask->events & EVENT_TIMEOUT) && (pTask->timeout < timeout) )
{
pPrioTask = pTask; pPrioTask = pTask;
pPrioTaskPrevious = pPreviousTask; pPrioTaskPrevious = pPreviousTask;
timeout = pTask->timeout; timeout = pTask->timeout;
@ -100,35 +92,27 @@ uint32_t nfc_scheduler_iteration(nfc_scheduler_t* pScheduler, uint32_t events)
pTask = pTask->pNext; pTask = pTask->pNext;
} while (pTask != NULL); } while (pTask != NULL);
if( pPrioTask == NULL ) if (pPrioTask == NULL) {
{
//No task to wake up, exit //No task to wake up, exit
NFC_DBG("No task to wake up"); NFC_DBG("No task to wake up");
return MAX_TIMEOUT; return MAX_TIMEOUT;
} }
if( timeout > 0 ) if (timeout > 0) {
{
//No task to wake up yet //No task to wake up yet
if( timeout > MAX_TIMEOUT ) if (timeout > MAX_TIMEOUT) {
{
NFC_DBG("No task to wake up"); NFC_DBG("No task to wake up");
return MAX_TIMEOUT; return MAX_TIMEOUT;
} } else {
else
{
NFC_DBG("No task to wake up, wait %lu ms", timeout); NFC_DBG("No task to wake up, wait %lu ms", timeout);
return timeout; return timeout;
} }
} }
//Dequeue task //Dequeue task
if( pPrioTaskPrevious == NULL ) if (pPrioTaskPrevious == NULL) {
{
pScheduler->pNext = pPrioTask->pNext; pScheduler->pNext = pPrioTask->pNext;
} } else {
else
{
pPrioTaskPrevious->pNext = pPrioTask->pNext; pPrioTaskPrevious->pNext = pPrioTask->pNext;
} }
pPrioTask->pNext = NULL; pPrioTask->pNext = NULL;
@ -149,13 +133,11 @@ void nfc_scheduler_queue_task(nfc_scheduler_t* pScheduler, nfc_task_t* pTask)
//Find last task //Find last task
nfc_task_t *pPrevTask = pScheduler->pNext; nfc_task_t *pPrevTask = pScheduler->pNext;
pTask->pNext = NULL; pTask->pNext = NULL;
if( pPrevTask == NULL ) if (pPrevTask == NULL) {
{
pScheduler->pNext = pTask; pScheduler->pNext = pTask;
return; return;
} }
while( pPrevTask->pNext != NULL ) while (pPrevTask->pNext != NULL) {
{
pPrevTask = pPrevTask->pNext; pPrevTask = pPrevTask->pNext;
} }
pPrevTask->pNext = pTask; pPrevTask->pNext = pTask;
@ -166,27 +148,21 @@ void nfc_scheduler_dequeue_task(nfc_scheduler_t* pScheduler, bool abort, nfc_tas
NFC_DBG("Dequeuing task %p", pTask); NFC_DBG("Dequeuing task %p", pTask);
//Find task //Find task
nfc_task_t *pPrevTask = pScheduler->pNext; nfc_task_t *pPrevTask = pScheduler->pNext;
if( pPrevTask == NULL ) if (pPrevTask == NULL) {
{
pTask->pNext = NULL; pTask->pNext = NULL;
return; return;
} }
if( pPrevTask == pTask ) if (pPrevTask == pTask) {
{ if (abort) {
if(abort)
{
pTask->fn(EVENT_ABORTED, pTask->pUserData); pTask->fn(EVENT_ABORTED, pTask->pUserData);
} }
pScheduler->pNext = pTask->pNext; pScheduler->pNext = pTask->pNext;
pTask->pNext = NULL; pTask->pNext = NULL;
return; return;
} }
while( pPrevTask->pNext != NULL ) while (pPrevTask->pNext != NULL) {
{ if (pPrevTask->pNext == pTask) {
if(pPrevTask->pNext == pTask) if (abort) {
{
if(abort)
{
pTask->fn(EVENT_ABORTED, pTask->pUserData); pTask->fn(EVENT_ABORTED, pTask->pUserData);
} }
pPrevTask->pNext = pTask->pNext; pPrevTask->pNext = pTask->pNext;

View File

@ -45,16 +45,14 @@ typedef struct __nfc_timer nfc_scheduler_timer_t;
struct __nfc_task; struct __nfc_task;
typedef struct __nfc_task nfc_task_t; typedef struct __nfc_task nfc_task_t;
typedef struct __scheduler typedef struct __scheduler {
{
nfc_task_t *pNext; nfc_task_t *pNext;
nfc_scheduler_timer_t *pTimer; nfc_scheduler_timer_t *pTimer;
} nfc_scheduler_t; } nfc_scheduler_t;
typedef void (*nfc_task_fn)(uint32_t events, void *pUserData); typedef void (*nfc_task_fn)(uint32_t events, void *pUserData);
struct __nfc_task struct __nfc_task {
{
uint32_t events; uint32_t events;
int64_t timeout; //millisecs int64_t timeout; //millisecs
int64_t timeoutInitial; int64_t timeoutInitial;

View File

@ -51,8 +51,7 @@ typedef void (*nfc_transport_write_fn_t)( uint8_t address, const uint8_t* outBuf
*/ */
typedef void (*nfc_transport_read_fn_t)(uint8_t address, uint8_t *inBuf, size_t inLen, void *pUser); typedef void (*nfc_transport_read_fn_t)(uint8_t address, uint8_t *inBuf, size_t inLen, void *pUser);
typedef struct __transport typedef struct __transport {
{
nfc_transport_write_fn_t write; nfc_transport_write_fn_t write;
nfc_transport_read_fn_t read; nfc_transport_read_fn_t read;
void *pUser; void *pUser;

View File

@ -83,8 +83,7 @@ void nfc_tech_iso7816_disconnect(nfc_tech_iso7816_t* pIso7816)
void nfc_tech_iso7816_add_app(nfc_tech_iso7816_t *pIso7816, nfc_tech_iso7816_app_t *pIso7816App) void nfc_tech_iso7816_add_app(nfc_tech_iso7816_t *pIso7816, nfc_tech_iso7816_app_t *pIso7816App)
{ {
nfc_tech_iso7816_app_t **ppPrevApp = &pIso7816->pAppList; nfc_tech_iso7816_app_t **ppPrevApp = &pIso7816->pAppList;
while( *ppPrevApp != NULL ) while (*ppPrevApp != NULL) {
{
ppPrevApp = &((*ppPrevApp)->pNext); ppPrevApp = &((*ppPrevApp)->pNext);
} }
*ppPrevApp = pIso7816App; *ppPrevApp = pIso7816App;
@ -105,8 +104,7 @@ nfc_err_t nfc_tech_iso7816_reply(nfc_tech_iso7816_t* pIso7816)
DBG_BLOCK(buffer_dump(&pIso7816->rApdu.dataOut);) DBG_BLOCK(buffer_dump(&pIso7816->rApdu.dataOut);)
ret = iso7816_transmit(pIso7816); ret = iso7816_transmit(pIso7816);
if(ret) if (ret) {
{
return ret; return ret;
} }
@ -116,8 +114,7 @@ nfc_err_t nfc_tech_iso7816_reply(nfc_tech_iso7816_t* pIso7816)
void iso7816_disconnected(nfc_tech_iso7816_t *pIso7816, bool deselected) void iso7816_disconnected(nfc_tech_iso7816_t *pIso7816, bool deselected)
{ {
pIso7816->disconnected = true; pIso7816->disconnected = true;
if(pIso7816->pSelectedApp != NULL) if (pIso7816->pSelectedApp != NULL) {
{
//Deselect previous app //Deselect previous app
pIso7816->pSelectedApp->deselected(pIso7816->pSelectedApp, pIso7816->pSelectedApp->pUserData); pIso7816->pSelectedApp->deselected(pIso7816->pSelectedApp, pIso7816->pSelectedApp->pUserData);
pIso7816->pSelectedApp = NULL; pIso7816->pSelectedApp = NULL;
@ -133,8 +130,7 @@ nfc_err_t iso7816_parse(nfc_tech_iso7816_t* pIso7816)
DBG_BLOCK(buffer_dump(buffer_builder_buffer(&pIso7816->rxBldr));) DBG_BLOCK(buffer_dump(buffer_builder_buffer(&pIso7816->rxBldr));)
if( buffer_reader_readable( buffer_builder_buffer(&pIso7816->rxBldr) ) < 4 ) if (buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) < 4) {
{
NFC_ERR("C-APDU is too small"); NFC_ERR("C-APDU is too small");
pIso7816->rApdu.sw = ISO7816_SW_INVALID_CLASS; pIso7816->rApdu.sw = ISO7816_SW_INVALID_CLASS;
nfc_tech_iso7816_reply(pIso7816); nfc_tech_iso7816_reply(pIso7816);
@ -148,46 +144,38 @@ nfc_err_t iso7816_parse(nfc_tech_iso7816_t* pIso7816)
buffer_init(&pIso7816->cApdu.dataIn, NULL, 0); buffer_init(&pIso7816->cApdu.dataIn, NULL, 0);
pIso7816->cApdu.maxRespLength = 0; pIso7816->cApdu.maxRespLength = 0;
if( buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) > 1 ) if (buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) > 1) {
{
size_t lc = buffer_read_nu8(buffer_builder_buffer(&pIso7816->rxBldr)); size_t lc = buffer_read_nu8(buffer_builder_buffer(&pIso7816->rxBldr));
if( buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) >= lc ) if (buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) >= lc) {
{
buffer_split(&pIso7816->cApdu.dataIn, buffer_builder_buffer(&pIso7816->rxBldr), buffer_builder_buffer(&pIso7816->rxBldr), lc); buffer_split(&pIso7816->cApdu.dataIn, buffer_builder_buffer(&pIso7816->rxBldr), buffer_builder_buffer(&pIso7816->rxBldr), lc);
} } else {
else
{
pIso7816->rApdu.sw = ISO7816_SW_WRONG_LENGTH; pIso7816->rApdu.sw = ISO7816_SW_WRONG_LENGTH;
nfc_tech_iso7816_reply(pIso7816); nfc_tech_iso7816_reply(pIso7816);
return NFC_ERR_LENGTH; //Not a valid frame return NFC_ERR_LENGTH; //Not a valid frame
} }
} }
if( buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) >= 1 ) if (buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) >= 1) {
{
pIso7816->cApdu.maxRespLength = buffer_read_nu8(buffer_builder_buffer(&pIso7816->rxBldr)); pIso7816->cApdu.maxRespLength = buffer_read_nu8(buffer_builder_buffer(&pIso7816->rxBldr));
} }
NFC_DBG("C-APDU: CLA:%02X INS:%02X P1:%02X P2:%02X LC:%02X LE:%02X", pIso7816->cApdu.cla, pIso7816->cApdu.ins, pIso7816->cApdu.p1, pIso7816->cApdu.p2, NFC_DBG("C-APDU: CLA:%02X INS:%02X P1:%02X P2:%02X LC:%02X LE:%02X", pIso7816->cApdu.cla, pIso7816->cApdu.ins, pIso7816->cApdu.p1, pIso7816->cApdu.p2,
buffer_reader_readable(&pIso7816->cApdu.dataIn), pIso7816->cApdu.maxRespLength); buffer_reader_readable(&pIso7816->cApdu.dataIn), pIso7816->cApdu.maxRespLength);
if( buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) > 0 ) if (buffer_reader_readable(buffer_builder_buffer(&pIso7816->rxBldr)) > 0) {
{
pIso7816->rApdu.sw = ISO7816_SW_WRONG_LENGTH; pIso7816->rApdu.sw = ISO7816_SW_WRONG_LENGTH;
nfc_tech_iso7816_reply(pIso7816); nfc_tech_iso7816_reply(pIso7816);
return NFC_ERR_LENGTH; //Not a valid frame return NFC_ERR_LENGTH; //Not a valid frame
} }
//See if can select an app //See if can select an app
if( iso7816_mf_command(pIso7816) ) if (iso7816_mf_command(pIso7816)) {
{
nfc_tech_iso7816_reply(pIso7816); nfc_tech_iso7816_reply(pIso7816);
return NFC_OK; return NFC_OK;
} }
//Pass command to selected app //Pass command to selected app
if( pIso7816->pSelectedApp == NULL ) if (pIso7816->pSelectedApp == NULL) {
{
pIso7816->rApdu.sw = ISO7816_SW_NOT_FOUND; pIso7816->rApdu.sw = ISO7816_SW_NOT_FOUND;
nfc_tech_iso7816_reply(pIso7816); nfc_tech_iso7816_reply(pIso7816);
return NFC_ERR_NOT_FOUND; //Not a valid frame return NFC_ERR_NOT_FOUND; //Not a valid frame
@ -223,25 +211,18 @@ nfc_err_t iso7816_transmit(nfc_tech_iso7816_t* pIso7816)
bool iso7816_mf_command(nfc_tech_iso7816_t *pIso7816) bool iso7816_mf_command(nfc_tech_iso7816_t *pIso7816)
{ {
nfc_tech_iso7816_app_t *pApp; nfc_tech_iso7816_app_t *pApp;
if(pIso7816->cApdu.cla != 0x00) if (pIso7816->cApdu.cla != 0x00) {
{
return false; return false;
} }
switch(pIso7816->cApdu.ins) switch (pIso7816->cApdu.ins) {
{
case ISO7816_INS_SELECT: case ISO7816_INS_SELECT:
switch(pIso7816->cApdu.p1) switch (pIso7816->cApdu.p1) {
{
case 0x04: //Selection by DF name case 0x04: //Selection by DF name
pApp = pIso7816->pAppList; pApp = pIso7816->pAppList;
while(pApp != NULL) while (pApp != NULL) {
{ if (buffer_reader_readable(&pIso7816->cApdu.dataIn) <= pApp->aidSize) {
if( buffer_reader_readable(&pIso7816->cApdu.dataIn) <= pApp->aidSize ) if (buffer_reader_cmp_bytes(&pIso7816->cApdu.dataIn, pApp->aid, buffer_reader_readable(&pIso7816->cApdu.dataIn))) {
{ if (pIso7816->pSelectedApp != NULL) {
if( buffer_reader_cmp_bytes(&pIso7816->cApdu.dataIn, pApp->aid, buffer_reader_readable(&pIso7816->cApdu.dataIn)) )
{
if(pIso7816->pSelectedApp != NULL)
{
//Deselect previous app //Deselect previous app
pIso7816->pSelectedApp->deselected(pIso7816->pSelectedApp, pIso7816->pSelectedApp->pUserData); pIso7816->pSelectedApp->deselected(pIso7816->pSelectedApp, pIso7816->pSelectedApp->pUserData);
} }
@ -256,25 +237,19 @@ bool iso7816_mf_command(nfc_tech_iso7816_t* pIso7816)
pIso7816->rApdu.sw = ISO7816_SW_NOT_FOUND; pIso7816->rApdu.sw = ISO7816_SW_NOT_FOUND;
return true; return true;
default: default:
if(pIso7816->pSelectedApp == NULL) if (pIso7816->pSelectedApp == NULL) {
{
pIso7816->rApdu.sw = ISO7816_SW_NOT_FOUND; pIso7816->rApdu.sw = ISO7816_SW_NOT_FOUND;
return true; return true;
} } else {
else
{
return false; return false;
} }
} }
break; break;
default: default:
if(pIso7816->pSelectedApp == NULL) if (pIso7816->pSelectedApp == NULL) {
{
pIso7816->rApdu.sw = ISO7816_SW_INVALID_INS; pIso7816->rApdu.sw = ISO7816_SW_INVALID_INS;
return true; return true;
} } else {
else
{
return false; return false;
} }
break; break;
@ -287,16 +262,14 @@ void iso_dep_received_cb(nfc_tech_isodep_t* pIsodep, nfc_err_t ret, void* pUserD
(void) pIsodep; (void) pIsodep;
if( ret ) if (ret) {
{
NFC_WARN("Got error %d", ret); NFC_WARN("Got error %d", ret);
return; return;
} }
//Parse received APDU //Parse received APDU
ret = iso7816_parse(pIso7816); ret = iso7816_parse(pIso7816);
if( ret ) if (ret) {
{
NFC_WARN("Got error %d", ret); NFC_WARN("Got error %d", ret);
return; return;
} }
@ -308,8 +281,7 @@ void iso_dep_transmitted_cb(nfc_tech_isodep_t* pIsodep, nfc_err_t ret, void* pUs
(void) pIsodep; (void) pIsodep;
if( ret ) if (ret) {
{
NFC_WARN("Got error %d", ret); NFC_WARN("Got error %d", ret);
return; return;
} }
@ -340,9 +312,7 @@ void iso_dep_stream_transmit_cb(buffer_t* pDataIn, bool* pClose, size_t maxLengt
{ {
maxLength = buffer_reader_readable(&pIso7816->rApdu.dataOut); maxLength = buffer_reader_readable(&pIso7816->rApdu.dataOut);
*pClose = true; *pClose = true;
} } else {
else
{
*pClose = false; *pClose = false;
} }
@ -355,8 +325,7 @@ void iso_dep_stream_receive_cb(buffer_t* pDataOut, bool closed, void* pUserParam
(void) closed; (void) closed;
if( buffer_reader_readable(pDataOut) > buffer_builder_writeable(&pIso7816->rxBldr) ) if (buffer_reader_readable(pDataOut) > buffer_builder_writeable(&pIso7816->rxBldr)) {
{
NFC_ERR("Frame will not fit (%d > %d)", buffer_reader_readable(pDataOut), buffer_builder_writeable(&pIso7816->rxBldr)); NFC_ERR("Frame will not fit (%d > %d)", buffer_reader_readable(pDataOut), buffer_builder_writeable(&pIso7816->rxBldr));
} }

View File

@ -32,8 +32,7 @@ extern "C" {
#include "tech/isodep/isodep_target.h" #include "tech/isodep/isodep_target.h"
struct nfc_tech_iso7816_c_apdu struct nfc_tech_iso7816_c_apdu {
{
uint8_t cla; uint8_t cla;
uint8_t ins; uint8_t ins;
uint8_t p1; uint8_t p1;
@ -42,8 +41,7 @@ struct nfc_tech_iso7816_c_apdu
size_t maxRespLength; size_t maxRespLength;
}; };
struct nfc_tech_iso7816_r_apdu struct nfc_tech_iso7816_r_apdu {
{
buffer_t dataOut; buffer_t dataOut;
uint16_t sw; uint16_t sw;
}; };
@ -60,8 +58,7 @@ typedef void (*nfc_tech_iso7816_disconnected_cb)(nfc_tech_iso7816_t* pIso7816, b
struct nfc_tech_iso7816_app; struct nfc_tech_iso7816_app;
typedef struct nfc_tech_iso7816_app nfc_tech_iso7816_app_t; typedef struct nfc_tech_iso7816_app nfc_tech_iso7816_app_t;
struct nfc_tech_iso7816 struct nfc_tech_iso7816 {
{
nfc_tech_isodep_target_t isoDepTarget; nfc_tech_isodep_target_t isoDepTarget;
nfc_tech_iso7816_app_t *pAppList; nfc_tech_iso7816_app_t *pAppList;

View File

@ -36,8 +36,7 @@ typedef struct nfc_tech_iso7816_app nfc_tech_iso7816_app_t;
typedef void (*nfc_tech_iso7816_app_cb)(nfc_tech_iso7816_app_t *pIso7816App, void *pUserData); typedef void (*nfc_tech_iso7816_app_cb)(nfc_tech_iso7816_app_t *pIso7816App, void *pUserData);
struct nfc_tech_iso7816_app struct nfc_tech_iso7816_app {
{
nfc_tech_iso7816_t *pIso7816; nfc_tech_iso7816_t *pIso7816;
const uint8_t *aid; const uint8_t *aid;

View File

@ -36,8 +36,7 @@ typedef void (*nfc_tech_isodep_cb_t)(nfc_tech_isodep_t* pIsodep, nfc_err_t ret,
typedef void (*nfc_tech_isodep_disconnected_cb)(nfc_tech_isodep_t *pIsodep, bool deselected, void *pUserData); typedef void (*nfc_tech_isodep_disconnected_cb)(nfc_tech_isodep_t *pIsodep, bool deselected, void *pUserData);
struct nfc_tech_isodep struct nfc_tech_isodep {
{
}; };

View File

@ -74,8 +74,7 @@
#define FWI 14 //Max time before answer is ~ 19.3ms #define FWI 14 //Max time before answer is ~ 19.3ms
typedef enum __dep_type dep_type_t; typedef enum __dep_type dep_type_t;
enum __dep_type enum __dep_type {
{
dep_type_information, dep_type_information,
dep_type_response, dep_type_response,
dep_type_supervisory, dep_type_supervisory,
@ -144,8 +143,7 @@ void nfc_tech_isodep_target_disconnect(nfc_tech_isodep_target_t* pIsodepTarget)
nfc_err_t nfc_tech_isodep_target_transmit(nfc_tech_isodep_target_t *pIsodepTarget, istream_t *pStream, nfc_tech_isodep_cb_t cb, void *pUserData) nfc_err_t nfc_tech_isodep_target_transmit(nfc_tech_isodep_target_t *pIsodepTarget, istream_t *pStream, nfc_tech_isodep_cb_t cb, void *pUserData)
{ {
if( pIsodepTarget->dep.pReqStream != NULL ) if (pIsodepTarget->dep.pReqStream != NULL) {
{
return NFC_ERR_BUSY; return NFC_ERR_BUSY;
} }
@ -154,8 +152,7 @@ nfc_err_t nfc_tech_isodep_target_transmit(nfc_tech_isodep_target_t* pIsodepTarge
pIsodepTarget->dep.pResUserData = pUserData; pIsodepTarget->dep.pResUserData = pUserData;
//Do we need to start transceiving? //Do we need to start transceiving?
if( pIsodepTarget->commands.state == ISO_DEP_TARGET_COMMANDS_DEP_REQ_RECVD ) if (pIsodepTarget->commands.state == ISO_DEP_TARGET_COMMANDS_DEP_REQ_RECVD) {
{
command_reply(pIsodepTarget, false); //Force reply command_reply(pIsodepTarget, false); //Force reply
} }
@ -164,8 +161,7 @@ nfc_err_t nfc_tech_isodep_target_transmit(nfc_tech_isodep_target_t* pIsodepTarge
nfc_err_t nfc_tech_isodep_target_receive(nfc_tech_isodep_target_t *pIsodepTarget, ostream_t *pStream, nfc_tech_isodep_cb_t cb, void *pUserData) nfc_err_t nfc_tech_isodep_target_receive(nfc_tech_isodep_target_t *pIsodepTarget, ostream_t *pStream, nfc_tech_isodep_cb_t cb, void *pUserData)
{ {
if( pIsodepTarget->dep.pResStream != NULL ) if (pIsodepTarget->dep.pResStream != NULL) {
{
return NFC_ERR_BUSY; return NFC_ERR_BUSY;
} }
@ -199,17 +195,13 @@ void dep_init(nfc_tech_isodep_target_t* pIsodepTarget)
bool dep_ready(nfc_tech_isodep_target_t *pIsodepTarget) bool dep_ready(nfc_tech_isodep_target_t *pIsodepTarget)
{ {
//Anything to send back? //Anything to send back?
if( pIsodepTarget->dep.frameState != ISO_DEP_TARGET_DEP_FRAME_INFORMATION_RECEIVED ) if (pIsodepTarget->dep.frameState != ISO_DEP_TARGET_DEP_FRAME_INFORMATION_RECEIVED) {
{
return true; return true;
} }
if( (pIsodepTarget->dep.pResStream != NULL) ) if ((pIsodepTarget->dep.pResStream != NULL)) {
{
return true; return true;
} } else {
else
{
return false; return false;
} }
} }
@ -226,18 +218,15 @@ void dep_req_information(nfc_tech_isodep_target_t* pIsodepTarget, buffer_t* pReq
pIsodepTarget->commands.state = ISO_DEP_TARGET_COMMANDS_ATS_RES_SENT; pIsodepTarget->commands.state = ISO_DEP_TARGET_COMMANDS_ATS_RES_SENT;
if (!pIsodepTarget->dep.chaining if (!pIsodepTarget->dep.chaining
&& (pIsodepTarget->dep.pResStream != NULL) ) && (pIsodepTarget->dep.pResStream != NULL)) {
{
//Sent the full frame //Sent the full frame
pIsodepTarget->dep.pResStream = NULL; pIsodepTarget->dep.pResStream = NULL;
pIsodepTarget->dep.resCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_OK, pIsodepTarget->dep.pResUserData); pIsodepTarget->dep.resCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_OK, pIsodepTarget->dep.pResUserData);
} }
if( pIsodepTarget->dep.pReqStream != NULL ) if (pIsodepTarget->dep.pReqStream != NULL) {
{
// Pull more // Pull more
ostream_push(pIsodepTarget->dep.pReqStream, pReq, !moreInformation); ostream_push(pIsodepTarget->dep.pReqStream, pReq, !moreInformation);
if(!moreInformation) if (!moreInformation) {
{
//Got the full frame //Got the full frame
pIsodepTarget->dep.pReqStream = NULL; pIsodepTarget->dep.pReqStream = NULL;
pIsodepTarget->dep.reqCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_OK, pIsodepTarget->dep.pReqUserData); pIsodepTarget->dep.reqCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_OK, pIsodepTarget->dep.pReqUserData);
@ -251,19 +240,13 @@ void dep_req_information(nfc_tech_isodep_target_t* pIsodepTarget, buffer_t* pReq
void dep_req_response(nfc_tech_isodep_target_t *pIsodepTarget, bool ack, uint8_t blockNumber) void dep_req_response(nfc_tech_isodep_target_t *pIsodepTarget, bool ack, uint8_t blockNumber)
{ {
if( blockNumber != pIsodepTarget->dep.blockNumber ) if (blockNumber != pIsodepTarget->dep.blockNumber) {
{
//Should be NACK //Should be NACK
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_NACK_DIFF_BLOCK_NUMBER_RECEIVED; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_NACK_DIFF_BLOCK_NUMBER_RECEIVED;
} } else {
else if (ack) {
{
if(ack)
{
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_ACK_RECEIVED; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_ACK_RECEIVED;
} } else {
else
{
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_NACK_RECEIVED; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_NACK_RECEIVED;
} }
} }
@ -273,16 +256,12 @@ void dep_req_supervisory(nfc_tech_isodep_target_t* pIsodepTarget, bool wtxNDesel
{ {
(void) wtxm; (void) wtxm;
if(wtxNDeselect) if (wtxNDeselect) {
{ if ((pIsodepTarget->dep.frameState != ISO_DEP_TARGET_DEP_FRAME_WTX_SENT)) {
if((pIsodepTarget->dep.frameState != ISO_DEP_TARGET_DEP_FRAME_WTX_SENT))
{
NFC_WARN("Unexpected WTX frame"); NFC_WARN("Unexpected WTX frame");
} }
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_WTX_RECEIVED; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_WTX_RECEIVED;
} } else {
else
{
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_DESELECT_RECEIVED; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_DESELECT_RECEIVED;
} }
} }
@ -290,33 +269,24 @@ void dep_req_supervisory(nfc_tech_isodep_target_t* pIsodepTarget, bool wtxNDesel
dep_type_t dep_res_type(nfc_tech_isodep_target_t *pIsodepTarget) dep_type_t dep_res_type(nfc_tech_isodep_target_t *pIsodepTarget)
{ {
dep_type_t depType; dep_type_t depType;
switch( pIsodepTarget->dep.frameState ) switch (pIsodepTarget->dep.frameState) {
{
case ISO_DEP_TARGET_DEP_FRAME_DESELECT_RECEIVED: case ISO_DEP_TARGET_DEP_FRAME_DESELECT_RECEIVED:
depType = dep_type_supervisory; //Deselect depType = dep_type_supervisory; //Deselect
break; break;
case ISO_DEP_TARGET_DEP_FRAME_INFORMATION_RECEIVED: case ISO_DEP_TARGET_DEP_FRAME_INFORMATION_RECEIVED:
case ISO_DEP_TARGET_DEP_FRAME_WTX_RECEIVED: case ISO_DEP_TARGET_DEP_FRAME_WTX_RECEIVED:
if( pIsodepTarget->dep.chaining ) //Need to ack? if (pIsodepTarget->dep.chaining) { //Need to ack?
{
depType = dep_type_response; depType = dep_type_response;
} } else if (pIsodepTarget->dep.pResStream != NULL) { //Anything to send back?
else if( pIsodepTarget->dep.pResStream != NULL ) //Anything to send back?
{
depType = dep_type_information; depType = dep_type_information;
} } else {
else
{
depType = dep_type_supervisory; //WTX depType = dep_type_supervisory; //WTX
} }
break; break;
case ISO_DEP_TARGET_DEP_FRAME_ACK_RECEIVED: case ISO_DEP_TARGET_DEP_FRAME_ACK_RECEIVED:
if(( pIsodepTarget->dep.pResStream != NULL ) && ( pIsodepTarget->dep.chaining )) if ((pIsodepTarget->dep.pResStream != NULL) && (pIsodepTarget->dep.chaining)) {
{
depType = dep_type_information; depType = dep_type_information;
} } else {
else
{
depType = dep_type_supervisory; //WTX depType = dep_type_supervisory; //WTX
} }
break; break;
@ -336,17 +306,13 @@ dep_type_t dep_res_type(nfc_tech_isodep_target_t* pIsodepTarget)
void dep_res_information(nfc_tech_isodep_target_t *pIsodepTarget, size_t maxLength, buffer_t **ppRes, bool *pMoreInformation, uint8_t *pBlockNumber) void dep_res_information(nfc_tech_isodep_target_t *pIsodepTarget, size_t maxLength, buffer_t **ppRes, bool *pMoreInformation, uint8_t *pBlockNumber)
{ {
*pBlockNumber = pIsodepTarget->dep.blockNumber; *pBlockNumber = pIsodepTarget->dep.blockNumber;
if( pIsodepTarget->dep.frameState != ISO_DEP_TARGET_DEP_FRAME_NACK_RECEIVED ) if (pIsodepTarget->dep.frameState != ISO_DEP_TARGET_DEP_FRAME_NACK_RECEIVED) {
{ if (pIsodepTarget->dep.pResStream != NULL) {
if( pIsodepTarget->dep.pResStream != NULL )
{
bool lastFrame = true; bool lastFrame = true;
istream_pull(pIsodepTarget->dep.pResStream, &pIsodepTarget->dep.res, &lastFrame, maxLength); istream_pull(pIsodepTarget->dep.pResStream, &pIsodepTarget->dep.res, &lastFrame, maxLength);
pIsodepTarget->dep.chaining = !lastFrame; pIsodepTarget->dep.chaining = !lastFrame;
} }
} } else {
else
{
//Retransmit previous frame (leave it as it is) //Retransmit previous frame (leave it as it is)
} }
*ppRes = &pIsodepTarget->dep.res; *ppRes = &pIsodepTarget->dep.res;
@ -364,13 +330,10 @@ void dep_res_response(nfc_tech_isodep_target_t* pIsodepTarget, bool* pAck, uint8
void dep_res_supervisory(nfc_tech_isodep_target_t *pIsodepTarget, bool *pWtxNDeselect, uint8_t *pWtxm) void dep_res_supervisory(nfc_tech_isodep_target_t *pIsodepTarget, bool *pWtxNDeselect, uint8_t *pWtxm)
{ {
if( pIsodepTarget->dep.frameState == ISO_DEP_TARGET_DEP_FRAME_DESELECT_RECEIVED ) if (pIsodepTarget->dep.frameState == ISO_DEP_TARGET_DEP_FRAME_DESELECT_RECEIVED) {
{
*pWtxNDeselect = false; *pWtxNDeselect = false;
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT;
} } else {
else
{
*pWtxNDeselect = true; *pWtxNDeselect = true;
*pWtxm = WTXM_DEFAULT; *pWtxm = WTXM_DEFAULT;
pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_WTX_SENT; pIsodepTarget->dep.frameState = ISO_DEP_TARGET_DEP_FRAME_WTX_SENT;
@ -380,18 +343,15 @@ void dep_res_supervisory(nfc_tech_isodep_target_t* pIsodepTarget, bool *pWtxNDes
void dep_disconnected(nfc_tech_isodep_target_t *pIsodepTarget, bool deselected) void dep_disconnected(nfc_tech_isodep_target_t *pIsodepTarget, bool deselected)
{ {
//Call callbacks if needed //Call callbacks if needed
if( pIsodepTarget->dep.pReqStream != NULL ) if (pIsodepTarget->dep.pReqStream != NULL) {
{
pIsodepTarget->dep.reqCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_ERR_DISCONNECTED, pIsodepTarget->dep.pReqUserData); pIsodepTarget->dep.reqCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_ERR_DISCONNECTED, pIsodepTarget->dep.pReqUserData);
pIsodepTarget->dep.pReqStream = NULL; pIsodepTarget->dep.pReqStream = NULL;
} }
if( pIsodepTarget->dep.pReqStream != NULL ) if (pIsodepTarget->dep.pReqStream != NULL) {
{
pIsodepTarget->dep.resCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_ERR_DISCONNECTED, pIsodepTarget->dep.pResUserData); pIsodepTarget->dep.resCb((nfc_tech_isodep_t *)pIsodepTarget, NFC_ERR_DISCONNECTED, pIsodepTarget->dep.pResUserData);
pIsodepTarget->dep.pResStream = NULL; pIsodepTarget->dep.pResStream = NULL;
} }
if( pIsodepTarget->commands.state != ISO_DEP_TARGET_COMMANDS_DISCONNECTED ) if (pIsodepTarget->commands.state != ISO_DEP_TARGET_COMMANDS_DISCONNECTED) {
{
pIsodepTarget->commands.state = ISO_DEP_TARGET_COMMANDS_DISCONNECTED; pIsodepTarget->commands.state = ISO_DEP_TARGET_COMMANDS_DISCONNECTED;
pIsodepTarget->disconnectedCb((nfc_tech_isodep_t *)pIsodepTarget, deselected, pIsodepTarget->pUserData); pIsodepTarget->disconnectedCb((nfc_tech_isodep_t *)pIsodepTarget, deselected, pIsodepTarget->pUserData);
} }
@ -412,13 +372,11 @@ void command_init(nfc_tech_isodep_target_t* pIsodepTarget)
nfc_err_t command_ats_req(nfc_tech_isodep_target_t *pIsodepTarget) nfc_err_t command_ats_req(nfc_tech_isodep_target_t *pIsodepTarget)
{ {
//Check we are in a correct state -- this should be the first command received //Check we are in a correct state -- this should be the first command received
if( pIsodepTarget->commands.state != ISO_DEP_TARGET_COMMANDS_CONNECTING ) if (pIsodepTarget->commands.state != ISO_DEP_TARGET_COMMANDS_CONNECTING) {
{
return NFC_ERR_PROTOCOL; return NFC_ERR_PROTOCOL;
} }
if( buffer_reader_readable(pIsodepTarget->commands.pReq) < 2 ) if (buffer_reader_readable(pIsodepTarget->commands.pReq) < 2) {
{
NFC_ERR("Payload too short"); NFC_ERR("Payload too short");
return NFC_ERR_PROTOCOL; return NFC_ERR_PROTOCOL;
} }
@ -440,13 +398,11 @@ nfc_err_t command_ats_req(nfc_tech_isodep_target_t* pIsodepTarget)
nfc_err_t command_dep_req(nfc_tech_isodep_target_t *pIsodepTarget) nfc_err_t command_dep_req(nfc_tech_isodep_target_t *pIsodepTarget)
{ {
if( pIsodepTarget->commands.state < ISO_DEP_TARGET_COMMANDS_ATS_RES_SENT ) if (pIsodepTarget->commands.state < ISO_DEP_TARGET_COMMANDS_ATS_RES_SENT) {
{
return NFC_ERR_PROTOCOL; return NFC_ERR_PROTOCOL;
} }
if( buffer_reader_readable(pIsodepTarget->commands.pReq) < 1 ) if (buffer_reader_readable(pIsodepTarget->commands.pReq) < 1) {
{
NFC_ERR("Payload too short"); NFC_ERR("Payload too short");
return NFC_ERR_PROTOCOL; return NFC_ERR_PROTOCOL;
} }
@ -477,8 +433,7 @@ nfc_err_t command_dep_req(nfc_tech_isodep_target_t* pIsodepTarget)
*/ */
uint8_t wtxm = 0; uint8_t wtxm = 0;
switch( PCB_TYPE(pcb) ) switch (PCB_TYPE(pcb)) {
{
case I_BLOCK_PCB: case I_BLOCK_PCB:
dep_req_information(pIsodepTarget, pIsodepTarget->commands.pReq, PCB_CHAINING(pcb), PCB_BLOCK_TOGGLE(pcb)); dep_req_information(pIsodepTarget, pIsodepTarget->commands.pReq, PCB_CHAINING(pcb), PCB_BLOCK_TOGGLE(pcb));
break; break;
@ -486,10 +441,8 @@ nfc_err_t command_dep_req(nfc_tech_isodep_target_t* pIsodepTarget)
dep_req_response(pIsodepTarget, !PCB_NACK(pcb), PCB_BLOCK_TOGGLE(pcb)); dep_req_response(pIsodepTarget, !PCB_NACK(pcb), PCB_BLOCK_TOGGLE(pcb));
break; break;
case S_BLOCK_PCB: case S_BLOCK_PCB:
if( PCB_WTX(pcb) ) if (PCB_WTX(pcb)) {
{ if (buffer_reader_readable(pIsodepTarget->commands.pReq) < 1) {
if( buffer_reader_readable(pIsodepTarget->commands.pReq) < 1 )
{
NFC_ERR("Payload too short"); NFC_ERR("Payload too short");
return NFC_ERR_PROTOCOL; return NFC_ERR_PROTOCOL;
} }
@ -510,8 +463,7 @@ nfc_err_t command_dep_req(nfc_tech_isodep_target_t* pIsodepTarget)
nfc_err_t command_ats_res(nfc_tech_isodep_target_t *pIsodepTarget) nfc_err_t command_ats_res(nfc_tech_isodep_target_t *pIsodepTarget)
{ {
//Send ATS back //Send ATS back
if (buffer_builder_writeable(&pIsodepTarget->commands.respBldr) < 5 ) if (buffer_builder_writeable(&pIsodepTarget->commands.respBldr) < 5) {
{
return NFC_ERR_BUFFER_TOO_SMALL; return NFC_ERR_BUFFER_TOO_SMALL;
} }
@ -562,8 +514,7 @@ nfc_err_t command_dep_res(nfc_tech_isodep_target_t* pIsodepTarget)
size_t maxLength = pIsodepTarget->commands.inPayloadSize - 1; size_t maxLength = pIsodepTarget->commands.inPayloadSize - 1;
switch( dep_res_type(pIsodepTarget) ) switch (dep_res_type(pIsodepTarget)) {
{
case dep_type_information: case dep_type_information:
dep_res_information(pIsodepTarget, maxLength, &pDepBuf, &moreInformation, &blockNumber); dep_res_information(pIsodepTarget, maxLength, &pDepBuf, &moreInformation, &blockNumber);
pcb = BUILD_I_BLOCK_PCB(moreInformation, false, false, blockNumber); pcb = BUILD_I_BLOCK_PCB(moreInformation, false, false, blockNumber);
@ -585,12 +536,9 @@ nfc_err_t command_dep_res(nfc_tech_isodep_target_t* pIsodepTarget)
buffer_builder_write_nu8(&pIsodepTarget->commands.respBldr, pIsodepTarget->commands.did); buffer_builder_write_nu8(&pIsodepTarget->commands.respBldr, pIsodepTarget->commands.did);
} }
*/ */
if( pDepBuf != NULL ) if (pDepBuf != NULL) {
{
buffer_set_next(buffer_builder_buffer(&pIsodepTarget->commands.respBldr), pDepBuf); buffer_set_next(buffer_builder_buffer(&pIsodepTarget->commands.respBldr), pDepBuf);
} } else if (wtxNDeselect) {
else if(wtxNDeselect)
{
buffer_builder_write_nu8(&pIsodepTarget->commands.respBldr, wtxm); buffer_builder_write_nu8(&pIsodepTarget->commands.respBldr, wtxm);
} }
@ -604,16 +552,14 @@ void command_reply(nfc_tech_isodep_target_t* pIsodepTarget, bool depWait)
nfc_err_t ret; nfc_err_t ret;
//Check whether we want to reply or wait for the higher layer to send us something //Check whether we want to reply or wait for the higher layer to send us something
if((pIsodepTarget->commands.state == ISO_DEP_TARGET_COMMANDS_DEP_REQ_RECVD) && depWait && !dep_ready(pIsodepTarget)) if ((pIsodepTarget->commands.state == ISO_DEP_TARGET_COMMANDS_DEP_REQ_RECVD) && depWait && !dep_ready(pIsodepTarget)) {
{
return; return;
} }
//Reply //Reply
buffer_builder_reset(&pIsodepTarget->commands.respBldr); buffer_builder_reset(&pIsodepTarget->commands.respBldr);
switch(pIsodepTarget->commands.state) switch (pIsodepTarget->commands.state) {
{
case ISO_DEP_TARGET_COMMANDS_ATS_REQ_RECVD: case ISO_DEP_TARGET_COMMANDS_ATS_REQ_RECVD:
ret = command_ats_res(pIsodepTarget); ret = command_ats_res(pIsodepTarget);
break; break;
@ -627,8 +573,7 @@ void command_reply(nfc_tech_isodep_target_t* pIsodepTarget, bool depWait)
return; return;
} }
if(ret) if (ret) {
{
NFC_ERR("Error %d", ret); NFC_ERR("Error %d", ret);
//Go back to receive mode //Go back to receive mode
nfc_transceiver_transceive(pIsodepTarget->pTransceiver, command_transceiver_cb, pIsodepTarget); nfc_transceiver_transceive(pIsodepTarget->pTransceiver, command_transceiver_cb, pIsodepTarget);
@ -637,12 +582,9 @@ void command_reply(nfc_tech_isodep_target_t* pIsodepTarget, bool depWait)
NFC_DBG("Transceive"); NFC_DBG("Transceive");
if( pIsodepTarget->dep.frameState == ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT ) if (pIsodepTarget->dep.frameState == ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT) {
{
transceiver_set_transceive_options(pIsodepTarget->pTransceiver, true, false, true); transceiver_set_transceive_options(pIsodepTarget->pTransceiver, true, false, true);
} } else {
else
{
transceiver_set_transceive_options(pIsodepTarget->pTransceiver, true, true, false); transceiver_set_transceive_options(pIsodepTarget->pTransceiver, true, true, false);
} }
@ -659,14 +601,12 @@ void command_transceiver_cb(nfc_transceiver_t* pTransceiver, nfc_err_t ret, void
{ {
nfc_tech_isodep_target_t *pIsodepTarget = (nfc_tech_isodep_target_t *) pUserData; nfc_tech_isodep_target_t *pIsodepTarget = (nfc_tech_isodep_target_t *) pUserData;
if( ret == NFC_ERR_ABORTED ) if (ret == NFC_ERR_ABORTED) {
{
// Just return // Just return
return; return;
} }
if( pIsodepTarget->dep.frameState == ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT ) if (pIsodepTarget->dep.frameState == ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT) {
{
//We are now disconnected (deselected) //We are now disconnected (deselected)
//Reset status //Reset status
dep_init(pIsodepTarget); dep_init(pIsodepTarget);
@ -684,14 +624,11 @@ void command_transceiver_cb(nfc_transceiver_t* pTransceiver, nfc_err_t ret, void
transceiver_set_write(pTransceiver, NULL); transceiver_set_write(pTransceiver, NULL);
transceiver_set_transceive_options(pTransceiver, false, true, false); transceiver_set_transceive_options(pTransceiver, false, true, false);
if( ret == NFC_ERR_FIELD ) if (ret == NFC_ERR_FIELD) {
{
NFC_WARN("Lost initiator"); NFC_WARN("Lost initiator");
dep_disconnected(pIsodepTarget, false); dep_disconnected(pIsodepTarget, false);
return; return;
} } else if (ret) {
else if(ret)
{
//We should ignore this error and wait for another frame //We should ignore this error and wait for another frame
NFC_WARN("Got invalid frame (error %d)", ret); NFC_WARN("Got invalid frame (error %d)", ret);
@ -705,8 +642,7 @@ void command_transceiver_cb(nfc_transceiver_t* pTransceiver, nfc_err_t ret, void
DBG_BLOCK(buffer_dump(pDataInitiator);) DBG_BLOCK(buffer_dump(pDataInitiator);)
//Framing is handled by transceiver //Framing is handled by transceiver
if( (buffer_reader_readable(pDataInitiator) < 1) ) if ((buffer_reader_readable(pDataInitiator) < 1)) {
{
NFC_ERR("Empty initiator message"); NFC_ERR("Empty initiator message");
//Go back to receive mode //Go back to receive mode
@ -721,8 +657,7 @@ void command_transceiver_cb(nfc_transceiver_t* pTransceiver, nfc_err_t ret, void
buffer_dup(&dataInitiatorDup, pDataInitiator); buffer_dup(&dataInitiatorDup, pDataInitiator);
uint8_t req = buffer_read_nu8(&dataInitiatorDup); uint8_t req = buffer_read_nu8(&dataInitiatorDup);
switch(req) switch (req) {
{
case RATS: case RATS:
ret = command_ats_req(pIsodepTarget); ret = command_ats_req(pIsodepTarget);
break; break;
@ -731,8 +666,7 @@ void command_transceiver_cb(nfc_transceiver_t* pTransceiver, nfc_err_t ret, void
break; break;
} }
if(ret) if (ret) {
{
NFC_ERR("Error %d", ret); NFC_ERR("Error %d", ret);
//Go back to receive mode //Go back to receive mode

View File

@ -35,13 +35,11 @@ struct nfc_tech_isodep_target;
typedef struct nfc_tech_isodep_target nfc_tech_isodep_target_t; typedef struct nfc_tech_isodep_target nfc_tech_isodep_target_t;
typedef struct nfc_tech_isodep_target nfc_tech_isodep_target_t; typedef struct nfc_tech_isodep_target nfc_tech_isodep_target_t;
struct nfc_tech_isodep_target struct nfc_tech_isodep_target {
{
nfc_tech_isodep_t isodep; nfc_tech_isodep_t isodep;
nfc_transceiver_t *pTransceiver; nfc_transceiver_t *pTransceiver;
struct struct {
{
ostream_t *pReqStream; ostream_t *pReqStream;
istream_t *pResStream; istream_t *pResStream;
@ -56,8 +54,7 @@ struct nfc_tech_isodep_target
uint8_t blockNumber; uint8_t blockNumber;
enum enum {
{
ISO_DEP_TARGET_DEP_FRAME_IDLE, ISO_DEP_TARGET_DEP_FRAME_IDLE,
ISO_DEP_TARGET_DEP_FRAME_WTX_RECEIVED, ISO_DEP_TARGET_DEP_FRAME_WTX_RECEIVED,
ISO_DEP_TARGET_DEP_FRAME_WTX_SENT, ISO_DEP_TARGET_DEP_FRAME_WTX_SENT,
@ -72,10 +69,8 @@ struct nfc_tech_isodep_target
ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT, ISO_DEP_TARGET_DEP_FRAME_DESELECT_SENT,
} frameState; } frameState;
} dep; } dep;
struct struct {
{ enum {
enum
{
ISO_DEP_TARGET_COMMANDS_DISCONNECTED, ISO_DEP_TARGET_COMMANDS_DISCONNECTED,
ISO_DEP_TARGET_COMMANDS_CONNECTING, ISO_DEP_TARGET_COMMANDS_CONNECTING,

View File

@ -98,8 +98,7 @@ void app_selected( nfc_tech_iso7816_app_t* pIso7816App, void* pUserData )
buffer_builder_write_nu16(&pType4Target->ndefFileBldr, buffer_reader_readable(buffer_builder_buffer(ndef_msg_buffer_builder(pType4Target->pNdef)))); buffer_builder_write_nu16(&pType4Target->ndefFileBldr, buffer_reader_readable(buffer_builder_buffer(ndef_msg_buffer_builder(pType4Target->pNdef))));
//Pad NDEF file with 0s //Pad NDEF file with 0s
while( buffer_builder_writeable( ndef_msg_buffer_builder(pType4Target->pNdef) ) > 0 ) while (buffer_builder_writeable(ndef_msg_buffer_builder(pType4Target->pNdef)) > 0) {
{
buffer_builder_write_nu8(ndef_msg_buffer_builder(pType4Target->pNdef), 0); buffer_builder_write_nu8(ndef_msg_buffer_builder(pType4Target->pNdef), 0);
} }
@ -122,20 +121,16 @@ void app_deselected( nfc_tech_iso7816_app_t* pIso7816App, void* pUserData )
DBG("Deselected"); DBG("Deselected");
if(pType4Target->written) if (pType4Target->written) {
{
DBG("New content has been written"); DBG("New content has been written");
//Try to parse NDEF //Try to parse NDEF
//Set buffer length based on file header //Set buffer length based on file header
size_t length = buffer_read_nu16(buffer_builder_buffer(&pType4Target->ndefFileBldr)); size_t length = buffer_read_nu16(buffer_builder_buffer(&pType4Target->ndefFileBldr));
DBG("Length is %lu", length); DBG("Length is %lu", length);
if( length < buffer_builder_writeable( ndef_msg_buffer_builder(pType4Target->pNdef) )) if (length < buffer_builder_writeable(ndef_msg_buffer_builder(pType4Target->pNdef))) {
{
buffer_builder_set_write_offset(ndef_msg_buffer_builder(pType4Target->pNdef), length); buffer_builder_set_write_offset(ndef_msg_buffer_builder(pType4Target->pNdef), length);
ndef_msg_decode(pType4Target->pNdef); ndef_msg_decode(pType4Target->pNdef);
} } else {
else
{
ERR("Invalid length"); ERR("Invalid length");
} }
} }
@ -157,34 +152,26 @@ void app_apdu( nfc_tech_iso7816_app_t* pIso7816App, void* pUserData )
nfc_tech_iso7816_r_apdu_t *pRApdu = nfc_tech_iso7816_app_r_apdu(pIso7816App); nfc_tech_iso7816_r_apdu_t *pRApdu = nfc_tech_iso7816_app_r_apdu(pIso7816App);
nfc_err_t ret; nfc_err_t ret;
switch(pCApdu->ins) switch (pCApdu->ins) {
{
case ISO7816_INS_SELECT: case ISO7816_INS_SELECT:
switch (pCApdu->p1) switch (pCApdu->p1) {
{
case 0x00: //Selection by ID case 0x00: //Selection by ID
case 0x02: //Selection by child ID case 0x02: //Selection by child ID
if ( buffer_reader_readable(&pCApdu->dataIn) != 2) if (buffer_reader_readable(&pCApdu->dataIn) != 2) {
{
pRApdu->sw = ISO7816_SW_NOT_FOUND; pRApdu->sw = ISO7816_SW_NOT_FOUND;
break; break;
} }
uint16_t file = buffer_read_nu16(&pCApdu->dataIn); uint16_t file = buffer_read_nu16(&pCApdu->dataIn);
if ( file == NDEF_FILE ) if (file == NDEF_FILE) {
{
pType4Target->selFile = NDEF_FILE; pType4Target->selFile = NDEF_FILE;
DBG("NDEF File selected"); DBG("NDEF File selected");
pRApdu->sw = ISO7816_SW_OK; pRApdu->sw = ISO7816_SW_OK;
} } else if (file == CC_FILE) {
else if ( file == CC_FILE )
{
pType4Target->selFile = CC_FILE; pType4Target->selFile = CC_FILE;
DBG("CC File selected"); DBG("CC File selected");
pRApdu->sw = ISO7816_SW_OK; pRApdu->sw = ISO7816_SW_OK;
} } else {
else
{
//file = DEFAULT_FILE; //file = DEFAULT_FILE;
DBG("Could not select file %04X", file); DBG("Could not select file %04X", file);
pRApdu->sw = ISO7816_SW_NOT_FOUND; pRApdu->sw = ISO7816_SW_NOT_FOUND;
@ -198,14 +185,11 @@ void app_apdu( nfc_tech_iso7816_app_t* pIso7816App, void* pUserData )
case 0xB0: //Read binary case 0xB0: //Read binary
DBG("Trying to read %d bytes at offset %d from file %04x", pCApdu->maxRespLength, (pCApdu->p1 << 8) | pCApdu->p2, pType4Target->selFile); DBG("Trying to read %d bytes at offset %d from file %04x", pCApdu->maxRespLength, (pCApdu->p1 << 8) | pCApdu->p2, pType4Target->selFile);
ret = data_read(pType4Target, &pRApdu->dataOut, pType4Target->selFile, (pCApdu->p1 << 8) | pCApdu->p2, pCApdu->maxRespLength); ret = data_read(pType4Target, &pRApdu->dataOut, pType4Target->selFile, (pCApdu->p1 << 8) | pCApdu->p2, pCApdu->maxRespLength);
if (ret == NFC_OK) if (ret == NFC_OK) {
{
DBG("Read %d bytes", buffer_reader_readable(&pRApdu->dataOut)); DBG("Read %d bytes", buffer_reader_readable(&pRApdu->dataOut));
DBG_BLOCK(buffer_dump(&pRApdu->dataOut);) DBG_BLOCK(buffer_dump(&pRApdu->dataOut);)
pRApdu->sw = ISO7816_SW_OK; pRApdu->sw = ISO7816_SW_OK;
} } else {
else
{
DBG("Failed with ret code %d", ret); DBG("Failed with ret code %d", ret);
pRApdu->sw = ISO7816_SW_WRONG_LENGTH; pRApdu->sw = ISO7816_SW_WRONG_LENGTH;
} }
@ -213,14 +197,11 @@ void app_apdu( nfc_tech_iso7816_app_t* pIso7816App, void* pUserData )
case 0xD6: //Update binary case 0xD6: //Update binary
DBG("Trying to write %d bytes at offset %d to file %04x", buffer_reader_readable(&pCApdu->dataIn), (pCApdu->p1 << 8) | pCApdu->p2, pType4Target->selFile); DBG("Trying to write %d bytes at offset %d to file %04x", buffer_reader_readable(&pCApdu->dataIn), (pCApdu->p1 << 8) | pCApdu->p2, pType4Target->selFile);
ret = data_write(pType4Target, &pCApdu->dataIn, pType4Target->selFile, (pCApdu->p1 << 8) | pCApdu->p2); ret = data_write(pType4Target, &pCApdu->dataIn, pType4Target->selFile, (pCApdu->p1 << 8) | pCApdu->p2);
if (ret == NFC_OK) if (ret == NFC_OK) {
{
DBG("OK"); DBG("OK");
pRApdu->sw = ISO7816_SW_OK; pRApdu->sw = ISO7816_SW_OK;
pType4Target->written = true; pType4Target->written = true;
} } else {
else
{
DBG("Failed with ret code %d", ret); DBG("Failed with ret code %d", ret);
pRApdu->sw = ISO7816_SW_WRONG_LENGTH; pRApdu->sw = ISO7816_SW_WRONG_LENGTH;
} }
@ -237,8 +218,7 @@ void app_apdu( nfc_tech_iso7816_app_t* pIso7816App, void* pUserData )
nfc_err_t data_read(nfc_tech_type4_target_t *pType4Target, buffer_t *pBuf, uint16_t file, size_t off, size_t len) nfc_err_t data_read(nfc_tech_type4_target_t *pType4Target, buffer_t *pBuf, uint16_t file, size_t off, size_t len)
{ {
buffer_t *pFile; buffer_t *pFile;
switch(file) switch (file) {
{
case CC_FILE: case CC_FILE:
pFile = buffer_builder_buffer(&pType4Target->ccFileBldr); pFile = buffer_builder_buffer(&pType4Target->ccFileBldr);
break; break;
@ -249,15 +229,13 @@ nfc_err_t data_read(nfc_tech_type4_target_t* pType4Target, buffer_t* pBuf, uint1
return NFC_ERR_NOT_FOUND; return NFC_ERR_NOT_FOUND;
} }
if( off > buffer_reader_readable(pFile) ) if (off > buffer_reader_readable(pFile)) {
{
return NFC_ERR_LENGTH; return NFC_ERR_LENGTH;
} }
buffer_read_n_skip(pFile, off); buffer_read_n_skip(pFile, off);
if( len > buffer_reader_readable(pFile)) if (len > buffer_reader_readable(pFile)) {
{
len = buffer_reader_readable(pFile); len = buffer_reader_readable(pFile);
} }
@ -269,8 +247,7 @@ nfc_err_t data_read(nfc_tech_type4_target_t* pType4Target, buffer_t* pBuf, uint1
nfc_err_t data_write(nfc_tech_type4_target_t *pType4Target, buffer_t *pBuf, uint16_t file, size_t off) nfc_err_t data_write(nfc_tech_type4_target_t *pType4Target, buffer_t *pBuf, uint16_t file, size_t off)
{ {
buffer_t *pFile; buffer_t *pFile;
switch(file) switch (file) {
{
case NDEF_FILE: case NDEF_FILE:
pFile = buffer_builder_buffer(&pType4Target->ndefFileBldr); pFile = buffer_builder_buffer(&pType4Target->ndefFileBldr);
break; break;
@ -281,20 +258,17 @@ nfc_err_t data_write(nfc_tech_type4_target_t* pType4Target, buffer_t* pBuf, uint
size_t len = buffer_reader_readable(pBuf); size_t len = buffer_reader_readable(pBuf);
if( off > buffer_reader_readable(pFile) ) if (off > buffer_reader_readable(pFile)) {
{
return NFC_ERR_LENGTH; return NFC_ERR_LENGTH;
} }
buffer_read_n_skip(pFile, off); buffer_read_n_skip(pFile, off);
if( len > buffer_reader_readable(pFile) ) if (len > buffer_reader_readable(pFile)) {
{
len = buffer_reader_readable(pFile); len = buffer_reader_readable(pFile);
} }
while( len > 0 ) while (len > 0) {
{
size_t cpy; size_t cpy;
buffer_builder_t builder; buffer_builder_t builder;
buffer_dup(buffer_builder_buffer(&builder), pFile); buffer_dup(buffer_builder_buffer(&builder), pFile);

View File

@ -37,8 +37,7 @@ typedef struct nfc_tech_type4_target nfc_tech_type4_target_t;
typedef void (*nfc_tech_type4_cb)(nfc_tech_type4_target_t *pType4Target, nfc_err_t ret, void *pUserData); typedef void (*nfc_tech_type4_cb)(nfc_tech_type4_target_t *pType4Target, nfc_err_t ret, void *pUserData);
struct nfc_tech_type4_target struct nfc_tech_type4_target {
{
nfc_tech_iso7816_app_t app; nfc_tech_iso7816_app_t app;
ndef_msg_t *pNdef; ndef_msg_t *pNdef;

View File

@ -60,8 +60,7 @@
//PN 512 VTABLE //PN 512 VTABLE
static const transceiver_impl_t pn512_impl = static const transceiver_impl_t pn512_impl = {
{
.set_protocols = pn512_set_protocols, .set_protocols = pn512_set_protocols,
.poll = pn512_poll, .poll = pn512_poll,
.transceive = pn512_transceive, .transceive = pn512_transceive,
@ -159,8 +158,7 @@ nfc_err_t pn512_init(pn512_t* pPN512, nfc_transport_t* pTransport, nfc_scheduler
DBGX_ENTER(); DBGX_ENTER();
NFC_DBG("Test result:"); NFC_DBG("Test result:");
while(pn512_fifo_length(pPN512)) while (pn512_fifo_length(pPN512)) {
{
buffer_builder_t read_byte; buffer_builder_t read_byte;
buffer_builder_init(&read_byte, null_array_buf, 1); buffer_builder_init(&read_byte, null_array_buf, 1);
@ -177,8 +175,7 @@ nfc_err_t pn512_init(pn512_t* pPN512, nfc_transport_t* pTransport, nfc_scheduler
NFC_DBG("PN512 version %02x", r); NFC_DBG("PN512 version %02x", r);
) )
if((r != 0x82) && (r != 0xB1) && (r != 0xB2)) if ((r != 0x82) && (r != 0xB1) && (r != 0xB2)) {
{
return NFC_ERR_UNSUPPORTED; //PN512 not found return NFC_ERR_UNSUPPORTED; //PN512 not found
} }
@ -198,11 +195,9 @@ void pn512_set_protocols(nfc_transceiver_t* pTransceiver, nfc_tech_t initiators,
{ {
pn512_t *pPN512 = (pn512_t *) pTransceiver; pn512_t *pPN512 = (pn512_t *) pTransceiver;
//If different, reconfigure //If different, reconfigure
if( memcmp(&initiators, &pPN512->config.initiators, sizeof(nfc_tech_t)) || memcmp(&targets, &pPN512->config.targets, sizeof(nfc_tech_t)) ) if (memcmp(&initiators, &pPN512->config.initiators, sizeof(nfc_tech_t)) || memcmp(&targets, &pPN512->config.targets, sizeof(nfc_tech_t))) {
{
pPN512->config.initiators = initiators; pPN512->config.initiators = initiators;
if( memcmp(&targets, &pPN512->config.targets, sizeof(nfc_tech_t)) ) if (memcmp(&targets, &pPN512->config.targets, sizeof(nfc_tech_t))) {
{
pPN512->config.targets = targets; pPN512->config.targets = targets;
pn512_poll_setup(pPN512); pn512_poll_setup(pPN512);
} }
@ -234,24 +229,15 @@ void pn512_set_timeout(nfc_transceiver_t* pTransceiver, int timeout)
void pn512_set_transceive_options(nfc_transceiver_t *pTransceiver, bool transmit, bool receive, bool repoll) void pn512_set_transceive_options(nfc_transceiver_t *pTransceiver, bool transmit, bool receive, bool repoll)
{ {
pn512_t *pPN512 = (pn512_t *) pTransceiver; pn512_t *pPN512 = (pn512_t *) pTransceiver;
if( transmit && receive ) if (transmit && receive) {
{
pPN512->nextFrameMode = pn512_transceive_mode_transceive; pPN512->nextFrameMode = pn512_transceive_mode_transceive;
} } else if (transmit && repoll) {
else if(transmit && repoll)
{
pPN512->nextFrameMode = pn512_transceive_mode_transmit_and_target_autocoll; pPN512->nextFrameMode = pn512_transceive_mode_transmit_and_target_autocoll;
} } else if (transmit) {
else if(transmit)
{
pPN512->nextFrameMode = pn512_transceive_mode_transmit; pPN512->nextFrameMode = pn512_transceive_mode_transmit;
} } else if (receive) {
else if(receive)
{
pPN512->nextFrameMode = pn512_transceive_mode_receive; pPN512->nextFrameMode = pn512_transceive_mode_receive;
} } else {
else
{
pPN512->nextFrameMode = pn512_transceive_mode_target_autocoll; pPN512->nextFrameMode = pn512_transceive_mode_target_autocoll;
} }
} }
@ -264,14 +250,12 @@ void pn512_set_transceive_framing(nfc_transceiver_t* pTransceiver, nfc_framing_t
//Switch NFC tech if NFC DEP //Switch NFC tech if NFC DEP
if (pTransceiver->active_tech.nfc_nfc_dep_a if (pTransceiver->active_tech.nfc_nfc_dep_a
|| pTransceiver->active_tech.nfc_nfc_dep_f_212 || pTransceiver->active_tech.nfc_nfc_dep_f_212
|| pTransceiver->active_tech.nfc_nfc_dep_f_424 ) || pTransceiver->active_tech.nfc_nfc_dep_f_424) {
{
//FIXME //FIXME
pTransceiver->active_tech.nfc_nfc_dep_a = 0; pTransceiver->active_tech.nfc_nfc_dep_a = 0;
pTransceiver->active_tech.nfc_nfc_dep_f_212 = 0; pTransceiver->active_tech.nfc_nfc_dep_f_212 = 0;
pTransceiver->active_tech.nfc_nfc_dep_f_424 = 0; pTransceiver->active_tech.nfc_nfc_dep_f_424 = 0;
switch(framing) switch (framing) {
{
case nfc_framing_target_a_106: case nfc_framing_target_a_106:
case nfc_framing_initiator_a_106: case nfc_framing_initiator_a_106:
pTransceiver->active_tech.nfc_nfc_dep_a = 1; pTransceiver->active_tech.nfc_nfc_dep_a = 1;
@ -293,8 +277,7 @@ void pn512_set_transceive_framing(nfc_transceiver_t* pTransceiver, nfc_framing_t
void pn512_set_write(nfc_transceiver_t *pTransceiver, buffer_t *pWriteBuf) void pn512_set_write(nfc_transceiver_t *pTransceiver, buffer_t *pWriteBuf)
{ {
pn512_t *pPN512 = (pn512_t *) pTransceiver; pn512_t *pPN512 = (pn512_t *) pTransceiver;
if( pWriteBuf == NULL ) if (pWriteBuf == NULL) {
{
buffer_init(&pPN512->writeBuf, NULL, 0); buffer_init(&pPN512->writeBuf, NULL, 0);
return; return;
} }
@ -310,8 +293,7 @@ buffer_t* pn512_get_read(nfc_transceiver_t* pTransceiver)
void pn512_set_last_byte_length(nfc_transceiver_t *pTransceiver, size_t lastByteLength) void pn512_set_last_byte_length(nfc_transceiver_t *pTransceiver, size_t lastByteLength)
{ {
pn512_t *pPN512 = (pn512_t *) pTransceiver; pn512_t *pPN512 = (pn512_t *) pTransceiver;
if( (lastByteLength > 8) || (lastByteLength == 0) ) if ((lastByteLength > 8) || (lastByteLength == 0)) {
{
lastByteLength = 8; lastByteLength = 8;
} }
pPN512->writeLastByteLength = lastByteLength; pPN512->writeLastByteLength = lastByteLength;
@ -355,12 +337,9 @@ void pn512_sleep(nfc_transceiver_t* pTransceiver, bool sleep)
{ {
pn512_t *pPN512 = (pn512_t *) pTransceiver; pn512_t *pPN512 = (pn512_t *) pTransceiver;
if(sleep) if (sleep) {
{
pn512_register_write(pPN512, PN512_REG_COMMAND, 0x30); //Receiver off + soft power down pn512_register_write(pPN512, PN512_REG_COMMAND, 0x30); //Receiver off + soft power down
} } else {
else
{
pn512_register_write(pPN512, PN512_REG_COMMAND, 0x00); pn512_register_write(pPN512, PN512_REG_COMMAND, 0x00);
while (pn512_register_read(pPN512, PN512_REG_COMMAND) & 0x10); while (pn512_register_read(pPN512, PN512_REG_COMMAND) & 0x10);
} }

View File

@ -34,8 +34,7 @@ typedef struct __pn512 pn512_t;
#include "pn512_callback.h" #include "pn512_callback.h"
#include "pn512_types.h" #include "pn512_types.h"
typedef enum __pn512_state typedef enum __pn512_state {
{
pn512_state_ready, pn512_state_ready,
pn512_state_target_autocoll, pn512_state_target_autocoll,
pn512_state_initiator_transceive_first_frame, pn512_state_initiator_transceive_first_frame,
@ -43,8 +42,7 @@ typedef enum __pn512_state
pn512_state_transceive_last_frame, pn512_state_transceive_last_frame,
} pn512_state_t; } pn512_state_t;
typedef enum __pn512_transceive_mode typedef enum __pn512_transceive_mode {
{
pn512_transceive_mode_idle, pn512_transceive_mode_idle,
pn512_transceive_mode_target_autocoll, pn512_transceive_mode_target_autocoll,
pn512_transceive_mode_transmit, pn512_transceive_mode_transmit,
@ -53,21 +51,18 @@ typedef enum __pn512_transceive_mode
pn512_transceive_mode_receive, pn512_transceive_mode_receive,
} pn512_transceive_mode_t; } pn512_transceive_mode_t;
typedef struct __pn512 typedef struct __pn512 {
{
nfc_transceiver_t transceiver; nfc_transceiver_t transceiver;
//Impl specific //Impl specific
pn512_registers_t registers; pn512_registers_t registers;
bool rf_on; bool rf_on;
struct struct {
{
bool out; bool out;
bool in; bool in;
} crc; } crc;
int timeout; int timeout;
struct struct {
{
nfc_tech_t initiators; nfc_tech_t initiators;
nfc_tech_t targets; nfc_tech_t targets;
polling_options_t options; polling_options_t options;
@ -88,11 +83,9 @@ typedef struct __pn512
uint8_t writeLastByteLength; uint8_t writeLastByteLength;
//Task parameters //Task parameters
struct struct {
{
//Polling //Polling
struct struct {
{
enum { enum {
pn512_polling_state_start_listening, pn512_polling_state_start_listening,
@ -120,30 +113,24 @@ typedef struct __pn512
pn512_cb_t cb; pn512_cb_t cb;
} poll; } poll;
struct struct {
{
pn512_cb_t cb; pn512_cb_t cb;
pn512_transceive_mode_t mode; pn512_transceive_mode_t mode;
} transceive; } transceive;
struct struct {
{
pn512_cb_t cb; pn512_cb_t cb;
} rf; } rf;
struct struct {
{ union {
union
{
// ISO A // ISO A
struct struct {
{
bool more_targets; // Collision detected bool more_targets; // Collision detected
uint8_t cascade_level; uint8_t cascade_level;
uint8_t cln[5]; uint8_t cln[5];
uint8_t valid_bits; // valid bits within cascade level uint8_t valid_bits; // valid bits within cascade level
} iso_a; } iso_a;
// ISO B // ISO B
struct struct {
{
bool more_targets; // Collision detected bool more_targets; // Collision detected
uint8_t slots_num_exponent; uint8_t slots_num_exponent;
uint8_t slot_number; uint8_t slot_number;

View File

@ -125,8 +125,7 @@ void pn512_cmd_exec(pn512_t* pPN512, uint8_t cmd)
nfc_err_t pn512_cmd_wait_idle(pn512_t *pPN512, int timeout) nfc_err_t pn512_cmd_wait_idle(pn512_t *pPN512, int timeout)
{ {
(void) timeout; (void) timeout;
while( pn512_cmd_get(pPN512) != PN512_CMD_IDLE ) while (pn512_cmd_get(pPN512) != PN512_CMD_IDLE) {
{
} }
return NFC_OK; return NFC_OK;

View File

@ -61,10 +61,8 @@ static inline void pn512_hw_read(pn512_t* pPN512, uint8_t addr, uint8_t* buf, si
static inline void pn512_hw_write_buffer(pn512_t *pPN512, uint8_t addr, buffer_t *pData, size_t len) static inline void pn512_hw_write_buffer(pn512_t *pPN512, uint8_t addr, buffer_t *pData, size_t len)
{ {
while( len > 0 ) while (len > 0) {
{ if (buffer_reader_readable(pData) == 0) {
if( buffer_reader_readable(pData) == 0 )
{
return; return;
} }
size_t cpyLen = MIN(len, buffer_reader_current_buffer_length(pData)); size_t cpyLen = MIN(len, buffer_reader_current_buffer_length(pData));
@ -76,10 +74,8 @@ static inline void pn512_hw_write_buffer(pn512_t* pPN512, uint8_t addr, buffer_t
static inline void pn512_hw_read_buffer(pn512_t *pPN512, uint8_t addr, buffer_builder_t *pData, size_t len) static inline void pn512_hw_read_buffer(pn512_t *pPN512, uint8_t addr, buffer_builder_t *pData, size_t len)
{ {
while( len > 0 ) while (len > 0) {
{ if (buffer_builder_writeable(pData) == 0) {
if( buffer_builder_writeable(pData) == 0 )
{
return; return;
} }
//Read payload //Read payload

View File

@ -61,61 +61,48 @@ void pn512_target_anticollision_complete(pn512_t* pPN512, nfc_err_t ret)
bool felica = pPN512->config.targets.nfc_type3 || pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424; bool felica = pPN512->config.targets.nfc_type3 || pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424;
nfc_transceiver_t *pTransceiver = &pPN512->transceiver; nfc_transceiver_t *pTransceiver = &pPN512->transceiver;
if( ret ) if (ret) {
{
NFC_WARN("Returned %d", ret); NFC_WARN("Returned %d", ret);
pn512_anticollision_callback(pPN512, ret); pn512_anticollision_callback(pPN512, ret);
return; return;
} }
//Data available in FIFO //Data available in FIFO
if (pPN512->readLastByteLength != 8) //We should receive a full byte if (pPN512->readLastByteLength != 8) { //We should receive a full byte
{
NFC_WARN("Not enough data in FIFO"); NFC_WARN("Not enough data in FIFO");
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
} }
//If successful, update state machine //If successful, update state machine
if (iso14443a && felica) if (iso14443a && felica) {
{
//Update current protocol accordingly //Update current protocol accordingly
uint8_t txmode = pn512_register_read(pPN512, PN512_REG_TXMODE); uint8_t txmode = pn512_register_read(pPN512, PN512_REG_TXMODE);
if ((txmode & 0x03) == 0x00) if ((txmode & 0x03) == 0x00) {
{
pn512_framing_set(pPN512, nfc_framing_target_a_106); pn512_framing_set(pPN512, nfc_framing_target_a_106);
NFC_DBG("A 106"); NFC_DBG("A 106");
felica = false; felica = false;
} } else if ((txmode & 0x03) == 0x02) {
else if ((txmode & 0x03) == 0x02) if ((txmode & 0x70) == 0x20) {
{
if ((txmode & 0x70) == 0x20)
{
//424kbps //424kbps
NFC_DBG("F 424"); NFC_DBG("F 424");
pn512_framing_set(pPN512, nfc_framing_target_f_424); pn512_framing_set(pPN512, nfc_framing_target_f_424);
} } else {
else
{
//212kbps //212kbps
NFC_DBG("F 212"); NFC_DBG("F 212");
pn512_framing_set(pPN512, nfc_framing_target_f_212); pn512_framing_set(pPN512, nfc_framing_target_f_212);
} }
iso14443a = false; iso14443a = false;
} } else {
else
{
//Unsupported mode, exit //Unsupported mode, exit
pn512_anticollision_callback(pPN512, NFC_ERR_UNSUPPORTED); pn512_anticollision_callback(pPN512, NFC_ERR_UNSUPPORTED);
return; return;
} }
} }
if (iso14443a) if (iso14443a) {
{ if (buffer_reader_readable(buffer_builder_buffer(&pPN512->readBufBldr)) == 0) {
if(buffer_reader_readable(buffer_builder_buffer(&pPN512->readBufBldr)) == 0)
{
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
} }
@ -136,20 +123,13 @@ void pn512_target_anticollision_complete(pn512_t* pPN512, nfc_err_t ret)
//Anything else --> NFC Type 2 //Anything else --> NFC Type 2
//First check if this could be NFC-DEP //First check if this could be NFC-DEP
if ( pPN512->config.targets.nfc_nfc_dep_a && (b0 == 0xF0) ) if (pPN512->config.targets.nfc_nfc_dep_a && (b0 == 0xF0)) {
{
pTransceiver->active_tech.nfc_nfc_dep_a = true; pTransceiver->active_tech.nfc_nfc_dep_a = true;
} } else if (pPN512->config.targets.nfc_iso_dep_a && (b0 == 0xE0)) {
else if ( pPN512->config.targets.nfc_iso_dep_a && (b0 == 0xE0) )
{
pTransceiver->active_tech.nfc_iso_dep_a = true; pTransceiver->active_tech.nfc_iso_dep_a = true;
} } else if (pPN512->config.targets.nfc_type2) {
else if ( pPN512->config.targets.nfc_type2 )
{
pTransceiver->active_tech.nfc_type2 = true; pTransceiver->active_tech.nfc_type2 = true;
} } else {
else
{
//Unknown tech, return error //Unknown tech, return error
pn512_anticollision_callback(pPN512, NFC_ERR_UNSUPPORTED); pn512_anticollision_callback(pPN512, NFC_ERR_UNSUPPORTED);
return; return;
@ -158,23 +138,15 @@ void pn512_target_anticollision_complete(pn512_t* pPN512, nfc_err_t ret)
//Give control to higher layer //Give control to higher layer
pn512_anticollision_callback(pPN512, NFC_OK); pn512_anticollision_callback(pPN512, NFC_OK);
return; return;
} } else if (felica) {
else if(felica)
{
//First check if this could be NFC-DEP //First check if this could be NFC-DEP
if ( (pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424) ) if ((pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424)) {
{ if (pPN512->framing == nfc_framing_target_f_424) {
if(pPN512->framing == nfc_framing_target_f_424)
{
pTransceiver->active_tech.nfc_nfc_dep_f_424 = true; pTransceiver->active_tech.nfc_nfc_dep_f_424 = true;
} } else {
else
{
pTransceiver->active_tech.nfc_nfc_dep_f_212 = true; pTransceiver->active_tech.nfc_nfc_dep_f_212 = true;
} }
} } else {
else
{
pn512_anticollision_callback(pPN512, NFC_ERR_UNSUPPORTED); pn512_anticollision_callback(pPN512, NFC_ERR_UNSUPPORTED);
return; return;
} }
@ -251,8 +223,7 @@ void pn512_initiator_isoa_anticollision_atqa(pn512_t* pPN512, nfc_err_t ret)
// Clear collisions register // Clear collisions register
// FIXME PN512 Anomaly: pn512_register_write(pPN512, PN512_REG_COLL, 0x80); // Set MSB to 1, to treat collisions as errors // FIXME PN512 Anomaly: pn512_register_write(pPN512, PN512_REG_COLL, 0x80); // Set MSB to 1, to treat collisions as errors
if (ret && (ret != NFC_ERR_COLLISION)) // There might be collisions here if (ret && (ret != NFC_ERR_COLLISION)) { // There might be collisions here
{
NFC_WARN("Did not receive ATQA: error %d", ret); NFC_WARN("Did not receive ATQA: error %d", ret);
pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER); pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER);
return; return;
@ -260,8 +231,7 @@ void pn512_initiator_isoa_anticollision_atqa(pn512_t* pPN512, nfc_err_t ret)
buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512); buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512);
if (buffer_reader_readable(pResp) != 2) if (buffer_reader_readable(pResp) != 2) {
{
NFC_WARN("Wrong length (%u bytes)", buffer_reader_readable(pResp)); NFC_WARN("Wrong length (%u bytes)", buffer_reader_readable(pResp));
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -293,8 +263,7 @@ void pn512_initiator_isoa_anticollision_cascade_1(pn512_t* pPN512)
NFC_DBG("SEL - cascade level %u, %u valid bits - NVB %u", pPN512->anticollision.iso_a.cascade_level, pPN512->anticollision.iso_a.valid_bits, NVB(pPN512->anticollision.iso_a.valid_bits)); NFC_DBG("SEL - cascade level %u, %u valid bits - NVB %u", pPN512->anticollision.iso_a.cascade_level, pPN512->anticollision.iso_a.valid_bits, NVB(pPN512->anticollision.iso_a.valid_bits));
if( pPN512->anticollision.iso_a.valid_bits > 0 ) if (pPN512->anticollision.iso_a.valid_bits > 0) {
{
// Transmit first part of uid // Transmit first part of uid
buffer_builder_write_n_bytes(pDataOutBldr, pPN512->anticollision.iso_a.cln, (pPN512->anticollision.iso_a.valid_bits >> 3) + ((pPN512->anticollision.iso_a.valid_bits & 0x7) ? 1 : 0)); buffer_builder_write_n_bytes(pDataOutBldr, pPN512->anticollision.iso_a.cln, (pPN512->anticollision.iso_a.valid_bits >> 3) + ((pPN512->anticollision.iso_a.valid_bits & 0x7) ? 1 : 0));
pn512_set_last_byte_length((nfc_transceiver_t *)pPN512, pPN512->anticollision.iso_a.valid_bits & 0x7); pn512_set_last_byte_length((nfc_transceiver_t *)pPN512, pPN512->anticollision.iso_a.valid_bits & 0x7);
@ -321,8 +290,7 @@ void pn512_initiator_isoa_anticollision_cascade_2(pn512_t* pPN512, nfc_err_t ret
// Load & clear collisions register // Load & clear collisions register
// FIXME PN512 Anomaly: pn512_register_write(pPN512, PN512_REG_COLL, 0x80); // Set MSB to 1, to treat collisions as errors // FIXME PN512 Anomaly: pn512_register_write(pPN512, PN512_REG_COLL, 0x80); // Set MSB to 1, to treat collisions as errors
if (ret && (ret != NFC_ERR_COLLISION)) // There might be collisions here if (ret && (ret != NFC_ERR_COLLISION)) { // There might be collisions here
{
NFC_WARN("Did not receive response: error %d", ret); NFC_WARN("Did not receive response: error %d", ret);
pn512_anticollision_callback(pPN512, ret); pn512_anticollision_callback(pPN512, ret);
return; return;
@ -333,8 +301,7 @@ void pn512_initiator_isoa_anticollision_cascade_2(pn512_t* pPN512, nfc_err_t ret
// Check for collision // Check for collision
uint8_t valid_bits = expected_resp_bits; uint8_t valid_bits = expected_resp_bits;
if( ret == NFC_ERR_COLLISION ) if (ret == NFC_ERR_COLLISION) {
{
uint8_t coll_reg = pn512_register_read(pPN512, PN512_REG_COLL); uint8_t coll_reg = pn512_register_read(pPN512, PN512_REG_COLL);
// FIXME - PN512 error // FIXME - PN512 error
@ -342,29 +309,24 @@ void pn512_initiator_isoa_anticollision_cascade_2(pn512_t* pPN512, nfc_err_t ret
{ {
valid_bits = (coll_reg & 0x1f); valid_bits = (coll_reg & 0x1f);
if(valid_bits == 0) if (valid_bits == 0) {
{
valid_bits = 32; valid_bits = 32;
} }
valid_bits--; valid_bits--;
NFC_DBG("Collision detected, %u valid bits", valid_bits); NFC_DBG("Collision detected, %u valid bits", valid_bits);
if( valid_bits < expected_resp_bits ) if (valid_bits < expected_resp_bits) {
{
// Collision detected // Collision detected
pPN512->anticollision.iso_a.more_targets = true; pPN512->anticollision.iso_a.more_targets = true;
} } else {
else
{
valid_bits = expected_resp_bits; valid_bits = expected_resp_bits;
} }
} }
} }
size_t resp_sz = (valid_bits >> 3) + ((valid_bits & 0x7) ? 1 : 0); size_t resp_sz = (valid_bits >> 3) + ((valid_bits & 0x7) ? 1 : 0);
if( buffer_reader_readable(pResp) < resp_sz ) if (buffer_reader_readable(pResp) < resp_sz) {
{
(void) pn512_register_read(pPN512, PN512_REG_COLL); (void) pn512_register_read(pPN512, PN512_REG_COLL);
NFC_WARN("Wrong length (%u instead of %u - valid bits %u)", buffer_reader_readable(pResp), resp_sz, valid_bits); NFC_WARN("Wrong length (%u instead of %u - valid bits %u)", buffer_reader_readable(pResp), resp_sz, valid_bits);
@ -386,14 +348,12 @@ void pn512_initiator_isoa_anticollision_cascade_2(pn512_t* pPN512, nfc_err_t ret
bufIn[pPN512->anticollision.iso_a.valid_bits >> 3] &= 0xff >> ((8 - pPN512->anticollision.iso_a.valid_bits) & 0x7); bufIn[pPN512->anticollision.iso_a.valid_bits >> 3] &= 0xff >> ((8 - pPN512->anticollision.iso_a.valid_bits) & 0x7);
// Now remember bits before collision // Now remember bits before collision
for(size_t p = 0; p < 5; p++) for (size_t p = 0; p < 5; p++) {
{
pPN512->anticollision.iso_a.cln[p] |= bufIn[p]; pPN512->anticollision.iso_a.cln[p] |= bufIn[p];
} }
// If we have all bits, then check BCC, go to next step // If we have all bits, then check BCC, go to next step
if( pPN512->anticollision.iso_a.valid_bits < 5*8 ) // Collision, add a 1 at the end of known bits to resolve collision if (pPN512->anticollision.iso_a.valid_bits < 5 * 8) { // Collision, add a 1 at the end of known bits to resolve collision
{
pPN512->anticollision.iso_a.cln[pPN512->anticollision.iso_a.valid_bits >> 3] |= (1 << (pPN512->anticollision.iso_a.valid_bits & 0x7)); pPN512->anticollision.iso_a.cln[pPN512->anticollision.iso_a.valid_bits >> 3] |= (1 << (pPN512->anticollision.iso_a.valid_bits & 0x7));
pPN512->anticollision.iso_a.valid_bits++; pPN512->anticollision.iso_a.valid_bits++;
@ -403,27 +363,22 @@ void pn512_initiator_isoa_anticollision_cascade_2(pn512_t* pPN512, nfc_err_t ret
} }
//Check BCC if all bits are valid //Check BCC if all bits are valid
if( pPN512->anticollision.iso_a.cln[4] != (pPN512->anticollision.iso_a.cln[0] ^ pPN512->anticollision.iso_a.cln[1] ^ pPN512->anticollision.iso_a.cln[2] ^ pPN512->anticollision.iso_a.cln[3]) ) if (pPN512->anticollision.iso_a.cln[4] != (pPN512->anticollision.iso_a.cln[0] ^ pPN512->anticollision.iso_a.cln[1] ^ pPN512->anticollision.iso_a.cln[2] ^ pPN512->anticollision.iso_a.cln[3])) {
{
NFC_WARN("Wrong BCC %02X != %02X", bufIn[4], bufIn[0] ^ bufIn[1] ^ bufIn[2] ^ bufIn[3]); NFC_WARN("Wrong BCC %02X != %02X", bufIn[4], bufIn[0] ^ bufIn[1] ^ bufIn[2] ^ bufIn[3]);
pn512_anticollision_callback(pPN512, NFC_ERR_COLLISION); pn512_anticollision_callback(pPN512, NFC_ERR_COLLISION);
return; //TODO handle this properly return; //TODO handle this properly
} }
if( pPN512->anticollision.iso_a.cln[0] == CT ) if (pPN512->anticollision.iso_a.cln[0] == CT) {
{
//Not the last cascade level //Not the last cascade level
if( pPN512->anticollision.iso_a.cascade_level == 3 ) // not allowed if (pPN512->anticollision.iso_a.cascade_level == 3) { // not allowed
{
NFC_WARN("Cascade tag present in cascade level 3"); NFC_WARN("Cascade tag present in cascade level 3");
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
} }
memcpy(&pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uid[(pPN512->anticollision.iso_a.cascade_level - 1) * 3], &pPN512->anticollision.iso_a.cln[1], 3); memcpy(&pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uid[(pPN512->anticollision.iso_a.cascade_level - 1) * 3], &pPN512->anticollision.iso_a.cln[1], 3);
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uidLength += 3; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uidLength += 3;
} } else {
else
{
//Last cascade level //Last cascade level
memcpy(&pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uid[(pPN512->anticollision.iso_a.cascade_level - 1) * 3], &pPN512->anticollision.iso_a.cln[0], 4); memcpy(&pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uid[(pPN512->anticollision.iso_a.cascade_level - 1) * 3], &pPN512->anticollision.iso_a.cln[0], 4);
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uidLength += 4; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.uidLength += 4;
@ -451,15 +406,13 @@ static void pn512_initiator_isoa_anticollision_cascade_3(pn512_t* pPN512, nfc_er
{ {
buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512); buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512);
if(ret) if (ret) {
{
NFC_WARN("Did not receive response: error %d", ret); NFC_WARN("Did not receive response: error %d", ret);
pn512_anticollision_callback(pPN512, ret); pn512_anticollision_callback(pPN512, ret);
return; return;
} }
if( buffer_reader_readable(pResp) != 1 ) if (buffer_reader_readable(pResp) != 1) {
{
NFC_WARN("Wrong length"); NFC_WARN("Wrong length");
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -469,16 +422,13 @@ static void pn512_initiator_isoa_anticollision_cascade_3(pn512_t* pPN512, nfc_er
NFC_DBG("Got SAK %02X", pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak); NFC_DBG("Got SAK %02X", pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak);
//Check SAK //Check SAK
if( pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x04 ) if (pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x04) {
{
//Continue anticollision //Continue anticollision
pPN512->anticollision.iso_a.cascade_level++; pPN512->anticollision.iso_a.cascade_level++;
pPN512->anticollision.iso_a.valid_bits = 0; pPN512->anticollision.iso_a.valid_bits = 0;
memset(pPN512->anticollision.iso_a.cln, 0, 5); memset(pPN512->anticollision.iso_a.cln, 0, 5);
pn512_initiator_isoa_anticollision_cascade_1(pPN512); pn512_initiator_isoa_anticollision_cascade_1(pPN512);
} } else {
else
{
//Anticollision complete //Anticollision complete
NFC_DBG("Found one target- SAK = %02X", pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak); NFC_DBG("Found one target- SAK = %02X", pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak);
@ -486,18 +436,15 @@ static void pn512_initiator_isoa_anticollision_cascade_3(pn512_t* pPN512, nfc_er
//Analyze SAK //Analyze SAK
memset(&pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type, 0, sizeof(nfc_tech_t)); memset(&pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type, 0, sizeof(nfc_tech_t));
if( pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x40 ) //NFC-IP1 compliant if (pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x40) { //NFC-IP1 compliant
{
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_nfc_dep_a = true; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_nfc_dep_a = true;
} }
if ((pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x20) if ((pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x20)
&& pPN512->config.initiators.nfc_iso_dep_a ) //ISO-14443A-4 compliant && pPN512->config.initiators.nfc_iso_dep_a) { //ISO-14443A-4 compliant
{
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_iso_dep_a = true; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_iso_dep_a = true;
} }
if (!(pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x60) if (!(pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcA.sak & 0x60)
&& pPN512->config.initiators.nfc_type2 ) //Potentially NFC Type 2 (or Mifare, etc) && pPN512->config.initiators.nfc_type2) { //Potentially NFC Type 2 (or Mifare, etc)
{
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_type2 = true; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_type2 = true;
} }
@ -505,8 +452,7 @@ static void pn512_initiator_isoa_anticollision_cascade_3(pn512_t* pPN512, nfc_er
if (!pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_iso_dep_a if (!pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_iso_dep_a
&& !pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_nfc_dep_a && !pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_nfc_dep_a
&& !pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_type2 && !pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_type2
) ) {
{
pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER); pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER);
return; return;
} }
@ -517,8 +463,7 @@ static void pn512_initiator_isoa_anticollision_cascade_3(pn512_t* pPN512, nfc_er
if (!pPN512->config.options.bail_at_first_target if (!pPN512->config.options.bail_at_first_target
&& pPN512->anticollision.iso_a.more_targets && pPN512->anticollision.iso_a.more_targets
&& (pPN512->transceiver.remote_targets_count < MUNFC_MAX_REMOTE_TARGETS) ) && (pPN512->transceiver.remote_targets_count < MUNFC_MAX_REMOTE_TARGETS)) {
{
// Halt target and continue with others // Halt target and continue with others
buffer_builder_t *pDataOutBldr = &pPN512->readBufBldr; buffer_builder_t *pDataOutBldr = &pPN512->readBufBldr;
buffer_builder_reset(pDataOutBldr); buffer_builder_reset(pDataOutBldr);
@ -541,8 +486,7 @@ static void pn512_initiator_isoa_anticollision_cascade_3(pn512_t* pPN512, nfc_er
static void pn512_initiator_isoa_anticollision_cascade_4(pn512_t *pPN512, nfc_err_t ret) static void pn512_initiator_isoa_anticollision_cascade_4(pn512_t *pPN512, nfc_err_t ret)
{ {
if(ret) if (ret) {
{
NFC_WARN("Could not halt device: error %d", ret); NFC_WARN("Could not halt device: error %d", ret);
pn512_anticollision_callback(pPN512, ret); pn512_anticollision_callback(pPN512, ret);
return; return;
@ -586,22 +530,18 @@ void pn512_initiator_isob_anticollision_reqb(pn512_t* pPN512)
buffer_builder_t *pDataOutBldr = &pPN512->readBufBldr; buffer_builder_t *pDataOutBldr = &pPN512->readBufBldr;
buffer_builder_reset(pDataOutBldr); buffer_builder_reset(pDataOutBldr);
if (pPN512->anticollision.iso_b.slot_number == 0) if (pPN512->anticollision.iso_b.slot_number == 0) {
{
// Send REQB/WUPB // Send REQB/WUPB
pPN512->anticollision.iso_b.more_targets = false; pPN512->anticollision.iso_b.more_targets = false;
buffer_builder_write_nu8(pDataOutBldr, REQB); buffer_builder_write_nu8(pDataOutBldr, REQB);
buffer_builder_write_nu8(pDataOutBldr, 0x00); // AFI: All card types should respond buffer_builder_write_nu8(pDataOutBldr, 0x00); // AFI: All card types should respond
uint8_t wup = 0; uint8_t wup = 0;
if( (pPN512->anticollision.iso_b.slots_num_exponent == 0) ) //&& (pPN512->anticollision.iso_b.slot_number == 0)) if ((pPN512->anticollision.iso_b.slots_num_exponent == 0)) { //&& (pPN512->anticollision.iso_b.slot_number == 0))
{
wup |= 0x8; // Send Wake-Up command on first iteration wup |= 0x8; // Send Wake-Up command on first iteration
} }
buffer_builder_write_nu8(pDataOutBldr, wup | (pPN512->anticollision.iso_b.slots_num_exponent & 0x7)); // Param: number of slots buffer_builder_write_nu8(pDataOutBldr, wup | (pPN512->anticollision.iso_b.slots_num_exponent & 0x7)); // Param: number of slots
} } else {
else
{
// Just send slot marker // Just send slot marker
buffer_builder_write_nu8(pDataOutBldr, REQB | ((pPN512->anticollision.iso_b.slot_number & 0xf) << 4)); buffer_builder_write_nu8(pDataOutBldr, REQB | ((pPN512->anticollision.iso_b.slot_number & 0xf) << 4));
} }
@ -620,8 +560,7 @@ void pn512_initiator_isob_anticollision_atqb(pn512_t* pPN512, nfc_err_t ret)
// - Collision --> check next slot number but we will have to increment number of slots // - Collision --> check next slot number but we will have to increment number of slots
buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512); buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512);
if (ret && ( ret != NFC_ERR_COLLISION ) && ( ret != NFC_ERR_WRONG_COMM ) && ( ret != NFC_ERR_TIMEOUT )) if (ret && (ret != NFC_ERR_COLLISION) && (ret != NFC_ERR_WRONG_COMM) && (ret != NFC_ERR_TIMEOUT)) {
{
NFC_WARN("Did not receive ATQB: error %u", ret); NFC_WARN("Did not receive ATQB: error %u", ret);
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -630,17 +569,13 @@ void pn512_initiator_isob_anticollision_atqb(pn512_t* pPN512, nfc_err_t ret)
// Increment slot number // Increment slot number
pPN512->anticollision.iso_b.slot_number++; pPN512->anticollision.iso_b.slot_number++;
if( (ret == NFC_ERR_COLLISION) || (ret == NFC_ERR_WRONG_COMM) ) if ((ret == NFC_ERR_COLLISION) || (ret == NFC_ERR_WRONG_COMM)) {
{
pPN512->anticollision.iso_b.more_targets = true; pPN512->anticollision.iso_b.more_targets = true;
} } else if (!ret) {
else if( !ret )
{
pPN512->anticollision.iso_b.found_one = true; pPN512->anticollision.iso_b.found_one = true;
// Decode ATQB // Decode ATQB
if (buffer_reader_readable(pResp) != 12) if (buffer_reader_readable(pResp) != 12) {
{
NFC_WARN("Wrong length (%u bytes)", buffer_reader_readable(pResp)); NFC_WARN("Wrong length (%u bytes)", buffer_reader_readable(pResp));
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -651,8 +586,7 @@ void pn512_initiator_isob_anticollision_atqb(pn512_t* pPN512, nfc_err_t ret)
// Check first byte // Check first byte
uint8_t atqb0 = buffer_read_nu8(pResp); uint8_t atqb0 = buffer_read_nu8(pResp);
if (atqb0 != 0x50) if (atqb0 != 0x50) {
{
NFC_WARN("Wrong first byte for ATQB: %02X", atqb0); NFC_WARN("Wrong first byte for ATQB: %02X", atqb0);
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -672,8 +606,7 @@ void pn512_initiator_isob_anticollision_atqb(pn512_t* pPN512, nfc_err_t ret)
if (!pPN512->config.options.bail_at_first_target if (!pPN512->config.options.bail_at_first_target
&& (pPN512->anticollision.iso_b.more_targets || (pPN512->anticollision.iso_b.slot_number < (1 << pPN512->anticollision.iso_b.slots_num_exponent))) && (pPN512->anticollision.iso_b.more_targets || (pPN512->anticollision.iso_b.slot_number < (1 << pPN512->anticollision.iso_b.slots_num_exponent)))
&& (pPN512->transceiver.remote_targets_count < MUNFC_MAX_REMOTE_TARGETS) ) && (pPN512->transceiver.remote_targets_count < MUNFC_MAX_REMOTE_TARGETS)) {
{
// Halt target and continue with others // Halt target and continue with others
buffer_builder_t *pDataOutBldr = &pPN512->readBufBldr; buffer_builder_t *pDataOutBldr = &pPN512->readBufBldr;
buffer_builder_reset(pDataOutBldr); buffer_builder_reset(pDataOutBldr);
@ -689,9 +622,7 @@ void pn512_initiator_isob_anticollision_atqb(pn512_t* pPN512, nfc_err_t ret)
pn512_set_write((nfc_transceiver_t *)pPN512, buffer_builder_buffer(pDataOutBldr)); pn512_set_write((nfc_transceiver_t *)pPN512, buffer_builder_buffer(pDataOutBldr));
pn512_transceive_hw(pPN512, pn512_transceive_mode_transceive, pn512_initiator_isob_anticollision_haltb_resp); pn512_transceive_hw(pPN512, pn512_transceive_mode_transceive, pn512_initiator_isob_anticollision_haltb_resp);
return; return;
} } else {
else
{
pn512_initiator_isob_anticollision_complete(pPN512); pn512_initiator_isob_anticollision_complete(pPN512);
return; return;
} }
@ -703,16 +634,13 @@ void pn512_initiator_isob_anticollision_atqb(pn512_t* pPN512, nfc_err_t ret)
void pn512_initiator_isob_anticollision_next_slot(pn512_t *pPN512) void pn512_initiator_isob_anticollision_next_slot(pn512_t *pPN512)
{ {
if( pPN512->anticollision.iso_b.slot_number >= (1 << pPN512->anticollision.iso_b.slots_num_exponent)) if (pPN512->anticollision.iso_b.slot_number >= (1 << pPN512->anticollision.iso_b.slots_num_exponent)) {
{ if (!pPN512->anticollision.iso_b.more_targets) {
if(!pPN512->anticollision.iso_b.more_targets)
{
// No further collisions to resolve // No further collisions to resolve
pn512_initiator_isob_anticollision_complete(pPN512); pn512_initiator_isob_anticollision_complete(pPN512);
return; return;
} }
if(pPN512->anticollision.iso_b.slots_num_exponent >= 4) if (pPN512->anticollision.iso_b.slots_num_exponent >= 4) {
{
// Cannot handle more than 16 slots // Cannot handle more than 16 slots
pn512_initiator_isob_anticollision_complete(pPN512); pn512_initiator_isob_anticollision_complete(pPN512);
return; return;
@ -726,8 +654,7 @@ void pn512_initiator_isob_anticollision_next_slot(pn512_t* pPN512)
void pn512_initiator_isob_anticollision_haltb_resp(pn512_t *pPN512, nfc_err_t ret) void pn512_initiator_isob_anticollision_haltb_resp(pn512_t *pPN512, nfc_err_t ret)
{ {
// Check for response // Check for response
if (ret) if (ret) {
{
NFC_WARN("Did not receive HALTB response: error %u", ret); NFC_WARN("Did not receive HALTB response: error %u", ret);
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -735,8 +662,7 @@ void pn512_initiator_isob_anticollision_haltb_resp(pn512_t* pPN512, nfc_err_t re
buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512); buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512);
if (buffer_reader_readable(pResp) != 1) if (buffer_reader_readable(pResp) != 1) {
{
NFC_WARN("Wrong length (%u bytes)", buffer_reader_readable(pResp)); NFC_WARN("Wrong length (%u bytes)", buffer_reader_readable(pResp));
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -747,8 +673,7 @@ void pn512_initiator_isob_anticollision_haltb_resp(pn512_t* pPN512, nfc_err_t re
// Check byte // Check byte
uint8_t haltbr = buffer_read_nu8(pResp); uint8_t haltbr = buffer_read_nu8(pResp);
if (haltbr != 0x00) if (haltbr != 0x00) {
{
NFC_WARN("Wrong byte for HALTB response: %02X", haltbr); NFC_WARN("Wrong byte for HALTB response: %02X", haltbr);
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -760,12 +685,9 @@ void pn512_initiator_isob_anticollision_haltb_resp(pn512_t* pPN512, nfc_err_t re
void pn512_initiator_isob_anticollision_complete(pn512_t *pPN512) void pn512_initiator_isob_anticollision_complete(pn512_t *pPN512)
{ {
if(pPN512->anticollision.iso_b.found_one) if (pPN512->anticollision.iso_b.found_one) {
{
pn512_anticollision_callback(pPN512, NFC_OK); pn512_anticollision_callback(pPN512, NFC_OK);
} } else {
else
{
pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER); pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER);
} }
} }
@ -812,8 +734,7 @@ void pn512_initiator_felica_anticollision_atqc(pn512_t* pPN512, nfc_err_t ret)
{ {
buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512); buffer_t *pResp = pn512_get_read((nfc_transceiver_t *)pPN512);
if (ret || (buffer_reader_readable(pResp) == 0)) if (ret || (buffer_reader_readable(pResp) == 0)) {
{
NFC_WARN("Did not receive ATQC: error %d", ret); NFC_WARN("Did not receive ATQC: error %d", ret);
pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER); pn512_anticollision_callback(pPN512, NFC_ERR_NOPEER);
return; return;
@ -823,10 +744,8 @@ void pn512_initiator_felica_anticollision_atqc(pn512_t* pPN512, nfc_err_t ret)
NFC_DBG("Got ATQC:"); NFC_DBG("Got ATQC:");
DBG_BLOCK(buffer_dump(pResp);) DBG_BLOCK(buffer_dump(pResp);)
while (buffer_reader_readable(pResp) > 0) while (buffer_reader_readable(pResp) > 0) {
{ if (buffer_reader_readable(pResp) != 18 + 1) { // ATQC is 18 bytes, 1 byte for errors added by PN512
if (buffer_reader_readable(pResp) != 18 + 1) // ATQC is 18 bytes, 1 byte for errors added by PN512
{
NFC_WARN("Wrong length (%d bytes)", buffer_reader_readable(pResp)); NFC_WARN("Wrong length (%d bytes)", buffer_reader_readable(pResp));
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -835,8 +754,7 @@ void pn512_initiator_felica_anticollision_atqc(pn512_t* pPN512, nfc_err_t ret)
// First byte is length, check that it's correct // First byte is length, check that it's correct
uint8_t frame_length = buffer_read_nu8(pResp); uint8_t frame_length = buffer_read_nu8(pResp);
uint8_t atqc0 = buffer_read_nu8(pResp); uint8_t atqc0 = buffer_read_nu8(pResp);
if( (frame_length != 18) || (atqc0 != 0x01) ) if ((frame_length != 18) || (atqc0 != 0x01)) {
{
NFC_WARN("Wrong ATQC frame"); NFC_WARN("Wrong ATQC frame");
pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL); pn512_anticollision_callback(pPN512, NFC_ERR_PROTOCOL);
return; return;
@ -850,8 +768,7 @@ void pn512_initiator_felica_anticollision_atqc(pn512_t* pPN512, nfc_err_t ret)
// Read error register // Read error register
uint8_t err_reg = buffer_read_nu8(pResp); uint8_t err_reg = buffer_read_nu8(pResp);
if(err_reg & 0x1f) if (err_reg & 0x1f) {
{
// Error within this time slot, skip // Error within this time slot, skip
continue; continue;
} }
@ -861,13 +778,10 @@ void pn512_initiator_felica_anticollision_atqc(pn512_t* pPN512, nfc_err_t ret)
if ( if (
(pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcF.nfcid2[0] == 0x01) (pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcF.nfcid2[0] == 0x01)
&& (pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcF.nfcid2[1] == 0xFE) && (pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].nfcF.nfcid2[1] == 0xFE)
) ) {
{
// NFC-DEP supported // NFC-DEP supported
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_nfc_dep_f_212 = 1; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_nfc_dep_f_212 = 1;
} } else {
else
{
// Type 3 supported // Type 3 supported
pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_type3 = 1; pPN512->transceiver.remote_targets[pPN512->transceiver.remote_targets_count].type.nfc_type3 = 1;
} }
@ -876,8 +790,7 @@ void pn512_initiator_felica_anticollision_atqc(pn512_t* pPN512, nfc_err_t ret)
// Only continue if we can have more targets // Only continue if we can have more targets
if (!pPN512->config.options.bail_at_first_target if (!pPN512->config.options.bail_at_first_target
&& (pPN512->transceiver.remote_targets_count < MUNFC_MAX_REMOTE_TARGETS) ) && (pPN512->transceiver.remote_targets_count < MUNFC_MAX_REMOTE_TARGETS)) {
{
continue; continue;
} }
break; break;
@ -909,8 +822,7 @@ void pn512_poll_setup(pn512_t* pPN512)
// || pPN512->config.initiators.nfc_nfc_dep_f_212 // || pPN512->config.initiators.nfc_nfc_dep_f_212
// || pPN512->config.initiators.nfc_nfc_dep_f_424; // || pPN512->config.initiators.nfc_nfc_dep_f_424;
if (target) if (target) {
{
NFC_DBG("Configure anticoll/polling response"); NFC_DBG("Configure anticoll/polling response");
//Setup ATQA, SAK and Felica polling response //Setup ATQA, SAK and Felica polling response
pn512_fifo_clear(pPN512); pn512_fifo_clear(pPN512);
@ -923,42 +835,33 @@ void pn512_poll_setup(pn512_t* pPN512)
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
//Write NFCID1 (0s as it will be randomly generated) - first byte will be set to 0x08 by HW according to NFC-IP1 //Write NFCID1 (0s as it will be randomly generated) - first byte will be set to 0x08 by HW according to NFC-IP1
for (int i = 0; i < 3; i++) for (int i = 0; i < 3; i++) {
{
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
} }
//Write SAK //Write SAK
uint8_t sak = 0x00; //Default SAK (UID complete) uint8_t sak = 0x00; //Default SAK (UID complete)
if (pPN512->config.targets.nfc_iso_dep_a) if (pPN512->config.targets.nfc_iso_dep_a) {
{
sak |= 0x20; //This target is ISO-14443A-4 compliant sak |= 0x20; //This target is ISO-14443A-4 compliant
} }
if (pPN512->config.targets.nfc_nfc_dep_a) if (pPN512->config.targets.nfc_nfc_dep_a) {
{
sak |= 0x40; //This target is NFC-IP1 compliant sak |= 0x40; //This target is NFC-IP1 compliant
} }
buffer_builder_write_nu8(pDataCfgBldr, sak); buffer_builder_write_nu8(pDataCfgBldr, sak);
//Write NFCID2 (xx 0xfe according to NFC-IP1 and 0s as 6 bytes will be randomly generated) //Write NFCID2 (xx 0xfe according to NFC-IP1 and 0s as 6 bytes will be randomly generated)
if (pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424) if (pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424) {
{
//Byte 1 is 0x01 if supporting NFC-IP1 //Byte 1 is 0x01 if supporting NFC-IP1
buffer_builder_write_nu8(pDataCfgBldr, 0x01); buffer_builder_write_nu8(pDataCfgBldr, 0x01);
} } else if (pPN512->config.targets.nfc_type3) { //NFC-IP will have priority over type 3 tag emulation
else if (pPN512->config.targets.nfc_type3) //NFC-IP will have priority over type 3 tag emulation
{
//Byte 1 is 0x02 if supporting Type 3 tag platform //Byte 1 is 0x02 if supporting Type 3 tag platform
buffer_builder_write_nu8(pDataCfgBldr, 0x02); buffer_builder_write_nu8(pDataCfgBldr, 0x02);
} } else {
else
{
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
} }
buffer_builder_write_nu8(pDataCfgBldr, 0xFE); buffer_builder_write_nu8(pDataCfgBldr, 0xFE);
for (int i = 0; i < 6; i++) for (int i = 0; i < 6; i++) {
{
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
} }
@ -972,13 +875,10 @@ void pn512_poll_setup(pn512_t* pPN512)
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
if (!(pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424) if (!(pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424)
&& pPN512->config.targets.nfc_type3) && pPN512->config.targets.nfc_type3) {
{
buffer_builder_write_nu8(pDataCfgBldr, 0x01); //MRTI Check buffer_builder_write_nu8(pDataCfgBldr, 0x01); //MRTI Check
buffer_builder_write_nu8(pDataCfgBldr, 0x01); //MRTI Update buffer_builder_write_nu8(pDataCfgBldr, 0x01); //MRTI Update
} } else {
else
{
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
buffer_builder_write_nu8(pDataCfgBldr, 0x00); buffer_builder_write_nu8(pDataCfgBldr, 0x00);
} }
@ -988,13 +888,10 @@ void pn512_poll_setup(pn512_t* pPN512)
//2 system code bytes //2 system code bytes
if (!(pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424) if (!(pPN512->config.targets.nfc_nfc_dep_f_212 || pPN512->config.targets.nfc_nfc_dep_f_424)
&& pPN512->config.targets.nfc_type3) && pPN512->config.targets.nfc_type3) {
{
buffer_builder_write_nu8(pDataCfgBldr, 0x12); buffer_builder_write_nu8(pDataCfgBldr, 0x12);
buffer_builder_write_nu8(pDataCfgBldr, 0xFC); buffer_builder_write_nu8(pDataCfgBldr, 0xFC);
} } else {
else
{
buffer_builder_write_nu8(pDataCfgBldr, 0xFF); //Wildcard system code buffer_builder_write_nu8(pDataCfgBldr, 0xFF); //Wildcard system code
buffer_builder_write_nu8(pDataCfgBldr, 0xFF); buffer_builder_write_nu8(pDataCfgBldr, 0xFF);
} }
@ -1020,8 +917,7 @@ static void pn512_poll_delay_complete(uint32_t events, void* pUserData)
{ {
pn512_t *pPN512 = (pn512_t *) pUserData; pn512_t *pPN512 = (pn512_t *) pUserData;
if(events & EVENT_ABORTED) if (events & EVENT_ABORTED) {
{
pn512_poll_callback(pPN512, NFC_ERR_ABORTED); pn512_poll_callback(pPN512, NFC_ERR_ABORTED);
return; return;
} }
@ -1038,12 +934,10 @@ static void pn512_poll_delay(pn512_t* pPN512, uint32_t timeout)
void pn512_poll_iteration(pn512_t *pPN512, nfc_err_t ret) void pn512_poll_iteration(pn512_t *pPN512, nfc_err_t ret)
{ {
do { do {
if( pPN512->poll.state == pn512_polling_state_start_listening ) if (pPN512->poll.state == pn512_polling_state_start_listening) {
{
NFC_DBG("pn512_polling_state_start_listening"); NFC_DBG("pn512_polling_state_start_listening");
// Start with listening // Start with listening
if( !pn512_config_target(pPN512) ) if (!pn512_config_target(pPN512)) {
{
// Otherwise switch to next step // Otherwise switch to next step
pPN512->poll.state = pn512_polling_state_start_polling; pPN512->poll.state = pn512_polling_state_start_polling;
continue; continue;
@ -1067,16 +961,11 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
NFC_DBG("Switch in target mode and set framing: ISO A: %s; Felica: %s", iso14443a ? "Yes" : "No", felica ? "Yes" : "No"); NFC_DBG("Switch in target mode and set framing: ISO A: %s; Felica: %s", iso14443a ? "Yes" : "No", felica ? "Yes" : "No");
//Switch in target mode //Switch in target mode
if(iso14443a && felica) if (iso14443a && felica) {
{
pn512_framing_set(pPN512, nfc_framing_target_mode_detector); pn512_framing_set(pPN512, nfc_framing_target_mode_detector);
} } else if (iso14443a) {
else if(iso14443a)
{
pn512_framing_set(pPN512, nfc_framing_target_a_106); pn512_framing_set(pPN512, nfc_framing_target_a_106);
} } else if (felica) {
else if(felica)
{
pn512_framing_set(pPN512, nfc_framing_target_f_212); pn512_framing_set(pPN512, nfc_framing_target_f_212);
} }
@ -1084,26 +973,22 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_listen_wait_for_remote_field ) if (pPN512->poll.state == pn512_polling_state_listen_wait_for_remote_field) {
{
NFC_DBG("pn512_polling_state_listen_wait_for_remote_field"); NFC_DBG("pn512_polling_state_listen_wait_for_remote_field");
if( !pn512_config_target(pPN512) ) if (!pn512_config_target(pPN512)) {
{
// Otherwise switch to next step // Otherwise switch to next step
pPN512->poll.state = pn512_polling_state_start_listening; pPN512->poll.state = pn512_polling_state_start_listening;
continue; continue;
} }
if( ret == NFC_ERR_TIMEOUT ) if (ret == NFC_ERR_TIMEOUT) {
{
// Continue polling // Continue polling
pPN512->poll.state = pn512_polling_state_start_polling; pPN512->poll.state = pn512_polling_state_start_polling;
continue; continue;
} }
if(ret) if (ret) {
{
pn512_poll_callback(pPN512, ret); pn512_poll_callback(pPN512, ret);
return; return;
} }
@ -1114,12 +999,10 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_listen_anticollision ) if (pPN512->poll.state == pn512_polling_state_listen_anticollision) {
{
NFC_DBG("pn512_polling_state_listen_anticollision"); NFC_DBG("pn512_polling_state_listen_anticollision");
if(ret == NFC_ERR_FIELD) if (ret == NFC_ERR_FIELD) {
{
// This means that a remote field was dropped - give it another chance // This means that a remote field was dropped - give it another chance
pPN512->poll.state = pn512_polling_state_listen_wait_for_remote_field; pPN512->poll.state = pn512_polling_state_listen_wait_for_remote_field;
pn512_rf_field_switch_off(pPN512); pn512_rf_field_switch_off(pPN512);
@ -1127,8 +1010,7 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if(ret) if (ret) {
{
pn512_poll_callback(pPN512, ret); pn512_poll_callback(pPN512, ret);
return; return;
} }
@ -1140,12 +1022,10 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_start_polling ) if (pPN512->poll.state == pn512_polling_state_start_polling) {
{
NFC_DBG("pn512_polling_state_start_polling"); NFC_DBG("pn512_polling_state_start_polling");
if( !pn512_config_initiator(pPN512) ) if (!pn512_config_initiator(pPN512)) {
{
// Otherwise switch to next step // Otherwise switch to next step
pPN512->poll.state = pn512_polling_state_start_listening; pPN512->poll.state = pn512_polling_state_start_listening;
continue; continue;
@ -1158,20 +1038,17 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_rf_collision_avoidance) if (pPN512->poll.state == pn512_polling_state_rf_collision_avoidance) {
{
NFC_DBG("pn512_polling_state_rf_collision_avoidance"); NFC_DBG("pn512_polling_state_rf_collision_avoidance");
if(ret) if (ret) {
{
pn512_poll_callback(pPN512, ret); pn512_poll_callback(pPN512, ret);
return; return;
} }
NFC_DBG("Own RF field is %s", pPN512->rf_on ? "on" : "off"); NFC_DBG("Own RF field is %s", pPN512->rf_on ? "on" : "off");
if(!pPN512->rf_on) if (!pPN512->rf_on) {
{
// Go back to listening, target framing is still valid so no need to reset it // Go back to listening, target framing is still valid so no need to reset it
pPN512->poll.state = pn512_polling_state_listen_wait_for_remote_field; pPN512->poll.state = pn512_polling_state_listen_wait_for_remote_field;
continue; continue;
@ -1180,14 +1057,12 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
pPN512->poll.state = pn512_polling_state_polling_nfc_a_start; pPN512->poll.state = pn512_polling_state_polling_nfc_a_start;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_a_start ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_a_start) {
{
NFC_DBG("pn512_polling_state_polling_nfc_a_start"); NFC_DBG("pn512_polling_state_polling_nfc_a_start");
//Check if ISO A is needed //Check if ISO A is needed
bool nfc_a = pPN512->config.initiators.nfc_type2 || pPN512->config.initiators.nfc_iso_dep_a || pPN512->config.initiators.nfc_nfc_dep_a; //We do not support type 1 card emulation so irrelevant bool nfc_a = pPN512->config.initiators.nfc_type2 || pPN512->config.initiators.nfc_iso_dep_a || pPN512->config.initiators.nfc_nfc_dep_a; //We do not support type 1 card emulation so irrelevant
if(!nfc_a) if (!nfc_a) {
{
// Continue with NFC B // Continue with NFC B
pPN512->poll.state = pn512_polling_state_polling_nfc_b_start; pPN512->poll.state = pn512_polling_state_polling_nfc_b_start;
continue; continue;
@ -1201,8 +1076,7 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_a_gt ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_a_gt) {
{
NFC_DBG("pn512_polling_state_polling_nfc_a_gt"); NFC_DBG("pn512_polling_state_polling_nfc_a_gt");
// Start anticollision // Start anticollision
@ -1211,27 +1085,23 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_a_anticollision ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_a_anticollision) {
{
NFC_DBG("pn512_polling_state_polling_nfc_a_anticollision"); NFC_DBG("pn512_polling_state_polling_nfc_a_anticollision");
if( ret == NFC_ERR_NOPEER ) if (ret == NFC_ERR_NOPEER) {
{
NFC_DBG("Not found"); NFC_DBG("Not found");
// Continue with NFC B // Continue with NFC B
pPN512->poll.state = pn512_polling_state_polling_nfc_b_start; pPN512->poll.state = pn512_polling_state_polling_nfc_b_start;
continue; continue;
} }
if( (ret == NFC_OK) && (pPN512->config.options.bail_at_first_tech || (pPN512->transceiver.remote_targets_count == MUNFC_MAX_REMOTE_TARGETS)) ) if ((ret == NFC_OK) && (pPN512->config.options.bail_at_first_tech || (pPN512->transceiver.remote_targets_count == MUNFC_MAX_REMOTE_TARGETS))) {
{
// At least one target found, exit polling loop // At least one target found, exit polling loop
pn512_poll_callback(pPN512, NFC_OK); pn512_poll_callback(pPN512, NFC_OK);
return; return;
} }
if( ret == NFC_ERR_ABORTED ) if (ret == NFC_ERR_ABORTED) {
{
pn512_poll_callback(pPN512, ret); pn512_poll_callback(pPN512, ret);
return; return;
} }
@ -1241,14 +1111,12 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
continue; continue;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_b_start ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_b_start) {
{
NFC_DBG("pn512_polling_state_polling_nfc_b_start"); NFC_DBG("pn512_polling_state_polling_nfc_b_start");
//Check if ISO B is needed //Check if ISO B is needed
bool nfc_b = pPN512->config.initiators.nfc_iso_dep_b; bool nfc_b = pPN512->config.initiators.nfc_iso_dep_b;
if (!nfc_b) if (!nfc_b) {
{
// Continue with NFC F // Continue with NFC F
pPN512->poll.state = pn512_polling_state_polling_nfc_f_start; pPN512->poll.state = pn512_polling_state_polling_nfc_f_start;
continue; continue;
@ -1262,8 +1130,7 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if (pPN512->poll.state == pn512_polling_state_polling_nfc_b_gt) if (pPN512->poll.state == pn512_polling_state_polling_nfc_b_gt) {
{
NFC_DBG("pn512_polling_state_polling_nfc_b_gt"); NFC_DBG("pn512_polling_state_polling_nfc_b_gt");
// Start anticollision // Start anticollision
@ -1272,12 +1139,10 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if (pPN512->poll.state == pn512_polling_state_polling_nfc_b_anticollision) if (pPN512->poll.state == pn512_polling_state_polling_nfc_b_anticollision) {
{
NFC_DBG("pn512_polling_state_polling_nfc_b_anticollision"); NFC_DBG("pn512_polling_state_polling_nfc_b_anticollision");
if (ret == NFC_ERR_NOPEER) if (ret == NFC_ERR_NOPEER) {
{
NFC_DBG("Not found"); NFC_DBG("Not found");
// Continue with NFC F // Continue with NFC F
pPN512->poll.state = pn512_polling_state_polling_nfc_f_start; pPN512->poll.state = pn512_polling_state_polling_nfc_f_start;
@ -1287,15 +1152,13 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
if ((ret == NFC_OK) if ((ret == NFC_OK)
&& (pPN512->config.options.bail_at_first_tech && (pPN512->config.options.bail_at_first_tech
|| (pPN512->transceiver.remote_targets_count || (pPN512->transceiver.remote_targets_count
== MUNFC_MAX_REMOTE_TARGETS))) == MUNFC_MAX_REMOTE_TARGETS))) {
{
// At least one target found, exit polling loop // At least one target found, exit polling loop
pn512_poll_callback(pPN512, NFC_OK); pn512_poll_callback(pPN512, NFC_OK);
return; return;
} }
if( ret == NFC_ERR_ABORTED ) if (ret == NFC_ERR_ABORTED) {
{
pn512_poll_callback(pPN512, ret); pn512_poll_callback(pPN512, ret);
return; return;
} }
@ -1305,14 +1168,12 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
continue; continue;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_f_start ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_f_start) {
{
NFC_DBG("pn512_polling_state_polling_nfc_f_start"); NFC_DBG("pn512_polling_state_polling_nfc_f_start");
//Check if Felica is needed //Check if Felica is needed
bool nfc_f = pPN512->config.initiators.nfc_type3 || pPN512->config.initiators.nfc_nfc_dep_f_212; bool nfc_f = pPN512->config.initiators.nfc_type3 || pPN512->config.initiators.nfc_nfc_dep_f_212;
if(!nfc_f) if (!nfc_f) {
{
// Wrap up // Wrap up
pPN512->poll.state = pn512_polling_state_finish_polling; pPN512->poll.state = pn512_polling_state_finish_polling;
continue; continue;
@ -1326,8 +1187,7 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_f_gt ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_f_gt) {
{
NFC_DBG("pn512_polling_state_polling_nfc_f_gt"); NFC_DBG("pn512_polling_state_polling_nfc_f_gt");
// Start anticollision // Start anticollision
@ -1336,27 +1196,23 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
return; return;
} }
if( pPN512->poll.state == pn512_polling_state_polling_nfc_f_anticollision ) if (pPN512->poll.state == pn512_polling_state_polling_nfc_f_anticollision) {
{
NFC_DBG("pn512_polling_state_polling_nfc_f_anticollision"); NFC_DBG("pn512_polling_state_polling_nfc_f_anticollision");
if( ret == NFC_ERR_NOPEER ) if (ret == NFC_ERR_NOPEER) {
{
NFC_DBG("Not found"); NFC_DBG("Not found");
// Resolve polling // Resolve polling
pPN512->poll.state = pn512_polling_state_finish_polling; pPN512->poll.state = pn512_polling_state_finish_polling;
continue; continue;
} }
if( (ret == NFC_OK) && (pPN512->config.options.bail_at_first_tech || (pPN512->transceiver.remote_targets_count == MUNFC_MAX_REMOTE_TARGETS)) ) if ((ret == NFC_OK) && (pPN512->config.options.bail_at_first_tech || (pPN512->transceiver.remote_targets_count == MUNFC_MAX_REMOTE_TARGETS))) {
{
// At least one target found, exit polling loop // At least one target found, exit polling loop
pn512_poll_callback(pPN512, NFC_OK); pn512_poll_callback(pPN512, NFC_OK);
return; return;
} }
if( ret == NFC_ERR_ABORTED ) if (ret == NFC_ERR_ABORTED) {
{
pn512_poll_callback(pPN512, ret); pn512_poll_callback(pPN512, ret);
return; return;
} }
@ -1366,14 +1222,10 @@ void pn512_poll_iteration(pn512_t* pPN512, nfc_err_t ret)
continue; continue;
} }
if( pPN512->poll.state == pn512_polling_state_finish_polling ) if (pPN512->poll.state == pn512_polling_state_finish_polling) {
{ if (pPN512->transceiver.remote_targets_count > 0) {
if(pPN512->transceiver.remote_targets_count > 0)
{
pn512_poll_callback(pPN512, NFC_OK); pn512_poll_callback(pPN512, NFC_OK);
} } else {
else
{
pn512_poll_callback(pPN512, NFC_ERR_NOPEER); pn512_poll_callback(pPN512, NFC_ERR_NOPEER);
} }
return; return;
@ -1398,8 +1250,7 @@ void pn512_poll_hw(pn512_t* pPN512, pn512_cb_t cb)
//Initialize state machine //Initialize state machine
pPN512->poll.state = pn512_polling_state_start_listening; pPN512->poll.state = pn512_polling_state_start_listening;
if( !pn512_config_target(pPN512) && !pn512_config_initiator(pPN512) ) if (!pn512_config_target(pPN512) && !pn512_config_initiator(pPN512)) {
{
pn512_poll_callback(pPN512, NFC_ERR_PARAMS); pn512_poll_callback(pPN512, NFC_ERR_PARAMS);
return; return;
} }

View File

@ -83,8 +83,7 @@ static const uint8_t PN512_CFG_INIT_VALS[] = {
void pn512_registers_reset(pn512_t *pPN512) void pn512_registers_reset(pn512_t *pPN512)
{ {
pn512_register_switch_page_intl(pPN512, 0); pn512_register_switch_page_intl(pPN512, 0);
for(int i = 0; i < PN512_CFG_INIT_LEN; i++) for (int i = 0; i < PN512_CFG_INIT_LEN; i++) {
{
pn512_register_write(pPN512, PN512_CFG_INIT_REGS[i], PN512_CFG_INIT_VALS[i]); pn512_register_write(pPN512, PN512_CFG_INIT_REGS[i], PN512_CFG_INIT_VALS[i]);
} }
} }
@ -97,8 +96,7 @@ void pn512_registers_reset(pn512_t* pPN512)
void pn512_register_write(pn512_t *pPN512, uint8_t address, uint8_t data) void pn512_register_write(pn512_t *pPN512, uint8_t address, uint8_t data)
{ {
NFC_DBG("Write [%02x] << %02x", address, data); NFC_DBG("Write [%02x] << %02x", address, data);
if(REGISTER_PAGE(address) != pPN512->registers.registers_page) if (REGISTER_PAGE(address) != pPN512->registers.registers_page) {
{
pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address)); pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address));
} }
address = REGISTER_ADDR(address); address = REGISTER_ADDR(address);
@ -117,8 +115,7 @@ uint8_t pn512_register_read(pn512_t* pPN512, uint8_t address)
uint8_t __dbg_addr; uint8_t __dbg_addr;
__dbg_addr = address; //FIXME __dbg_addr = address; //FIXME
) )
if(REGISTER_PAGE(address) != pPN512->registers.registers_page) if (REGISTER_PAGE(address) != pPN512->registers.registers_page) {
{
pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address)); pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address));
} }
address = REGISTER_ADDR(address); address = REGISTER_ADDR(address);
@ -129,8 +126,7 @@ uint8_t pn512_register_read(pn512_t* pPN512, uint8_t address)
void pn512_register_switch_page(pn512_t *pPN512, uint8_t address) void pn512_register_switch_page(pn512_t *pPN512, uint8_t address)
{ {
if(REGISTER_PAGE(address) != pPN512->registers.registers_page) if (REGISTER_PAGE(address) != pPN512->registers.registers_page) {
{
pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address)); pn512_register_switch_page_intl(pPN512, REGISTER_PAGE(address));
} }
} }

View File

@ -48,16 +48,14 @@ static const uint8_t framing_registers_felica_414k[] = { 0x3A, 0xA2, 0xA2, 0x12,
nfc_err_t pn512_framing_set(pn512_t *pPN512, nfc_framing_t framing) nfc_err_t pn512_framing_set(pn512_t *pPN512, nfc_framing_t framing)
{ {
if(framing == pPN512->framing) //No need to do anything if (framing == pPN512->framing) { //No need to do anything
{
return NFC_OK; return NFC_OK;
} }
NFC_DBG("Switching to %u", framing); NFC_DBG("Switching to %u", framing);
const uint8_t *framing_registers_values; const uint8_t *framing_registers_values;
switch(framing) switch (framing) {
{
case nfc_framing_target_mode_detector: case nfc_framing_target_mode_detector:
framing_registers_values = framing_registers_mode_detector; framing_registers_values = framing_registers_mode_detector;
break; break;
@ -82,8 +80,7 @@ nfc_err_t pn512_framing_set(pn512_t* pPN512, nfc_framing_t framing)
return NFC_ERR_UNSUPPORTED; return NFC_ERR_UNSUPPORTED;
} }
for(int i = 0; i < PN512_FRAMING_REGS; i++) for (int i = 0; i < PN512_FRAMING_REGS; i++) {
{
pn512_register_write(pPN512, framing_registers[i], framing_registers_values[i]); pn512_register_write(pPN512, framing_registers[i], framing_registers_values[i]);
} }
@ -93,8 +90,7 @@ nfc_err_t pn512_framing_set(pn512_t* pPN512, nfc_framing_t framing)
//TODO initiator: PN512_REG_MODGSP //TODO initiator: PN512_REG_MODGSP
switch(pPN512->framing) switch (pPN512->framing) {
{
case nfc_framing_initiator_a_106: case nfc_framing_initiator_a_106:
case nfc_framing_initiator_b_106: case nfc_framing_initiator_b_106:
case nfc_framing_initiator_f_212: case nfc_framing_initiator_f_212:
@ -111,13 +107,10 @@ nfc_err_t pn512_framing_set(pn512_t* pPN512, nfc_framing_t framing)
return NFC_ERR_UNSUPPORTED; return NFC_ERR_UNSUPPORTED;
} }
#if 1 #if 1
if( (pPN512->framing == nfc_framing_initiator_a_106) /*|| (pPN512->framing == pn512_framing_target_iso14443a_106k)*/ ) if ((pPN512->framing == nfc_framing_initiator_a_106) /*|| (pPN512->framing == pn512_framing_target_iso14443a_106k)*/) {
{
//Enable 100% ASK Modulation //Enable 100% ASK Modulation
pn512_register_write(pPN512, PN512_REG_TXAUTO, pn512_register_read(pPN512, PN512_REG_TXAUTO) | 0x40); pn512_register_write(pPN512, PN512_REG_TXAUTO, pn512_register_read(pPN512, PN512_REG_TXAUTO) | 0x40);
} } else {
else
{
pn512_register_write(pPN512, PN512_REG_TXAUTO, pn512_register_read(pPN512, PN512_REG_TXAUTO) & (~0x40)); pn512_register_write(pPN512, PN512_REG_TXAUTO, pn512_register_read(pPN512, PN512_REG_TXAUTO) & (~0x40));
} }
#endif #endif
@ -127,8 +120,7 @@ nfc_err_t pn512_framing_set(pn512_t* pPN512, nfc_framing_t framing)
nfc_err_t pn512_framing_crc_set(pn512_t *pPN512, bool out, bool in) nfc_err_t pn512_framing_crc_set(pn512_t *pPN512, bool out, bool in)
{ {
const uint8_t *framing_registers_values; const uint8_t *framing_registers_values;
switch(pPN512->framing) switch (pPN512->framing) {
{
case nfc_framing_target_mode_detector: case nfc_framing_target_mode_detector:
framing_registers_values = framing_registers_mode_detector; framing_registers_values = framing_registers_mode_detector;
break; break;
@ -153,13 +145,11 @@ nfc_err_t pn512_framing_crc_set(pn512_t* pPN512, bool out, bool in)
return NFC_ERR_UNSUPPORTED; return NFC_ERR_UNSUPPORTED;
} }
if(pPN512->crc.out != out) if (pPN512->crc.out != out) {
{
pn512_register_write(pPN512, framing_registers[1], (framing_registers_values[1] & 0x7F) | (out ? 0x80 : 0x00)); //TXMODE pn512_register_write(pPN512, framing_registers[1], (framing_registers_values[1] & 0x7F) | (out ? 0x80 : 0x00)); //TXMODE
pPN512->crc.out = out; pPN512->crc.out = out;
} }
if(pPN512->crc.in != in) if (pPN512->crc.in != in) {
{
pn512_register_write(pPN512, framing_registers[2], (framing_registers_values[2] & 0x7F) | (in ? 0x80 : 0x00)); //RXMODE pn512_register_write(pPN512, framing_registers[2], (framing_registers_values[2] & 0x7F) | (in ? 0x80 : 0x00)); //RXMODE
pPN512->crc.in = in; pPN512->crc.in = in;
} }
@ -170,8 +160,7 @@ nfc_err_t pn512_framing_crc_set(pn512_t* pPN512, bool out, bool in)
nfc_err_t pn512_framing_rx_multiple_enable(pn512_t *pPN512) nfc_err_t pn512_framing_rx_multiple_enable(pn512_t *pPN512)
{ {
const uint8_t *framing_registers_values; const uint8_t *framing_registers_values;
switch(pPN512->framing) switch (pPN512->framing) {
{
case nfc_framing_target_mode_detector: case nfc_framing_target_mode_detector:
framing_registers_values = framing_registers_mode_detector; framing_registers_values = framing_registers_mode_detector;
break; break;
@ -221,8 +210,7 @@ void pn512_rf_field_nfcip1_rf_collision_avoidance_complete(uint32_t events, void
pn512_irq_set(pPN512, PN512_IRQ_NONE); pn512_irq_set(pPN512, PN512_IRQ_NONE);
pn512_irq_clear(pPN512, PN512_IRQ_RF_ON | PN512_IRQ_TIMER); pn512_irq_clear(pPN512, PN512_IRQ_RF_ON | PN512_IRQ_TIMER);
if(irq_res & PN512_IRQ_RF_ON) if (irq_res & PN512_IRQ_RF_ON) {
{
NFC_DBG("External field on"); NFC_DBG("External field on");
//Clear TXAUTO register //Clear TXAUTO register
@ -234,8 +222,7 @@ void pn512_rf_field_nfcip1_rf_collision_avoidance_complete(uint32_t events, void
} }
//Has our RF field been switched on? //Has our RF field been switched on?
if( pn512_register_read(pPN512, PN512_REG_TXAUTO) & 0x40 ) //InitialRFOn bit is cleared automatically, if the RF field is switched on if (pn512_register_read(pPN512, PN512_REG_TXAUTO) & 0x40) { //InitialRFOn bit is cleared automatically, if the RF field is switched on
{
NFC_ERR("InitialRFOn bit still set"); NFC_ERR("InitialRFOn bit still set");
pn512_rf_callback(pPN512, NFC_ERR_UNKNOWN); pn512_rf_callback(pPN512, NFC_ERR_UNKNOWN);
return; return;
@ -262,8 +249,7 @@ void pn512_rf_field_nfcip1_rf_collision_avoidance(pn512_t* pPN512, pn512_cb_t cb
pn512_register_write(pPN512, PN512_REG_TXAUTO, 0x0F); pn512_register_write(pPN512, PN512_REG_TXAUTO, 0x0F);
//Is external RF Field already on? //Is external RF Field already on?
if( pn512_register_read(pPN512, PN512_REG_STATUS1) & 0x4 ) if (pn512_register_read(pPN512, PN512_REG_STATUS1) & 0x4) {
{
NFC_DBG("External field already on"); NFC_DBG("External field already on");
pPN512->rf_on = false; //External field on pPN512->rf_on = false; //External field on
@ -293,14 +279,12 @@ void pn512_rf_field_wait_for_external_complete_task(uint32_t events, void* pUser
pn512_irq_set(pPN512, PN512_IRQ_NONE); pn512_irq_set(pPN512, PN512_IRQ_NONE);
pn512_irq_clear(pPN512, PN512_IRQ_RF_ON); pn512_irq_clear(pPN512, PN512_IRQ_RF_ON);
if(events & EVENT_ABORTED) if (events & EVENT_ABORTED) {
{
pn512_rf_callback(pPN512, NFC_ERR_ABORTED); pn512_rf_callback(pPN512, NFC_ERR_ABORTED);
return; return;
} }
if( events & EVENT_TIMEOUT ) if (events & EVENT_TIMEOUT) {
{
NFC_DBG("Timeout"); NFC_DBG("Timeout");
pn512_rf_callback(pPN512, NFC_ERR_TIMEOUT); pn512_rf_callback(pPN512, NFC_ERR_TIMEOUT);
return; return;
@ -320,8 +304,7 @@ void pn512_rf_field_wait_for_external(pn512_t* pPN512, int timeout, pn512_cb_t c
//Is external RF Field already on? //Is external RF Field already on?
pn512_irq_set(pPN512, PN512_IRQ_RF_ON /* External field switched on */); pn512_irq_set(pPN512, PN512_IRQ_RF_ON /* External field switched on */);
if( pn512_register_read(pPN512, PN512_REG_STATUS1) & 0x4 ) if (pn512_register_read(pPN512, PN512_REG_STATUS1) & 0x4) {
{
NFC_DBG("RF field already on"); NFC_DBG("RF field already on");
pn512_irq_set(pPN512, PN512_IRQ_NONE); pn512_irq_set(pPN512, PN512_IRQ_NONE);
pn512_irq_clear(pPN512, PN512_IRQ_RF_ON); pn512_irq_clear(pPN512, PN512_IRQ_RF_ON);

View File

@ -39,8 +39,7 @@ void pn512_timer_config(pn512_t* pPN512, bool autostart, uint16_t prescaler, uin
void pn512_timer_start(pn512_t *pPN512) void pn512_timer_start(pn512_t *pPN512)
{ {
//The control register also contains the initiator bit that we must set correctly //The control register also contains the initiator bit that we must set correctly
switch(pPN512->framing) switch (pPN512->framing) {
{
case nfc_framing_initiator_a_106: case nfc_framing_initiator_a_106:
case nfc_framing_initiator_f_212: case nfc_framing_initiator_f_212:
case nfc_framing_initiator_f_424: case nfc_framing_initiator_f_424:
@ -59,8 +58,7 @@ void pn512_timer_start(pn512_t* pPN512)
void pn512_timer_stop(pn512_t *pPN512) void pn512_timer_stop(pn512_t *pPN512)
{ {
//The control register also contains the initiator bit that we must set correctly //The control register also contains the initiator bit that we must set correctly
switch(pPN512->framing) switch (pPN512->framing) {
{
case nfc_framing_initiator_a_106: case nfc_framing_initiator_a_106:
case nfc_framing_initiator_f_212: case nfc_framing_initiator_f_212:
case nfc_framing_initiator_f_424: case nfc_framing_initiator_f_424:

View File

@ -42,25 +42,19 @@ void pn512_transceive_hw_tx_iteration(pn512_t* pPN512, bool start)
{ {
uint16_t irqs_en = pn512_irq_enabled(pPN512); uint16_t irqs_en = pn512_irq_enabled(pPN512);
if( buffer_reader_readable(&pPN512->writeBuf) > 0 ) if (buffer_reader_readable(&pPN512->writeBuf) > 0) {
{
//Fill FIFO //Fill FIFO
pn512_fifo_write(pPN512, &pPN512->writeBuf); pn512_fifo_write(pPN512, &pPN512->writeBuf);
if (buffer_reader_readable(&pPN512->writeBuf) > 0) //Did not fit in FIFO if (buffer_reader_readable(&pPN512->writeBuf) > 0) { //Did not fit in FIFO
{
pn512_irq_clear(pPN512, PN512_IRQ_LOW_ALERT); pn512_irq_clear(pPN512, PN512_IRQ_LOW_ALERT);
//Has low FIFO alert IRQ already been enabled? //Has low FIFO alert IRQ already been enabled?
if (!(irqs_en & PN512_IRQ_LOW_ALERT)) if (!(irqs_en & PN512_IRQ_LOW_ALERT)) {
{
irqs_en |= PN512_IRQ_LOW_ALERT; irqs_en |= PN512_IRQ_LOW_ALERT;
pn512_irq_set(pPN512, irqs_en); pn512_irq_set(pPN512, irqs_en);
} }
} } else {
else if (irqs_en & PN512_IRQ_LOW_ALERT) {
{
if (irqs_en & PN512_IRQ_LOW_ALERT)
{
//Buffer has been fully sent //Buffer has been fully sent
irqs_en &= ~PN512_IRQ_LOW_ALERT; irqs_en &= ~PN512_IRQ_LOW_ALERT;
pn512_irq_set(pPN512, irqs_en); pn512_irq_set(pPN512, irqs_en);
@ -69,19 +63,15 @@ void pn512_transceive_hw_tx_iteration(pn512_t* pPN512, bool start)
} }
if (start) if (start) {
{ if ((pPN512->transceive.mode == pn512_transceive_mode_transmit) || (pPN512->transceive.mode == pn512_transceive_mode_transmit_and_target_autocoll)) {
if ( (pPN512->transceive.mode == pn512_transceive_mode_transmit) || (pPN512->transceive.mode == pn512_transceive_mode_transmit_and_target_autocoll) )
{
//Update bitframing register //Update bitframing register
pn512_register_write(pPN512, PN512_REG_BITFRAMING, pn512_register_write(pPN512, PN512_REG_BITFRAMING,
0x00 | ((pPN512->readFirstByteAlign & 0x7) << 4) | (pPN512->writeLastByteLength & 0x7)); 0x00 | ((pPN512->readFirstByteAlign & 0x7) << 4) | (pPN512->writeLastByteLength & 0x7));
//Use transmit command //Use transmit command
pn512_cmd_exec(pPN512, PN512_CMD_TRANSMIT); pn512_cmd_exec(pPN512, PN512_CMD_TRANSMIT);
} } else {
else
{
NFC_DBG("Bitframing %02X", 0x80 | ((pPN512->readFirstByteAlign & 0x7) << 4) | (pPN512->writeLastByteLength & 0x7)); NFC_DBG("Bitframing %02X", 0x80 | ((pPN512->readFirstByteAlign & 0x7) << 4) | (pPN512->writeLastByteLength & 0x7));
//Update bitframing register to start transmission //Update bitframing register to start transmission
pn512_register_write(pPN512, PN512_REG_BITFRAMING, pn512_register_write(pPN512, PN512_REG_BITFRAMING,
@ -102,8 +92,7 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
{ {
pn512_t *pPN512 = (pn512_t *) pUserData; pn512_t *pPN512 = (pn512_t *) pUserData;
if(events & EVENT_ABORTED) if (events & EVENT_ABORTED) {
{
//Stop command //Stop command
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
pPN512->transceive.mode = pn512_transceive_mode_idle; pPN512->transceive.mode = pn512_transceive_mode_idle;
@ -118,8 +107,7 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
} }
NFC_DBG("TX task"); NFC_DBG("TX task");
if(events & EVENT_TIMEOUT) if (events & EVENT_TIMEOUT) {
{
// Check status // Check status
NFC_DBG("Status = %02X %02X", pn512_register_read(pPN512, PN512_REG_STATUS1), pn512_register_read(pPN512, PN512_REG_STATUS2)); NFC_DBG("Status = %02X %02X", pn512_register_read(pPN512, PN512_REG_STATUS1), pn512_register_read(pPN512, PN512_REG_STATUS2));
@ -140,8 +128,7 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
uint16_t irqs_en = pn512_irq_enabled(pPN512); uint16_t irqs_en = pn512_irq_enabled(pPN512);
uint16_t irqs = pn512_irq_get(pPN512); uint16_t irqs = pn512_irq_get(pPN512);
if( irqs & PN512_IRQ_RF_OFF ) if (irqs & PN512_IRQ_RF_OFF) {
{
//Stop command //Stop command
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
pPN512->transceive.mode = pn512_transceive_mode_idle; pPN512->transceive.mode = pn512_transceive_mode_idle;
@ -152,10 +139,8 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
pn512_transceive_callback(pPN512, NFC_ERR_FIELD); pn512_transceive_callback(pPN512, NFC_ERR_FIELD);
return; return;
} }
if( irqs & PN512_IRQ_TX ) if (irqs & PN512_IRQ_TX) {
{ if (irqs_en & PN512_IRQ_LOW_ALERT) {
if( irqs_en & PN512_IRQ_LOW_ALERT )
{
//If the transmission has been completed without us getting a chance to fill the buffer up it means that we had a buffer underflow //If the transmission has been completed without us getting a chance to fill the buffer up it means that we had a buffer underflow
NFC_ERR("Buffer underflow"); NFC_ERR("Buffer underflow");
pn512_irq_set(pPN512, PN512_IRQ_NONE); pn512_irq_set(pPN512, PN512_IRQ_NONE);
@ -171,10 +156,8 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
//Start receiving //Start receiving
NFC_DBG("Transmission complete"); NFC_DBG("Transmission complete");
if(pPN512->transceive.mode != pn512_transceive_mode_transmit) if (pPN512->transceive.mode != pn512_transceive_mode_transmit) {
{ if (pPN512->transceive.mode == pn512_transceive_mode_transmit_and_target_autocoll) {
if(pPN512->transceive.mode == pn512_transceive_mode_transmit_and_target_autocoll)
{
//Make sure bitframing reg is clean //Make sure bitframing reg is clean
pn512_register_write(pPN512, PN512_REG_BITFRAMING, 0x00); pn512_register_write(pPN512, PN512_REG_BITFRAMING, 0x00);
@ -183,15 +166,11 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
//Start autocoll //Start autocoll
pn512_cmd_exec(pPN512, PN512_CMD_AUTOCOLL); pn512_cmd_exec(pPN512, PN512_CMD_AUTOCOLL);
} } else {
else
{
pn512_transceive_hw_rx_start(pPN512); pn512_transceive_hw_rx_start(pPN512);
} }
return; return;
} } else {
else
{
pn512_irq_set(pPN512, PN512_IRQ_NONE); pn512_irq_set(pPN512, PN512_IRQ_NONE);
pn512_irq_clear(pPN512, PN512_IRQ_RX | PN512_IRQ_HIGH_ALERT); pn512_irq_clear(pPN512, PN512_IRQ_RX | PN512_IRQ_HIGH_ALERT);
@ -199,8 +178,7 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
return; return;
} }
} }
if( (irqs & PN512_IRQ_LOW_ALERT) && (buffer_reader_readable(&pPN512->writeBuf) > 0) ) if ((irqs & PN512_IRQ_LOW_ALERT) && (buffer_reader_readable(&pPN512->writeBuf) > 0)) {
{
//Continue to fill FIFO //Continue to fill FIFO
pn512_irq_clear(pPN512, PN512_IRQ_LOW_ALERT); pn512_irq_clear(pPN512, PN512_IRQ_LOW_ALERT);
@ -208,8 +186,7 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
return; return;
} }
if( irqs & PN512_IRQ_IDLE ) if (irqs & PN512_IRQ_IDLE) {
{
pn512_irq_clear(pPN512, PN512_IRQ_ERR); pn512_irq_clear(pPN512, PN512_IRQ_ERR);
NFC_ERR("Modem went to idle"); NFC_ERR("Modem went to idle");
@ -230,8 +207,7 @@ void pn512_transceive_hw_tx_task(uint32_t events, void* pUserData)
void pn512_transceive_hw_rx_start(pn512_t *pPN512) void pn512_transceive_hw_rx_start(pn512_t *pPN512)
{ {
uint16_t irqs_en = PN512_IRQ_RX | PN512_IRQ_HIGH_ALERT | PN512_IRQ_ERR; uint16_t irqs_en = PN512_IRQ_RX | PN512_IRQ_HIGH_ALERT | PN512_IRQ_ERR;
if(PN512_FRAMING_IS_TARGET(pPN512->framing)) if (PN512_FRAMING_IS_TARGET(pPN512->framing)) {
{
irqs_en |= PN512_IRQ_RF_OFF; irqs_en |= PN512_IRQ_RF_OFF;
} }
@ -252,8 +228,7 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
pn512_t *pPN512 = (pn512_t *) pUserData; pn512_t *pPN512 = (pn512_t *) pUserData;
NFC_DBG("RX task"); NFC_DBG("RX task");
if(events & EVENT_ABORTED) if (events & EVENT_ABORTED) {
{
//Stop command //Stop command
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
pPN512->transceive.mode = pn512_transceive_mode_idle; pPN512->transceive.mode = pn512_transceive_mode_idle;
@ -267,8 +242,7 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
return; return;
} }
if(events & EVENT_TIMEOUT) if (events & EVENT_TIMEOUT) {
{
NFC_WARN("Timeout"); NFC_WARN("Timeout");
//Stop command //Stop command
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
@ -285,25 +259,20 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
uint16_t irqs = pn512_irq_get(pPN512); uint16_t irqs = pn512_irq_get(pPN512);
NFC_DBG("irqs %04x", irqs); NFC_DBG("irqs %04x", irqs);
bool collision_detected = false; bool collision_detected = false;
if( irqs & PN512_IRQ_ERR ) if (irqs & PN512_IRQ_ERR) {
{
pn512_irq_clear(pPN512, PN512_IRQ_ERR); pn512_irq_clear(pPN512, PN512_IRQ_ERR);
uint8_t err_reg = pn512_register_read(pPN512, PN512_REG_ERROR); uint8_t err_reg = pn512_register_read(pPN512, PN512_REG_ERROR);
NFC_ERR("Got error - error reg is %02X", err_reg); NFC_ERR("Got error - error reg is %02X", err_reg);
// if err_reg == 0, sticky error that must have been cleared automatically, continue // if err_reg == 0, sticky error that must have been cleared automatically, continue
if( err_reg != 0 ) if (err_reg != 0) {
{
//If it's a collsision, flag it but still carry on with RX procedure //If it's a collsision, flag it but still carry on with RX procedure
collision_detected = true; collision_detected = true;
if( (err_reg == 0x08) || (err_reg == 0x0A) ) // Collision (and maybe parity) (and no other error) if ((err_reg == 0x08) || (err_reg == 0x0A)) { // Collision (and maybe parity) (and no other error)
{
irqs &= ~PN512_IRQ_ERR; irqs &= ~PN512_IRQ_ERR;
irqs |= PN512_IRQ_RX; irqs |= PN512_IRQ_RX;
} } else {
else
{
DBG_BLOCK( DBG_BLOCK(
//Empty FIFO into buffer //Empty FIFO into buffer
pn512_fifo_read(pPN512, &pPN512->readBufBldr); pn512_fifo_read(pPN512, &pPN512->readBufBldr);
@ -328,13 +297,11 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
} }
} }
} }
if( (irqs & PN512_IRQ_RX) || (irqs & PN512_IRQ_HIGH_ALERT) ) if ((irqs & PN512_IRQ_RX) || (irqs & PN512_IRQ_HIGH_ALERT)) {
{
//Empty FIFO into buffer //Empty FIFO into buffer
pn512_fifo_read(pPN512, &pPN512->readBufBldr); pn512_fifo_read(pPN512, &pPN512->readBufBldr);
if( (buffer_builder_writeable(&pPN512->readBufBldr) == 0) && (pn512_fifo_length(pPN512) > 0) ) if ((buffer_builder_writeable(&pPN512->readBufBldr) == 0) && (pn512_fifo_length(pPN512) > 0)) {
{
//Stop command //Stop command
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
pPN512->transceive.mode = pn512_transceive_mode_idle; pPN512->transceive.mode = pn512_transceive_mode_idle;
@ -348,19 +315,16 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
return; //overflow return; //overflow
} }
if( irqs & PN512_IRQ_HIGH_ALERT ) if (irqs & PN512_IRQ_HIGH_ALERT) {
{
NFC_DBG("High alert"); NFC_DBG("High alert");
pn512_irq_clear(pPN512, PN512_IRQ_HIGH_ALERT); pn512_irq_clear(pPN512, PN512_IRQ_HIGH_ALERT);
} }
if( irqs & PN512_IRQ_RX ) if (irqs & PN512_IRQ_RX) {
{
pn512_irq_clear(pPN512, PN512_IRQ_RX); pn512_irq_clear(pPN512, PN512_IRQ_RX);
size_t last_byte_length = pn512_register_read(pPN512, PN512_REG_CONTROL) & 0x7; size_t last_byte_length = pn512_register_read(pPN512, PN512_REG_CONTROL) & 0x7;
if( last_byte_length == 0 ) if (last_byte_length == 0) {
{
last_byte_length = 8; last_byte_length = 8;
} }
pPN512->readLastByteLength = last_byte_length; pPN512->readLastByteLength = last_byte_length;
@ -371,11 +335,9 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
NFC_DBG("Received:"); NFC_DBG("Received:");
DBG_BLOCK(buffer_dump(buffer_builder_buffer(&pPN512->readBufBldr));) DBG_BLOCK(buffer_dump(buffer_builder_buffer(&pPN512->readBufBldr));)
if( (pPN512->transceive.mode == pn512_transceive_mode_target_autocoll) || (pPN512->transceive.mode == pn512_transceive_mode_transmit_and_target_autocoll) ) if ((pPN512->transceive.mode == pn512_transceive_mode_target_autocoll) || (pPN512->transceive.mode == pn512_transceive_mode_transmit_and_target_autocoll)) {
{
//Check if target was activated //Check if target was activated
if( !(pn512_register_read(pPN512, PN512_REG_STATUS2) & 0x10) ) if (!(pn512_register_read(pPN512, PN512_REG_STATUS2) & 0x10)) {
{
pPN512->transceive.mode = pn512_transceive_mode_idle; pPN512->transceive.mode = pn512_transceive_mode_idle;
pn512_irq_set(pPN512, PN512_IRQ_NONE); pn512_irq_set(pPN512, PN512_IRQ_NONE);
@ -386,27 +348,21 @@ void pn512_transceive_hw_rx_task(uint32_t events, void* pUserData)
} }
//PN512 switches to transceive automatically //PN512 switches to transceive automatically
pPN512->transceive.mode = pn512_transceive_mode_transceive; pPN512->transceive.mode = pn512_transceive_mode_transceive;
} } else if (pPN512->transceive.mode == pn512_transceive_mode_receive) {
else if( pPN512->transceive.mode == pn512_transceive_mode_receive )
{
pPN512->transceive.mode = pn512_transceive_mode_transceive; pPN512->transceive.mode = pn512_transceive_mode_transceive;
//pn512_cmd_exec(pPN512, PN512_CMD_IDLE); //Useful? //pn512_cmd_exec(pPN512, PN512_CMD_IDLE); //Useful?
} }
if(!collision_detected) if (!collision_detected) {
{
pn512_transceive_callback(pPN512, NFC_OK); pn512_transceive_callback(pPN512, NFC_OK);
} } else {
else
{
pn512_transceive_callback(pPN512, NFC_ERR_COLLISION); pn512_transceive_callback(pPN512, NFC_ERR_COLLISION);
} }
return; return;
} }
} }
if( irqs & PN512_IRQ_RF_OFF ) if (irqs & PN512_IRQ_RF_OFF) {
{
//Stop command //Stop command
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
pPN512->transceive.mode = pn512_transceive_mode_idle; pPN512->transceive.mode = pn512_transceive_mode_idle;
@ -439,31 +395,24 @@ void pn512_transceive_hw(pn512_t* pPN512, pn512_transceive_mode_t mode, pn512_cb
//Clear previous IRQs if present //Clear previous IRQs if present
pn512_irq_clear(pPN512, PN512_IRQ_RX | PN512_IRQ_TX | PN512_IRQ_HIGH_ALERT | PN512_IRQ_LOW_ALERT | PN512_IRQ_ERR | PN512_IRQ_IDLE | PN512_IRQ_RF_OFF); pn512_irq_clear(pPN512, PN512_IRQ_RX | PN512_IRQ_TX | PN512_IRQ_HIGH_ALERT | PN512_IRQ_LOW_ALERT | PN512_IRQ_ERR | PN512_IRQ_IDLE | PN512_IRQ_RF_OFF);
if( PN512_FRAMING_IS_TARGET(pPN512->framing) ) if (PN512_FRAMING_IS_TARGET(pPN512->framing)) {
{
//RF off? //RF off?
if(!(pn512_register_read(pPN512, PN512_REG_STATUS1) & 0x04)) if (!(pn512_register_read(pPN512, PN512_REG_STATUS1) & 0x04)) {
{
//Call callback //Call callback
pn512_transceive_callback(pPN512, NFC_ERR_FIELD); pn512_transceive_callback(pPN512, NFC_ERR_FIELD);
return; return;
} }
} } else if ((pPN512->transceive.mode != mode) && (mode == pn512_transceive_mode_transceive)) {
else if((pPN512->transceive.mode != mode) && (mode == pn512_transceive_mode_transceive))
{
pn512_cmd_exec(pPN512, PN512_CMD_TRANSCEIVE); pn512_cmd_exec(pPN512, PN512_CMD_TRANSCEIVE);
} }
pPN512->transceive.mode = mode; pPN512->transceive.mode = mode;
if( mode == pn512_transceive_mode_receive ) if (mode == pn512_transceive_mode_receive) {
{
pn512_cmd_exec(pPN512, PN512_CMD_IDLE); pn512_cmd_exec(pPN512, PN512_CMD_IDLE);
pn512_transceive_hw_rx_start(pPN512); pn512_transceive_hw_rx_start(pPN512);
pn512_cmd_exec(pPN512, PN512_CMD_TRANSCEIVE); pn512_cmd_exec(pPN512, PN512_CMD_TRANSCEIVE);
} } else if (mode == pn512_transceive_mode_target_autocoll) {
else if(mode == pn512_transceive_mode_target_autocoll)
{
//Make sure bitframing reg is clean //Make sure bitframing reg is clean
pn512_register_write(pPN512, PN512_REG_BITFRAMING, 0x00); pn512_register_write(pPN512, PN512_REG_BITFRAMING, 0x00);
@ -472,16 +421,13 @@ void pn512_transceive_hw(pn512_t* pPN512, pn512_transceive_mode_t mode, pn512_cb
//Start autocoll //Start autocoll
pn512_cmd_exec(pPN512, PN512_CMD_AUTOCOLL); pn512_cmd_exec(pPN512, PN512_CMD_AUTOCOLL);
return; return;
} } else {
else
{
NFC_DBG("Sending:"); NFC_DBG("Sending:");
DBG_BLOCK(buffer_dump(&pPN512->writeBuf);) DBG_BLOCK(buffer_dump(&pPN512->writeBuf);)
//Transmit a frame to remote target/initiator //Transmit a frame to remote target/initiator
irqs_en = PN512_IRQ_TX | PN512_IRQ_IDLE; irqs_en = PN512_IRQ_TX | PN512_IRQ_IDLE;
if( PN512_FRAMING_IS_TARGET(pPN512->framing) ) if (PN512_FRAMING_IS_TARGET(pPN512->framing)) {
{
irqs_en |= PN512_IRQ_RF_OFF; irqs_en |= PN512_IRQ_RF_OFF;
} }

View File

@ -27,8 +27,7 @@
extern "C" { extern "C" {
#endif #endif
typedef struct __pn512_registers typedef struct __pn512_registers {
{
int8_t registers_page; int8_t registers_page;
} pn512_registers_t; } pn512_registers_t;

View File

@ -34,8 +34,7 @@
extern "C" { extern "C" {
#endif #endif
typedef enum __RF_PROTOCOL typedef enum __RF_PROTOCOL {
{
__RF_PROTOCOL_UNKNOWN = 0, __RF_PROTOCOL_UNKNOWN = 0,
//Reader //Reader
RF_PROTOCOL_ISO_14443_A_READER, RF_PROTOCOL_ISO_14443_A_READER,
@ -67,8 +66,7 @@ typedef uint32_t RF_OPTION;
#define RF_OPTION_CHECK_PARITY 0x08 #define RF_OPTION_CHECK_PARITY 0x08
#define RF_OPTION_CLOSE 0x10 //Last frame #define RF_OPTION_CLOSE 0x10 //Last frame
typedef enum __RF_BITRATE typedef enum __RF_BITRATE {
{
RF_BITRATE_106K = 0x00, RF_BITRATE_106K = 0x00,
RF_BITRATE_212K = 0x01, RF_BITRATE_212K = 0x01,
RF_BITRATE_424K = 0x02, RF_BITRATE_424K = 0x02,

View File

@ -51,8 +51,7 @@ enum __nfc_framing {
nfc_framing_initiator_f_424, nfc_framing_initiator_f_424,
}; };
typedef struct __nfc_tech typedef struct __nfc_tech {
{
unsigned int nfc_type1 : 1; unsigned int nfc_type1 : 1;
unsigned int nfc_type2 : 1; unsigned int nfc_type2 : 1;
unsigned int nfc_type3 : 1; unsigned int nfc_type3 : 1;
@ -64,8 +63,7 @@ typedef struct __nfc_tech
} nfc_tech_t; } nfc_tech_t;
typedef struct __polling_options polling_options_t; typedef struct __polling_options polling_options_t;
struct __polling_options struct __polling_options {
{
unsigned int bail_at_first_target : 1; unsigned int bail_at_first_target : 1;
unsigned int bail_at_first_tech : 1; unsigned int bail_at_first_tech : 1;
int32_t listen_for; int32_t listen_for;
@ -89,8 +87,7 @@ typedef void (*abort_fn_t)(nfc_transceiver_t* pTransceiver);
typedef void (*close_fn_t)(nfc_transceiver_t *pTransceiver); typedef void (*close_fn_t)(nfc_transceiver_t *pTransceiver);
typedef void (*sleep_fn_t)(nfc_transceiver_t *pTransceiver, bool sleep); typedef void (*sleep_fn_t)(nfc_transceiver_t *pTransceiver, bool sleep);
struct __transceiver_impl struct __transceiver_impl {
{
set_protocols_fn_t set_protocols; set_protocols_fn_t set_protocols;
poll_fn_t poll; poll_fn_t poll;
set_crc_fn_t set_crc; set_crc_fn_t set_crc;
@ -109,8 +106,7 @@ struct __transceiver_impl
}; };
typedef struct __nfc_a_info nfc_a_info_t; typedef struct __nfc_a_info nfc_a_info_t;
struct __nfc_a_info struct __nfc_a_info {
{
uint8_t uid[10]; uint8_t uid[10];
size_t uidLength; size_t uidLength;
uint8_t sak; uint8_t sak;
@ -118,23 +114,20 @@ struct __nfc_a_info
}; };
typedef struct __nfc_b_info nfc_b_info_t; typedef struct __nfc_b_info nfc_b_info_t;
struct __nfc_b_info struct __nfc_b_info {
{
uint8_t pupi[4]; uint8_t pupi[4];
uint8_t application_data[4]; uint8_t application_data[4];
uint8_t protocol_info[3]; uint8_t protocol_info[3];
}; };
typedef struct __nfc_f_info nfc_f_info_t; typedef struct __nfc_f_info nfc_f_info_t;
struct __nfc_f_info struct __nfc_f_info {
{
uint8_t nfcid2[8]; uint8_t nfcid2[8];
}; };
typedef struct __nfc_info nfc_info_t; typedef struct __nfc_info nfc_info_t;
struct __nfc_info struct __nfc_info {
{
nfc_tech_t type; nfc_tech_t type;
union { union {
nfc_a_info_t nfcA; nfc_a_info_t nfcA;
@ -144,8 +137,7 @@ struct __nfc_info
}; };
#define MUNFC_MAX_REMOTE_TARGETS 4 #define MUNFC_MAX_REMOTE_TARGETS 4
struct __transceiver struct __transceiver {
{
const transceiver_impl_t *fn; //vtable const transceiver_impl_t *fn; //vtable
bool initiator_ntarget; bool initiator_ntarget;
@ -255,8 +247,7 @@ static inline nfc_scheduler_t* transceiver_get_scheduler(nfc_transceiver_t* pTra
static inline const nfc_info_t *transceiver_get_remote_target_info(nfc_transceiver_t *pTransceiver, size_t number) static inline const nfc_info_t *transceiver_get_remote_target_info(nfc_transceiver_t *pTransceiver, size_t number)
{ {
if( number > pTransceiver->remote_targets_count ) if (number > pTransceiver->remote_targets_count) {
{
return NULL; return NULL;
} }
return &pTransceiver->remote_targets[number]; return &pTransceiver->remote_targets[number];