removed redundant function to compose reader short frame

This commit is contained in:
roel@libnfc.org 2013-04-03 08:45:04 +00:00
commit 195af47289
4 changed files with 36 additions and 80 deletions

View file

@ -29,10 +29,6 @@ bool bAuthenticating;
bool bPwd; bool bPwd;
bool bSuccessful; 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) int LogTraceHitag(const uint8_t * btBytes, int iBits, int iSamples, uint32_t dwParity, int bReader)
{ {
// Return when trace is full // Return when trace is full

View file

@ -1262,12 +1262,11 @@ static void TransmitFor14443a(const uint8_t *cmd, int len, int *samples, int *wa
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Code a 7-bit command without parity bit // Prepare reader command (in bits, support short frames) to send to FPGA
// This is especially for 0x26 and 0x52 (REQA and WUPA)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void ShortFrameFromReader(const uint8_t bt) void CodeIso14443aBitsAsReaderPar(const uint8_t * cmd, int bits, uint32_t dwParity)
{ {
int j; int i, j;
int last; int last;
uint8_t b; uint8_t b;
@ -1277,18 +1276,23 @@ void ShortFrameFromReader(const uint8_t bt)
ToSend[++ToSendMax] = SEC_Z; ToSend[++ToSendMax] = SEC_Z;
last = 0; last = 0;
b = bt; size_t bytecount = nbytes(bits);
for(j = 0; j < 7; j++) { // Generate send structure for the data bits
if(b & 1) { 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 < bitsleft; j++) {
if (b & 1) {
// Sequence X // Sequence X
ToSend[++ToSendMax] = SEC_X; ToSend[++ToSendMax] = SEC_X;
last = 1; last = 1;
} else { } else {
if(last == 0) { if (last == 0) {
// Sequence Z // Sequence Z
ToSend[++ToSendMax] = SEC_Z; ToSend[++ToSendMax] = SEC_Z;
} } else {
else {
// Sequence Y // Sequence Y
ToSend[++ToSendMax] = SEC_Y; ToSend[++ToSendMax] = SEC_Y;
last = 0; last = 0;
@ -1297,12 +1301,31 @@ void ShortFrameFromReader(const uint8_t bt)
b >>= 1; b >>= 1;
} }
// End of Communication // Only transmit (last) parity bit if we transmitted a complete byte
if(last == 0) { if (j == 8) {
// Get the parity bit
if ((dwParity >> i) & 0x01) {
// Sequence X
ToSend[++ToSendMax] = SEC_X;
last = 1;
} else {
if (last == 0) {
// Sequence Z // Sequence Z
ToSend[++ToSendMax] = SEC_Z; ToSend[++ToSendMax] = SEC_Z;
} else {
// Sequence Y
ToSend[++ToSendMax] = SEC_Y;
last = 0;
} }
else { }
}
}
// End of Communication
if (last == 0) {
// Sequence Z
ToSend[++ToSendMax] = SEC_Z;
} else {
// Sequence Y // Sequence Y
ToSend[++ToSendMax] = SEC_Y; ToSend[++ToSendMax] = SEC_Y;
last = 0; last = 0;
@ -1321,79 +1344,10 @@ void ShortFrameFromReader(const uint8_t bt)
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Prepare reader command to send to FPGA // Prepare reader command to send to FPGA
//
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity) void CodeIso14443aAsReaderPar(const uint8_t * cmd, int len, uint32_t dwParity)
{ {
int i, j; CodeIso14443aBitsAsReaderPar(cmd,len*8,dwParity);
int last;
uint8_t b;
ToSendReset();
// Start of Communication (Seq. Z)
ToSend[++ToSendMax] = SEC_Z;
last = 0;
// Generate send structure for the data bits
for (i = 0; i < len; i++) {
// Get the current byte to send
b = cmd[i];
for (j = 0; j < 8; 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;
}
// 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;
} else {
// Sequence Y
ToSend[++ToSendMax] = SEC_Y;
last = 0;
}
}
}
// 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++;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -1598,7 +1552,8 @@ void ReaderTransmitShort(const uint8_t* bt)
int wait = 0; int wait = 0;
int samples = 0; int samples = 0;
ShortFrameFromReader(*bt); // ShortFrameFromReader(*bt);
CodeIso14443aBitsAsReaderPar(bt,7,0);
// Select the card // Select the card
TransmitFor14443a(ToSend, ToSendMax, &samples, &wait); TransmitFor14443a(ToSend, ToSendMax, &samples, &wait);

View file

@ -12,6 +12,10 @@
#include "util.h" #include "util.h"
#include "string.h" #include "string.h"
size_t nbytes(size_t nbits) {
return (nbits/8)+((nbits%8)>0);
}
uint32_t SwapBits(uint32_t value, int nrbits) { uint32_t SwapBits(uint32_t value, int nrbits) {
int i; int i;
uint32_t newvalue = 0; uint32_t newvalue = 0;

View file

@ -27,6 +27,7 @@
#define BUTTON_DOUBLE_CLICK -2 #define BUTTON_DOUBLE_CLICK -2
#define BUTTON_ERROR -99 #define BUTTON_ERROR -99
size_t nbytes(size_t nbits);
uint32_t SwapBits(uint32_t value, int nrbits); uint32_t SwapBits(uint32_t value, int nrbits);
void num_to_bytes(uint64_t n, size_t len, uint8_t* dest); void num_to_bytes(uint64_t n, size_t len, uint8_t* dest);
uint64_t bytes_to_num(uint8_t* src, size_t len); uint64_t bytes_to_num(uint8_t* src, size_t len);