mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2024-09-20 23:36:31 +08:00
CHG: 'lf snoop' - now automatically downloads samples after finished. (annoying step to do over and over)
FIX: 'lf snoop' - now turns of LF antenna after snoop. FIX: 'lf cotag read' - now waits until the ACK cmd arrives before downloading samples.
This commit is contained in:
parent
71aa1ff824
commit
b828a4e168
|
@ -78,6 +78,8 @@ void ModThenAcquireRawAdcSamples125k(uint32_t delay_off, uint32_t periods, uint3
|
||||||
|
|
||||||
// now do the read
|
// now do the read
|
||||||
DoAcquisition_config(false);
|
DoAcquisition_config(false);
|
||||||
|
|
||||||
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* blank r/w tag data stream
|
/* blank r/w tag data stream
|
||||||
|
@ -1740,12 +1742,12 @@ void EM4xWriteWord(uint32_t Data, uint8_t Address, uint32_t Pwd, uint8_t PwdMode
|
||||||
|
|
||||||
void Cotag() {
|
void Cotag() {
|
||||||
|
|
||||||
|
//#define WAIT2200 { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); WaitUS(2035); }
|
||||||
#define WAIT2200 { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); WaitUS(2200); }
|
#define WAIT2200 { FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); WaitUS(2200); }
|
||||||
|
|
||||||
LED_A_ON();
|
LED_A_ON();
|
||||||
|
|
||||||
//clear buffer now so it does not interfere with timing later
|
//clear buffer now so it does not interfere with timing later
|
||||||
BigBuf_Clear_keep_EM();
|
BigBuf_Clear_ext(false);
|
||||||
|
|
||||||
// Set up FPGA, 132kHz to power up the tag
|
// Set up FPGA, 132kHz to power up the tag
|
||||||
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
|
||||||
|
@ -1755,28 +1757,33 @@ void Cotag() {
|
||||||
// Connect the A/D to the peak-detected low-frequency path.
|
// Connect the A/D to the peak-detected low-frequency path.
|
||||||
SetAdcMuxFor(GPIO_MUXSEL_LOPKD);
|
SetAdcMuxFor(GPIO_MUXSEL_LOPKD);
|
||||||
|
|
||||||
// 50ms for the resonant antenna to settle.
|
|
||||||
SpinDelay(50);
|
|
||||||
|
|
||||||
// Now set up the SSC to get the ADC samples that are now streaming at us.
|
// Now set up the SSC to get the ADC samples that are now streaming at us.
|
||||||
FpgaSetupSsc();
|
FpgaSetupSsc();
|
||||||
|
|
||||||
// start a 1.5ticks is 1us
|
// start a 1.5ticks is 1us
|
||||||
StartTicks();
|
StartTicks();
|
||||||
|
|
||||||
//send start pulse
|
//send start pulse
|
||||||
TurnReadLFOn(800);
|
TurnReadLFOn(800); WAIT2200
|
||||||
WAIT2200
|
TurnReadLFOn(3600); WAIT2200
|
||||||
TurnReadLFOn(3600);
|
TurnReadLFOn(800); WAIT2200
|
||||||
WAIT2200
|
|
||||||
TurnReadLFOn(800);
|
|
||||||
WAIT2200
|
|
||||||
TurnReadLFOn(3600);
|
TurnReadLFOn(3600);
|
||||||
|
|
||||||
// Turn field on to read the response
|
/*
|
||||||
TurnReadLFOn(READ_GAP);
|
TurnReadLFOn(740); WAIT2200
|
||||||
|
TurnReadLFOn(3330); WAIT2200
|
||||||
|
TurnReadLFOn(740); WAIT2200
|
||||||
|
TurnReadLFOn(3330);
|
||||||
|
|
||||||
|
|
||||||
|
burst 800 us, gap 2.2 msecs
|
||||||
|
burst 3.6 msecs gap 2.2 msecs
|
||||||
|
burst 800 us gap 2.2 msecs
|
||||||
|
pulse 3.6 msecs
|
||||||
|
*/
|
||||||
|
|
||||||
// Acquisition
|
// Acquisition
|
||||||
doT55x7Acquisition(20000);
|
DoAcquisition_default(-1, true);
|
||||||
|
|
||||||
// Turn the field off
|
// Turn the field off
|
||||||
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF); // field off
|
||||||
|
|
|
@ -110,7 +110,7 @@ void LFSetupFPGAForADC(int divisor, bool lf_field) {
|
||||||
* @param silent - is true, now outputs are made. If false, dbprints the status
|
* @param silent - is true, now outputs are made. If false, dbprints the status
|
||||||
* @return the number of bits occupied by the samples.
|
* @return the number of bits occupied by the samples.
|
||||||
*/
|
*/
|
||||||
uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averaging, int trigger_threshold,bool silent) {
|
uint32_t DoAcquisition(uint8_t decimation, uint32_t bits_per_sample, bool averaging, int trigger_threshold, bool silent) {
|
||||||
//bigbuf, to hold the aquired raw data signal
|
//bigbuf, to hold the aquired raw data signal
|
||||||
uint8_t *dest = BigBuf_get_addr();
|
uint8_t *dest = BigBuf_get_addr();
|
||||||
uint16_t bufsize = BigBuf_max_traceLen();
|
uint16_t bufsize = BigBuf_max_traceLen();
|
||||||
|
@ -224,14 +224,20 @@ uint32_t ReadLF(bool activeField, bool silent) {
|
||||||
* @return number of bits sampled
|
* @return number of bits sampled
|
||||||
**/
|
**/
|
||||||
uint32_t SampleLF(bool printCfg) {
|
uint32_t SampleLF(bool printCfg) {
|
||||||
return ReadLF(true, printCfg);
|
BigBuf_Clear_ext(false);
|
||||||
|
uint32_t ret = ReadLF(true, printCfg);
|
||||||
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Initializes the FPGA for snoop-mode (field off), and acquires the samples.
|
* Initializes the FPGA for snoop-mode (field off), and acquires the samples.
|
||||||
* @return number of bits sampled
|
* @return number of bits sampled
|
||||||
**/
|
**/
|
||||||
uint32_t SnoopLF() {
|
uint32_t SnoopLF() {
|
||||||
return ReadLF(false, true);
|
BigBuf_Clear_ext(false);
|
||||||
|
uint32_t ret = ReadLF(false, true);
|
||||||
|
FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -36,11 +36,10 @@ int usage_lf_read(void){
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int usage_lf_snoop(void) {
|
int usage_lf_snoop(void) {
|
||||||
PrintAndLog("Usage: lf snoop");
|
PrintAndLog("Snoop low frequence signal. Use 'lf config' to set parameters.");
|
||||||
|
PrintAndLog("Usage: lf snoop [h]");
|
||||||
PrintAndLog("Options:");
|
PrintAndLog("Options:");
|
||||||
PrintAndLog(" h This help");
|
PrintAndLog(" h This help");
|
||||||
PrintAndLog("This function takes no arguments. ");
|
|
||||||
PrintAndLog("Use 'lf config' to set parameters.");
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int usage_lf_config(void) {
|
int usage_lf_config(void) {
|
||||||
|
@ -568,10 +567,11 @@ int CmdLFSnoop(const char *Cmd) {
|
||||||
uint8_t cmdp = param_getchar(Cmd, 0);
|
uint8_t cmdp = param_getchar(Cmd, 0);
|
||||||
if(cmdp == 'h' || cmdp == 'H') return usage_lf_snoop();
|
if(cmdp == 'h' || cmdp == 'H') return usage_lf_snoop();
|
||||||
|
|
||||||
UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES};
|
UsbCommand c = {CMD_LF_SNOOP_RAW_ADC_SAMPLES,{0,0,0}};
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
WaitForResponse(CMD_ACK,NULL);
|
WaitForResponse(CMD_ACK,NULL);
|
||||||
|
getSamples("", false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1221,7 +1221,7 @@ static command_t CommandTable[] =
|
||||||
{"simfsk", CmdLFfskSim, 0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] \n\t\t-- Simulate LF FSK tag from demodbuffer or input"},
|
{"simfsk", CmdLFfskSim, 0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] \n\t\t-- Simulate LF FSK tag from demodbuffer or input"},
|
||||||
{"simpsk", CmdLFpskSim, 0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] \n\t\t-- Simulate LF PSK tag from demodbuffer or input"},
|
{"simpsk", CmdLFpskSim, 0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] \n\t\t-- Simulate LF PSK tag from demodbuffer or input"},
|
||||||
{"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
|
{"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
|
||||||
{"snoop", CmdLFSnoop, 0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
|
{"snoop", CmdLFSnoop, 0, "Snoop LF"},
|
||||||
{"vchdemod", CmdVchDemod, 1, "['clone'] -- Demodulate samples for VeriChip"},
|
{"vchdemod", CmdVchDemod, 1, "['clone'] -- Demodulate samples for VeriChip"},
|
||||||
{NULL, NULL, 0, NULL}
|
{NULL, NULL, 0, NULL}
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,9 +18,13 @@ int CmdCOTAGRead(const char *Cmd) {
|
||||||
UsbCommand c = {CMD_COTAG, {0, 0, 0}};
|
UsbCommand c = {CMD_COTAG, {0, 0, 0}};
|
||||||
clearCommandBuffer();
|
clearCommandBuffer();
|
||||||
SendCommand(&c);
|
SendCommand(&c);
|
||||||
|
if ( !WaitForResponseTimeout(CMD_ACK, NULL, 2500) ) {
|
||||||
getSamples("20000", TRUE);
|
//PrintAndLog("command execution time out");
|
||||||
return CmdFSKdemodAWID(Cmd);
|
return 1;
|
||||||
|
}
|
||||||
|
getSamples("", true);
|
||||||
|
//return CmdFSKdemodAWID(Cmd);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static command_t CommandTable[] = {
|
static command_t CommandTable[] = {
|
||||||
|
|
Loading…
Reference in a new issue