pn53x_usb: leave the device in cleaner state (Fixes Issue 123)

This commit is contained in:
Philippe Teuwen 2010-10-12 15:51:57 +00:00
parent 61b0df5fe9
commit 9d1e72a9f7
3 changed files with 52 additions and 6 deletions

View file

@ -35,6 +35,7 @@
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <signal.h>
#include <nfc/nfc.h>
@ -49,6 +50,16 @@ static nfc_device_t *pnd;
static bool quiet_output = false;
static bool init_mfc_auth = false;
void
intr_hdlr (void)
{
printf ("\nQuitting...\n");
if (pnd != NULL) {
nfc_disconnect(pnd);
}
exit (EXIT_FAILURE);
}
bool
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;
#ifdef WIN32
signal (SIGINT, (void (__cdecl *) (int)) intr_hdlr);
#else
signal (SIGINT, (void (*)()) intr_hdlr);
#endif
// Try to open the NFC reader
pnd = nfc_connect (NULL);

View file

@ -37,6 +37,7 @@
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <signal.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 abtSak[9] = { 0x08, 0xb6, 0xdd };
void
intr_hdlr (void)
{
printf ("\nQuitting...\n");
if (pnd != NULL) {
nfc_disconnect(pnd);
}
exit (EXIT_FAILURE);
}
void
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
pnd = nfc_connect (NULL);

View file

@ -45,6 +45,11 @@ Thanks to d18c7db and Okko for example code
#define BUFFER_LENGTH 256
#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
void
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->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:
uint8_t ack_frame[] = { 0x00, 0x00, 0xff, 0x00, 0xff, 0x00 };
#ifdef DEBUG
PRINT_HEX ("TX", ack_frame, 6);
#endif
usb_bulk_write (pus->pudh, pus->uiEndPointOut, (char *) ack_frame, 6, USB_TIMEOUT);
pn53x_usb_ack (pnd);
// 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
@ -262,6 +262,8 @@ pn53x_usb_disconnect (nfc_device_t * pnd)
usb_spec_t *pus = (usb_spec_t *) pnd->nds;
int ret;
pn53x_usb_ack (pnd);
if ((ret = usb_release_interface (pus->pudh, 0)) < 0) {
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;
}
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);
}