// Low frequency commands
//-----------------------------------------------------------------------------
#include "cmdlf.h"
+
+bool g_lf_threshold_set = FALSE;
+
static int CmdHelp(const char *Cmd);
int usage_lf_cmdread(void) {
PrintAndLog("Options:");
PrintAndLog(" h This help");
PrintAndLog(" s silent run no printout");
- PrintAndLog("This function takes no arguments. ");
PrintAndLog("Use 'lf config' to set parameters.");
return 0;
}
case 't':
errors |= param_getdec(Cmd, cmdp+1, &unsigned_trigg);
cmdp+=2;
- if(!errors) trigger_threshold = unsigned_trigg;
+ if(!errors) {
+ trigger_threshold = unsigned_trigg;
+ g_lf_threshold_set = (trigger_threshold > 0);
+ }
break;
case 'b':
errors |= param_getdec(Cmd, cmdp+1, &bps);
}
int CmdLFRead(const char *Cmd) {
- bool arg1 = false;
- uint8_t cmdp = param_getchar(Cmd, 0);
- if ( cmdp == 'h' || cmdp == 'H') return usage_lf_read();
+ if (offline) return 0;
+
+ bool errors = FALSE;
+ bool arg1 = FALSE;
+ uint8_t cmdp = 0;
+ while(param_getchar(Cmd, cmdp) != 0x00) {
+ switch(param_getchar(Cmd, cmdp)) {
+ case 'h':
+ case 'H':
+ return usage_lf_read();
+ case 's':
+ case 'S':
+ arg1 = TRUE;
+ cmdp++;
+ break;
+ default:
+ PrintAndLog("Unknown parameter '%c'", param_getchar(Cmd, cmdp));
+ errors = 1;
+ break;
+ }
+ if(errors) break;
+ }
- //suppress print
- if ( cmdp == 's' || cmdp == 'S') arg1 = true;
+ // No args
+ if (cmdp == 0) errors = 1;
+
+ //Validations
+ if (errors) return usage_lf_read();
UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
clearCommandBuffer();
SendCommand(&c);
- if ( !WaitForResponseTimeout(CMD_ACK, NULL ,2500) ) {
- PrintAndLog("command execution time out");
- return 1;
+ if ( g_lf_threshold_set ) {
+ WaitForResponse(CMD_ACK,NULL);
+ } else {
+ if ( !WaitForResponseTimeout(CMD_ACK, NULL ,2500) ) {
+ PrintAndLog("command execution time out");
+ return 1;
+ }
}
return 0;
}
return 0;
}
+
+//by marshmellow
+int CheckChipset(bool getDeviceData) {
+
+ if (!getDeviceData) return 0;
+
+ uint32_t word = 0;
+ save_restoreGB(1);
+
+ //check for em4x05/em4x69 chips first
+ if (EM4x05IsBlock0(&word)) {
+ save_restoreGB(0);
+ PrintAndLog("\nValid EM4x05/EM4x69 Chipset found\nTry `lf em 4x05` commands\n");
+ return 1;
+ }
+
+ //TODO check for t55xx chip...
+ // if ( t55xxIsBlock0(() {
+ // save_restoreGB(0);
+ // PrintAndLog("\nValid T55xx Chipset found\nTry `lf t55xx` commands\n");
+ // return 1;
+ // }
+
+ save_restoreGB(0);
+ return 0;
+}
+
//by marshmellow
int CmdLFfind(const char *Cmd) {
int ans = 0;
char testRaw = param_getchar(Cmd, 1);
if (strlen(Cmd) > 3 || cmdp == 'h' || cmdp == 'H') return usage_lf_find();
- if (!offline && (cmdp != '1')){
+ bool getDeviceData = (!offline && (cmdp != '1') );
+
+ if (getDeviceData) {
CmdLFRead("s");
getSamples("30000", false);
} else if (GraphTraceLen < minLength) {
size_t testLen = minLength;
// only run these tests if device is online
- if (!offline && (cmdp != '1')){
+ if (getDeviceData) {
// only run if graphbuffer is just noise as it should be for hitag/cotag
if (graphJustNoise(GraphBuffer, testLen)) {
+ if (CheckChipset(getDeviceData) )
+ return 1;
+
ans=CmdLFHitagReader("26");
if (ans==0)
return 1;
}
}
+ // identify chipset
+ CheckChipset(getDeviceData);
+
ans=CmdFSKdemodIO("");
if (ans>0) {
PrintAndLog("\nValid IO Prox ID Found!");
return 0;
}
-static command_t CommandTable[] =
-{
+static command_t CommandTable[] = {
{"help", CmdHelp, 1, "This help"},
{"animal", CmdLFFdx, 1, "{ Animal RFIDs... }"},
{"awid", CmdLFAWID, 1, "{ AWID RFIDs... }"},
{"cotag", CmdLFCOTAG, 1, "{ COTAG RFIDs... }"},
- {"em4x", CmdLFEM4X, 1, "{ EM4X RFIDs... }"},
+ {"em", CmdLFEM4X, 1, "{ EM4X RFIDs... }"},
{"guard", CmdLFGuard, 1, "{ Guardall RFIDs... }"},
{"hid", CmdLFHID, 1, "{ HID RFIDs... }"},
{"hitag", CmdLFHitag, 1, "{ HITAG RFIDs... }"},