X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/3f84d473698a65e37504ec873905d248edef0f5d..966c111e8c8e45e624465502d0ee405ebda9a39c:/client/cmdlf.c

diff --git a/client/cmdlf.c b/client/cmdlf.c
index f2a9bb38..414e4a2b 100644
--- a/client/cmdlf.c
+++ b/client/cmdlf.c
@@ -8,6 +8,9 @@
 // Low frequency commands
 //-----------------------------------------------------------------------------
 #include "cmdlf.h"
+
+bool g_lf_threshold_set = FALSE;
+
 static int CmdHelp(const char *Cmd);
 
 int usage_lf_cmdread(void) {
@@ -31,7 +34,6 @@ int usage_lf_read(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;
 }
@@ -503,7 +505,10 @@ int CmdLFSetConfig(const char *Cmd) {
 		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);
@@ -544,20 +549,43 @@ int CmdLFSetConfig(const char *Cmd) {
 }
 
 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;
 	
-	 //suppress print
-	if ( cmdp == 's' || cmdp == 'S') arg1 = true;
+	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 = TRUE;
+			break;
+		}
+		if(errors) break;
+	}
+
+	//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;
 }
@@ -1001,6 +1029,33 @@ int CmdVchDemod(const char *Cmd) {
 	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;
@@ -1009,7 +1064,9 @@ int CmdLFfind(const char *Cmd) {
 	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) {
@@ -1025,11 +1082,14 @@ int CmdLFfind(const char *Cmd) {
 	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;
@@ -1044,6 +1104,9 @@ int CmdLFfind(const char *Cmd) {
 		}
 	}
 
+	// identify chipset
+	CheckChipset(getDeviceData);
+	
 	ans=CmdFSKdemodIO("");
 	if (ans>0) {
 		PrintAndLog("\nValid IO Prox ID Found!");
@@ -1197,13 +1260,12 @@ int CmdLFfind(const char *Cmd) {
 	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... }"},