Improves log feature:

* Add --disable-log
  * Add a log level filter, configurable using conf file (ie. /etc/nfc/libnfc.conf) or environment var LIBNFC_LOG_LEVEL
This commit is contained in:
Romuald Conty 2012-11-26 21:02:03 +01:00
parent d6c879083c
commit 9b3947b8ed
21 changed files with 406 additions and 272 deletions

View file

@ -69,16 +69,27 @@ AC_TYPE_OFF_T
LIBNFC_CFLAGS='-I$(top_srcdir)/libnfc -I$(top_builddir)/include -I$(top_srcdir)/include' LIBNFC_CFLAGS='-I$(top_srcdir)/libnfc -I$(top_builddir)/include -I$(top_srcdir)/include'
AC_SUBST(LIBNFC_CFLAGS) AC_SUBST(LIBNFC_CFLAGS)
# Debug support (default:no) # Log support (default:yes)
AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug],[Enable debug output]),[enable_debug=$enableval],[enable_debug="no"]) AC_ARG_ENABLE([log],AS_HELP_STRING([--disable-log],[Disable any logs]),[enable_log=$enableval],[enable_log="yes"])
AC_MSG_CHECKING(for log flag)
AC_MSG_RESULT($enable_log)
AM_CONDITIONAL([WITH_LOG], [test "$enable_log" != "no"])
if test x"$enable_log" = "xyes"
then
AC_DEFINE([LOG], [1], [Enable log])
fi
# Debug support (default:no)
AC_ARG_ENABLE([debug],AS_HELP_STRING([--enable-debug],[Enable debug mode]),[enable_debug=$enableval],[enable_debug="no"])
AC_MSG_CHECKING(for debug flag) AC_MSG_CHECKING(for debug flag)
AC_MSG_RESULT($enable_debug) AC_MSG_RESULT($enable_debug)
AM_CONDITIONAL([WITH_DEBUG], [test "$enable_debug" != "no"]) AM_CONDITIONAL([WITH_DEBUG], [test "$enable_debug" != "no"])
if test x"$enable_debug" = "xyes" if test x"$enable_debug" = "xyes"
then then
CFLAGS="$CFLAGS -g -DDEBUG -O0 -ggdb" AC_DEFINE([DEBUG], [1], [Enable debug flag])
CFLAGS="$CFLAGS -g -O0 -ggdb"
fi fi
# Handle --with-drivers option # Handle --with-drivers option

View file

@ -6,3 +6,8 @@
# Allow intrusive auto-detection (default: false) # Allow intrusive auto-detection (default: false)
# Warning: intrusive auto-detection can seriously disturb other devices # Warning: intrusive auto-detection can seriously disturb other devices
#allow_intrusive_autoscan = false #allow_intrusive_autoscan = false
# Set log level (default: error)
# Valid log levels are (in order of verbosity): 0 (none), 1 (error), 2 (info), 3 (debug)
# Note: if you set --enable-debug option, the default log level is "debug"
#log_level = 1

View file

@ -16,6 +16,7 @@ lib_LTLIBRARIES = libnfc.la
libnfc_la_SOURCES = \ libnfc_la_SOURCES = \
conf.c \ conf.c \
iso14443-subr.c \ iso14443-subr.c \
log.c \
mirror-subr.c \ mirror-subr.c \
nfc.c \ nfc.c \
nfc-device.c \ nfc-device.c \
@ -40,7 +41,7 @@ if LIBUSB_ENABLED
libnfc_la_LIBADD += @libusb_LIBS@ libnfc_la_LIBADD += @libusb_LIBS@
endif endif
if WITH_DEBUG if WITH_LOG
libnfc_la_SOURCES += log-printf.c libnfc_la_SOURCES += log-printf.c
endif endif

View file

@ -42,6 +42,7 @@
#include "nfc-internal.h" #include "nfc-internal.h"
#define LOG_GROUP NFC_LOG_GROUP_COM
#define LOG_CATEGORY "libnfc.bus.uart" #define LOG_CATEGORY "libnfc.bus.uart"
# if defined(__APPLE__) # if defined(__APPLE__)
@ -127,14 +128,14 @@ uart_flush_input(serial_port sp)
char *rx = malloc(available_bytes_count); char *rx = malloc(available_bytes_count);
// There is something available, read the data // There is something available, read the data
res = read(UART_DATA(sp)->fd, rx, available_bytes_count); res = read(UART_DATA(sp)->fd, rx, available_bytes_count);
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%d bytes have eatten.", available_bytes_count); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%d bytes have eatten.", available_bytes_count);
free(rx); free(rx);
} }
void void
uart_set_speed(serial_port sp, const uint32_t uiPortSpeed) uart_set_speed(serial_port sp, const uint32_t uiPortSpeed)
{ {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Serial port speed requested to be set to %d bauds.", uiPortSpeed); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Serial port speed requested to be set to %d bauds.", uiPortSpeed);
// Portability note: on some systems, B9600 != 9600 so we have to do // Portability note: on some systems, B9600 != 9600 so we have to do
// uint32_t <=> speed_t associations by hand. // uint32_t <=> speed_t associations by hand.
@ -170,7 +171,7 @@ uart_set_speed(serial_port sp, const uint32_t uiPortSpeed)
break; break;
# endif # endif
default: default:
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to set serial port speed to %d bauds. Speed value must be one of those defined in termios(3).", log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to set serial port speed to %d bauds. Speed value must be one of those defined in termios(3).",
uiPortSpeed); uiPortSpeed);
return; return;
}; };
@ -179,7 +180,7 @@ uart_set_speed(serial_port sp, const uint32_t uiPortSpeed)
cfsetispeed(&(UART_DATA(sp)->termios_new), stPortSpeed); cfsetispeed(&(UART_DATA(sp)->termios_new), stPortSpeed);
cfsetospeed(&(UART_DATA(sp)->termios_new), stPortSpeed); cfsetospeed(&(UART_DATA(sp)->termios_new), stPortSpeed);
if (tcsetattr(UART_DATA(sp)->fd, TCSADRAIN, &(UART_DATA(sp)->termios_new)) == -1) { if (tcsetattr(UART_DATA(sp)->fd, TCSADRAIN, &(UART_DATA(sp)->termios_new)) == -1) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to apply new speed settings."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to apply new speed settings.");
} }
} }
@ -279,18 +280,18 @@ select:
// Read error // Read error
if (res < 0) { if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Error: %s", strerror(errno)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Error: %s", strerror(errno));
return NFC_EIO; return NFC_EIO;
} }
// Read time-out // Read time-out
if (res == 0) { if (res == 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "Timeout!"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "Timeout!");
return NFC_ETIMEOUT; return NFC_ETIMEOUT;
} }
if (FD_ISSET(iAbortFd, &rfds)) { if (FD_ISSET(iAbortFd, &rfds)) {
// Abort requested // Abort requested
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "Abort!"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "Abort!");
close(iAbortFd); close(iAbortFd);
return NFC_EOPABORTED; return NFC_EOPABORTED;
} }
@ -309,7 +310,7 @@ select:
received_bytes_count += res; received_bytes_count += res;
} while (expected_bytes_count > received_bytes_count); } while (expected_bytes_count > received_bytes_count);
LOG_HEX("RX", pbtRx, szRx); LOG_HEX(LOG_GROUP, "RX", pbtRx, szRx);
return NFC_SUCCESS; return NFC_SUCCESS;
} }
@ -322,7 +323,7 @@ int
uart_send(serial_port sp, const uint8_t *pbtTx, const size_t szTx, int timeout) uart_send(serial_port sp, const uint8_t *pbtTx, const size_t szTx, int timeout)
{ {
(void) timeout; (void) timeout;
LOG_HEX("TX", pbtTx, szTx); LOG_HEX(LOG_GROUP, "TX", pbtTx, szTx);
if ((int) szTx == write(UART_DATA(sp)->fd, pbtTx, szTx)) if ((int) szTx == write(UART_DATA(sp)->fd, pbtTx, szTx))
return NFC_SUCCESS; return NFC_SUCCESS;
else else

View file

@ -2,7 +2,7 @@
* Public platform independent Near Field Communication (NFC) library * Public platform independent Near Field Communication (NFC) library
* *
* Copyright (C) 2011 Romain Tartière * Copyright (C) 2011 Romain Tartière
* Copyright (C) 2011 Romuald Conty * Copyright (C) 2011, 2012 Romuald Conty
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the * under the terms of the GNU Lesser General Public License as published by the
@ -115,7 +115,7 @@
typedef struct { typedef struct {
uint8_t ui8Code; uint8_t ui8Code;
uint8_t ui8CompatFlags; uint8_t ui8CompatFlags;
#ifdef LOGGING #ifdef LOG
const char *abtCommandText; const char *abtCommandText;
#endif #endif
} pn53x_command; } pn53x_command;
@ -128,7 +128,7 @@ typedef enum {
RCS360 = 0x08 RCS360 = 0x08
} pn53x_type; } pn53x_type;
#ifndef LOGGING #ifndef LOG
# define PNCMD( X, Y ) { X , Y } # define PNCMD( X, Y ) { X , Y }
# define PNCMD_TRACE( X ) do {} while(0) # define PNCMD_TRACE( X ) do {} while(0)
#else #else
@ -136,7 +136,7 @@ typedef enum {
# define PNCMD_TRACE( X ) do { \ # define PNCMD_TRACE( X ) do { \
for (size_t i=0; i<(sizeof(pn53x_commands)/sizeof(pn53x_command)); i++) { \ for (size_t i=0; i<(sizeof(pn53x_commands)/sizeof(pn53x_command)); i++) { \
if ( X == pn53x_commands[i].ui8Code ) { \ if ( X == pn53x_commands[i].ui8Code ) { \
log_put( LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", pn53x_commands[i].abtCommandText ); \ log_put( LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", pn53x_commands[i].abtCommandText ); \
break; \ break; \
} \ } \
} \ } \
@ -201,7 +201,7 @@ static const pn53x_command pn53x_commands[] = {
#define P35 5 #define P35 5
// Registers part // Registers part
#ifdef LOGGING #ifdef LOG
typedef struct { typedef struct {
uint16_t ui16Address; uint16_t ui16Address;
const char *abtRegisterText; const char *abtRegisterText;
@ -210,17 +210,17 @@ typedef struct {
# define PNREG( X, Y ) { X , #X, Y } # define PNREG( X, Y ) { X , #X, Y }
#endif /* LOGGING */ #endif /* LOG */
#ifndef LOGGING #ifndef LOG
# define PNREG_TRACE( X ) do { \ # define PNREG_TRACE( X ) do { \
} while(0) } while(0)
#else #else
# define PNREG_TRACE( X ) do { \ # define PNREG_TRACE( X ) do { \
for (size_t i=0; i<(sizeof(pn53x_registers)/sizeof(pn53x_register)); i++) { \ for (size_t i=0; i<(sizeof(pn53x_registers)/sizeof(pn53x_register)); i++) { \
if ( X == pn53x_registers[i].ui16Address ) { \ if ( X == pn53x_registers[i].ui16Address ) { \
log_put( LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s (%s)", pn53x_registers[i].abtRegisterText, pn53x_registers[i].abtRegisterDescription ); \ log_put( LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s (%s)", pn53x_registers[i].abtRegisterText, pn53x_registers[i].abtRegisterDescription ); \
break; \ break; \
} \ } \
} \ } \
@ -329,7 +329,7 @@ typedef struct {
#define EOVCURRENT 0x2d #define EOVCURRENT 0x2d
#define ENAD 0x2e #define ENAD 0x2e
#ifdef LOGGING #ifdef LOG
static const pn53x_register pn53x_registers[] = { static const pn53x_register pn53x_registers[] = {
PNREG(PN53X_REG_CIU_Mode, "Defines general modes for transmitting and receiving"), PNREG(PN53X_REG_CIU_Mode, "Defines general modes for transmitting and receiving"),
PNREG(PN53X_REG_CIU_TxMode, "Defines the transmission data rate and framing during transmission"), PNREG(PN53X_REG_CIU_TxMode, "Defines the transmission data rate and framing during transmission"),

View file

@ -3,7 +3,7 @@
* *
* Copyright (C) 2009, 2010 Roel Verdult * Copyright (C) 2009, 2010 Roel Verdult
* Copyright (C) 2010, 2011 Romain Tartière * Copyright (C) 2010, 2011 Romain Tartière
* Copyright (C) 2009, 2010, 2011 Romuald Conty * Copyright (C) 2009, 2010, 2011, 2012 Romuald Conty
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the * under the terms of the GNU Lesser General Public License as published by the
@ -41,6 +41,7 @@
#include "mirror-subr.h" #include "mirror-subr.h"
#define LOG_CATEGORY "libnfc.chip.pn53x" #define LOG_CATEGORY "libnfc.chip.pn53x"
#define LOG_GROUP NFC_LOG_GROUP_CHIP
const uint8_t pn53x_ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 }; const uint8_t pn53x_ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
const uint8_t pn53x_nack_frame[] = { 0x00, 0x00, 0xff, 0xff, 0x00, 0x00 }; const uint8_t pn53x_nack_frame[] = { 0x00, 0x00, 0xff, 0xff, 0x00, 0x00 };
@ -154,13 +155,13 @@ pn53x_transceive(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTx
PNCMD_TRACE(pbtTx[0]); PNCMD_TRACE(pbtTx[0]);
if (timeout > 0) { if (timeout > 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Timeout values: %d", timeout); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Timeout values: %d", timeout);
} else if (timeout == 0) { } else if (timeout == 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "No timeout"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "No timeout");
} else if (timeout == -1) { } else if (timeout == -1) {
timeout = CHIP_DATA(pnd)->timeout_command; timeout = CHIP_DATA(pnd)->timeout_command;
} else { } else {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Invalid timeout value: %d", timeout); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Invalid timeout value: %d", timeout);
} }
uint8_t abtRx[PN53x_EXTENDED_FRAME__DATA_MAX_LEN]; uint8_t abtRx[PN53x_EXTENDED_FRAME__DATA_MAX_LEN];
@ -294,7 +295,7 @@ pn53x_transceive(struct nfc_device *pnd, const uint8_t *pbtTx, const size_t szTx
if (res < 0) { if (res < 0) {
pnd->last_error = res; pnd->last_error = res;
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Chip error: \"%s\" (%02x), returned error: \"%s\" (%d))", pn53x_strerror(pnd), CHIP_DATA(pnd)->last_status_byte, nfc_strerror(pnd), res); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Chip error: \"%s\" (%02x), returned error: \"%s\" (%d))", pn53x_strerror(pnd), CHIP_DATA(pnd)->last_status_byte, nfc_strerror(pnd), res);
} else { } else {
pnd->last_error = 0; pnd->last_error = 0;
} }
@ -1359,7 +1360,7 @@ pn53x_initiator_transceive_bytes(struct nfc_device *pnd, const uint8_t *pbtTx, c
const size_t szRxLen = (size_t)res - 1; const size_t szRxLen = (size_t)res - 1;
if (pbtRx != NULL) { if (pbtRx != NULL) {
if (szRxLen > szRx) { if (szRxLen > szRx) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Buffer size is too short: %zuo available(s), %zuo needed", szRx, szRxLen); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Buffer size is too short: %zuo available(s), %zuo needed", szRx, szRxLen);
return NFC_EOVFLOW; return NFC_EOVFLOW;
} }
// Copy the received bytes // Copy the received bytes
@ -1634,7 +1635,7 @@ pn53x_initiator_transceive_bytes_timed(struct nfc_device *pnd, const uint8_t *pb
} }
if (pbtRx != NULL) { if (pbtRx != NULL) {
if ((szRxLen + sz) > szRx) { if ((szRxLen + sz) > szRx) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Buffer size is too short: %zuo available(s), %zuo needed", szRx, szRxLen + sz); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Buffer size is too short: %zuo available(s), %zuo needed", szRx, szRxLen + sz);
return NFC_EOVFLOW; return NFC_EOVFLOW;
} }
// Copy the received bytes // Copy the received bytes
@ -2635,12 +2636,12 @@ pn53x_check_ack_frame(struct nfc_device *pnd, const uint8_t *pbtRxFrame, const s
{ {
if (szRxFrameLen >= sizeof(pn53x_ack_frame)) { if (szRxFrameLen >= sizeof(pn53x_ack_frame)) {
if (0 == memcmp(pbtRxFrame, pn53x_ack_frame, sizeof(pn53x_ack_frame))) { if (0 == memcmp(pbtRxFrame, pn53x_ack_frame, sizeof(pn53x_ack_frame))) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "PN53x ACKed"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "PN53x ACKed");
return NFC_SUCCESS; return NFC_SUCCESS;
} }
} }
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unexpected PN53x reply!"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unexpected PN53x reply!");
return pnd->last_error; return pnd->last_error;
} }
@ -2649,7 +2650,7 @@ pn53x_check_error_frame(struct nfc_device *pnd, const uint8_t *pbtRxFrame, const
{ {
if (szRxFrameLen >= sizeof(pn53x_error_frame)) { if (szRxFrameLen >= sizeof(pn53x_error_frame)) {
if (0 == memcmp(pbtRxFrame, pn53x_error_frame, sizeof(pn53x_error_frame))) { if (0 == memcmp(pbtRxFrame, pn53x_error_frame, sizeof(pn53x_error_frame))) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "PN53x sent an error frame"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "PN53x sent an error frame");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -2714,7 +2715,7 @@ pn53x_build_frame(uint8_t *pbtFrame, size_t *pszFrame, const uint8_t *pbtData, c
(*pszFrame) = szData + PN53x_EXTENDED_FRAME__OVERHEAD; (*pszFrame) = szData + PN53x_EXTENDED_FRAME__OVERHEAD;
} else { } else {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "We can't send more than %d bytes in a raw (requested: %zd)", PN53x_EXTENDED_FRAME__DATA_MAX_LEN, szData); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "We can't send more than %d bytes in a raw (requested: %zd)", PN53x_EXTENDED_FRAME__DATA_MAX_LEN, szData);
return NFC_ECHIP; return NFC_ECHIP;
} }
return NFC_SUCCESS; return NFC_SUCCESS;

View file

@ -15,6 +15,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
#include "conf.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <dirent.h> #include <dirent.h>
@ -27,13 +29,14 @@
#include "log.h" #include "log.h"
#define LOG_CATEGORY "libnfc.config" #define LOG_CATEGORY "libnfc.config"
#define LOG_GROUP NFC_LOG_GROUP_CONFIG
#define LIBNFC_SYSCONFDIR "/etc/nfc" #define LIBNFC_SYSCONFDIR "/etc/nfc"
#define LIBNFC_CONFFILE LIBNFC_SYSCONFDIR"/libnfc.conf" #define LIBNFC_CONFFILE LIBNFC_SYSCONFDIR"/libnfc.conf"
#define LIBNFC_DEVICECONFDIR LIBNFC_SYSCONFDIR"/devices.d" #define LIBNFC_DEVICECONFDIR LIBNFC_SYSCONFDIR"/devices.d"
static bool
bool conf_parse_file(const char* filename, void (*conf_keyvalue)(void* data, const char* key, const char* value), void* data) conf_parse_file(const char* filename, void (*conf_keyvalue)(void* data, const char* key, const char* value), void* data)
{ {
FILE *f = fopen (filename, "r"); FILE *f = fopen (filename, "r");
if (!f) { if (!f) {
@ -73,7 +76,7 @@ bool conf_parse_file(const char* filename, void (*conf_keyvalue)(void* data, con
strncpy(value, line+(pmatch[value_pmatch].rm_so), value_size); value[value_size]='\0'; strncpy(value, line+(pmatch[value_pmatch].rm_so), value_size); value[value_size]='\0';
conf_keyvalue(data, key, value); conf_keyvalue(data, key, value);
} else { } else {
log_put( LOG_CATEGORY, NFC_PRIORITY_TRACE, "parse error on line #%d: %s", lineno, line); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "parse error on line #%d: %s", lineno, line);
} }
} }
break; break;
@ -82,7 +85,7 @@ bool conf_parse_file(const char* filename, void (*conf_keyvalue)(void* data, con
return false; return false;
} }
void static void
conf_keyvalue_context(void *data, const char* key, const char* value) conf_keyvalue_context(void *data, const char* key, const char* value)
{ {
nfc_context *context = (nfc_context*)data; nfc_context *context = (nfc_context*)data;
@ -91,8 +94,10 @@ conf_keyvalue_context(void *data, const char* key, const char* value)
string_as_boolean(value, &(context->allow_autoscan)); string_as_boolean(value, &(context->allow_autoscan));
} else if (strcmp(key, "allow_intrusive_scan") == 0) { } else if (strcmp(key, "allow_intrusive_scan") == 0) {
string_as_boolean(value, &(context->allow_intrusive_scan)); string_as_boolean(value, &(context->allow_intrusive_scan));
} else if (strcmp(key, "log_level") == 0) {
context->log_level = atoi(value);
} else { } else {
log_put( LOG_CATEGORY, NFC_PRIORITY_INFO, "unknown key in config line: %s = %s", key, value); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_INFO, "unknown key in config line: %s = %s", key, value);
} }
} }

View file

@ -14,6 +14,7 @@
* You should have received a copy of the GNU Lesser General Public License * You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
#include "nfc-internal.h"
void conf_load(nfc_context *context); void conf_load(nfc_context *context);

View file

@ -79,6 +79,7 @@
#define ACR122_PCSC_COMMAND_LEN 266 #define ACR122_PCSC_COMMAND_LEN 266
#define ACR122_PCSC_RESPONSE_LEN 268 #define ACR122_PCSC_RESPONSE_LEN 268
#define LOG_GROUP NFC_LOG_GROUP_DRIVER
#define LOG_CATEGORY "libnfc.driver.acr122" #define LOG_CATEGORY "libnfc.driver.acr122"
// Internal data struct // Internal data struct
@ -142,8 +143,9 @@ acr122_pcsc_free_scardcontext(void)
* @return number of devices found. * @return number of devices found.
*/ */
static size_t static size_t
acr122_pcsc_scan(nfc_connstring connstrings[], const size_t connstrings_len) acr122_pcsc_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{ {
(void) context;
size_t szPos = 0; size_t szPos = 0;
char acDeviceNames[256 + 64 * PCSC_MAX_DEVICES]; char acDeviceNames[256 + 64 * PCSC_MAX_DEVICES];
size_t szDeviceNamesLen = sizeof(acDeviceNames); size_t szDeviceNamesLen = sizeof(acDeviceNames);
@ -156,7 +158,7 @@ acr122_pcsc_scan(nfc_connstring connstrings[], const size_t connstrings_len)
// Test if context succeeded // Test if context succeeded
if (!(pscc = acr122_pcsc_get_scardcontext())) { if (!(pscc = acr122_pcsc_get_scardcontext())) {
log_put(LOG_CATEGORY, NFC_PRIORITY_WARN, "%s", "PCSC context not found (make sure PCSC daemon is running)."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_INFO, "Warning: %s", "PCSC context not found (make sure PCSC daemon is running).");
return 0; return 0;
} }
// Retrieve the string array of all available pcsc readers // Retrieve the string array of all available pcsc readers
@ -177,7 +179,7 @@ acr122_pcsc_scan(nfc_connstring connstrings[], const size_t connstrings_len)
snprintf(connstrings[device_found], sizeof(nfc_connstring), "%s:%s", ACR122_PCSC_DRIVER_NAME, acDeviceNames + szPos); snprintf(connstrings[device_found], sizeof(nfc_connstring), "%s:%s", ACR122_PCSC_DRIVER_NAME, acDeviceNames + szPos);
device_found++; device_found++;
} else { } else {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "PCSC device [%s] is not NFC capable or not supported by libnfc.", acDeviceNames + szPos); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "PCSC device [%s] is not NFC capable or not supported by libnfc.", acDeviceNames + szPos);
} }
// Find next device name position // Find next device name position
@ -231,7 +233,7 @@ acr122_pcsc_connstring_decode(const nfc_connstring connstring, struct acr122_pcs
} }
static nfc_device * static nfc_device *
acr122_pcsc_open(const nfc_connstring connstring) acr122_pcsc_open(const nfc_context *context, const nfc_connstring connstring)
{ {
struct acr122_pcsc_descriptor ndd; struct acr122_pcsc_descriptor ndd;
int connstring_decode_level = acr122_pcsc_connstring_decode(connstring, &ndd); int connstring_decode_level = acr122_pcsc_connstring_decode(connstring, &ndd);
@ -243,7 +245,7 @@ acr122_pcsc_open(const nfc_connstring connstring)
nfc_connstring fullconnstring; nfc_connstring fullconnstring;
if (connstring_decode_level == 1) { if (connstring_decode_level == 1) {
// Device was not specified, take the first one we can find // Device was not specified, take the first one we can find
size_t szDeviceFound = acr122_pcsc_scan(&fullconnstring, 1); size_t szDeviceFound = acr122_pcsc_scan(context, &fullconnstring, 1);
if (szDeviceFound < 1) if (szDeviceFound < 1)
return NULL; return NULL;
connstring_decode_level = acr122_pcsc_connstring_decode(fullconnstring, &ndd); connstring_decode_level = acr122_pcsc_connstring_decode(fullconnstring, &ndd);
@ -259,7 +261,7 @@ acr122_pcsc_open(const nfc_connstring connstring)
if (sscanf(ndd.pcsc_device_name, "%lu", &index) != 1) if (sscanf(ndd.pcsc_device_name, "%lu", &index) != 1)
return NULL; return NULL;
nfc_connstring *ncs = malloc(sizeof(nfc_connstring) * (index + 1)); nfc_connstring *ncs = malloc(sizeof(nfc_connstring) * (index + 1));
size_t szDeviceFound = acr122_pcsc_scan(ncs, index + 1); size_t szDeviceFound = acr122_pcsc_scan(context, ncs, index + 1);
if (szDeviceFound < index + 1) if (szDeviceFound < index + 1)
return NULL; return NULL;
strncpy(fullconnstring, ncs[index], sizeof(nfc_connstring)); strncpy(fullconnstring, ncs[index], sizeof(nfc_connstring));
@ -271,7 +273,7 @@ acr122_pcsc_open(const nfc_connstring connstring)
} }
char *pcFirmware; char *pcFirmware;
nfc_device *pnd = nfc_device_new(fullconnstring); nfc_device *pnd = nfc_device_new(context, fullconnstring);
pnd->driver_data = malloc(sizeof(struct acr122_pcsc_data)); pnd->driver_data = malloc(sizeof(struct acr122_pcsc_data));
// Alloc and init chip's data // Alloc and init chip's data
@ -279,7 +281,7 @@ acr122_pcsc_open(const nfc_connstring connstring)
SCARDCONTEXT *pscc; SCARDCONTEXT *pscc;
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Attempt to open %s", ndd.pcsc_device_name); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Attempt to open %s", ndd.pcsc_device_name);
// Test if context succeeded // Test if context succeeded
if (!(pscc = acr122_pcsc_get_scardcontext())) if (!(pscc = acr122_pcsc_get_scardcontext()))
goto error; goto error;
@ -288,7 +290,7 @@ acr122_pcsc_open(const nfc_connstring connstring)
// Connect to ACR122 firmware version >2.0 // Connect to ACR122 firmware version >2.0
if (SCardConnect(*pscc, ndd.pcsc_device_name, SCARD_SHARE_DIRECT, 0, &(DRIVER_DATA(pnd)->hCard), (void *) & (DRIVER_DATA(pnd)->ioCard.dwProtocol)) != SCARD_S_SUCCESS) { if (SCardConnect(*pscc, ndd.pcsc_device_name, SCARD_SHARE_DIRECT, 0, &(DRIVER_DATA(pnd)->hCard), (void *) & (DRIVER_DATA(pnd)->ioCard.dwProtocol)) != SCARD_S_SUCCESS) {
// We can not connect to this device. // We can not connect to this device.
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "PCSC connect failed"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "PCSC connect failed");
goto error; goto error;
} }
} }
@ -345,7 +347,7 @@ acr122_pcsc_send(nfc_device *pnd, const uint8_t *pbtData, const size_t szData, i
const size_t szTxBuf = szData + 6; const size_t szTxBuf = szData + 6;
uint8_t abtTxBuf[ACR122_PCSC_WRAP_LEN + ACR122_PCSC_COMMAND_LEN] = { 0xFF, 0x00, 0x00, 0x00, szData + 1, 0xD4 }; uint8_t abtTxBuf[ACR122_PCSC_WRAP_LEN + ACR122_PCSC_COMMAND_LEN] = { 0xFF, 0x00, 0x00, 0x00, szData + 1, 0xD4 };
memcpy(abtTxBuf + 6, pbtData, szData); memcpy(abtTxBuf + 6, pbtData, szData);
LOG_HEX("TX", abtTxBuf, szTxBuf); LOG_HEX(NFC_LOG_GROUP_COM, "TX", abtTxBuf, szTxBuf);
DRIVER_DATA(pnd)->szRx = 0; DRIVER_DATA(pnd)->szRx = 0;
@ -425,7 +427,7 @@ acr122_pcsc_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szData, int
* We already have the PN532 answer, it was saved by acr122_pcsc_send(). * We already have the PN532 answer, it was saved by acr122_pcsc_send().
*/ */
} }
LOG_HEX("RX", DRIVER_DATA(pnd)->abtRx, DRIVER_DATA(pnd)->szRx); LOG_HEX(NFC_LOG_GROUP_COM, "RX", DRIVER_DATA(pnd)->abtRx, DRIVER_DATA(pnd)->szRx);
// Make sure we have an emulated answer that fits the return buffer // Make sure we have an emulated answer that fits the return buffer
if (DRIVER_DATA(pnd)->szRx < 4 || (DRIVER_DATA(pnd)->szRx - 4) > szData) { if (DRIVER_DATA(pnd)->szRx < 4 || (DRIVER_DATA(pnd)->szRx - 4) > szData) {
@ -455,7 +457,7 @@ acr122_pcsc_firmware(nfc_device *pnd)
} }
if (uiResult != SCARD_S_SUCCESS) { if (uiResult != SCARD_S_SUCCESS) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "No ACR122 firmware received, Error: %08x", uiResult); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "No ACR122 firmware received, Error: %08x", uiResult);
} }
return abtFw; return abtFw;

View file

@ -77,6 +77,8 @@ Thanks to d18c7db and Okko for example code
#include "drivers/acr122_usb.h" #include "drivers/acr122_usb.h"
#define ACR122_USB_DRIVER_NAME "acr122_usb" #define ACR122_USB_DRIVER_NAME "acr122_usb"
#define LOG_GROUP NFC_LOG_GROUP_DRIVER
#define LOG_CATEGORY "libnfc.driver.acr122_usb" #define LOG_CATEGORY "libnfc.driver.acr122_usb"
#define USB_INFINITE_TIMEOUT 0 #define USB_INFINITE_TIMEOUT 0
@ -216,11 +218,11 @@ acr122_usb_bulk_read(struct acr122_usb_data *data, uint8_t abtRx[], const size_t
{ {
int res = usb_bulk_read(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, timeout); int res = usb_bulk_read(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, timeout);
if (res > 0) { if (res > 0) {
LOG_HEX("RX", abtRx, res); LOG_HEX(NFC_LOG_GROUP_COM, "RX", abtRx, res);
} else if (res < 0) { } else if (res < 0) {
if (res != -USB_TIMEDOUT) { if (res != -USB_TIMEDOUT) {
res = NFC_EIO; res = NFC_EIO;
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to read from USB (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to read from USB (%s)", _usb_strerror(res));
} else { } else {
res = NFC_ETIMEOUT; res = NFC_ETIMEOUT;
} }
@ -231,7 +233,7 @@ acr122_usb_bulk_read(struct acr122_usb_data *data, uint8_t abtRx[], const size_t
static int static int
acr122_usb_bulk_write(struct acr122_usb_data *data, uint8_t abtTx[], const size_t szTx, const int timeout) acr122_usb_bulk_write(struct acr122_usb_data *data, uint8_t abtTx[], const size_t szTx, const int timeout)
{ {
LOG_HEX("TX", abtTx, szTx); LOG_HEX(NFC_LOG_GROUP_COM, "TX", abtTx, szTx);
int res = usb_bulk_write(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, timeout); int res = usb_bulk_write(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, timeout);
if (res > 0) { if (res > 0) {
// HACK This little hack is a well know problem of USB, see http://www.libusb.org/ticket/6 for more details // HACK This little hack is a well know problem of USB, see http://www.libusb.org/ticket/6 for more details
@ -239,7 +241,7 @@ acr122_usb_bulk_write(struct acr122_usb_data *data, uint8_t abtTx[], const size_
usb_bulk_write(data->pudh, data->uiEndPointOut, "\0", 0, timeout); usb_bulk_write(data->pudh, data->uiEndPointOut, "\0", 0, timeout);
} }
} else if (res < 0) { } else if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to write to USB (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to write to USB (%s)", _usb_strerror(res));
if (res == -USB_TIMEDOUT) { if (res == -USB_TIMEDOUT) {
res = NFC_ETIMEOUT; res = NFC_ETIMEOUT;
} else { } else {
@ -304,8 +306,9 @@ acr122_usb_get_end_points(struct usb_device *dev, struct acr122_usb_data *data)
} }
static size_t static size_t
acr122_usb_scan(nfc_connstring connstrings[], const size_t connstrings_len) acr122_usb_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{ {
(void)context;
usb_init(); usb_init();
int res; int res;
@ -313,14 +316,14 @@ acr122_usb_scan(nfc_connstring connstrings[], const size_t connstrings_len)
// number of changes since previous call to this function (total of new // number of changes since previous call to this function (total of new
// busses and busses removed). // busses and busses removed).
if ((res = usb_find_busses() < 0)) { if ((res = usb_find_busses() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res));
return 0; return 0;
} }
// usb_find_devices will find all of the devices on each bus. This should be // usb_find_devices will find all of the devices on each bus. This should be
// called after usb_find_busses. Returns the number of changes since the // called after usb_find_busses. Returns the number of changes since the
// previous call to this function (total of new device and devices removed). // previous call to this function (total of new device and devices removed).
if ((res = usb_find_devices() < 0)) { if ((res = usb_find_devices() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res));
return 0; return 0;
} }
@ -349,7 +352,7 @@ acr122_usb_scan(nfc_connstring connstrings[], const size_t connstrings_len)
// Set configuration // Set configuration
// acr122_usb_get_usb_device_name (dev, udev, pnddDevices[device_found].acDevice, sizeof (pnddDevices[device_found].acDevice)); // acr122_usb_get_usb_device_name (dev, udev, pnddDevices[device_found].acDevice, sizeof (pnddDevices[device_found].acDevice));
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "device found: Bus %s Device %s Name %s", bus->dirname, dev->filename, acr122_usb_supported_devices[n].name); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "device found: Bus %s Device %s Name %s", bus->dirname, dev->filename, acr122_usb_supported_devices[n].name);
usb_close(udev); usb_close(udev);
snprintf(connstrings[device_found], sizeof(nfc_connstring), "%s:%s:%s", ACR122_USB_DRIVER_NAME, bus->dirname, dev->filename); snprintf(connstrings[device_found], sizeof(nfc_connstring), "%s:%s:%s", ACR122_USB_DRIVER_NAME, bus->dirname, dev->filename);
device_found++; device_found++;
@ -425,12 +428,12 @@ acr122_usb_get_usb_device_name(struct usb_device *dev, usb_dev_handle *udev, cha
} }
static nfc_device * static nfc_device *
acr122_usb_open(const nfc_connstring connstring) acr122_usb_open(const nfc_context *context, const nfc_connstring connstring)
{ {
nfc_device *pnd = NULL; nfc_device *pnd = NULL;
struct acr122_usb_descriptor desc = { NULL, NULL }; struct acr122_usb_descriptor desc = { NULL, NULL };
int connstring_decode_level = acr122_usb_connstring_decode(connstring, &desc); int connstring_decode_level = acr122_usb_connstring_decode(connstring, &desc);
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%d element(s) have been decoded from \"%s\"", connstring_decode_level, connstring); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%d element(s) have been decoded from \"%s\"", connstring_decode_level, connstring);
if (connstring_decode_level < 1) { if (connstring_decode_level < 1) {
goto free_mem; goto free_mem;
} }
@ -450,14 +453,14 @@ acr122_usb_open(const nfc_connstring connstring)
// number of changes since previous call to this function (total of new // number of changes since previous call to this function (total of new
// busses and busses removed). // busses and busses removed).
if ((res = usb_find_busses() < 0)) { if ((res = usb_find_busses() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res));
goto free_mem; goto free_mem;
} }
// usb_find_devices will find all of the devices on each bus. This should be // usb_find_devices will find all of the devices on each bus. This should be
// called after usb_find_busses. Returns the number of changes since the // called after usb_find_busses. Returns the number of changes since the
// previous call to this function (total of new device and devices removed). // previous call to this function (total of new device and devices removed).
if ((res = usb_find_devices() < 0)) { if ((res = usb_find_devices() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res));
goto free_mem; goto free_mem;
} }
@ -482,7 +485,7 @@ acr122_usb_open(const nfc_connstring connstring)
// Claim interface // Claim interface
res = usb_claim_interface(data.pudh, 0); res = usb_claim_interface(data.pudh, 0);
if (res < 0) { if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to claim USB interface (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to claim USB interface (%s)", _usb_strerror(res));
usb_close(data.pudh); usb_close(data.pudh);
// we failed to use the specified device // we failed to use the specified device
goto free_mem; goto free_mem;
@ -490,7 +493,7 @@ acr122_usb_open(const nfc_connstring connstring)
res = usb_set_altinterface(data.pudh, 0); res = usb_set_altinterface(data.pudh, 0);
if (res < 0) { if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to set alternate setting on USB interface (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to set alternate setting on USB interface (%s)", _usb_strerror(res));
usb_close(data.pudh); usb_close(data.pudh);
// we failed to use the specified device // we failed to use the specified device
goto free_mem; goto free_mem;
@ -498,7 +501,7 @@ acr122_usb_open(const nfc_connstring connstring)
data.model = acr122_usb_get_device_model(dev->descriptor.idVendor, dev->descriptor.idProduct); data.model = acr122_usb_get_device_model(dev->descriptor.idVendor, dev->descriptor.idProduct);
// Allocate memory for the device info and specification, fill it and return the info // Allocate memory for the device info and specification, fill it and return the info
pnd = nfc_device_new(connstring); pnd = nfc_device_new(context, connstring);
acr122_usb_get_usb_device_name(dev, data.pudh, pnd->name, sizeof(pnd->name)); acr122_usb_get_usb_device_name(dev, data.pudh, pnd->name, sizeof(pnd->name));
pnd->driver_data = malloc(sizeof(struct acr122_usb_data)); pnd->driver_data = malloc(sizeof(struct acr122_usb_data));
@ -553,11 +556,11 @@ acr122_usb_close(nfc_device *pnd)
int res; int res;
if ((res = usb_release_interface(DRIVER_DATA(pnd)->pudh, 0)) < 0) { if ((res = usb_release_interface(DRIVER_DATA(pnd)->pudh, 0)) < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to release USB interface (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to release USB interface (%s)", _usb_strerror(res));
} }
if ((res = usb_close(DRIVER_DATA(pnd)->pudh)) < 0) { if ((res = usb_close(DRIVER_DATA(pnd)->pudh)) < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to close USB connection (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to close USB connection (%s)", _usb_strerror(res));
} }
pn53x_data_free(pnd); pn53x_data_free(pnd);
nfc_device_free(pnd); nfc_device_free(pnd);
@ -668,7 +671,7 @@ read:
} }
} }
if (abtRxBuf[offset] != attempted_response) { if (abtRxBuf[offset] != attempted_response) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame header mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame header mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -676,7 +679,7 @@ read:
len = abtRxBuf[offset++]; len = abtRxBuf[offset++];
if (len != 2) { if (len != 2) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Wrong reply"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Wrong reply");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -707,7 +710,7 @@ read:
} }
if (abtRxBuf[offset] != attempted_response) { if (abtRxBuf[offset] != attempted_response) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame header mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame header mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -716,21 +719,21 @@ read:
// XXX In CCID specification, len is a 32-bits (dword), do we need to decode more than 1 byte ? (0-255 bytes for PN532 reply) // XXX In CCID specification, len is a 32-bits (dword), do we need to decode more than 1 byte ? (0-255 bytes for PN532 reply)
len = abtRxBuf[offset++]; len = abtRxBuf[offset++];
if ((abtRxBuf[offset] != 0x00) && (abtRxBuf[offset+1] != 0x00) && (abtRxBuf[offset+2] != 0x00)) { if ((abtRxBuf[offset] != 0x00) && (abtRxBuf[offset+1] != 0x00) && (abtRxBuf[offset+2] != 0x00)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Not implemented: only 1-byte length is supported, please report this bug with a full trace."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Not implemented: only 1-byte length is supported, please report this bug with a full trace.");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
offset += 3; offset += 3;
if (len < 4) { if (len < 4) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Too small reply"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Too small reply");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
len -= 4; // We skip 2 bytes for PN532 direction byte (D5) and command byte (CMD+1), then 2 bytes for APDU status (90 00). len -= 4; // We skip 2 bytes for PN532 direction byte (D5) and command byte (CMD+1), then 2 bytes for APDU status (90 00).
if (len > szDataLen) { if (len > szDataLen) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len);
pnd->last_error = NFC_EOVFLOW; pnd->last_error = NFC_EOVFLOW;
return pnd->last_error; return pnd->last_error;
} }
@ -742,14 +745,14 @@ read:
// TFI + PD0 (CC+1) // TFI + PD0 (CC+1)
if (abtRxBuf[offset] != 0xD5) { if (abtRxBuf[offset] != 0xD5) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "TFI Mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "TFI Mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
offset += 1; offset += 1;
if (abtRxBuf[offset] != CHIP_DATA(pnd)->last_command + 1) { if (abtRxBuf[offset] != CHIP_DATA(pnd)->last_command + 1) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Command Code verification failed"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Command Code verification failed");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -767,7 +770,7 @@ acr122_usb_ack(nfc_device *pnd)
(void) pnd; (void) pnd;
int res = 0; int res = 0;
uint8_t acr122_ack_frame[] = { GetFirmwareVersion }; // We can't send a PN532's ACK frame, so we use a normal command to cancel current command uint8_t acr122_ack_frame[] = { GetFirmwareVersion }; // We can't send a PN532's ACK frame, so we use a normal command to cancel current command
log_put(LOG_CATEGORY, NFC_PRIORITY_DEBUG, "%s", "ACR122 Abort"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "ACR122 Abort");
if ((res = acr122_build_frame_from_tama(pnd, acr122_ack_frame, sizeof(acr122_ack_frame))) < 0) if ((res = acr122_build_frame_from_tama(pnd, acr122_ack_frame, sizeof(acr122_ack_frame))) < 0)
return res; return res;
@ -812,7 +815,7 @@ acr122_usb_init(nfc_device *pnd)
0x00, 0x00, 0x00, 0x00, // Blinking duration control 0x00, 0x00, 0x00, 0x00, // Blinking duration control
}; };
log_put (LOG_CATEGORY, NFC_PRIORITY_DEBUG, "%s", "ACR122 Get LED state"); log_put (LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "ACR122 Get LED state");
if ((res = acr122_usb_bulk_write (DRIVER_DATA (pnd), (uint8_t *) acr122u_get_led_state_frame, sizeof (acr122u_get_led_state_frame), 1000)) < 0) if ((res = acr122_usb_bulk_write (DRIVER_DATA (pnd), (uint8_t *) acr122u_get_led_state_frame, sizeof (acr122u_get_led_state_frame), 1000)) < 0)
return res; return res;
@ -837,7 +840,7 @@ acr122_usb_init(nfc_device *pnd)
if ((res = acr122_usb_bulk_read(DRIVER_DATA(pnd), abtRxBuf, sizeof(abtRxBuf), 1000)) < 0) if ((res = acr122_usb_bulk_read(DRIVER_DATA(pnd), abtRxBuf, sizeof(abtRxBuf), 1000)) < 0)
return res; return res;
log_put(LOG_CATEGORY, NFC_PRIORITY_DEBUG, "%s", "ACR122 PICC Operating Parameters"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "ACR122 PICC Operating Parameters");
if ((res = acr122_usb_send_apdu(pnd, 0x00, 0x51, 0x00, NULL, 0, 0, abtRxBuf, sizeof(abtRxBuf))) < 0) if ((res = acr122_usb_send_apdu(pnd, 0x00, 0x51, 0x00, NULL, 0, 0, abtRxBuf, sizeof(abtRxBuf))) < 0)
return res; return res;

View file

@ -45,7 +45,9 @@
#define ACR122S_DEFAULT_SPEED 9600 #define ACR122S_DEFAULT_SPEED 9600
#define ACR122S_DRIVER_NAME "ACR122S" #define ACR122S_DRIVER_NAME "ACR122S"
#define LOG_CATEGORY "libnfc.driver.acr122s" #define LOG_CATEGORY "libnfc.driver.acr122s"
#define LOG_GROUP NFC_LOG_GROUP_DRIVER
// Internal data structs // Internal data structs
struct acr122s_data { struct acr122s_data {
@ -252,7 +254,7 @@ acr122s_recv_frame(nfc_device *pnd, uint8_t *frame, size_t frame_size, void *abo
struct xfr_block_res *res = (struct xfr_block_res *) &frame[1]; struct xfr_block_res *res = (struct xfr_block_res *) &frame[1];
if ((uint8_t)(res->seq + 1) != DRIVER_DATA(pnd)->seq) { if ((uint8_t)(res->seq + 1) != DRIVER_DATA(pnd)->seq) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Invalid response sequence number."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Invalid response sequence number.");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -448,7 +450,7 @@ acr122s_connstring_decode(const nfc_connstring connstring, struct acr122s_descri
} }
static size_t static size_t
acr122s_scan(nfc_connstring connstrings[], const size_t connstrings_len) acr122s_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{ {
size_t device_found = 0; size_t device_found = 0;
serial_port sp; serial_port sp;
@ -458,7 +460,7 @@ acr122s_scan(nfc_connstring connstrings[], const size_t connstrings_len)
while ((acPort = acPorts[iDevice++])) { while ((acPort = acPorts[iDevice++])) {
sp = uart_open(acPort); sp = uart_open(acPort);
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Trying to find ACR122S device on serial port: %s at %d bauds.", acPort, ACR122S_DEFAULT_SPEED); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Trying to find ACR122S device on serial port: %s at %d bauds.", acPort, ACR122S_DEFAULT_SPEED);
if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) { if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) {
// We need to flush input to be sure first reply does not comes from older byte transceive // We need to flush input to be sure first reply does not comes from older byte transceive
@ -467,7 +469,7 @@ acr122s_scan(nfc_connstring connstrings[], const size_t connstrings_len)
nfc_connstring connstring; nfc_connstring connstring;
snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, ACR122S_DRIVER_NAME, acPort, ACR122S_DEFAULT_SPEED); snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, ACR122S_DRIVER_NAME, acPort, ACR122S_DEFAULT_SPEED);
nfc_device *pnd = nfc_device_new(connstring); nfc_device *pnd = nfc_device_new(context, connstring);
pnd->driver = &acr122s_driver; pnd->driver = &acr122s_driver;
pnd->driver_data = malloc(sizeof(struct acr122s_data)); pnd->driver_data = malloc(sizeof(struct acr122s_data));
@ -531,7 +533,7 @@ acr122s_close(nfc_device *pnd)
} }
static nfc_device * static nfc_device *
acr122s_open(const nfc_connstring connstring) acr122s_open(const nfc_context *context, const nfc_connstring connstring)
{ {
serial_port sp; serial_port sp;
nfc_device *pnd; nfc_device *pnd;
@ -545,17 +547,17 @@ acr122s_open(const nfc_connstring connstring)
ndd.speed = ACR122S_DEFAULT_SPEED; ndd.speed = ACR122S_DEFAULT_SPEED;
} }
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG,
"Attempt to connect to: %s at %d bauds.", ndd.port, ndd.speed); "Attempt to connect to: %s at %d bauds.", ndd.port, ndd.speed);
sp = uart_open(ndd.port); sp = uart_open(ndd.port);
if (sp == INVALID_SERIAL_PORT) { if (sp == INVALID_SERIAL_PORT) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR,
"Invalid serial port: %s", ndd.port); "Invalid serial port: %s", ndd.port);
return NULL; return NULL;
} }
if (sp == CLAIMED_SERIAL_PORT) { if (sp == CLAIMED_SERIAL_PORT) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR,
"Serial port already claimed: %s", ndd.port); "Serial port already claimed: %s", ndd.port);
return NULL; return NULL;
} }
@ -563,7 +565,7 @@ acr122s_open(const nfc_connstring connstring)
uart_flush_input(sp); uart_flush_input(sp);
uart_set_speed(sp, ndd.speed); uart_set_speed(sp, ndd.speed);
pnd = nfc_device_new(connstring); pnd = nfc_device_new(context, connstring);
pnd->driver = &acr122s_driver; pnd->driver = &acr122s_driver;
strcpy(pnd->name, ACR122S_DRIVER_NAME); strcpy(pnd->name, ACR122S_DRIVER_NAME);
@ -586,13 +588,13 @@ acr122s_open(const nfc_connstring connstring)
// Retrieve firmware version // Retrieve firmware version
char version[DEVICE_NAME_LENGTH]; char version[DEVICE_NAME_LENGTH];
if (acr122s_get_firmware_version(pnd, version, sizeof(version)) != 0) { if (acr122s_get_firmware_version(pnd, version, sizeof(version)) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Cannot get reader firmware."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Cannot get reader firmware.");
acr122s_close(pnd); acr122s_close(pnd);
return NULL; return NULL;
} }
if (strncmp(version, "ACR122S", 7) != 0) { if (strncmp(version, "ACR122S", 7) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Invalid firmware version: %s", log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Invalid firmware version: %s",
version); version);
acr122s_close(pnd); acr122s_close(pnd);
return NULL; return NULL;
@ -602,14 +604,14 @@ acr122s_open(const nfc_connstring connstring)
// Activate SAM before operating // Activate SAM before operating
if (acr122s_activate_sam(pnd) != 0) { if (acr122s_activate_sam(pnd) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Cannot activate SAM."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Cannot activate SAM.");
acr122s_close(pnd); acr122s_close(pnd);
return NULL; return NULL;
} }
#endif #endif
if (pn53x_init(pnd) < 0) { if (pn53x_init(pnd) < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Failed initializing PN532 chip."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Failed initializing PN532 chip.");
acr122s_close(pnd); acr122s_close(pnd);
return NULL; return NULL;
} }
@ -626,7 +628,7 @@ acr122s_send(nfc_device *pnd, const uint8_t *buf, const size_t buf_len, int time
acr122s_build_frame(pnd, cmd, sizeof(cmd), 0, 0, buf, buf_len, 1); acr122s_build_frame(pnd, cmd, sizeof(cmd), 0, 0, buf, buf_len, 1);
int ret; int ret;
if ((ret = acr122s_send_frame(pnd, cmd, timeout)) != 0) { if ((ret = acr122s_send_frame(pnd, cmd, timeout)) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to transmit data. (TX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to transmit data. (TX)");
pnd->last_error = ret; pnd->last_error = ret;
return pnd->last_error; return pnd->last_error;
} }
@ -654,13 +656,13 @@ acr122s_receive(nfc_device *pnd, uint8_t *buf, size_t buf_len, int timeout)
} }
if (pnd->last_error < 0) { if (pnd->last_error < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
return -1; return -1;
} }
size_t data_len = FRAME_SIZE(tmp) - 17; size_t data_len = FRAME_SIZE(tmp) - 17;
if (data_len > buf_len) { if (data_len > buf_len) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Receive buffer too small. (buf_len: %zu, data_len: %zu)", buf_len, data_len); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Receive buffer too small. (buf_len: %zu, data_len: %zu)", buf_len, data_len);
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }

View file

@ -66,7 +66,9 @@
#define ARYGON_DEFAULT_SPEED 9600 #define ARYGON_DEFAULT_SPEED 9600
#define ARYGON_DRIVER_NAME "arygon" #define ARYGON_DRIVER_NAME "arygon"
#define LOG_CATEGORY "libnfc.driver.arygon" #define LOG_CATEGORY "libnfc.driver.arygon"
#define LOG_GROUP NFC_LOG_GROUP_DRIVER
#define DRIVER_DATA(pnd) ((struct arygon_data*)(pnd->driver_data)) #define DRIVER_DATA(pnd) ((struct arygon_data*)(pnd->driver_data))
@ -92,7 +94,7 @@ int arygon_reset_tama(nfc_device *pnd);
void arygon_firmware(nfc_device *pnd, char *str); void arygon_firmware(nfc_device *pnd, char *str);
static size_t static size_t
arygon_scan(nfc_connstring connstrings[], const size_t connstrings_len) arygon_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{ {
size_t device_found = 0; size_t device_found = 0;
serial_port sp; serial_port sp;
@ -102,7 +104,7 @@ arygon_scan(nfc_connstring connstrings[], const size_t connstrings_len)
while ((acPort = acPorts[iDevice++])) { while ((acPort = acPorts[iDevice++])) {
sp = uart_open(acPort); sp = uart_open(acPort);
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Trying to find ARYGON device on serial port: %s at %d bauds.", acPort, ARYGON_DEFAULT_SPEED); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Trying to find ARYGON device on serial port: %s at %d bauds.", acPort, ARYGON_DEFAULT_SPEED);
if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) { if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) {
// We need to flush input to be sure first reply does not comes from older byte transceive // We need to flush input to be sure first reply does not comes from older byte transceive
@ -111,7 +113,7 @@ arygon_scan(nfc_connstring connstrings[], const size_t connstrings_len)
nfc_connstring connstring; nfc_connstring connstring;
snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, ARYGON_DRIVER_NAME, acPort, ARYGON_DEFAULT_SPEED); snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, ARYGON_DRIVER_NAME, acPort, ARYGON_DEFAULT_SPEED);
nfc_device *pnd = nfc_device_new(connstring); nfc_device *pnd = nfc_device_new(context, connstring);
pnd->driver = &arygon_driver; pnd->driver = &arygon_driver;
pnd->driver_data = malloc(sizeof(struct arygon_data)); pnd->driver_data = malloc(sizeof(struct arygon_data));
@ -223,7 +225,7 @@ arygon_close(nfc_device *pnd)
} }
static nfc_device * static nfc_device *
arygon_open(const nfc_connstring connstring) arygon_open(const nfc_context *context, const nfc_connstring connstring)
{ {
struct arygon_descriptor ndd; struct arygon_descriptor ndd;
int connstring_decode_level = arygon_connstring_decode(connstring, &ndd); int connstring_decode_level = arygon_connstring_decode(connstring, &ndd);
@ -237,13 +239,13 @@ arygon_open(const nfc_connstring connstring)
serial_port sp; serial_port sp;
nfc_device *pnd = NULL; nfc_device *pnd = NULL;
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Attempt to open: %s at %d bauds.", ndd.port, ndd.speed); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Attempt to open: %s at %d bauds.", ndd.port, ndd.speed);
sp = uart_open(ndd.port); sp = uart_open(ndd.port);
if (sp == INVALID_SERIAL_PORT) if (sp == INVALID_SERIAL_PORT)
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Invalid serial port: %s", ndd.port); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Invalid serial port: %s", ndd.port);
if (sp == CLAIMED_SERIAL_PORT) if (sp == CLAIMED_SERIAL_PORT)
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Serial port already claimed: %s", ndd.port); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Serial port already claimed: %s", ndd.port);
if ((sp == CLAIMED_SERIAL_PORT) || (sp == INVALID_SERIAL_PORT)) if ((sp == CLAIMED_SERIAL_PORT) || (sp == INVALID_SERIAL_PORT))
return NULL; return NULL;
@ -252,7 +254,7 @@ arygon_open(const nfc_connstring connstring)
uart_set_speed(sp, ndd.speed); uart_set_speed(sp, ndd.speed);
// We have a connection // We have a connection
pnd = nfc_device_new(connstring); pnd = nfc_device_new(context, connstring);
snprintf(pnd->name, sizeof(pnd->name), "%s:%s", ARYGON_DRIVER_NAME, ndd.port); snprintf(pnd->name, sizeof(pnd->name), "%s:%s", ARYGON_DRIVER_NAME, ndd.port);
pnd->driver_data = malloc(sizeof(struct arygon_data)); pnd->driver_data = malloc(sizeof(struct arygon_data));
@ -308,7 +310,7 @@ arygon_tama_send(nfc_device *pnd, const uint8_t *pbtData, const size_t szData, i
size_t szFrame = 0; size_t szFrame = 0;
if (szData > PN53x_NORMAL_FRAME__DATA_MAX_LEN) { if (szData > PN53x_NORMAL_FRAME__DATA_MAX_LEN) {
// ARYGON Reader with PN532 equipped does not support extended frame (bug in ARYGON firmware?) // ARYGON Reader with PN532 equipped does not support extended frame (bug in ARYGON firmware?)
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "ARYGON device does not support more than %d bytes as payload (requested: %zd)", PN53x_NORMAL_FRAME__DATA_MAX_LEN, szData); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "ARYGON device does not support more than %d bytes as payload (requested: %zd)", PN53x_NORMAL_FRAME__DATA_MAX_LEN, szData);
pnd->last_error = NFC_EDEVNOTSUPP; pnd->last_error = NFC_EDEVNOTSUPP;
return pnd->last_error; return pnd->last_error;
} }
@ -319,14 +321,14 @@ arygon_tama_send(nfc_device *pnd, const uint8_t *pbtData, const size_t szData, i
} }
if ((res = uart_send(DRIVER_DATA(pnd)->port, abtFrame, szFrame + 1, timeout)) != 0) { if ((res = uart_send(DRIVER_DATA(pnd)->port, abtFrame, szFrame + 1, timeout)) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to transmit data. (TX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to transmit data. (TX)");
pnd->last_error = res; pnd->last_error = res;
return pnd->last_error; return pnd->last_error;
} }
uint8_t abtRxBuf[6]; uint8_t abtRxBuf[6];
if ((res = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, sizeof(abtRxBuf), 0, timeout)) != 0) { if ((res = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, sizeof(abtRxBuf), 0, timeout)) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to read ACK"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to read ACK");
pnd->last_error = res; pnd->last_error = res;
return pnd->last_error; return pnd->last_error;
} }
@ -334,7 +336,7 @@ arygon_tama_send(nfc_device *pnd, const uint8_t *pbtData, const size_t szData, i
if (pn53x_check_ack_frame(pnd, abtRxBuf, sizeof(abtRxBuf)) == 0) { if (pn53x_check_ack_frame(pnd, abtRxBuf, sizeof(abtRxBuf)) == 0) {
// The PN53x is running the sent command // The PN53x is running the sent command
} else if (0 == memcmp(arygon_error_unknown_mode, abtRxBuf, sizeof(abtRxBuf))) { } else if (0 == memcmp(arygon_error_unknown_mode, abtRxBuf, sizeof(abtRxBuf))) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Bad frame format."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Bad frame format.");
// We have already read 6 bytes and arygon_error_unknown_mode is 10 bytes long // We have already read 6 bytes and arygon_error_unknown_mode is 10 bytes long
// so we have to read 4 remaining bytes to be synchronized at the next receiving pass. // so we have to read 4 remaining bytes to be synchronized at the next receiving pass.
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 4, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 4, 0, timeout);
@ -381,13 +383,13 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
} }
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
return pnd->last_error; return pnd->last_error;
} }
const uint8_t pn53x_preamble[3] = { 0x00, 0x00, 0xff }; const uint8_t pn53x_preamble[3] = { 0x00, 0x00, 0xff };
if (0 != (memcmp(abtRxBuf, pn53x_preamble, 3))) { if (0 != (memcmp(abtRxBuf, pn53x_preamble, 3))) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame preamble+start code mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame preamble+start code mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -395,7 +397,7 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
if ((0x01 == abtRxBuf[3]) && (0xff == abtRxBuf[4])) { if ((0x01 == abtRxBuf[3]) && (0xff == abtRxBuf[4])) {
// Error frame // Error frame
uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 3, 0, timeout); uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 3, 0, timeout);
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Application level error detected"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Application level error detected");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} else if ((0xff == abtRxBuf[3]) && (0xff == abtRxBuf[4])) { } else if ((0xff == abtRxBuf[3]) && (0xff == abtRxBuf[4])) {
@ -406,7 +408,7 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
// Normal frame // Normal frame
if (256 != (abtRxBuf[3] + abtRxBuf[4])) { if (256 != (abtRxBuf[3] + abtRxBuf[4])) {
// TODO: Retry // TODO: Retry
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Length checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Length checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -416,7 +418,7 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
} }
if (len > szDataLen) { if (len > szDataLen) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len);
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -424,18 +426,18 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
// TFI + PD0 (CC+1) // TFI + PD0 (CC+1)
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
return pnd->last_error; return pnd->last_error;
} }
if (abtRxBuf[0] != 0xD5) { if (abtRxBuf[0] != 0xD5) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "TFI Mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "TFI Mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
if (abtRxBuf[1] != CHIP_DATA(pnd)->last_command + 1) { if (abtRxBuf[1] != CHIP_DATA(pnd)->last_command + 1) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Command Code verification failed"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Command Code verification failed");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -443,14 +445,14 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
if (len) { if (len) {
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, pbtData, len, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, pbtData, len, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
return pnd->last_error; return pnd->last_error;
} }
} }
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
return pnd->last_error; return pnd->last_error;
} }
@ -461,13 +463,13 @@ arygon_tama_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, i
} }
if (btDCS != abtRxBuf[0]) { if (btDCS != abtRxBuf[0]) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Data checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Data checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
if (0x00 != abtRxBuf[1]) { if (0x00 != abtRxBuf[1]) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame postamble mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame postamble mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -485,12 +487,12 @@ arygon_firmware(nfc_device *pnd, char *str)
int res = uart_send(DRIVER_DATA(pnd)->port, arygon_firmware_version_cmd, sizeof(arygon_firmware_version_cmd), 0); int res = uart_send(DRIVER_DATA(pnd)->port, arygon_firmware_version_cmd, sizeof(arygon_firmware_version_cmd), 0);
if (res != 0) { if (res != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "Unable to send ARYGON firmware command."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "Unable to send ARYGON firmware command.");
return; return;
} }
res = uart_receive(DRIVER_DATA(pnd)->port, abtRx, szRx, 0, 0); res = uart_receive(DRIVER_DATA(pnd)->port, abtRx, szRx, 0, 0);
if (res != 0) { if (res != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "Unable to retrieve ARYGON firmware version."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "Unable to retrieve ARYGON firmware version.");
return; return;
} }
@ -517,7 +519,7 @@ arygon_reset_tama(nfc_device *pnd)
// or arygon_error_unknown_mode (ie. in case of the first byte was bad-transmitted) // or arygon_error_unknown_mode (ie. in case of the first byte was bad-transmitted)
res = uart_receive(DRIVER_DATA(pnd)->port, abtRx, szRx, 0, 1000); res = uart_receive(DRIVER_DATA(pnd)->port, abtRx, szRx, 0, 1000);
if (res != 0) { if (res != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "No reply to 'reset TAMA' command."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "No reply to 'reset TAMA' command.");
pnd->last_error = res; pnd->last_error = res;
return pnd->last_error; return pnd->last_error;
} }

View file

@ -45,7 +45,9 @@
#define PN532_UART_DEFAULT_SPEED 115200 #define PN532_UART_DEFAULT_SPEED 115200
#define PN532_UART_DRIVER_NAME "pn532_uart" #define PN532_UART_DRIVER_NAME "pn532_uart"
#define LOG_CATEGORY "libnfc.driver.pn532_uart" #define LOG_CATEGORY "libnfc.driver.pn532_uart"
#define LOG_GROUP NFC_LOG_GROUP_DRIVER
// Internal data structs // Internal data structs
const struct pn53x_io pn532_uart_io; const struct pn53x_io pn532_uart_io;
@ -65,7 +67,7 @@ int pn532_uart_wakeup(nfc_device *pnd);
#define DRIVER_DATA(pnd) ((struct pn532_uart_data*)(pnd->driver_data)) #define DRIVER_DATA(pnd) ((struct pn532_uart_data*)(pnd->driver_data))
static size_t static size_t
pn532_uart_scan(nfc_connstring connstrings[], const size_t connstrings_len) pn532_uart_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{ {
size_t device_found = 0; size_t device_found = 0;
serial_port sp; serial_port sp;
@ -75,7 +77,7 @@ pn532_uart_scan(nfc_connstring connstrings[], const size_t connstrings_len)
while ((acPort = acPorts[iDevice++])) { while ((acPort = acPorts[iDevice++])) {
sp = uart_open(acPort); sp = uart_open(acPort);
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Trying to find PN532 device on serial port: %s at %d bauds.", acPort, PN532_UART_DEFAULT_SPEED); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Trying to find PN532 device on serial port: %s at %d bauds.", acPort, PN532_UART_DEFAULT_SPEED);
if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) { if ((sp != INVALID_SERIAL_PORT) && (sp != CLAIMED_SERIAL_PORT)) {
// We need to flush input to be sure first reply does not comes from older byte transceive // We need to flush input to be sure first reply does not comes from older byte transceive
@ -85,7 +87,7 @@ pn532_uart_scan(nfc_connstring connstrings[], const size_t connstrings_len)
nfc_connstring connstring; nfc_connstring connstring;
snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, PN532_UART_DRIVER_NAME, acPort, PN532_UART_DEFAULT_SPEED); snprintf(connstring, sizeof(nfc_connstring), "%s:%s:%"PRIu32, PN532_UART_DRIVER_NAME, acPort, PN532_UART_DEFAULT_SPEED);
nfc_device *pnd = nfc_device_new(connstring); nfc_device *pnd = nfc_device_new(context, connstring);
pnd->driver = &pn532_uart_driver; pnd->driver = &pn532_uart_driver;
pnd->driver_data = malloc(sizeof(struct pn532_uart_data)); pnd->driver_data = malloc(sizeof(struct pn532_uart_data));
DRIVER_DATA(pnd)->port = sp; DRIVER_DATA(pnd)->port = sp;
@ -200,7 +202,7 @@ pn532_uart_close(nfc_device *pnd)
} }
static nfc_device * static nfc_device *
pn532_uart_open(const nfc_connstring connstring) pn532_uart_open(const nfc_context *context, const nfc_connstring connstring)
{ {
struct pn532_uart_descriptor ndd; struct pn532_uart_descriptor ndd;
int connstring_decode_level = pn532_connstring_decode(connstring, &ndd); int connstring_decode_level = pn532_connstring_decode(connstring, &ndd);
@ -214,13 +216,13 @@ pn532_uart_open(const nfc_connstring connstring)
serial_port sp; serial_port sp;
nfc_device *pnd = NULL; nfc_device *pnd = NULL;
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Attempt to open: %s at %d bauds.", ndd.port, ndd.speed); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Attempt to open: %s at %d bauds.", ndd.port, ndd.speed);
sp = uart_open(ndd.port); sp = uart_open(ndd.port);
if (sp == INVALID_SERIAL_PORT) if (sp == INVALID_SERIAL_PORT)
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Invalid serial port: %s", ndd.port); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Invalid serial port: %s", ndd.port);
if (sp == CLAIMED_SERIAL_PORT) if (sp == CLAIMED_SERIAL_PORT)
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Serial port already claimed: %s", ndd.port); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Serial port already claimed: %s", ndd.port);
if ((sp == CLAIMED_SERIAL_PORT) || (sp == INVALID_SERIAL_PORT)) if ((sp == CLAIMED_SERIAL_PORT) || (sp == INVALID_SERIAL_PORT))
return NULL; return NULL;
@ -229,7 +231,7 @@ pn532_uart_open(const nfc_connstring connstring)
uart_set_speed(sp, ndd.speed); uart_set_speed(sp, ndd.speed);
// We have a connection // We have a connection
pnd = nfc_device_new(connstring); pnd = nfc_device_new(context, connstring);
snprintf(pnd->name, sizeof(pnd->name), "%s:%s", PN532_UART_DRIVER_NAME, ndd.port); snprintf(pnd->name, sizeof(pnd->name), "%s:%s", PN532_UART_DRIVER_NAME, ndd.port);
pnd->driver_data = malloc(sizeof(struct pn532_uart_data)); pnd->driver_data = malloc(sizeof(struct pn532_uart_data));
@ -315,7 +317,7 @@ pn532_uart_send(nfc_device *pnd, const uint8_t *pbtData, const size_t szData, in
res = uart_send(DRIVER_DATA(pnd)->port, abtFrame, szFrame, timeout); res = uart_send(DRIVER_DATA(pnd)->port, abtFrame, szFrame, timeout);
if (res != 0) { if (res != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to transmit data. (TX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to transmit data. (TX)");
pnd->last_error = res; pnd->last_error = res;
return pnd->last_error; return pnd->last_error;
} }
@ -323,7 +325,7 @@ pn532_uart_send(nfc_device *pnd, const uint8_t *pbtData, const size_t szData, in
uint8_t abtRxBuf[6]; uint8_t abtRxBuf[6];
res = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 6, 0, timeout); res = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 6, 0, timeout);
if (res != 0) { if (res != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to read ACK"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to read ACK");
pnd->last_error = res; pnd->last_error = res;
return pnd->last_error; return pnd->last_error;
} }
@ -361,7 +363,7 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
const uint8_t pn53x_preamble[3] = { 0x00, 0x00, 0xff }; const uint8_t pn53x_preamble[3] = { 0x00, 0x00, 0xff };
if (0 != (memcmp(abtRxBuf, pn53x_preamble, 3))) { if (0 != (memcmp(abtRxBuf, pn53x_preamble, 3))) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame preamble+start code mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame preamble+start code mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
@ -369,20 +371,20 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
if ((0x01 == abtRxBuf[3]) && (0xff == abtRxBuf[4])) { if ((0x01 == abtRxBuf[3]) && (0xff == abtRxBuf[4])) {
// Error frame // Error frame
uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 3, 0, timeout); uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 3, 0, timeout);
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Application level error detected"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Application level error detected");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} else if ((0xff == abtRxBuf[3]) && (0xff == abtRxBuf[4])) { } else if ((0xff == abtRxBuf[3]) && (0xff == abtRxBuf[4])) {
// Extended frame // Extended frame
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 3, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 3, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
goto error; goto error;
} }
// (abtRxBuf[0] << 8) + abtRxBuf[1] (LEN) include TFI + (CC+1) // (abtRxBuf[0] << 8) + abtRxBuf[1] (LEN) include TFI + (CC+1)
len = (abtRxBuf[0] << 8) + abtRxBuf[1] - 2; len = (abtRxBuf[0] << 8) + abtRxBuf[1] - 2;
if (((abtRxBuf[0] + abtRxBuf[1] + abtRxBuf[2]) % 256) != 0) { if (((abtRxBuf[0] + abtRxBuf[1] + abtRxBuf[2]) % 256) != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Length checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Length checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
@ -390,7 +392,7 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
// Normal frame // Normal frame
if (256 != (abtRxBuf[3] + abtRxBuf[4])) { if (256 != (abtRxBuf[3] + abtRxBuf[4])) {
// TODO: Retry // TODO: Retry
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Length checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Length checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
@ -400,7 +402,7 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
} }
if (len > szDataLen) { if (len > szDataLen) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len);
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
@ -408,18 +410,18 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
// TFI + PD0 (CC+1) // TFI + PD0 (CC+1)
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
goto error; goto error;
} }
if (abtRxBuf[0] != 0xD5) { if (abtRxBuf[0] != 0xD5) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "TFI Mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "TFI Mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
if (abtRxBuf[1] != CHIP_DATA(pnd)->last_command + 1) { if (abtRxBuf[1] != CHIP_DATA(pnd)->last_command + 1) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Command Code verification failed"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Command Code verification failed");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
@ -427,14 +429,14 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
if (len) { if (len) {
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, pbtData, len, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, pbtData, len, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
goto error; goto error;
} }
} }
pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout); pnd->last_error = uart_receive(DRIVER_DATA(pnd)->port, abtRxBuf, 2, 0, timeout);
if (pnd->last_error != 0) { if (pnd->last_error != 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Unable to receive data. (RX)");
goto error; goto error;
} }
@ -445,13 +447,13 @@ pn532_uart_receive(nfc_device *pnd, uint8_t *pbtData, const size_t szDataLen, in
} }
if (btDCS != abtRxBuf[0]) { if (btDCS != abtRxBuf[0]) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Data checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Data checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }
if (0x00 != abtRxBuf[1]) { if (0x00 != abtRxBuf[1]) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame postamble mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame postamble mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
goto error; goto error;
} }

View file

@ -61,6 +61,7 @@ Thanks to d18c7db and Okko for example code
#define PN53X_USB_DRIVER_NAME "pn53x_usb" #define PN53X_USB_DRIVER_NAME "pn53x_usb"
#define LOG_CATEGORY "libnfc.driver.pn53x_usb" #define LOG_CATEGORY "libnfc.driver.pn53x_usb"
#define LOG_GROUP NFC_LOG_GROUP_DRIVER
#define USB_INFINITE_TIMEOUT 0 #define USB_INFINITE_TIMEOUT 0
@ -97,10 +98,10 @@ pn53x_usb_bulk_read(struct pn53x_usb_data *data, uint8_t abtRx[], const size_t s
{ {
int res = usb_bulk_read(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, timeout); int res = usb_bulk_read(data->pudh, data->uiEndPointIn, (char *) abtRx, szRx, timeout);
if (res > 0) { if (res > 0) {
LOG_HEX("RX", abtRx, res); LOG_HEX(NFC_LOG_GROUP_COM, "RX", abtRx, res);
} else if (res < 0) { } else if (res < 0) {
if (res != -USB_TIMEDOUT) if (res != -USB_TIMEDOUT)
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to read from USB (%s)", _usb_strerror(res)); log_put(NFC_LOG_GROUP_COM, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to read from USB (%s)", _usb_strerror(res));
} }
return res; return res;
} }
@ -108,7 +109,7 @@ pn53x_usb_bulk_read(struct pn53x_usb_data *data, uint8_t abtRx[], const size_t s
static int static int
pn53x_usb_bulk_write(struct pn53x_usb_data *data, uint8_t abtTx[], const size_t szTx, const int timeout) pn53x_usb_bulk_write(struct pn53x_usb_data *data, uint8_t abtTx[], const size_t szTx, const int timeout)
{ {
LOG_HEX("TX", abtTx, szTx); LOG_HEX(NFC_LOG_GROUP_COM, "TX", abtTx, szTx);
int res = usb_bulk_write(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, timeout); int res = usb_bulk_write(data->pudh, data->uiEndPointOut, (char *) abtTx, szTx, timeout);
if (res > 0) { if (res > 0) {
// HACK This little hack is a well know problem of USB, see http://www.libusb.org/ticket/6 for more details // HACK This little hack is a well know problem of USB, see http://www.libusb.org/ticket/6 for more details
@ -116,7 +117,7 @@ pn53x_usb_bulk_write(struct pn53x_usb_data *data, uint8_t abtTx[], const size_t
usb_bulk_write(data->pudh, data->uiEndPointOut, "\0", 0, timeout); usb_bulk_write(data->pudh, data->uiEndPointOut, "\0", 0, timeout);
} }
} else { } else {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to write to USB (%s)", _usb_strerror(res)); log_put(NFC_LOG_GROUP_COM, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to write to USB (%s)", _usb_strerror(res));
} }
return res; return res;
} }
@ -182,22 +183,23 @@ pn53x_usb_get_end_points(struct usb_device *dev, struct pn53x_usb_data *data)
} }
static size_t static size_t
pn53x_usb_scan(nfc_connstring connstrings[], const size_t connstrings_len) pn53x_usb_scan(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len)
{ {
(void)context;
usb_init(); usb_init();
int res; int res;
// usb_find_busses will find all of the busses on the system. Returns the // usb_find_busses will find all of the busses on the system. Returns the
// number of changes since previous call to this function (total of new // number of changes since previous call to this function (total of new
// busses and busses removed). // busses and busses removed).
if ((res = usb_find_busses() < 0)) { if ((res = usb_find_busses() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res));
return 0; return 0;
} }
// usb_find_devices will find all of the devices on each bus. This should be // usb_find_devices will find all of the devices on each bus. This should be
// called after usb_find_busses. Returns the number of changes since the // called after usb_find_busses. Returns the number of changes since the
// previous call to this function (total of new device and devices removed). // previous call to this function (total of new device and devices removed).
if ((res = usb_find_devices() < 0)) { if ((res = usb_find_devices() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res));
return 0; return 0;
} }
@ -227,14 +229,14 @@ pn53x_usb_scan(nfc_connstring connstrings[], const size_t connstrings_len)
// Set configuration // Set configuration
res = usb_set_configuration(udev, 1); res = usb_set_configuration(udev, 1);
if (res < 0) { if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to set USB configuration (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to set USB configuration (%s)", _usb_strerror(res));
usb_close(udev); usb_close(udev);
// we failed to use the device // we failed to use the device
continue; continue;
} }
// pn53x_usb_get_usb_device_name (dev, udev, pnddDevices[device_found].acDevice, sizeof (pnddDevices[device_found].acDevice)); // pn53x_usb_get_usb_device_name (dev, udev, pnddDevices[device_found].acDevice, sizeof (pnddDevices[device_found].acDevice));
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "device found: Bus %s Device %s", bus->dirname, dev->filename); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "device found: Bus %s Device %s", bus->dirname, dev->filename);
usb_close(udev); usb_close(udev);
snprintf(connstrings[device_found], sizeof(nfc_connstring), "%s:%s:%s", PN53X_USB_DRIVER_NAME, bus->dirname, dev->filename); snprintf(connstrings[device_found], sizeof(nfc_connstring), "%s:%s:%s", PN53X_USB_DRIVER_NAME, bus->dirname, dev->filename);
device_found++; device_found++;
@ -310,12 +312,12 @@ pn53x_usb_get_usb_device_name(struct usb_device *dev, usb_dev_handle *udev, char
} }
static nfc_device * static nfc_device *
pn53x_usb_open(const nfc_connstring connstring) pn53x_usb_open(const nfc_context *context, const nfc_connstring connstring)
{ {
nfc_device *pnd = NULL; nfc_device *pnd = NULL;
struct pn53x_usb_descriptor desc = { NULL, NULL }; struct pn53x_usb_descriptor desc = { NULL, NULL };
int connstring_decode_level = pn53x_usb_connstring_decode(connstring, &desc); int connstring_decode_level = pn53x_usb_connstring_decode(connstring, &desc);
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%d element(s) have been decoded from \"%s\"", connstring_decode_level, connstring); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%d element(s) have been decoded from \"%s\"", connstring_decode_level, connstring);
if (connstring_decode_level < 1) { if (connstring_decode_level < 1) {
goto free_mem; goto free_mem;
} }
@ -335,14 +337,14 @@ pn53x_usb_open(const nfc_connstring connstring)
// number of changes since previous call to this function (total of new // number of changes since previous call to this function (total of new
// busses and busses removed). // busses and busses removed).
if ((res = usb_find_busses() < 0)) { if ((res = usb_find_busses() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB busses (%s)", _usb_strerror(res));
goto free_mem; goto free_mem;
} }
// usb_find_devices will find all of the devices on each bus. This should be // usb_find_devices will find all of the devices on each bus. This should be
// called after usb_find_busses. Returns the number of changes since the // called after usb_find_busses. Returns the number of changes since the
// previous call to this function (total of new device and devices removed). // previous call to this function (total of new device and devices removed).
if ((res = usb_find_devices() < 0)) { if ((res = usb_find_devices() < 0)) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to find USB devices (%s)", _usb_strerror(res));
goto free_mem; goto free_mem;
} }
@ -365,9 +367,9 @@ pn53x_usb_open(const nfc_connstring connstring)
// Set configuration // Set configuration
res = usb_set_configuration(data.pudh, 1); res = usb_set_configuration(data.pudh, 1);
if (res < 0) { if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to set USB configuration (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to set USB configuration (%s)", _usb_strerror(res));
if (EPERM == -res) { if (EPERM == -res) {
log_put(LOG_CATEGORY, NFC_PRIORITY_WARN, "Please double check USB permissions for device %04x:%04x", dev->descriptor.idVendor, dev->descriptor.idProduct); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_INFO, "Warning: Please double check USB permissions for device %04x:%04x", dev->descriptor.idVendor, dev->descriptor.idProduct);
} }
usb_close(data.pudh); usb_close(data.pudh);
// we failed to use the specified device // we failed to use the specified device
@ -376,14 +378,14 @@ pn53x_usb_open(const nfc_connstring connstring)
res = usb_claim_interface(data.pudh, 0); res = usb_claim_interface(data.pudh, 0);
if (res < 0) { if (res < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to claim USB interface (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to claim USB interface (%s)", _usb_strerror(res));
usb_close(data.pudh); usb_close(data.pudh);
// we failed to use the specified device // we failed to use the specified device
goto free_mem; goto free_mem;
} }
data.model = pn53x_usb_get_device_model(dev->descriptor.idVendor, dev->descriptor.idProduct); data.model = pn53x_usb_get_device_model(dev->descriptor.idVendor, dev->descriptor.idProduct);
// Allocate memory for the device info and specification, fill it and return the info // Allocate memory for the device info and specification, fill it and return the info
pnd = nfc_device_new(connstring); pnd = nfc_device_new(context, connstring);
pn53x_usb_get_usb_device_name(dev, data.pudh, pnd->name, sizeof(pnd->name)); pn53x_usb_get_usb_device_name(dev, data.pudh, pnd->name, sizeof(pnd->name));
pnd->driver_data = malloc(sizeof(struct pn53x_usb_data)); pnd->driver_data = malloc(sizeof(struct pn53x_usb_data));
@ -455,11 +457,11 @@ pn53x_usb_close(nfc_device *pnd)
int res; int res;
if ((res = usb_release_interface(DRIVER_DATA(pnd)->pudh, 0)) < 0) { if ((res = usb_release_interface(DRIVER_DATA(pnd)->pudh, 0)) < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to release USB interface (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to release USB interface (%s)", _usb_strerror(res));
} }
if ((res = usb_close(DRIVER_DATA(pnd)->pudh)) < 0) { if ((res = usb_close(DRIVER_DATA(pnd)->pudh)) < 0) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to close USB connection (%s)", _usb_strerror(res)); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to close USB connection (%s)", _usb_strerror(res));
} }
pn53x_data_free(pnd); pn53x_data_free(pnd);
nfc_device_free(pnd); nfc_device_free(pnd);
@ -562,7 +564,7 @@ read:
const uint8_t pn53x_preamble[3] = { 0x00, 0x00, 0xff }; const uint8_t pn53x_preamble[3] = { 0x00, 0x00, 0xff };
if (0 != (memcmp(abtRxBuf, pn53x_preamble, 3))) { if (0 != (memcmp(abtRxBuf, pn53x_preamble, 3))) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame preamble+start code mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame preamble+start code mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -570,7 +572,7 @@ read:
if ((0x01 == abtRxBuf[offset]) && (0xff == abtRxBuf[offset + 1])) { if ((0x01 == abtRxBuf[offset]) && (0xff == abtRxBuf[offset + 1])) {
// Error frame // Error frame
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Application level error detected"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Application level error detected");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} else if ((0xff == abtRxBuf[offset]) && (0xff == abtRxBuf[offset + 1])) { } else if ((0xff == abtRxBuf[offset]) && (0xff == abtRxBuf[offset + 1])) {
@ -581,7 +583,7 @@ read:
len = (abtRxBuf[offset] << 8) + abtRxBuf[offset + 1] - 2; len = (abtRxBuf[offset] << 8) + abtRxBuf[offset + 1] - 2;
if (((abtRxBuf[offset] + abtRxBuf[offset + 1] + abtRxBuf[offset + 2]) % 256) != 0) { if (((abtRxBuf[offset] + abtRxBuf[offset + 1] + abtRxBuf[offset + 2]) % 256) != 0) {
// TODO: Retry // TODO: Retry
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Length checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Length checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -590,7 +592,7 @@ read:
// Normal frame // Normal frame
if (256 != (abtRxBuf[offset] + abtRxBuf[offset + 1])) { if (256 != (abtRxBuf[offset] + abtRxBuf[offset + 1])) {
// TODO: Retry // TODO: Retry
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Length checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Length checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -601,21 +603,21 @@ read:
} }
if (len > szDataLen) { if (len > szDataLen) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "Unable to receive data: buffer too small. (szDataLen: %zu, len: %zu)", szDataLen, len);
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
// TFI + PD0 (CC+1) // TFI + PD0 (CC+1)
if (abtRxBuf[offset] != 0xD5) { if (abtRxBuf[offset] != 0xD5) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "TFI Mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "TFI Mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
offset += 1; offset += 1;
if (abtRxBuf[offset] != CHIP_DATA(pnd)->last_command + 1) { if (abtRxBuf[offset] != CHIP_DATA(pnd)->last_command + 1) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Command Code verification failed"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Command Code verification failed");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -631,14 +633,14 @@ read:
} }
if (btDCS != abtRxBuf[offset]) { if (btDCS != abtRxBuf[offset]) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Data checksum mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Data checksum mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
offset += 1; offset += 1;
if (0x00 != abtRxBuf[offset]) { if (0x00 != abtRxBuf[offset]) {
log_put(LOG_CATEGORY, NFC_PRIORITY_ERROR, "%s", "Frame postamble mismatch"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s", "Frame postamble mismatch");
pnd->last_error = NFC_EIO; pnd->last_error = NFC_EIO;
return pnd->last_error; return pnd->last_error;
} }
@ -664,7 +666,7 @@ pn53x_usb_init(nfc_device *pnd)
// ...and we don't care about error // ...and we don't care about error
pnd->last_error = 0; pnd->last_error = 0;
if (SONY_RCS360 == DRIVER_DATA(pnd)->model) { if (SONY_RCS360 == DRIVER_DATA(pnd)->model) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "SONY RC-S360 initialization."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "SONY RC-S360 initialization.");
const uint8_t abtCmd2[] = { 0x18, 0x01 }; const uint8_t abtCmd2[] = { 0x18, 0x01 };
pn53x_transceive(pnd, abtCmd2, sizeof(abtCmd2), NULL, 0, -1); pn53x_transceive(pnd, abtCmd2, sizeof(abtCmd2), NULL, 0, -1);
pn53x_usb_ack(pnd); pn53x_usb_ack(pnd);
@ -674,7 +676,7 @@ pn53x_usb_init(nfc_device *pnd)
return res; return res;
if (ASK_LOGO == DRIVER_DATA(pnd)->model) { if (ASK_LOGO == DRIVER_DATA(pnd)->model) {
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", "ASK LoGO initialization."); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", "ASK LoGO initialization.");
/* Internal registers */ /* Internal registers */
/* Disable 100mA current limit, Power on Secure IC (SVDD) */ /* Disable 100mA current limit, Power on Secure IC (SVDD) */
pn53x_write_register(pnd, PN53X_REG_Control_switch_rng, 0xFF, SYMBOL_CURLIMOFF | SYMBOL_SIC_SWITCH_EN | SYMBOL_RANDOM_DATAREADY); pn53x_write_register(pnd, PN53X_REG_Control_switch_rng, 0xFF, SYMBOL_CURLIMOFF | SYMBOL_SIC_SWITCH_EN | SYMBOL_RANDOM_DATAREADY);
@ -722,7 +724,7 @@ pn53x_usb_set_property_bool(nfc_device *pnd, const nfc_property property, const
case ASK_LOGO: case ASK_LOGO:
if (NP_ACTIVATE_FIELD == property) { if (NP_ACTIVATE_FIELD == property) {
/* Switch on/off LED2 and Progressive Field GPIO according to ACTIVATE_FIELD option */ /* Switch on/off LED2 and Progressive Field GPIO according to ACTIVATE_FIELD option */
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Switch progressive field %s", bEnable ? "On" : "Off"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Switch progressive field %s", bEnable ? "On" : "Off");
if ((res = pn53x_write_register(pnd, PN53X_SFR_P3, _BV(P31) | _BV(P34), bEnable ? _BV(P34) : _BV(P31))) < 0) if ((res = pn53x_write_register(pnd, PN53X_SFR_P3, _BV(P31) | _BV(P34), bEnable ? _BV(P34) : _BV(P31))) < 0)
return NFC_ECHIP; return NFC_ECHIP;
} }

View file

@ -1,6 +1,6 @@
/*- /*-
* Copyright (C) 2011 Romain Tartière * Copyright (C) 2011 Romain Tartière
* Copyright (C) 2011 Romuald Conty * Copyright (C) 2011, 2012 Romuald Conty
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the * under the terms of the GNU Lesser General Public License as published by the
@ -16,53 +16,54 @@
* along with this program. If not, see <http://www.gnu.org/licenses/> * along with this program. If not, see <http://www.gnu.org/licenses/>
*/ */
#include "config.h" #include "log.h"
#include <stdlib.h>
#include <stdint.h> #include <stdint.h>
#include <inttypes.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <fcntl.h> #include <fcntl.h>
#include "log.h" void
log_init(const nfc_context *context)
static uint8_t __log_init_counter = 0;
int
log_init(void)
{ {
int res = 0; char str[32];
sprintf(str, "%"PRIu32, context->log_level);
if (__log_init_counter == 0) { setenv("LIBNFC_LOG_LEVEL", str, 1);
res = 0;
}
if (!res) {
__log_init_counter++;
}
return res;
}
int
log_fini(void)
{
int res = 0;
if (__log_init_counter >= 1) {
if (__log_init_counter == 1) {
res = 0;
}
__log_init_counter--;
} else {
res = -1;
}
return res;
} }
void void
log_put(const char *category, const char *priority, const char *format, ...) log_exit(void)
{ {
va_list va; }
va_start(va, format);
fprintf(stderr, "%s\t%s\t", priority, category); void
vfprintf(stderr, format, va); log_put(const uint8_t group, const char *category, const uint8_t priority, const char *format, ...)
fprintf(stderr, "\n"); {
va_end(va); char *env_log_level = getenv("LIBNFC_LOG_LEVEL");
uint32_t log_level;
if (NULL == env_log_level) {
// LIBNFC_LOG_LEVEL is not set
#ifdef DEBUG
log_level = 3;
#else
log_level = 1;
#endif
} else {
log_level = atoi(env_log_level);
}
// printf("log_level = %"PRIu32" group = %"PRIu8" priority = %"PRIu8"\n", log_level, group, priority);
if (log_level) { // If log is not disabled by log_level=none
if ( ((log_level & 0x00000003) >= priority) || // Global log level
(((log_level >> (group*2)) & 0x00000003) >= priority) ) { // Group log level
va_list va;
va_start(va, format);
fprintf(stderr, "%s\t%s\t", log_priority_to_str(priority), category);
vfprintf(stderr, format, va);
fprintf(stderr, "\n");
va_end(va);
}
}
} }

72
libnfc/log.c Normal file
View file

@ -0,0 +1,72 @@
/*-
* Copyright (C) 2012 Romuald Conty
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
#include "log.h"
/*
#include <stdint.h>
#include <stdio.h>
#include <stdarg.h>
*/
#include <string.h>
/*
int
log_priority_to_int(const char* priority)
{
if (strcmp("none", priority) == 0) {
return -1;
} else if (strcmp("fatal", priority) == 0) {
return NFC_LOG_PRIORITY_FATAL;
} else if (strcmp("alert", priority) == 0) {
return NFC_LOG_PRIORITY_ALERT;
} else if (strcmp("critical", priority) == 0) {
return NFC_LOG_PRIORITY_CRIT;
} else if (strcmp("error", priority) == 0) {
return NFC_LOG_PRIORITY_ERROR;
} else if (strcmp("warning", priority) == 0) {
return NFC_LOG_PRIORITY_WARN;
} else if (strcmp("notice", priority) == 0) {
return NFC_LOG_PRIORITY_NOTICE;
} else if (strcmp("info", priority) == 0) {
return NFC_LOG_PRIORITY_INFO;
} else if (strcmp("debug", priority) == 0) {
return NFC_LOG_PRIORITY_DEBUG;
} else if (strcmp("trace", priority) == 0) {
return NFC_LOG_PRIORITY_TRACE;
}
// if priority is string is not recognized, we set maximal verbosity
return NFC_LOG_PRIORITY_TRACE;
}
*/
const char*
log_priority_to_str(const int priority)
{
switch(priority) {
case NFC_LOG_PRIORITY_ERROR:
return "error";
case NFC_LOG_PRIORITY_INFO:
return "info";
case NFC_LOG_PRIORITY_DEBUG:
return "debug";
default:
break;
}
return "unkown";
}

View file

@ -1,6 +1,6 @@
/*- /*-
* Copyright (C) 2011 Romain Tartière * Copyright (C) 2011 Romain Tartière
* Copyright (C) 2011 Romuald Conty * Copyright (C) 2011, 2012 Romuald Conty
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the * under the terms of the GNU Lesser General Public License as published by the
@ -23,7 +23,36 @@
# include "config.h" # include "config.h"
#endif // HAVE_CONFIG_H #endif // HAVE_CONFIG_H
#if defined DEBUG #include "nfc-internal.h"
#define NFC_LOG_PRIORITY_NONE 0
#define NFC_LOG_PRIORITY_ERROR 1
#define NFC_LOG_PRIORITY_INFO 2
#define NFC_LOG_PRIORITY_DEBUG 3
#define NFC_LOG_GROUP_GENERAL 1
#define NFC_LOG_GROUP_CONFIG 2
#define NFC_LOG_GROUP_CHIP 3
#define NFC_LOG_GROUP_DRIVER 4
#define NFC_LOG_GROUP_COM 5
/*
To enable log only for one (or more) group, you can use this formula:
log_level = NFC_LOG_PRIORITY(main) + NFC_LOG_PRIORITY(group) * 2 ^ (NFC_LOG_GROUP(group) * 2)
Examples:
* Main log level is NONE and only communication group log is set to DEBUG verbosity (for rx/tx trace):
LIBNFC_LOG_LEVEL=3072 // 0+3072
* Main log level is ERROR and driver layer log is set to DEBUG level:
LIBNFC_LOG_LEVEL=769 // 1+768
* Main log level is ERROR, driver layer is set to INFO and communication is set to DEBUG:
LIBNFC_LOG_LEVEL=3585 // 1+512+3072
*/
//int log_priority_to_int(const char* priority);
const char* log_priority_to_str(const int priority);
#if defined LOG
# ifndef __has_attribute # ifndef __has_attribute
# define __has_attribute(x) 0 # define __has_attribute(x) 0
@ -33,57 +62,34 @@
# define __has_attribute_format 1 # define __has_attribute_format 1
# endif # endif
// User want debug features void log_init(const nfc_context *context);
#define LOGGING 1 void log_exit(void);
int log_init(void); void log_put(const uint8_t group, const char *category, const uint8_t priority, const char *format, ...)
int log_fini(void);
void log_put(const char *category, const char *priority, const char *format, ...)
# if __has_attribute_format # if __has_attribute_format
__attribute__((format(printf, 3, 4))) __attribute__((format(printf, 4, 5)))
# endif # endif
; ;
#define NFC_PRIORITY_FATAL "fatal"
#define NFC_PRIORITY_ALERT "alert"
#define NFC_PRIORITY_CRIT "critical"
#define NFC_PRIORITY_ERROR "error"
#define NFC_PRIORITY_WARN "warning"
#define NFC_PRIORITY_NOTICE "notice"
#define NFC_PRIORITY_INFO "info"
#define NFC_PRIORITY_DEBUG "debug"
#define NFC_PRIORITY_TRACE "trace"
#else #else
// No logging // No logging
#define log_init() ((void) 0) #define log_init() ((void) 0)
#define log_fini() ((void) 0) #define log_exit() ((void) 0)
#define log_msg(category, priority, message) do {} while (0)
#define log_set_appender(category, appender) do {} while (0)
#define log_put(category, priority, format, ...) do {} while (0) #define log_put(category, priority, format, ...) do {} while (0)
#define NFC_PRIORITY_FATAL 8 #endif // LOG
#define NFC_PRIORITY_ALERT 7
#define NFC_PRIORITY_CRIT 6
#define NFC_PRIORITY_ERROR 5
#define NFC_PRIORITY_WARN 4
#define NFC_PRIORITY_NOTICE 3
#define NFC_PRIORITY_INFO 2
#define NFC_PRIORITY_DEBUG 1
#define NFC_PRIORITY_TRACE 0
#endif /* HAS_LOG4C, DEBUG */
/** /**
* @macro LOG_HEX * @macro LOG_HEX
* @brief Log a byte-array in hexadecimal format * @brief Log a byte-array in hexadecimal format
*/ */
# ifdef LOGGING # ifdef LOG
# define LOG_HEX(pcTag, pbtData, szBytes) do { \ # define LOG_HEX(group, pcTag, pbtData, szBytes) do { \
size_t __szPos; \ size_t __szPos; \
char __acBuf[1024]; \ char __acBuf[1024]; \
size_t __szBuf = 0; \ size_t __szBuf = 0; \
if ((int)szBytes < 0) { \ if ((int)szBytes < 0) { \
fprintf (stderr, "%s:%d: Attempt to print %d bytes!\n", __FILE__, __LINE__, (int)szBytes); \ fprintf (stderr, "%s:%d: Attempt to print %d bytes!\n", __FILE__, __LINE__, (int)szBytes); \
log_put (LOG_CATEGORY, NFC_PRIORITY_FATAL, "%s:%d: Attempt to print %d bytes!\n", __FILE__, __LINE__, (int)szBytes); \ log_put (group, LOG_CATEGORY, NFC_LOG_PRIORITY_ERROR, "%s:%d: Attempt to print %d bytes!\n", __FILE__, __LINE__, (int)szBytes); \
abort(); \ abort(); \
break; \ break; \
} \ } \
@ -93,7 +99,7 @@ __attribute__((format(printf, 3, 4)))
snprintf (__acBuf + __szBuf, sizeof(__acBuf) - __szBuf, "%02x ",((uint8_t *)(pbtData))[__szPos]); \ snprintf (__acBuf + __szBuf, sizeof(__acBuf) - __szBuf, "%02x ",((uint8_t *)(pbtData))[__szPos]); \
__szBuf += 4; \ __szBuf += 4; \
} \ } \
log_put (LOG_CATEGORY, NFC_PRIORITY_TRACE, "%s", __acBuf); \ log_put (group, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%s", __acBuf); \
} while (0); } while (0);
# else # else
# define LOG_HEX(pcTag, pbtData, szBytes) do { \ # define LOG_HEX(pcTag, pbtData, szBytes) do { \
@ -103,4 +109,4 @@ __attribute__((format(printf, 3, 4)))
} while (0); } while (0);
# endif # endif
#endif #endif // __LOG_H__

View file

@ -2,7 +2,7 @@
* Public platform independent Near Field Communication (NFC) library * Public platform independent Near Field Communication (NFC) library
* *
* Copyright (C) 2011 Romain Tartière * Copyright (C) 2011 Romain Tartière
* Copyright (C) 2011 Romuald Conty * Copyright (C) 2011, 2012 Romuald Conty
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the * under the terms of the GNU Lesser General Public License as published by the
@ -33,7 +33,7 @@
#include "nfc-internal.h" #include "nfc-internal.h"
nfc_device * nfc_device *
nfc_device_new(const nfc_connstring connstring) nfc_device_new(const nfc_context *context, const nfc_connstring connstring)
{ {
nfc_device *res = malloc(sizeof(*res)); nfc_device *res = malloc(sizeof(*res));
@ -41,6 +41,9 @@ nfc_device_new(const nfc_connstring connstring)
err(EXIT_FAILURE, "nfc_device_new: malloc"); err(EXIT_FAILURE, "nfc_device_new: malloc");
} }
// Store associated context
res->context = context;
// Variables initiatialization // Variables initiatialization
// Note: Actually, these initialization will be overwritten while the device // Note: Actually, these initialization will be overwritten while the device
// will be setup. Putting them to _false_ while the default is _true_ ensure we // will be setup. Putting them to _false_ while the default is _true_ ensure we

View file

@ -28,6 +28,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <inttypes.h>
#define LOG_GROUP NFC_LOG_GROUP_GENERAL
#define LOG_CATEGORY "libnfc.general"
void void
string_as_boolean(const char* s, bool *value) string_as_boolean(const char* s, bool *value)
@ -63,6 +67,11 @@ nfc_context_new(void)
// Set default context values // Set default context values
res->allow_autoscan = true; res->allow_autoscan = true;
res->allow_intrusive_scan = false; res->allow_intrusive_scan = false;
#ifdef DEBUG
res->log_level = 3;
#else
res->log_level = 1;
#endif
// Load options from configuration file (ie. /etc/nfc/libnfc.conf) // Load options from configuration file (ie. /etc/nfc/libnfc.conf)
conf_load(res); conf_load(res);
@ -72,9 +81,16 @@ nfc_context_new(void)
char *envvar = getenv("LIBNFC_INTRUSIVE_SCAN"); char *envvar = getenv("LIBNFC_INTRUSIVE_SCAN");
string_as_boolean(envvar, &(res->allow_intrusive_scan)); string_as_boolean(envvar, &(res->allow_intrusive_scan));
// log level
envvar = getenv("LIBNFC_LOG_LEVEL");
if (envvar) {
res->log_level = atoi(envvar);
}
// Debug context state // Debug context state
log_put ("libnfc", NFC_PRIORITY_DEBUG, "allow_autoscan is set to %s", (res->allow_autoscan)?"true":"false"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_NONE, "log_level is set to %"PRIu32, res->log_level);
log_put ("libnfc", NFC_PRIORITY_DEBUG, "allow_intrusive_scan is set to %s", (res->allow_intrusive_scan)?"true":"false"); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "allow_autoscan is set to %s", (res->allow_autoscan)?"true":"false");
log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "allow_intrusive_scan is set to %s", (res->allow_intrusive_scan)?"true":"false");
return res; return res;
} }

View file

@ -2,7 +2,7 @@
* Public platform independent Near Field Communication (NFC) library * Public platform independent Near Field Communication (NFC) library
* *
* Copyright (C) 2011 Romain Tartière * Copyright (C) 2011 Romain Tartière
* Copyright (C) 2011 Romuald Conty * Copyright (C) 2011, 2012 Romuald Conty
* *
* This program is free software: you can redistribute it and/or modify it * This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the * under the terms of the GNU Lesser General Public License as published by the
@ -116,8 +116,8 @@ typedef enum {
struct nfc_driver { struct nfc_driver {
const char *name; const char *name;
const scan_type_enum scan_type; const scan_type_enum scan_type;
size_t (*scan)(nfc_connstring connstrings[], const size_t connstrings_len); size_t (*scan)(const nfc_context *context, nfc_connstring connstrings[], const size_t connstrings_len);
struct nfc_device *(*open)(const nfc_connstring connstring); struct nfc_device *(*open)(const nfc_context *context, const nfc_connstring connstring);
void (*close)(struct nfc_device *pnd); void (*close)(struct nfc_device *pnd);
const char *(*strerror)(const struct nfc_device *pnd); const char *(*strerror)(const struct nfc_device *pnd);
@ -160,6 +160,7 @@ struct nfc_driver {
struct nfc_context { struct nfc_context {
bool allow_autoscan; bool allow_autoscan;
bool allow_intrusive_scan; bool allow_intrusive_scan;
int log_level;
}; };
nfc_context *nfc_context_new(void); nfc_context *nfc_context_new(void);
@ -170,6 +171,7 @@ void nfc_context_free(nfc_context *context);
* @brief NFC device information * @brief NFC device information
*/ */
struct nfc_device { struct nfc_device {
nfc_context *context;
const struct nfc_driver *driver; const struct nfc_driver *driver;
void *driver_data; void *driver_data;
void *chip_data; void *chip_data;
@ -193,7 +195,7 @@ struct nfc_device {
int last_error; int last_error;
}; };
nfc_device *nfc_device_new(const nfc_connstring connstring); nfc_device *nfc_device_new(const nfc_context *context, const nfc_connstring connstring);
void nfc_device_free(nfc_device *dev); void nfc_device_free(nfc_device *dev);
void string_as_boolean(const char* s, bool *value); void string_as_boolean(const char* s, bool *value);

View file

@ -82,6 +82,7 @@
#include "drivers.h" #include "drivers.h"
#define LOG_CATEGORY "libnfc.general" #define LOG_CATEGORY "libnfc.general"
#define LOG_GROUP NFC_LOG_GROUP_GENERAL
const struct nfc_driver *nfc_drivers[] = { const struct nfc_driver *nfc_drivers[] = {
# if defined (DRIVER_PN53X_USB_ENABLED) # if defined (DRIVER_PN53X_USB_ENABLED)
@ -118,7 +119,7 @@ nfc_init(nfc_context **context)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
*context = nfc_context_new(); *context = nfc_context_new();
log_init(); log_init(*context);
} }
/** @ingroup lib /** @ingroup lib
@ -129,8 +130,8 @@ nfc_init(nfc_context **context)
void void
nfc_exit(nfc_context *context) nfc_exit(nfc_context *context)
{ {
if(context) nfc_context_free(context); nfc_context_free(context);
log_fini(); log_exit();
} }
/** @ingroup dev /** @ingroup dev
@ -186,13 +187,11 @@ nfc_get_default_device(nfc_connstring *connstring)
nfc_device * nfc_device *
nfc_open(nfc_context *context, const nfc_connstring connstring) nfc_open(nfc_context *context, const nfc_connstring connstring)
{ {
(void) context;
nfc_device *pnd = NULL; nfc_device *pnd = NULL;
nfc_connstring ncs; nfc_connstring ncs;
if (connstring == NULL) { if (connstring == NULL) {
if (!nfc_get_default_device(&ncs)) { if (!nfc_get_default_device(&ncs)) {
log_fini();
return NULL; return NULL;
} }
} else { } else {
@ -212,7 +211,7 @@ nfc_open(nfc_context *context, const nfc_connstring connstring)
} }
} }
pnd = ndr->open(ncs); pnd = ndr->open(context, ncs);
// Test if the opening was successful // Test if the opening was successful
if (pnd == NULL) { if (pnd == NULL) {
if (0 == strncmp("usb", ncs, strlen("usb"))) { if (0 == strncmp("usb", ncs, strlen("usb"))) {
@ -220,19 +219,16 @@ nfc_open(nfc_context *context, const nfc_connstring connstring)
pndr++; pndr++;
continue; continue;
} }
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "Unable to open \"%s\".", ncs); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "Unable to open \"%s\".", ncs);
log_fini();
return pnd; return pnd;
} }
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "\"%s\" (%s) has been claimed.", pnd->name, pnd->connstring); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "\"%s\" (%s) has been claimed.", pnd->name, pnd->connstring);
log_fini();
return pnd; return pnd;
} }
// Too bad, no driver can decode connstring // Too bad, no driver can decode connstring
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "No driver available to handle \"%s\".", ncs); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "No driver available to handle \"%s\".", ncs);
log_fini();
return NULL; return NULL;
} }
@ -280,8 +276,8 @@ nfc_list_devices(nfc_context *context, nfc_connstring connstrings[], const size_
while ((ndr = *pndr)) { while ((ndr = *pndr)) {
size_t _device_found = 0; size_t _device_found = 0;
if((ndr->scan_type == NOT_INTRUSIVE) || ((context->allow_intrusive_scan) && (ndr->scan_type == INTRUSIVE))) { if((ndr->scan_type == NOT_INTRUSIVE) || ((context->allow_intrusive_scan) && (ndr->scan_type == INTRUSIVE))) {
_device_found = ndr->scan(connstrings + (device_found), connstrings_len - (device_found)); _device_found = ndr->scan(context, connstrings + (device_found), connstrings_len - (device_found));
log_put(LOG_CATEGORY, NFC_PRIORITY_TRACE, "%ld device(s) found using %s driver", (unsigned long) _device_found, ndr->name); log_put(LOG_GROUP, LOG_CATEGORY, NFC_LOG_PRIORITY_DEBUG, "%ld device(s) found using %s driver", (unsigned long) _device_found, ndr->name);
if (_device_found > 0) { if (_device_found > 0) {
device_found += _device_found; device_found += _device_found;
if (device_found == connstrings_len) if (device_found == connstrings_len)