diff --git a/libnfc/chips/pn53x-internal.h b/libnfc/chips/pn53x-internal.h index 61781e2..f61a3d7 100644 --- a/libnfc/chips/pn53x-internal.h +++ b/libnfc/chips/pn53x-internal.h @@ -119,7 +119,8 @@ typedef struct { typedef enum { PN531 = 0x01, PN532 = 0x02, - PN533 = 0x04 + PN533 = 0x04, + S330 = 0x08 } pn53x_type; #ifndef DEBUG @@ -141,7 +142,7 @@ typedef enum { static const pn53x_command pn53x_commands[] = { // Miscellaneous PNCMD( Diagnose, PN531|PN532|PN533 ), - PNCMD( GetFirmwareVersion, PN531|PN532|PN533 ), + PNCMD( GetFirmwareVersion, PN531|PN532|PN533|S330 ), PNCMD( GetGeneralStatus, PN531|PN532|PN533 ), PNCMD( ReadRegister, PN531|PN532|PN533 ), PNCMD( WriteRegister, PN531|PN532|PN533 ), @@ -204,12 +205,6 @@ typedef struct { } pn53x_register; #endif -/* -#define PN531 0x01 -#define PN532 0x02 -#define PN533 0X04 -*/ - #ifndef DEBUG # define PNREG_DBG( X ) do { \ } while(0) diff --git a/libnfc/chips/pn53x.c b/libnfc/chips/pn53x.c index 6d9b8c3..dffc1ac 100644 --- a/libnfc/chips/pn53x.c +++ b/libnfc/chips/pn53x.c @@ -593,8 +593,12 @@ pn53x_get_firmware_version (nfc_device_t * pnd, char abtFirmwareText[22]) } else if (szFwLen == 4) { if (abtFw[0] == 0x32) { // PN532 version IC CHIP_DATA(pnd)->type = PN532; - } else if (abtFw[0] == 0x33) { // PN532 version IC - CHIP_DATA(pnd)->type = PN533; + } else if (abtFw[0] == 0x33) { // PN533 version IC + if (abtFw[1] == 0x01) { // Sony ROM code + CHIP_DATA(pnd)->type = S330; + } else { + CHIP_DATA(pnd)->type = PN533; + } } else { // Unknown version IC return false; @@ -614,6 +618,7 @@ pn53x_get_firmware_version (nfc_device_t * pnd, char abtFirmwareText[22]) pnd->btSupportByte = abtFw[3]; break; case PN533: + case S330: snprintf (abtFirmwareText, 22, "PN533 v%d.%d (0x%02x)", abtFw[1], abtFw[2], abtFw[3]); pnd->btSupportByte = abtFw[3]; break; @@ -1838,6 +1843,11 @@ pn53x_strerror (const nfc_device_t * pnd) bool pn53x_SetParameters (nfc_device_t * pnd, const uint8_t ui8Value) { + if (CHIP_DATA (pnd)->type == S330) { + // TODO add support for S330 + return true; + } + byte_t abtCmd[] = { SetParameters, ui8Value }; if(!pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), NULL, NULL)) { @@ -1955,6 +1965,10 @@ pn53x_InListPassiveTarget (nfc_device_t * pnd, bool pn53x_InDeselect (nfc_device_t * pnd, const uint8_t ui8Target) { + if (CHIP_DATA(pnd)->type == S330) { + // TODO Add support for S330 + return true; + } byte_t abtCmd[] = { InDeselect, ui8Target }; return (pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), NULL, NULL)); @@ -1963,6 +1977,10 @@ pn53x_InDeselect (nfc_device_t * pnd, const uint8_t ui8Target) bool pn53x_InRelease (nfc_device_t * pnd, const uint8_t ui8Target) { + if (CHIP_DATA(pnd)->type == S330) { + // TODO Add support for S330 + return true; + } byte_t abtCmd[] = { InRelease, ui8Target }; return (pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), NULL, NULL)); diff --git a/libnfc/drivers/pn53x_usb.c b/libnfc/drivers/pn53x_usb.c index 8484a49..7c097d4 100644 --- a/libnfc/drivers/pn53x_usb.c +++ b/libnfc/drivers/pn53x_usb.c @@ -57,7 +57,8 @@ typedef enum { SONY_PN531, NXP_PN533, ASK_LOGO, - SCM_SCL3711 + SCM_SCL3711, + SONY_S330 } pn53x_usb_model; struct pn53x_usb_data { @@ -115,7 +116,8 @@ const struct pn53x_usb_supported_device pn53x_usb_supported_devices[] = { { 0x04CC, 0x2533, NXP_PN533, "NXP / PN533" }, { 0x04E6, 0x5591, SCM_SCL3711, "SCM Micro / SCL3711-NFC&RW" }, { 0x054c, 0x0193, SONY_PN531, "Sony / PN531" }, - { 0x1FD3, 0x0608, ASK_LOGO, "ASK / LoGO" } + { 0x1FD3, 0x0608, ASK_LOGO, "ASK / LoGO" }, + { 0x054C, 0x02E1, SONY_S330, "Sony / FeliCa S330 [PaSoRi]" } }; pn53x_usb_model @@ -568,7 +570,9 @@ bool pn53x_usb_init (nfc_device_t *pnd) { // Sometimes PN53x USB doesn't reply ACK one the first frame, so we need to send a dummy one... - pn53x_check_communication (pnd); + //pn53x_check_communication (pnd); // Sony S330 doesn't support this command for now so let's use a get_firmware_version instead: + const byte_t abtCmd[] = { GetFirmwareVersion }; + pn53x_transceive (pnd, abtCmd, sizeof (abtCmd), NULL, NULL); // ...and we don't care about error pnd->iLastError = 0; diff --git a/pn53x.rules b/pn53x.rules index 594da3b..f679fcc 100644 --- a/pn53x.rules +++ b/pn53x.rules @@ -12,5 +12,6 @@ ATTRS{idVendor}=="054c", ATTRS{idProduct}=="0193", MODE="0664", GROUP="plugdev" ATTRS{idVendor}=="04cc", ATTRS{idProduct}=="2533", MODE="0664", GROUP="plugdev" ATTRS{idVendor}=="04e6", ATTRS{idProduct}=="5591", MODE="0664", GROUP="plugdev" ATTRS{idVendor}=="1fd3", ATTRS{idProduct}=="0608", MODE="0664", GROUP="plugdev" +ATTRS{idVendor}=="054c", ATTRS{idProduct}=="02e1", MODE="0664", GROUP="plugdev" LABEL="pn53x_rules_end"