diff --git a/examples/nfc-dep-initiator.c b/examples/nfc-dep-initiator.c index 01a2f10..8f4b3c9 100644 --- a/examples/nfc-dep-initiator.c +++ b/examples/nfc-dep-initiator.c @@ -56,13 +56,14 @@ main (int argc, const char *argv[]) printf("Unable to connect to NFC device.\n"); return EXIT_FAILURE; } + printf ("Connected to NFC device: %s\n", pnd->acName); if (!nfc_initiator_init (pnd)) { nfc_perror(pnd, "nfc_initiator_init"); return EXIT_FAILURE; } - if(!nfc_initiator_select_dep_target (pnd, NDM_PASSIVE, NBR_106, NULL, &nt)) { + if(!nfc_initiator_select_dep_target (pnd, NDM_PASSIVE, NBR_212, NULL, &nt)) { nfc_perror(pnd, "nfc_initiator_select_dep_target"); return EXIT_FAILURE; } diff --git a/examples/nfc-dep-target.c b/examples/nfc-dep-target.c index 1af716e..4cd064b 100644 --- a/examples/nfc-dep-target.c +++ b/examples/nfc-dep-target.c @@ -2,7 +2,7 @@ * Public platform independent Near Field Communication (NFC) library * * Copyright (C) 2009, Roel Verdult - * Copyright (C) 2009, Romuald Conty + * Copyright (C) 2010, 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 @@ -67,7 +67,7 @@ main (int argc, const char *argv[]) const nfc_target_t nt = { .nm.nmt = NMT_DEP, - .nm.nbr = NBR_UNDEFINED, + .nm.nbr = NBR_UNDEFINED, // Not used by nfc_target_init .nti.ndi.abtNFCID3 = { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xff, 0x00, 0x00 }, .nti.ndi.szGB = 4, .nti.ndi.abtGB = { 0x12, 0x34, 0x56, 0x78 }, @@ -85,8 +85,9 @@ main (int argc, const char *argv[]) } printf ("Connected to NFC device: %s\n", pnd->acName); - printf ("NFC device will now act as this D.E.P. target:\n"); - print_nfc_dep_info ( nt.nti.ndi ); + printf ("NFC device will now act as: "); + print_nfc_target (nt); + printf ("Waiting for initiator request...\n"); if(!nfc_target_init (pnd, NTM_DEP_ONLY, nt, abtRx, &szRx)) { nfc_perror(pnd, "nfc_target_init"); diff --git a/libnfc/chips/pn53x.c b/libnfc/chips/pn53x.c index b5854b0..dc00a78 100644 --- a/libnfc/chips/pn53x.c +++ b/libnfc/chips/pn53x.c @@ -1119,17 +1119,20 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta // XXX I (Romuald) don't think that a good thing to select NDO_EASY_FRAMING here, that's a user choice... switch(ntm) { + case NTM_NORMAL: case NTM_PASSIVE_ONLY: pn53x_set_parameter(pnd, PARAM_AUTO_ATR_RES, false); pn53x_configure(pnd, NDO_EASY_FRAMING, false); break; case NTM_DEP_ONLY: + // XXX Should we check that nt is a DEP ? pn53x_set_parameter(pnd, PARAM_AUTO_ATR_RES, true); pn53x_configure(pnd, NDO_EASY_FRAMING, true); break; case NTM_ISO14443_4_PICC_ONLY: + // XXX Should we check that nt is a ISO14443A ? if(pnd->nc != NC_PN532) { // This mode is not supported by pn531 neither pn533 pnd->iLastError = DENOTSUP; @@ -1160,8 +1163,8 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta byte_t * pbtFeliCaParams = NULL; const byte_t * pbtNFCID3t = NULL; - const byte_t * pbtGB = NULL; - size_t szGB = 0; + const byte_t * pbtGBt = NULL; + size_t szGBt = 0; switch(nt.nm.nmt) { case NMT_ISO14443A: { @@ -1169,7 +1172,7 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta abtMifareParams[0] = nt.nti.nai.abtAtqa[1]; abtMifareParams[1] = nt.nti.nai.abtAtqa[0]; // Set UID - // Note: in this mode we can only emulate a single size (4 bytes) UID where the first is fixed by PN53x as 0x08 + // Note: in this mode we can only emulate a single size (4 bytes) UID where the first is hard-wired by PN53x as 0x08 abtMifareParams[2] = nt.nti.nai.abtUid[1]; abtMifareParams[3] = nt.nti.nai.abtUid[2]; abtMifareParams[4] = nt.nti.nai.abtUid[3]; @@ -1191,9 +1194,11 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta break; case NMT_DEP: + // Set NFCID3 pbtNFCID3t = nt.nti.ndi.abtNFCID3; - szGB = nt.nti.ndi.szGB; - if (szGB) pbtGB = nt.nti.ndi.abtGB; + // Set General Bytes, if relevant + szGBt = nt.nti.ndi.szGB; + if (szGBt) pbtGBt = nt.nti.ndi.abtGB; break; case NMT_ISO14443B: case NMT_JEWEL: @@ -1202,10 +1207,43 @@ pn53x_target_init (nfc_device_t * pnd, const nfc_target_mode_t ntm, const nfc_ta break; } - if(!pn53x_TgInitAsTarget(pnd, ntm, pbtMifareParams, pbtFeliCaParams, pbtNFCID3t, pbtGB, szGB, pbtRx, pszRx, NULL)) { + byte_t btActivatedMode; +target_activation: + if(!pn53x_TgInitAsTarget(pnd, ntm, pbtMifareParams, pbtFeliCaParams, pbtNFCID3t, pbtGBt, szGBt, pbtRx, pszRx, &btActivatedMode)) { return false; } + nfc_modulation_t nm; + // Decode activated "mode" + switch(btActivatedMode & 0x70) { // Baud rate + case 0x00: // 106kbps + nm.nbr = NBR_106; + break; + case 0x10: // 212kbps + nm.nbr = NBR_212; + break; + case 0x20: // 424kbps + nm.nbr = NBR_424; + break; + }; + + if (btActivatedMode & 0x04) { // D.E.P. + nm.nmt = NMT_DEP; + if ((btActivatedMode & 0x03) == 0x01) { // Active mode + // XXX What to do ? + } else { // Passive mode + } + } else { // Not D.E.P. + if ((btActivatedMode & 0x03) == 0x00) { // MIFARE + nm.nmt = NMT_ISO14443A; + } else if ((btActivatedMode & 0x03) == 0x02) { // FeliCa + nm.nmt = NMT_FELICA; + } + } + + // XXX When using DEP, shouldn't we update target modulation ? + if(nm.nmt != nt.nm.nmt) goto target_activation; + // Restore the CRC & parity setting to the original value (if needed) if (!bCrc) pn53x_configure ((nfc_device_t *) pnd, NDO_HANDLE_CRC, false); @@ -1267,7 +1305,7 @@ pn53x_TgInitAsTarget (nfc_device_t * pnd, nfc_target_mode_t ntm, // Note: the first byte is skip: // its the "mode" byte which contains baudrate, DEP and Framing type (Mifare, active or FeliCa) datas. if(pbtModeByte) { - *pbtModeByte = pbtRx[0]; + *pbtModeByte = abtRx[0]; } // Save the received byte count