X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/4ab135c0cdb190d6d29608204d3d7c15a25b07ee..refs/pull/278/head:/client/cmdlfem4x.c?ds=sidebyside diff --git a/client/cmdlfem4x.c b/client/cmdlfem4x.c index 47b240c8..66c4221a 100644 --- a/client/cmdlfem4x.c +++ b/client/cmdlfem4x.c @@ -146,17 +146,20 @@ void printEM410x(uint32_t hi, uint64_t id) int AskEm410xDecode(bool verbose, uint32_t *hi, uint64_t *lo ) { size_t idx = 0; - size_t BitLen = DemodBufferLen; - uint8_t BitStream[MAX_GRAPH_TRACE_LEN]={0}; - memcpy(BitStream, DemodBuffer, BitLen); - if (Em410xDecode(BitStream, &BitLen, &idx, hi, lo)){ + uint8_t BitStream[512]={0}; + size_t BitLen = sizeof(BitStream); + if ( !getDemodBuf(BitStream, &BitLen) ) return 0; + + if (Em410xDecode(BitStream, &BitLen, &idx, hi, lo)) { //set GraphBuffer for clone or sim command - setDemodBuf(BitStream, BitLen, idx); - if (g_debugMode){ + setDemodBuf(DemodBuffer, (BitLen==40) ? 64 : 128, idx+1); + setClockGrid(g_DemodClock, g_DemodStartIdx + ((idx+1)*g_DemodClock)); + + if (g_debugMode) { PrintAndLog("DEBUG: idx: %d, Len: %d, Printing Demod Buffer:", idx, BitLen); printDemodBuff(); } - if (verbose){ + if (verbose) { PrintAndLog("EM410x pattern found: "); printEM410x(*hi, *lo); g_em410xId = *lo; @@ -298,9 +301,7 @@ int CmdEM410xWatch(const char *Cmd) printf("\naborted via keyboard!\n"); break; } - - CmdLFRead("s"); - getSamples("8201",true); + lf_read(true, 8201); } while (!CmdAskEM410xDemod("")); return 0; @@ -704,6 +705,8 @@ bool EM4x05testDemodReadData(uint32_t *word, bool readCmd) { } setDemodBuf(DemodBuffer, 32, 0); + //setClockGrid(0,0); + *word = bytebits_to_byteLSBF(DemodBuffer, 32); } return true; @@ -914,6 +917,9 @@ int usage_lf_em_write(void) { return 0; } +// note: em4x05 doesn't have a way to invert data output so we must invert the data prior to writing +// it if invertion is needed. (example FSK2a vs FSK) +// also em4x05 requires swapping word data when compared to the data used for t55xx chips. int EM4x05WriteWord(uint8_t addr, uint32_t data, uint32_t pwd, bool usePwd, bool swap, bool invert) { if (swap) data = SwapBits(data, 32); @@ -921,7 +927,7 @@ int EM4x05WriteWord(uint8_t addr, uint32_t data, uint32_t pwd, bool usePwd, bool if ( (addr > 15) ) { PrintAndLog("Address must be between 0 and 15"); - return 1; + return -1; } if ( !usePwd ) { PrintAndLog("Writing address %d data %08X", addr, data); @@ -962,7 +968,7 @@ int CmdEM4x05WriteWord(const char *Cmd) { bool swap = false; bool invert = false; uint8_t addr = 16; // default to invalid address - + bool gotData = false; char cmdp = 0; while(param_getchar(Cmd, cmdp) != 0x00) { @@ -979,6 +985,7 @@ int CmdEM4x05WriteWord(const char *Cmd) { case 'd': case 'D': data = param_get32ex(Cmd, cmdp+1, 0, 16); + gotData = true; cmdp += 2; break; case 'i': @@ -1013,6 +1020,10 @@ int CmdEM4x05WriteWord(const char *Cmd) { if ( strlen(Cmd) == 0 ) return usage_lf_em_write(); + if (!gotData) { + PrintAndLog("You must enter the data you want to write"); + return usage_lf_em_write(); + } return EM4x05WriteWord(addr, data, pwd, usePwd, swap, invert); }