From 68008fb517179131a7368a0917150867f14decd1 Mon Sep 17 00:00:00 2001 From: iceman1001 Date: Sat, 14 Feb 2015 12:29:02 +0100 Subject: [PATCH] add: timeouts for "lf read" chg: change command consistency "lf t55xx rd" -> "lf t55xx read" chg: buffer size used for armside is quite big. maybe to big. takes too long to read. --- armsrc/lfops.c | 25 +++++---- client/cmdlf.c | 7 ++- client/cmdlft55xx.c | 120 +++++++++++++++++++------------------------- client/util.c | 2 +- 4 files changed, 71 insertions(+), 83 deletions(-) diff --git a/armsrc/lfops.c b/armsrc/lfops.c index f3daacc6..fabede41 100644 --- a/armsrc/lfops.c +++ b/armsrc/lfops.c @@ -72,8 +72,6 @@ void ModThenAcquireRawAdcSamples125k(int delay_off, int period_0, int period_1, DoAcquisition_config(false); } - - /* blank r/w tag data stream ...0000000000000000 01111111 1010101010101010101010101010101010101010101010101010101010101010 @@ -885,12 +883,13 @@ void T55xxWriteBlock(uint32_t Data, uint32_t Block, uint32_t Pwd, uint8_t PwdMod // Read one card block in page 0 void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) { - uint8_t *dest = BigBuf_get_addr(); - //uint16_t bufferlength = BigBuf_max_traceLen(); - uint16_t bufferlength = T55xx_SAMPLES_SIZE; uint32_t i = 0; - // Clear destination buffer before sending the command 0x80 = average. - memset(dest, 0x80, bufferlength); + uint8_t *dest = BigBuf_get_addr(); + uint16_t bufferlength = BigBuf_max_traceLen(); + if ( bufferlength > T55xx_SAMPLES_SIZE ) + bufferlength = T55xx_SAMPLES_SIZE; + + memset(dest, 0x80, bufferlength); // Set up FPGA, 125kHz // Wait for config.. (192+8190xPOW)x8 == 67ms @@ -920,7 +919,6 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) for(;;) { if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_TXRDY) { AT91C_BASE_SSC->SSC_THR = 0x43; - //AT91C_BASE_SSC->SSC_THR = 0xff; LED_D_ON(); } if (AT91C_BASE_SSC->SSC_SR & AT91C_SSC_RXRDY) { @@ -938,12 +936,13 @@ void T55xxReadBlock(uint32_t Block, uint32_t Pwd, uint8_t PwdMode) // Read card traceability data (page 1) void T55xxReadTrace(void){ - uint8_t *dest = BigBuf_get_addr(); - //uint16_t bufferlength = BigBuf_max_traceLen(); - uint16_t bufferlength = T55xx_SAMPLES_SIZE; + uint32_t i = 0; + uint8_t *dest = BigBuf_get_addr(); + uint16_t bufferlength = BigBuf_max_traceLen(); + if ( bufferlength > T55xx_SAMPLES_SIZE ) + bufferlength = T55xx_SAMPLES_SIZE; - // Clear destination buffer before sending the command 0x80 = average memset(dest, 0x80, bufferlength); LFSetupFPGAForADC(0, true); @@ -978,7 +977,7 @@ void T55xxReadTrace(void){ } void TurnReadLFOn(){ - FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz + //FpgaSendCommand(FPGA_CMD_SET_DIVISOR, 95); //125Khz FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); // Give it a bit of time for the resonant antenna to settle. //SpinDelay(30); diff --git a/client/cmdlf.c b/client/cmdlf.c index 136b0533..8dd944cb 100644 --- a/client/cmdlf.c +++ b/client/cmdlf.c @@ -489,7 +489,12 @@ int CmdLFRead(const char *Cmd) //And ship it to device UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K}; SendCommand(&c); - WaitForResponse(CMD_ACK,NULL); + //WaitForResponse(CMD_ACK,NULL); + if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) { + PrintAndLog("command execution time out"); + return 1; + } + return 0; } diff --git a/client/cmdlft55xx.c b/client/cmdlft55xx.c index a48945ab..4a1bdaa0 100644 --- a/client/cmdlft55xx.c +++ b/client/cmdlft55xx.c @@ -25,17 +25,17 @@ #define LF_TRACE_BUFF_SIZE 20000 // 32 x 32 x 10 (32 bit times numofblock (7), times clock skip..) #define LF_BITSSTREAM_LEN 1000 // more then 1000 bits shouldn't happend.. 8block * 4 bytes * 8bits = -int usage_t55xx_rd(){ - PrintAndLog("Usage: lf t55xx rd "); +int usage_t55xx_read(){ + PrintAndLog("Usage: lf t55xx read "); PrintAndLog(" , block number to read. Between 0-7"); PrintAndLog(" , OPTIONAL password (8 hex characters)"); PrintAndLog(""); - PrintAndLog(" sample: lf t55xx rd 0 = try reading data from block 0"); - PrintAndLog(" : lf t55xx rd 0 feedbeef = try reading data from block 0 using password"); + PrintAndLog(" sample: lf t55xx read 0 = try reading data from block 0"); + PrintAndLog(" : lf t55xx read 0 feedbeef = try reading data from block 0 using password"); PrintAndLog(""); return 0; } -int usage_t55xx_wr(){ +int usage_t55xx_write(){ PrintAndLog("Usage: lf t55xx wr [password]"); PrintAndLog(" , block number to read. Between 0-7"); PrintAndLog(" , 4 bytes of data to write (8 hex characters)"); @@ -78,23 +78,23 @@ static int CmdHelp(const char *Cmd); int CmdReadBlk(const char *Cmd) { + int i = 0; int block = -1; int password = 0xFFFFFFFF; //default to blank Block 7 - size_t bitlen; - uint32_t blockData; + size_t bitlen = 0; + uint32_t blockData = 0; uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00}; - char cmdp = param_getchar(Cmd, 0); if (cmdp == 'h' || cmdp == 'H') { - usage_t55xx_rd(); + usage_t55xx_read(); return 0; } int res = sscanf(Cmd, "%d %x", &block, &password); if ( res < 1 || res > 2 ){ - usage_t55xx_rd(); + usage_t55xx_read(); return 1; } @@ -113,31 +113,40 @@ int CmdReadBlk(const char *Cmd) } SendCommand(&c); - if ( !WaitForResponseTimeout(CMD_ACK,NULL,1500) ) { + if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) { PrintAndLog("command execution time out"); return 2; } - CmdSamples("12000"); + uint8_t got[12000]; + GetFromBigBuf(got,sizeof(got),0); + WaitForResponse(CMD_ACK,NULL); + setGraphBuf(got, 12000); + bitlen = getFromGraphBuf(bits); - if ( !tryDemod(bits, bitlen) ) - return 3; + int ans = 0; + ans = CmdFSKrawdemod(""); + ans = CmdFSKrawdemod("1"); //invert? + ans = Cmdaskmandemod(""); + ans = Cmdaskrawdemod(""); + ans = CmdNRZrawDemod(""); + ans = CmdPSK1rawDemod(""); + ans = CmdPSK2rawDemod(""); + + // if ( !tryDemod(bits, bitlen) ) + // return 3; + + // //move bits back to DemodBuffer + // setDemodBuf(bits, bitlen, 0); + // printBitStream(bits, bitlen); + if ( !DemodBufferLen) + return 0; - //move bits back to DemodBuffer - setDemodBuf(bits, bitlen, 0); - printBitStream(bits, bitlen); + for (;i 3) { - usage_t55xx_wr(); + usage_t55xx_write(); return 1; } @@ -238,26 +247,23 @@ int CmdWriteBlk(const char *Cmd) UsbCommand c = {CMD_T55XX_WRITE_BLOCK, {data, block, 0}}; c.d.asBytes[0] = 0x0; - if (res == 2) { - PrintAndLog("Writing block %d data %08X", block, data); - } else { - //Password mode + PrintAndLog("Writing to T55x7"); + PrintAndLog("block : %d", block); + PrintAndLog("data : 0x%08X", data); + + //Password mode + if (res == 3) { c.arg[2] = password; c.d.asBytes[0] = 0x1; - PrintAndLog("Writing block %d data %08X password %08X", block, data, password); + PrintAndLog("pwd : 0x%08X", password); } - SendCommand(&c); return 0; } int CmdReadTrace(const char *Cmd) { - int invert = 0; - int clk = 0; - int errCnt; size_t bitlen; - int maxErr = 100; uint8_t bits[MAX_GRAPH_TRACE_LEN] = {0x00}; char cmdp = param_getchar(Cmd, 0); @@ -271,37 +277,16 @@ int CmdReadTrace(const char *Cmd) UsbCommand c = {CMD_T55XX_READ_TRACE, {0, 0, 0}}; SendCommand(&c); - WaitForResponse(CMD_ACK, NULL); - - CmdSamples("12000"); + if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) { + PrintAndLog("command execution time out"); + return 1; + } + //darn + //CmdSamples("12000"); } bitlen = getFromGraphBuf(bits); - //errCnt = askrawdemod(bits, &bitlen, &clk, &invert, maxErr, askAmp); - errCnt = askmandemod(bits, &bitlen, &clk, &invert, maxErr); - - //throw away static - allow 1 and -1 (in case of threshold command first) - if ( errCnt == -1 || bitlen < 16 ){ - PrintAndLog("no data found"); - if (g_debugMode) - PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert); - return 3; - } - if (g_debugMode) - PrintAndLog("Using Clock: %d - invert: %d - Bits Found: %d", clk, invert, bitlen); - - //move bits back to DemodBuffer - setDemodBuf(bits, bitlen, 0); - - // bits has the manchester encoded data. - errCnt = manrawdecode(bits, &bitlen); - if ( errCnt == -1 || bitlen < 16 ){ - PrintAndLog("no data found"); - if (g_debugMode) - PrintAndLog("errCnt: %d, bitlen: %d, clk: %d, invert: %d", errCnt, bitlen, clk, invert); - return 4; - } RepaintGraphWindow(); @@ -596,12 +581,11 @@ uint32_t PackBits(uint8_t start, uint8_t len, uint8_t* bits){ static command_t CommandTable[] = { {"help", CmdHelp, 1, "This help"}, - {"rd", CmdReadBlk, 0, " [password] -- Read T55xx block data (page 0) [optional password]"}, - {"wr", CmdWriteBlk, 0, " [password] -- Write T55xx block data (page 0) [optional password]"}, + {"read", CmdReadBlk, 0, " [password] -- Read T55xx block data (page 0) [optional password]"}, + {"write", CmdWriteBlk, 0, " [password] -- Write T55xx block data (page 0) [optional password]"}, {"trace", CmdReadTrace, 0, "[1] Read T55xx traceability data (page 1/ blk 0-1)"}, {"info", CmdInfo, 0, "[1] Read T55xx configuration data (page 0/ blk 0)"}, {"dump", CmdDump, 0, "[password] Dump T55xx card block 0-7. [optional password]"}, - {"man", CmdIceManchester, 0, "Manchester demod (with SST)"}, {NULL, NULL, 0, NULL} }; diff --git a/client/util.c b/client/util.c index 6b47eab9..c55d3f66 100644 --- a/client/util.c +++ b/client/util.c @@ -237,7 +237,7 @@ uint8_t param_get8(const char *line, int paramnum) uint8_t param_getdec(const char *line, int paramnum, uint8_t *destination) { uint8_t val = param_get8ex(line, paramnum, 255, 10); - printf("read %i", (int8_t ) val); + printf("read %i\n", (int8_t ) val); if( (int8_t) val == -1) return 1; (*destination) = val; return 0; -- 2.39.2