From 195af47289761be82eeb4f6687a65f5ee8f38611 Mon Sep 17 00:00:00 2001 From: "roel@libnfc.org" Date: Wed, 3 Apr 2013 08:45:04 +0000 Subject: [PATCH] removed redundant function to compose reader short frame --- armsrc/hitag2.c | 4 -- armsrc/iso14443a.c | 107 +++++++++++++-------------------------------- armsrc/util.c | 4 ++ armsrc/util.h | 1 + 4 files changed, 36 insertions(+), 80 deletions(-) diff --git a/armsrc/hitag2.c b/armsrc/hitag2.c index aa9ce237..1a0e9b56 100644 --- a/armsrc/hitag2.c +++ b/armsrc/hitag2.c @@ -29,10 +29,6 @@ bool bAuthenticating; bool bPwd; bool bSuccessful; -size_t nbytes(size_t nbits) { - return (nbits/8)+((nbits%8)>0); -} - int LogTraceHitag(const uint8_t * btBytes, int iBits, int iSamples, uint32_t dwParity, int bReader) { // Return when trace is full diff --git a/armsrc/iso14443a.c b/armsrc/iso14443a.c index ca7c3ba4..5a01178d 100644 --- a/armsrc/iso14443a.c +++ b/armsrc/iso14443a.c @@ -1262,68 +1262,9 @@ static void TransmitFor14443a(const uint8_t *cmd, int len, int *samples, int *wa } //----------------------------------------------------------------------------- -// Code a 7-bit command without parity bit -// This is especially for 0x26 and 0x52 (REQA and WUPA) +// Prepare reader command (in bits, support short frames) to send to FPGA //----------------------------------------------------------------------------- -void ShortFrameFromReader(const uint8_t bt) -{ - int j; - int last; - uint8_t b; - - ToSendReset(); - - // Start of Communication (Seq. Z) - ToSend[++ToSendMax] = SEC_Z; - last = 0; - - b = bt; - for(j = 0; j < 7; j++) { - if(b & 1) { - // Sequence X - ToSend[++ToSendMax] = SEC_X; - last = 1; - } else { - if(last == 0) { - // Sequence Z - ToSend[++ToSendMax] = SEC_Z; - } - else { - // Sequence Y - ToSend[++ToSendMax] = SEC_Y; - last = 0; - } - } - b >>= 1; - } - - // End of Communication - if(last == 0) { - // Sequence Z - ToSend[++ToSendMax] = SEC_Z; - } - else { - // Sequence Y - ToSend[++ToSendMax] = SEC_Y; - last = 0; - } - // Sequence Y - ToSend[++ToSendMax] = SEC_Y; - - // Just to be sure! - ToSend[++ToSendMax] = SEC_Y; - ToSend[++ToSendMax] = SEC_Y; - ToSend[++ToSendMax] = SEC_Y; - - // Convert from last character reference to length - ToSendMax++; -} - -//----------------------------------------------------------------------------- -// Prepare reader command to send to FPGA -// -//----------------------------------------------------------------------------- -void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity) +void CodeIso14443aBitsAsReaderPar(const uint8_t * cmd, int bits, uint32_t dwParity) { int i, j; int last; @@ -1335,12 +1276,14 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity) ToSend[++ToSendMax] = SEC_Z; last = 0; + size_t bytecount = nbytes(bits); // Generate send structure for the data bits - for (i = 0; i < len; i++) { + for (i = 0; i < bytecount; i++) { // Get the current byte to send b = cmd[i]; + size_t bitsleft = MIN((bits-(i*8)),8); - for (j = 0; j < 8; j++) { + for (j = 0; j < bitsleft; j++) { if (b & 1) { // Sequence X ToSend[++ToSendMax] = SEC_X; @@ -1358,19 +1301,22 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity) b >>= 1; } - // Get the parity bit - if ((dwParity >> i) & 0x01) { - // Sequence X - ToSend[++ToSendMax] = SEC_X; - last = 1; - } else { - if (last == 0) { - // Sequence Z - ToSend[++ToSendMax] = SEC_Z; + // Only transmit (last) parity bit if we transmitted a complete byte + if (j == 8) { + // Get the parity bit + if ((dwParity >> i) & 0x01) { + // Sequence X + ToSend[++ToSendMax] = SEC_X; + last = 1; } else { - // Sequence Y - ToSend[++ToSendMax] = SEC_Y; - last = 0; + if (last == 0) { + // Sequence Z + ToSend[++ToSendMax] = SEC_Z; + } else { + // Sequence Y + ToSend[++ToSendMax] = SEC_Y; + last = 0; + } } } } @@ -1396,6 +1342,14 @@ void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity) ToSendMax++; } +//----------------------------------------------------------------------------- +// Prepare reader command to send to FPGA +//----------------------------------------------------------------------------- +void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity) +{ + CodeIso14443aBitsAsReaderPar(cmd,len*8,dwParity); +} + //----------------------------------------------------------------------------- // Wait for commands from reader // Stop when button is pressed (return 1) or field was gone (return 2) @@ -1598,7 +1552,8 @@ void ReaderTransmitShort(const uint8_t* bt) int wait = 0; int samples = 0; - ShortFrameFromReader(*bt); +// ShortFrameFromReader(*bt); + CodeIso14443aBitsAsReaderPar(bt,7,0); // Select the card TransmitFor14443a(ToSend, ToSendMax, &samples, &wait); diff --git a/armsrc/util.c b/armsrc/util.c index 3870a6c6..f2298290 100644 --- a/armsrc/util.c +++ b/armsrc/util.c @@ -12,6 +12,10 @@ #include "util.h" #include "string.h" +size_t nbytes(size_t nbits) { + return (nbits/8)+((nbits%8)>0); +} + uint32_t SwapBits(uint32_t value, int nrbits) { int i; uint32_t newvalue = 0; diff --git a/armsrc/util.h b/armsrc/util.h index d2a85ba0..ac141065 100644 --- a/armsrc/util.h +++ b/armsrc/util.h @@ -27,6 +27,7 @@ #define BUTTON_DOUBLE_CLICK -2 #define BUTTON_ERROR -99 +size_t nbytes(size_t nbits); uint32_t SwapBits(uint32_t value, int nrbits); void num_to_bytes(uint64_t n, size_t len, uint8_t* dest); uint64_t bytes_to_num(uint8_t* src, size_t len); -- 2.39.5