#include <stdlib.h>
#include <string.h>
#include <limits.h>
+#include <stdbool.h>
+#include <stdint.h>
#include "proxmark3.h"
#include "cmdlf.h"
#include "lfdemod.h" // for psk2TOpsk1
PrintAndLog("Options: ");
PrintAndLog(" h This help");
PrintAndLog(" s silent run no printout");
- PrintAndLog("This function takes no arguments. ");
+ PrintAndLog(" [# samples] # samples to collect (optional)");
PrintAndLog("Use 'lf config' to set parameters.");
return 0;
}
return 0;
}
+bool lf_read(bool silent, uint32_t samples) {
+ if (offline) return false;
+ UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {silent,samples,0}};
+ clearCommandBuffer();
+ //And ship it to device
+ SendCommand(&c);
+
+ UsbCommand resp;
+ if (g_lf_threshold_set) {
+ WaitForResponse(CMD_ACK,&resp);
+ } else {
+ if ( !WaitForResponseTimeout(CMD_ACK,&resp,2500) ) {
+ PrintAndLog("command execution time out");
+ return false;
+ }
+ }
+ getSamples(resp.arg[0], silent);
+
+ return true;
+}
+
int CmdLFRead(const char *Cmd)
{
- if (offline) return 0;
uint8_t cmdp = 0;
- bool arg1 = false;
+ bool silent = false;
if (param_getchar(Cmd, cmdp) == 'h')
{
return usage_lf_read();
}
- if (param_getchar(Cmd, cmdp) == 's') arg1 = true; //suppress print
- //And ship it to device
- UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
- clearCommandBuffer();
- SendCommand(&c);
- if (g_lf_threshold_set) {
- WaitForResponse(CMD_ACK,NULL);
- } else {
- if ( !WaitForResponseTimeout(CMD_ACK,NULL,2500) ) {
- PrintAndLog("command execution time out");
- return 1;
- }
+ if (param_getchar(Cmd, cmdp) == 's') {
+ silent = true; //suppress print
+ cmdp++;
}
- return 0;
+ uint32_t samples = param_get32ex(Cmd, cmdp, 0, 10);
+ return lf_read(silent, samples);
}
int CmdLFSnoop(const char *Cmd)
clearCommandBuffer();
SendCommand(&c);
WaitForResponse(CMD_ACK,NULL);
+ getSamples(0, true);
+
return 0;
}
{
return usage_lf_simfsk();
}
-
+ int firstClockEdge = 0;
if (dataLen == 0){ //using DemodBuffer
if (clk==0 || fcHigh==0 || fcLow==0){ //manual settings must set them all
- uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0);
+ uint8_t ans = fskClocks(&fcHigh, &fcLow, &clk, 0, &firstClockEdge);
if (ans==0){
if (!fcHigh) fcHigh=10;
if (!fcLow) fcLow=8;
int CheckChipType(char cmdp) {
uint32_t wordData = 0;
+ if (offline || cmdp == '1') return 0;
+
+ save_restoreGB(GRAPH_SAVE);
+ save_restoreDB(GRAPH_SAVE);
//check for em4x05/em4x69 chips first
- save_restoreGB(1);
- save_restoreDB(1);
- if ((!offline && (cmdp != '1')) && EM4x05Block0Test(&wordData)) {
+ if (EM4x05Block0Test(&wordData)) {
PrintAndLog("\nValid EM4x05/EM4x69 Chip Found\nTry lf em 4x05... commands\n");
- save_restoreGB(0);
- save_restoreDB(0);
+ save_restoreGB(GRAPH_RESTORE);
+ save_restoreDB(GRAPH_RESTORE);
return 1;
}
- //TODO check for t55xx chip...
-
- if ((!offline && (cmdp != '1')) && tryDetectP1(true)) {
+ //check for t55xx chip...
+ if (tryDetectP1(true)) {
PrintAndLog("\nValid T55xx Chip Found\nTry lf t55xx ... commands\n");
- save_restoreGB(0);
- save_restoreDB(0);
+ save_restoreGB(GRAPH_RESTORE);
+ save_restoreDB(GRAPH_RESTORE);
return 1;
}
- save_restoreGB(0);
- save_restoreDB(0);
+ save_restoreGB(GRAPH_RESTORE);
+ save_restoreDB(GRAPH_RESTORE);
return 0;
}
return 0;
}
- if (!offline && (cmdp != '1')){
- CmdLFRead("s");
- getSamples("30000",false);
+ if (!offline && (cmdp != '1')) {
+ lf_read(true, 30000);
} else if (GraphTraceLen < minLength) {
PrintAndLog("Data in Graphbuffer was too small.");
return 0;
PrintAndLog("\nNo Known Tags Found!\n");
if (testRaw=='u' || testRaw=='U') {
- ans=CheckChipType(cmdp);
+ //ans=CheckChipType(cmdp);
//test unknown tag formats (raw mode)0
PrintAndLog("\nChecking for Unknown tags:\n");
- ans=AutoCorrelate(4000, false, false);
+ ans=AutoCorrelate(GraphBuffer, GraphBuffer, GraphTraceLen, 4000, false, false);
if (ans > 0) PrintAndLog("Possible Auto Correlation of %d repeating samples",ans);
ans=GetFskClock("",false,false);
if (ans != 0) { //fsk
ans=FSKrawDemod("",true);
if (ans>0) {
PrintAndLog("\nUnknown FSK Modulated Tag Found!");
- return 1;
+ return CheckChipType(cmdp);
}
}
bool st = true;
if (ans>0) {
PrintAndLog("\nUnknown ASK Modulated and Manchester encoded Tag Found!");
PrintAndLog("\nif it does not look right it could instead be ASK/Biphase - try 'data rawdemod ab'");
- return 1;
+ return CheckChipType(cmdp);
}
ans=CmdPSK1rawDemod("");
if (ans>0) {
PrintAndLog("Possible unknown PSK1 Modulated Tag Found above!\n\nCould also be PSK2 - try 'data rawdemod p2'");
PrintAndLog("\nCould also be PSK3 - [currently not supported]");
- PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod");
- return 1;
+ PrintAndLog("\nCould also be NRZ - try 'data nrzrawdemod'");
+ return CheckChipType(cmdp);
}
+ ans = CheckChipType(cmdp);
PrintAndLog("\nNo Data Found!\n");
}
return 0;