pn53x_usb: leave the device in cleaner state (Fixes Issue 123)
This commit is contained in:
parent
61b0df5fe9
commit
9d1e72a9f7
3 changed files with 52 additions and 6 deletions
|
@ -35,6 +35,7 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include <nfc/nfc.h>
|
#include <nfc/nfc.h>
|
||||||
|
|
||||||
|
@ -49,6 +50,16 @@ static nfc_device_t *pnd;
|
||||||
static bool quiet_output = false;
|
static bool quiet_output = false;
|
||||||
static bool init_mfc_auth = false;
|
static bool init_mfc_auth = false;
|
||||||
|
|
||||||
|
void
|
||||||
|
intr_hdlr (void)
|
||||||
|
{
|
||||||
|
printf ("\nQuitting...\n");
|
||||||
|
if (pnd != NULL) {
|
||||||
|
nfc_disconnect(pnd);
|
||||||
|
}
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
target_io( const nfc_target_t nt, const byte_t * pbtInput, const size_t szInput, byte_t * pbtOutput, size_t *pszOutput )
|
target_io( const nfc_target_t nt, const byte_t * pbtInput, const size_t szInput, byte_t * pbtOutput, size_t *pszOutput )
|
||||||
{
|
{
|
||||||
|
@ -139,6 +150,12 @@ main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
const char *acLibnfcVersion;
|
const char *acLibnfcVersion;
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
signal (SIGINT, (void (__cdecl *) (int)) intr_hdlr);
|
||||||
|
#else
|
||||||
|
signal (SIGINT, (void (*)()) intr_hdlr);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Try to open the NFC reader
|
// Try to open the NFC reader
|
||||||
pnd = nfc_connect (NULL);
|
pnd = nfc_connect (NULL);
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
#include <nfc/nfc.h>
|
#include <nfc/nfc.h>
|
||||||
|
|
||||||
|
@ -54,6 +55,16 @@ byte_t abtAtqa[2] = { 0x04, 0x00 };
|
||||||
byte_t abtUidBcc[5] = { 0xDE, 0xAD, 0xBE, 0xAF, 0x62 };
|
byte_t abtUidBcc[5] = { 0xDE, 0xAD, 0xBE, 0xAF, 0x62 };
|
||||||
byte_t abtSak[9] = { 0x08, 0xb6, 0xdd };
|
byte_t abtSak[9] = { 0x08, 0xb6, 0xdd };
|
||||||
|
|
||||||
|
void
|
||||||
|
intr_hdlr (void)
|
||||||
|
{
|
||||||
|
printf ("\nQuitting...\n");
|
||||||
|
if (pnd != NULL) {
|
||||||
|
nfc_disconnect(pnd);
|
||||||
|
}
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
print_usage (char *argv[])
|
print_usage (char *argv[])
|
||||||
{
|
{
|
||||||
|
@ -99,6 +110,12 @@ main (int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
signal (SIGINT, (void (__cdecl *) (int)) intr_hdlr);
|
||||||
|
#else
|
||||||
|
signal (SIGINT, (void (*)()) intr_hdlr);
|
||||||
|
#endif
|
||||||
|
|
||||||
// Try to open the NFC device
|
// Try to open the NFC device
|
||||||
pnd = nfc_connect (NULL);
|
pnd = nfc_connect (NULL);
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,11 @@ Thanks to d18c7db and Okko for example code
|
||||||
#define BUFFER_LENGTH 256
|
#define BUFFER_LENGTH 256
|
||||||
#define USB_TIMEOUT 30000
|
#define USB_TIMEOUT 30000
|
||||||
|
|
||||||
|
// TODO Move this HACK1 into an upper level in order to benefit to other devices that use PN53x
|
||||||
|
static const byte_t ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
|
||||||
|
|
||||||
|
void pn53x_usb_ack (nfc_device_t * pnd);
|
||||||
|
|
||||||
// Find transfer endpoints for bulk transfers
|
// Find transfer endpoints for bulk transfers
|
||||||
void
|
void
|
||||||
get_end_points (struct usb_device *dev, usb_spec_t * pus)
|
get_end_points (struct usb_device *dev, usb_spec_t * pus)
|
||||||
|
@ -195,13 +200,8 @@ pn53x_usb_connect (const nfc_device_desc_t * pndd, const char *target_name, int
|
||||||
pnd->nds = (nfc_device_spec_t) pus;
|
pnd->nds = (nfc_device_spec_t) pus;
|
||||||
pnd->bActive = true;
|
pnd->bActive = true;
|
||||||
|
|
||||||
// TODO Move this HACK1 into an upper level in order to benefit to other devices that use PN53x
|
|
||||||
// HACK1: Send first an ACK as Abort command, to reset chip before talking to it:
|
// HACK1: Send first an ACK as Abort command, to reset chip before talking to it:
|
||||||
uint8_t ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
|
pn53x_usb_ack (pnd);
|
||||||
#ifdef DEBUG
|
|
||||||
PRINT_HEX ("TX", ack_frame, 6);
|
|
||||||
#endif
|
|
||||||
usb_bulk_write (pus->pudh, pus->uiEndPointOut, (char *) ack_frame, 6, USB_TIMEOUT);
|
|
||||||
|
|
||||||
// HACK2: Then send a GetFirmware command to resync USB toggle bit between host & device
|
// HACK2: Then send a GetFirmware command to resync USB toggle bit between host & device
|
||||||
// in case host used set_configuration and expects the device to have reset its toggle bit, which PN53x doesn't do
|
// in case host used set_configuration and expects the device to have reset its toggle bit, which PN53x doesn't do
|
||||||
|
@ -262,6 +262,8 @@ pn53x_usb_disconnect (nfc_device_t * pnd)
|
||||||
usb_spec_t *pus = (usb_spec_t *) pnd->nds;
|
usb_spec_t *pus = (usb_spec_t *) pnd->nds;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
pn53x_usb_ack (pnd);
|
||||||
|
|
||||||
if ((ret = usb_release_interface (pus->pudh, 0)) < 0) {
|
if ((ret = usb_release_interface (pus->pudh, 0)) < 0) {
|
||||||
ERR ("usb_release_interface failed (%i)", ret);
|
ERR ("usb_release_interface failed (%i)", ret);
|
||||||
}
|
}
|
||||||
|
@ -369,3 +371,13 @@ pn53x_usb_transceive (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szT
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pn53x_usb_ack (nfc_device_t * pnd)
|
||||||
|
{
|
||||||
|
usb_spec_t *pus = (usb_spec_t *) pnd->nds;
|
||||||
|
#ifdef DEBUG
|
||||||
|
PRINT_HEX ("TX", ack_frame, sizeof (ack_frame));
|
||||||
|
#endif
|
||||||
|
usb_bulk_write (pus->pudh, pus->uiEndPointOut, (char *) ack_frame, sizeof (ack_frame), USB_TIMEOUT);
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue