]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - client/cmdlf.c
ADD: `hf 14a read` - now can detect the newer magic generation 1b. In output 1A...
[proxmark3-svn] / client / cmdlf.c
index ba7d9cc8412f9ad58c78d01fd52a6d2fbdcfda9f..8ab065bb45b0a51f31dc48d6a927188bb00db274 100644 (file)
@@ -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) {
@@ -27,11 +30,10 @@ int usage_lf_cmdread(void) {
        return 0;
 }
 int usage_lf_read(void){
-       PrintAndLog("Usage: lf read [h] [s] [t]");
+       PrintAndLog("Usage: lf read [h] [s]");
        PrintAndLog("Options:");
        PrintAndLog("       h            This help");
        PrintAndLog("       s            silent run no printout");
-       PrintAndLog("       t            waits for device to respond with no timeout");
        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,8 +549,11 @@ int CmdLFSetConfig(const char *Cmd) {
 }
 
 int CmdLFRead(const char *Cmd) {
-       bool arg1 = false;
-       bool thresholdRead = false;     
+       
+       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)) {
@@ -554,12 +562,7 @@ int CmdLFRead(const char *Cmd) {
                        return usage_lf_read();
                case 's':
                case 'S':
-                       arg1 = true;
-                       cmdp++;
-                       break;
-               case 't':
-               case 'T':
-                       thresholdRead = true;
+                       arg1 = TRUE;
                        cmdp++;
                        break;
                default:
@@ -579,7 +582,7 @@ int CmdLFRead(const char *Cmd) {
        UsbCommand c = {CMD_ACQUIRE_RAW_ADC_SAMPLES_125K, {arg1,0,0}};
        clearCommandBuffer();
        SendCommand(&c);
-       if ( thresholdRead ) {
+       if ( g_lf_threshold_set ) {
                WaitForResponse(CMD_ACK,NULL);  
        } else {
                if ( !WaitForResponseTimeout(CMD_ACK, NULL ,2500) ) {
@@ -1029,6 +1032,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;
@@ -1037,7 +1067,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) {
@@ -1053,11 +1085,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;
@@ -1072,6 +1107,9 @@ int CmdLFfind(const char *Cmd) {
                }
        }
 
+       // identify chipset
+       CheckChipset(getDeviceData);
+       
        ans=CmdFSKdemodIO("");
        if (ans>0) {
                PrintAndLog("\nValid IO Prox ID Found!");
@@ -1225,13 +1263,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... }"},
Impressum, Datenschutz