reconfigure lf cmdread ...

to use lf config settings instead of it's own settings.  (now allows
full options of lf config...)

also it will now run `data samples` when the command completes making it
not necessary to run manually...

note: adjusted client wait message as it was confusing.
This commit is contained in:
marshmellow42 2018-02-10 17:30:32 -05:00
commit 779d9a0e90
3 changed files with 38 additions and 42 deletions

View file

@ -4,7 +4,7 @@
// the license. // the license.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Miscellaneous routines for low frequency tag operations. // Miscellaneous routines for low frequency tag operations.
// Tags supported here so far are Texas Instruments (TI), HID // Tags supported here so far are Texas Instruments (TI), HID, EM4x05, EM410x
// Also routines for raw mode reading/simulating of LF waveform // Also routines for raw mode reading/simulating of LF waveform
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -28,17 +28,12 @@
*/ */
void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint32_t period_1, uint8_t *command) void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint32_t period_1, uint8_t *command)
{ {
// start timer
StartTicks(); StartTicks();
int divisor_used = 95; // 125 KHz
// see if 'h' was specified
if (command[strlen((char *) command) - 1] == 'h') // use lf config settings
divisor_used = 88; // 134.8 KHz sample_config *sc = getSamplingConfig();
// clear read buffer
sample_config sc = { 0,0,1, divisor_used, 0};
setSamplingConfig(&sc);
//clear read buffer
BigBuf_Clear_keep_EM(); BigBuf_Clear_keep_EM();
/* Make sure the tag is reset */ /* Make sure the tag is reset */
@ -46,8 +41,8 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
WaitMS(2500); WaitMS(2500);
//power on // power on
LFSetupFPGAForADC(sc.divisor, 1); LFSetupFPGAForADC(sc->divisor, 1);
// And a little more time for the tag to fully power up // And a little more time for the tag to fully power up
WaitMS(2000); WaitMS(2000);
@ -56,15 +51,21 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint
// now modulate the reader field // now modulate the reader field
if (bitbang) { if (bitbang) {
//HACK it appears my loop and if statements take up about 7 us so adjust waits accordingly... // HACK it appears the loop and if statements take up about 7us so adjust waits accordingly...
uint8_t hack_cnt = 7; uint8_t hack_cnt = 7;
if (period_0 < hack_cnt || period_1 < hack_cnt) { if (period_0 < hack_cnt || period_1 < hack_cnt) {
DbpString("Warning periods cannot be less than 7 in bit bang mode"); DbpString("Warning periods cannot be less than 7us in bit bang mode");
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
LED_D_OFF(); LED_D_OFF();
return; return;
} }
//prime cmd_len to save time comparing strings while modulating
// hack2 needed--- it appears to take about 8-16us to turn the antenna back on
// leading to ~ 1 to 2 125khz samples extra in every off period
// so we should test for last 0 before next 1 and reduce period_0 by this extra amount...
// but is this time different for every antenna or other hw builds??? more testing needed
// prime cmd_len to save time comparing strings while modulating
int cmd_len = 0; int cmd_len = 0;
while(command[cmd_len] != '\0' && command[cmd_len] != ' ') while(command[cmd_len] != '\0' && command[cmd_len] != ' ')
cmd_len++; cmd_len++;
@ -72,7 +73,6 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint
int counter = 0; int counter = 0;
bool off = false; bool off = false;
for (counter = 0; counter < cmd_len; counter++) { for (counter = 0; counter < cmd_len; counter++) {
//while(*command != '\0' && *command != ' ') {
// if cmd = 0 then turn field off // if cmd = 0 then turn field off
if (command[counter] == '0') { if (command[counter] == '0') {
// if field already off leave alone (affects timing otherwise) // if field already off leave alone (affects timing otherwise)
@ -81,17 +81,17 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint
LED_D_OFF(); LED_D_OFF();
off = true; off = true;
} }
// note we appear to take about 6us to switch over (or run the if statements/loop...) // note we appear to take about 7us to switch over (or run the if statements/loop...)
WaitUS(period_0-hack_cnt); WaitUS(period_0-hack_cnt);
// else if cmd = 1 then turn field on // else if cmd = 1 then turn field on
} else { } else {
// if field already on leave alone (affects timing otherwise) // if field already on leave alone (affects timing otherwise)
if (off) { if (off) {
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
LED_D_ON(); LED_D_ON();
off = false; off = false;
} }
// note we appear to take about 6us to switch over (or run the if statements/loop...) // note we appear to take about 7us to switch over (or run the if statements/loop...)
WaitUS(period_1-hack_cnt); WaitUS(period_1-hack_cnt);
} }
} }
@ -100,7 +100,7 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
LED_D_OFF(); LED_D_OFF();
WaitUS(delay_off); WaitUS(delay_off);
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc.divisor); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc->divisor);
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
LED_D_ON(); LED_D_ON();
if(*(command++) == '0') { if(*(command++) == '0') {
@ -112,14 +112,18 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t period_0, uint
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
LED_D_OFF(); LED_D_OFF();
WaitUS(delay_off); WaitUS(delay_off);
FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc.divisor); FpgaSendCommand(FPGA_CMD_SET_DIVISOR, sc->divisor);
} }
FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD); FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
// now do the read // now do the read
DoAcquisition_config(false, 0); DoAcquisition_config(false, 0);
// note leaves field on... (for future commands?)
// Turn off antenna
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
// tell client we are done
cmd_send(CMD_ACK,0,0,0,0,0);
} }
/* blank r/w tag data stream /* blank r/w tag data stream

View file

@ -54,26 +54,24 @@ static int CmdHelp(const char *Cmd);
int usage_lf_cmdread(void) int usage_lf_cmdread(void)
{ {
PrintAndLog("Usage: lf cmdread d <delay period> z <zero period> o <one period> c <cmdbytes> [H] "); PrintAndLog("Usage: lf cmdread d <delay period> z <zero period> o <one period> c <cmdbytes> ");
PrintAndLog("Options: "); PrintAndLog("Options: ");
PrintAndLog(" h This help"); PrintAndLog(" h This help");
PrintAndLog(" L Low frequency (125 KHz)"); PrintAndLog(" d <delay> delay OFF period between bits (0 for bitbang mode)");
PrintAndLog(" H High frequency (134 KHz)"); PrintAndLog(" z <zero> time period ZERO (antenna off in bitbang mode)");
PrintAndLog(" d <delay> delay OFF period"); PrintAndLog(" o <one> time period ONE (antenna on in bitbang mode)");
PrintAndLog(" z <zero> time period ZERO");
PrintAndLog(" o <one> time period ONE");
PrintAndLog(" c <cmd> Command bytes"); PrintAndLog(" c <cmd> Command bytes");
PrintAndLog(" ************* All periods in microseconds"); PrintAndLog(" ************* All periods in microseconds");
PrintAndLog(" ************* Use lf config to configure options.");
PrintAndLog("Examples:"); PrintAndLog("Examples:");
PrintAndLog(" lf cmdread d 80 z 100 o 200 c 11000"); PrintAndLog(" lf cmdread d 80 z 100 o 200 c 11000");
PrintAndLog(" lf cmdread d 80 z 100 o 100 c 11000 H"); PrintAndLog(" lf cmdread d 80 z 100 o 100 c 11000");
return 0; return 0;
} }
/* send a command before reading */ /* send a command before reading */
int CmdLFCommandRead(const char *Cmd) int CmdLFCommandRead(const char *Cmd)
{ {
static char dummy[3] = {0x20,0x00,0x00};
UsbCommand c = {CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K}; UsbCommand c = {CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K};
bool errors = false; bool errors = false;
//uint8_t divisor = 95; //125khz //uint8_t divisor = 95; //125khz
@ -84,14 +82,6 @@ int CmdLFCommandRead(const char *Cmd)
{ {
case 'h': case 'h':
return usage_lf_cmdread(); return usage_lf_cmdread();
case 'H':
//divisor = 88;
dummy[1]='h';
cmdp++;
break;
case 'L':
cmdp++;
break;
case 'c': case 'c':
param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes, sizeof(c.d.asBytes)); param_getstr(Cmd, cmdp+1, (char *)&c.d.asBytes, sizeof(c.d.asBytes));
cmdp+=2; cmdp+=2;
@ -121,11 +111,13 @@ int CmdLFCommandRead(const char *Cmd)
//Validations //Validations
if(errors) return usage_lf_cmdread(); if(errors) return usage_lf_cmdread();
// in case they specified 'H'
strcpy((char *)&c.d.asBytes + strlen((char *)c.d.asBytes), dummy);
clearCommandBuffer(); clearCommandBuffer();
SendCommand(&c); SendCommand(&c);
WaitForResponse(CMD_ACK,NULL);
getSamples(0, true);
return 0; return 0;
} }

View file

@ -162,7 +162,7 @@ bool WaitForResponseTimeoutW(uint32_t cmd, UsbCommand* response, size_t ms_timeo
} }
if (msclock() - start_time > 2000 && show_warning) { if (msclock() - start_time > 2000 && show_warning) {
PrintAndLog("Waiting for a response from the proxmark..."); PrintAndLog("Waiting for a response from the proxmark...");
PrintAndLog("Don't forget to cancel its operation first by pressing on the button"); PrintAndLog("You can cancel this operation by pressing the pm3 button");
show_warning = false; show_warning = false;
} }
} }