From 082edbf598e1ed14f640a601a231f02642cf7874 Mon Sep 17 00:00:00 2001 From: Philippe Teuwen Date: Wed, 8 Jun 2011 00:09:57 +0000 Subject: [PATCH] More attempt to support Sony RC-S360 reader Adapt InDeselect & InRelease to RC-S360 nfc-list now supports discovery of several typeA tags properly Current status of RC-S360 support is: - nfc-list => ok except for B' & 3B - nfc-anticol => fails to send raw frames before select - nfc-mfultralight => ok - nfc-mfclassic => ok - pn53x-tamashell => ok - pn53x-diagnose => ok - nfc-dep-initiator => ok - nfc-dep-target => fails in InitAsTarget - nfc-emulate-* => fails in InitAsTarget Commands momentarily disabled for RC-S360: - select_passive_target for B'& 3B --- libnfc/chips/pn53x.c | 47 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/libnfc/chips/pn53x.c b/libnfc/chips/pn53x.c index dac2db6..68bdc4f 100644 --- a/libnfc/chips/pn53x.c +++ b/libnfc/chips/pn53x.c @@ -145,16 +145,13 @@ pn53x_transceive (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, b } *pszRx = (size_t) res; - switch (pbtTx[0]) { case PowerDown: case InDataExchange: case InCommunicateThru: - case InDeselect: case InJumpForPSL: case InPSL: case InATR: - case InRelease: case InSelect: case InJumpForDEP: case TgGetData: @@ -165,6 +162,16 @@ pn53x_transceive (nfc_device_t * pnd, const byte_t * pbtTx, const size_t szTx, b case TgSetMetaData: pnd->iLastError = pbtRx[0] & 0x3f; break; + case InDeselect: + case InRelease: + if (CHIP_DATA(pnd)->type == RCS360) { + // Error code is in pbtRx[1] but we ignore error code anyway + // because other PN53x chips always return 0 on those commands + pnd->iLastError = 0; + break; + } + pnd->iLastError = pbtRx[0] & 0x3f; + break; default: pnd->iLastError = 0; } @@ -766,7 +773,7 @@ pn53x_configure (nfc_device_t * pnd, const nfc_device_option_t ndo, const bool b break; } - // When we reach this, the configuration is completed and succesful + // When we reach this, the configuration is completed and successful return true; } @@ -1965,11 +1972,21 @@ bool pn53x_InDeselect (nfc_device_t * pnd, const uint8_t ui8Target) { if (CHIP_DATA(pnd)->type == RCS360) { - // TODO Add support for RC-S360 - return true; + // We should do act here *only* if a target was previsouly selected + byte_t abtStatus[PN53x_EXTENDED_FRAME__DATA_MAX_LEN]; + size_t szStatus = sizeof(abtStatus); + byte_t abtCmdGetStatus[] = { GetGeneralStatus }; + if (!pn53x_transceive (pnd, abtCmdGetStatus, sizeof (abtCmdGetStatus), abtStatus, &szStatus)) { + return false; + } + if ((szStatus < 3) || (abtStatus[2] == 0)) { + return true; + } + // No much choice what to deselect actually... + byte_t abtCmdRcs360[] = { InDeselect, 0x01, 0x01 }; + return (pn53x_transceive (pnd, abtCmdRcs360, sizeof (abtCmdRcs360), NULL, NULL)); } byte_t abtCmd[] = { InDeselect, ui8Target }; - return (pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), NULL, NULL)); } @@ -1977,11 +1994,21 @@ bool pn53x_InRelease (nfc_device_t * pnd, const uint8_t ui8Target) { if (CHIP_DATA(pnd)->type == RCS360) { - // TODO Add support for RC-S360 - return true; + // We should do act here *only* if a target was previsouly selected + byte_t abtStatus[PN53x_EXTENDED_FRAME__DATA_MAX_LEN]; + size_t szStatus = sizeof(abtStatus); + byte_t abtCmdGetStatus[] = { GetGeneralStatus }; + if (!pn53x_transceive (pnd, abtCmdGetStatus, sizeof (abtCmdGetStatus), abtStatus, &szStatus)) { + return false; + } + if ((szStatus < 3) || (abtStatus[2] == 0)) { + return true; + } + // No much choice what to release actually... + byte_t abtCmdRcs360[] = { InRelease, 0x01, 0x01 }; + return (pn53x_transceive (pnd, abtCmdRcs360, sizeof (abtCmdRcs360), NULL, NULL)); } byte_t abtCmd[] = { InRelease, ui8Target }; - return (pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), NULL, NULL)); }