X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/9760414b9672e778317fc9238265cf7fc36061b8..ac174b297a8d16b138186d4c5543c11a9572515c:/winsrc/command.cpp diff --git a/winsrc/command.cpp b/winsrc/command.cpp index 1c434ebb..3fa75431 100644 --- a/winsrc/command.cpp +++ b/winsrc/command.cpp @@ -52,6 +52,13 @@ static void CmdReset(char *str) SendCommand(&c, FALSE); } +static void CmdBuffClear(char *str) +{ + UsbCommand c; + c.cmd = CMD_BUFF_CLEAR; + SendCommand(&c, FALSE); + CmdClearGraph(TRUE); +} static void CmdQuit(char *str) { @@ -211,10 +218,10 @@ int CmdClearGraph(int redraw) { int gtl = GraphTraceLen; GraphTraceLen = 0; - + if (redraw) RepaintGraphWindow(); - + return gtl; } @@ -225,8 +232,8 @@ static void CmdAppendGraph(int redraw, int clock, int bit) for (i = 0; i < (int)(clock/2); i++) GraphBuffer[GraphTraceLen++] = bit ^ 1; - - for (i = (int)(clock/2); i < clock; i++) + + for (i = (int)(clock/2); i < clock; i++) GraphBuffer[GraphTraceLen++] = bit; if (redraw) @@ -240,7 +247,7 @@ static void CmdEM410xwatch(char *str) char *zero = ""; char *twok = "2000"; go = 1; - + do { CmdLoread(zero); @@ -262,9 +269,10 @@ static void CmdEM410xread(char *str) int i, j, clock, header, rows, bit, hithigh, hitlow, first, bit2idx, high, low; int parity[4]; char id[11]; + int retested = 0; int BitStream[MAX_GRAPH_TRACE_LEN]; high = low = 0; - + /* Detect high and lows and clock */ for (i = 0; i < GraphTraceLen; i++) { @@ -272,15 +280,15 @@ static void CmdEM410xread(char *str) high = GraphBuffer[i]; else if (GraphBuffer[i] < low) low = GraphBuffer[i]; - } - + } + /* get clock */ clock = GetClock(str, high); - + /* parity for our 4 columns */ parity[0] = parity[1] = parity[2] = parity[3] = 0; header = rows = 0; - + /* manchester demodulate */ bit = bit2idx = 0; for (i = 0; i < (int)(GraphTraceLen / clock); i++) @@ -288,7 +296,7 @@ static void CmdEM410xread(char *str) hithigh = 0; hitlow = 0; first = 1; - + /* Find out if we hit both high and low peaks */ for (j = 0; j < clock; j++) { @@ -296,14 +304,14 @@ static void CmdEM410xread(char *str) hithigh = 1; else if (GraphBuffer[(i * clock) + j] == low) hitlow = 1; - + /* it doesn't count if it's the first part of our read because it's really just trailing from the last sequence */ if (first && (hithigh || hitlow)) hithigh = hitlow = 0; else first = 0; - + if (hithigh && hitlow) break; } @@ -315,6 +323,7 @@ static void CmdEM410xread(char *str) BitStream[bit2idx++] = bit; } +retest: /* We go till 5 before the graph ends because we'll get that far below */ for (i = 1; i < bit2idx - 5; i++) { @@ -327,29 +336,29 @@ static void CmdEM410xread(char *str) /* Read another byte! */ sprintf(id+rows, "%x", (8 * BitStream[i]) + (4 * BitStream[i+1]) + (2 * BitStream[i+2]) + (1 * BitStream[i+3])); rows++; - + /* Keep parity info */ parity[0] ^= BitStream[i]; parity[1] ^= BitStream[i+1]; parity[2] ^= BitStream[i+2]; parity[3] ^= BitStream[i+3]; - + /* Move 4 bits ahead */ i += 4; } - + /* Damn, something wrong! reset */ else { PrintToScrollback("Thought we had a valid tag but failed at word %d (i=%d)", rows + 1, i); - + /* Start back rows * 5 + 9 header bits, -1 to not start at same place */ i -= 9 + (5 * rows) - 5; rows = header = 0; } } - + /* Step 3: Got our 40 bits! confirm column parity */ else if (rows == 10) { @@ -360,34 +369,44 @@ static void CmdEM410xread(char *str) { /* Sweet! */ PrintToScrollback("EM410x Tag ID: %s", id); - + /* Stop any loops */ go = 0; - break; + return; } - + /* Crap! Incorrect parity or no stop bit, start all over */ else { rows = header = 0; - + /* Go back 59 bits (9 header bits + 10 rows at 4+1 parity) */ i -= 59; } } - + /* Step 1: get our header */ else if (header < 9) { /* Need 9 consecutive 1's */ if (BitStream[i] == 1) header++; - + /* We don't have a header, not enough consecutive 1 bits */ else header = 0; } } + + /* if we've already retested after flipping bits, return */ + if (retested++) + return; + + /* if this didn't work, try flipping bits */ + for (i = 0; i < bit2idx; i++) + BitStream[i] ^= 1; + + goto retest; } /* emulate an EM410X tag @@ -402,20 +421,20 @@ static void CmdEM410xsim(char *str) { int i, n, j, h, binary[4], parity[4]; char *s = "0"; - + /* clock is 64 in EM410x tags */ int clock = 64; - + /* clear our graph */ CmdClearGraph(0); - + /* write it out a few times */ for (h = 0; h < 4; h++) { /* write 9 start bits */ for (i = 0; i < 9; i++) CmdAppendGraph(0, clock, 1); - + /* for each hex char */ parity[0] = parity[1] = parity[2] = parity[3] = 0; for (i = 0; i < 10; i++) @@ -424,36 +443,36 @@ static void CmdEM410xsim(char *str) sscanf(&str[i], "%1x", &n); for (j = 3; j >= 0; j--, n/= 2) binary[j] = n % 2; - + /* append each bit */ CmdAppendGraph(0, clock, binary[0]); CmdAppendGraph(0, clock, binary[1]); CmdAppendGraph(0, clock, binary[2]); CmdAppendGraph(0, clock, binary[3]); - + /* append parity bit */ CmdAppendGraph(0, clock, binary[0] ^ binary[1] ^ binary[2] ^ binary[3]); - + /* keep track of column parity */ parity[0] ^= binary[0]; parity[1] ^= binary[1]; parity[2] ^= binary[2]; parity[3] ^= binary[3]; } - + /* parity columns */ CmdAppendGraph(0, clock, parity[0]); CmdAppendGraph(0, clock, parity[1]); CmdAppendGraph(0, clock, parity[2]); CmdAppendGraph(0, clock, parity[3]); - + /* stop bit */ CmdAppendGraph(0, clock, 0); } - + /* modulate that biatch */ Cmdmanchestermod(s); - + /* booyah! */ RepaintGraphWindow(); @@ -463,7 +482,7 @@ static void CmdEM410xsim(char *str) static void ChkBitstream(char *str) { int i; - + /* convert to bitstream if necessary */ for (i = 0; i < (int)(GraphTraceLen / 2); i++) { @@ -479,10 +498,10 @@ static void CmdLosim(char *str) { int i; char *zero = "0"; - + /* convert to bitstream if necessary */ ChkBitstream(str); - + for (i = 0; i < GraphTraceLen; i += 48) { UsbCommand c; int j; @@ -1822,60 +1841,54 @@ static void CmdFlexdemod(char *str) } /* - * Generic command to demodulate ASK. bit length in argument. - * Giving the bit length helps discriminate ripple effects - * upon zero crossing for noisy traces. + * Generic command to demodulate ASK. * - * Second is convention: positive or negative (High mod means zero + * Argument is convention: positive or negative (High mod means zero * or high mod means one) * * Updates the Graph trace with 0/1 values * * Arguments: - * sl : bit length in terms of number of samples per bit - * (use yellow/purple markers to compute). * c : 0 or 1 */ static void Cmdaskdemod(char *str) { int i; - int sign = 1; int n = 0; - int c = 0; - int t1 = 0; + int c,high,low = 0; // TODO: complain if we do not give 2 arguments here ! - sscanf(str, "%i %i", &n, &c); - if (c == 0) { - c = 1 ; - } else { - c = -1; + sscanf(str, "%i", &c); + + /* Detect high and lows and clock */ + for (i = 0; i < GraphTraceLen; i++) + { + if (GraphBuffer[i] > high) + high = GraphBuffer[i]; + else if (GraphBuffer[i] < low) + low = GraphBuffer[i]; } - if (GraphBuffer[0]*c > 0) { - GraphBuffer[0] = 1; + if (GraphBuffer[0] > 0) { + GraphBuffer[0] = 1-c; } else { - GraphBuffer[0] = 0; + GraphBuffer[0] = c; } for(i=1;i n/4 ) { - sign = -sign; - t1=i; - if (GraphBuffer[i]*c > 0){ - GraphBuffer[i]=1; - } else { - GraphBuffer[i]=0; - } - } else { - /* This is a ripple, set the current sample value - to the same as previous */ - GraphBuffer[i] = GraphBuffer[i-1]; - } + /* Transitions are detected at each peak + * Transitions are either: + * - we're low: transition if we hit a high + * - we're high: transition if we hit a low + * (we need to do it this way because some tags keep high or + * low for long periods, others just reach the peak and go + * down) + */ + if ((GraphBuffer[i]==high) && (GraphBuffer[i-1] == c)) { + GraphBuffer[i]=1-c; + } else if ((GraphBuffer[i]==low) && (GraphBuffer[i-1] == (1-c))){ + GraphBuffer[i] = c; } else { + /* No transition */ GraphBuffer[i] = GraphBuffer[i-1]; } } @@ -1917,7 +1930,7 @@ int detectclock(int peak) lastpeak = i; } } - + return clock; } @@ -1925,7 +1938,7 @@ int detectclock(int peak) int GetClock(char *str, int peak) { int clock; - + sscanf(str, "%i", &clock); if (!strcmp(str, "")) clock = 0; @@ -1934,12 +1947,12 @@ int GetClock(char *str, int peak) if (!clock) { clock = detectclock(peak); - + /* Only print this message if we're not looping something */ if (!go) PrintToScrollback("Auto-detected clock rate: %d", clock); } - + return clock; } @@ -1966,16 +1979,16 @@ static void Cmdbitstream(char *str) { /* Get our clock */ clock = GetClock(str, high); - + gtl = CmdClearGraph(0); - + bit = 0; for (i = 0; i < (int)(gtl / clock); i++) { hithigh = 0; hitlow = 0; first = 1; - + /* Find out if we hit both high and low peaks */ for (j = 0; j < clock; j++) { @@ -1983,18 +1996,18 @@ static void Cmdbitstream(char *str) { hithigh = 1; else if (GraphBuffer[(i * clock) + j] == low) hitlow = 1; - + /* it doesn't count if it's the first part of our read because it's really just trailing from the last sequence */ if (first && (hithigh || hitlow)) hithigh = hitlow = 0; else first = 0; - + if (hithigh && hitlow) break; } - + /* If we didn't hit both high and low peaks, we had a bit transition */ if (!hithigh || !hitlow) bit ^= 1; @@ -2015,7 +2028,7 @@ static void Cmdmanchestermod(char *str) int i, j; int clock; int bit, lastbit, wave; - + /* Get our clock */ clock = GetClock(str, 0); @@ -2024,17 +2037,17 @@ static void Cmdmanchestermod(char *str) for (i = 0; i < (int)(GraphTraceLen / clock); i++) { bit = GraphBuffer[i * clock] ^ 1; - + for (j = 0; j < (int)(clock/2); j++) GraphBuffer[(i * clock) + j] = bit ^ lastbit ^ wave; for (j = (int)(clock/2); j < clock; j++) GraphBuffer[(i * clock) + j] = bit ^ lastbit ^ wave ^ 1; - + /* Keep track of how we start our wave and if we changed or not this time */ wave ^= bit ^ lastbit; lastbit = bit; } - + RepaintGraphWindow(); } @@ -2052,7 +2065,7 @@ static void Cmdmanchestermod(char *str) * Typical values can be 64, 32, 128... */ static void Cmdmanchesterdemod(char *str) { - int i, j; + int i, j, invert= 0; int bit; int clock; int lastval; @@ -2064,6 +2077,16 @@ static void Cmdmanchesterdemod(char *str) { int bit2idx = 0; int warnings = 0; + /* check if we're inverting output */ + if(*str == 'i') + { + PrintToScrollback("Inverting output"); + invert= 1; + do + ++str; + while(*str == ' '); // in case a 2nd argument was given + } + /* Holds the decoded bitstream: each clock period contains 2 bits */ /* later simplified to 1 bit after manchester decoding. */ /* Add 10 bits to allow for noisy / uncertain traces without aborting */ @@ -2084,9 +2107,9 @@ static void Cmdmanchesterdemod(char *str) { /* Get our clock */ clock = GetClock(str, high); - + int tolerance = clock/4; - + /* Detect first transition */ /* Lo-Hi (arbitrary) */ for (i = 0; i < GraphTraceLen; i++) @@ -2101,8 +2124,11 @@ static void Cmdmanchesterdemod(char *str) { /* If we're not working with 1/0s, demod based off clock */ if (high != 1) { - bit = 0; - for (i = 0; i < (int)(GraphTraceLen / clock); i++) + bit = 0; /* We assume the 1st bit is zero, it may not be + * the case: this routine (I think) has an init problem. + * Ed. + */ + for (; i < (int)(GraphTraceLen / clock); i++) { hithigh = 0; hitlow = 0; @@ -2131,7 +2157,7 @@ static void Cmdmanchesterdemod(char *str) { if (!hithigh || !hitlow) bit ^= 1; - BitStream[bit2idx++] = bit; + BitStream[bit2idx++] = bit ^ invert; } } @@ -2139,7 +2165,7 @@ static void Cmdmanchesterdemod(char *str) { else { - /* Then detect duration between 2 successive transitions */ + /* Then detect duration between 2 successive transitions */ for (bitidx = 1; i < GraphTraceLen; i++) { if (GraphBuffer[i-1] != GraphBuffer[i]) @@ -2174,18 +2200,18 @@ static void Cmdmanchesterdemod(char *str) { PrintToScrollback("Error: too many detection errors, aborting."); return; } + } } } - } - // At this stage, we now have a bitstream of "01" ("1") or "10" ("0"), parse it into final decoded bitstream - // Actually, we overwrite BitStream with the new decoded bitstream, we just need to be careful - // to stop output at the final bitidx2 value, not bitidx - for (i = 0; i < bitidx; i += 2) { - if ((BitStream[i] == 0) && (BitStream[i+1] == 1)) { - BitStream[bit2idx++] = 1; + // At this stage, we now have a bitstream of "01" ("1") or "10" ("0"), parse it into final decoded bitstream + // Actually, we overwrite BitStream with the new decoded bitstream, we just need to be careful + // to stop output at the final bitidx2 value, not bitidx + for (i = 0; i < bitidx; i += 2) { + if ((BitStream[i] == 0) && (BitStream[i+1] == 1)) { + BitStream[bit2idx++] = 1 ^ invert; } else if ((BitStream[i] == 1) && (BitStream[i+1] == 0)) { - BitStream[bit2idx++] = 0; + BitStream[bit2idx++] = 0 ^ invert; } else { // We cannot end up in this state, this means we are unsynchronized, // move up 1 bit: @@ -2199,8 +2225,8 @@ static void Cmdmanchesterdemod(char *str) { PrintToScrollback("Error: too many decode errors, aborting."); return; } - } - } + } + } } PrintToScrollback("Manchester decoded bitstream"); @@ -2376,72 +2402,75 @@ static void CmdSweepLF(char *str) typedef void HandlerFunction(char *cmdline); +/* in alphabetic order */ static struct { char *name; HandlerFunction *handler; int offline; // 1 if the command can be used when in offline mode char *docString; } CommandTable[] = { - "tune", CmdTune,0, "measure antenna tuning", - "tiread", CmdTiread,0, "read a TI-type 134 kHz tag", - "tibits", CmdTibits,0, "get raw bits for TI-type LF tag", - "tidemod", CmdTidemod,0, "demod raw bits for TI-type LF tag", - "vchdemod", CmdVchdemod,0, "demod samples for VeriChip", - "plot", CmdPlot,1, "show graph window", - "hide", CmdHide,1, "hide graph window", - "losim", CmdLosim,0, "simulate LF tag", - "em410xsim", CmdEM410xsim,1, "simulate EM410x tag", - "em410xread", CmdEM410xread,1, "extract ID from EM410x tag", - "em410xwatch", CmdEM410xwatch,0, "watches for EM410x tags", - "loread", CmdLoread,0, "read (125/134 kHz) LF ID-only tag", - "losamples", CmdLosamples,0, "get raw samples for LF tag", - "hisamples", CmdHisamples,0, "get raw samples for HF tag", - "hisampless", CmdHisampless,0, "get signed raw samples, HF tag", - "hisamplest", CmdHi14readt,0, "get samples HF, for testing", - "higet", CmdHi14read_sim,0, "get samples HF, 'analog'", - "bitsamples", CmdBitsamples,0, "get raw samples as bitstring", - "hexsamples", CmdHexsamples,0, "dump big buffer as hex bytes", - "hi15read", CmdHi15read,0, "read HF tag (ISO 15693)", - "hi15reader", CmdHi15reader,0, "act like an ISO15693 reader", // new command greg - "hi15sim", CmdHi15tag,0, "fake an ISO15693 tag", // new command greg - "hi14read", CmdHi14read,0, "read HF tag (ISO 14443)", - "sri512read", CmdSri512read,0, "Read contents of a SRI512 tag", - "hi14areader", CmdHi14areader,0, "act like an ISO14443 Type A reader", // ## New reader command - "hi15demod", CmdHi15demod,1, "demod ISO15693 from tag", - "hi14bdemod", CmdHi14bdemod,1, "demod ISO14443 Type B from tag", - "autocorr", CmdAutoCorr,1, "autocorrelation over window", - "norm", CmdNorm,1, "normalize max/min to +/-500", - "dec", CmdDec,1, "decimate", - "hpf", CmdHpf,1, "remove DC offset from trace", - "zerocrossings", CmdZerocrossings,1, "count time between zero-crossings", - "ltrim", CmdLtrim,1, "trim from left of trace", - "scale", CmdScale,1, "set cursor display scale", - "flexdemod", CmdFlexdemod,1, "demod samples for FlexPass", - "save", CmdSave,1, "save trace (from graph window)", - "load", CmdLoad,1, "load trace (to graph window", - "hisimlisten", CmdHisimlisten,0, "get HF samples as fake tag", - "hi14sim", CmdHi14sim,0, "fake ISO 14443 tag", - "hi14asim", CmdHi14asim,0, "fake ISO 14443a tag", // ## Simulate 14443a tag - "hi14snoop", CmdHi14snoop,0, "eavesdrop ISO 14443", - "hi14asnoop", CmdHi14asnoop,0, "eavesdrop ISO 14443 Type A", // ## New snoop command - "hi14list", CmdHi14list,0, "list ISO 14443 history", - "hi14alist", CmdHi14alist,0, "list ISO 14443a history", // ## New list command - "hiddemod", CmdHiddemod,1, "HID Prox Card II (not optimal)", - "hidfskdemod", CmdHIDdemodFSK,0, "HID FSK demodulator", - "indalademod", CmdIndalademod,0, "demod samples for Indala", - "askdemod", Cmdaskdemod,1, "Attempt to demodulate simple ASK tags", - "bitstream", Cmdbitstream,1, "Convert waveform into a bitstream", - "hidsimtag", CmdHIDsimTAG,0, "HID tag simulator", - "mandemod", Cmdmanchesterdemod,1, "Try a Manchester demodulation on a binary stream", - "manmod", Cmdmanchestermod,1, "Manchester modulate a binary stream", - "detectclock", Cmddetectclockrate,1, "Detect clock rate", - "fpgaoff", CmdFPGAOff,0, "set FPGA off", // ## FPGA Control - "lcdreset", CmdLcdReset,0, "Hardware reset LCD", - "lcd", CmdLcd,0, "Send command/data to LCD", - "setlfdivisor", CmdSetDivisor,0, "Drive LF antenna at 12Mhz/(divisor+1)", - "sweeplf", CmdSweepLF,0, "Sweep through LF freq range and store results in buffer", - "reset", CmdReset,0, "Reset the Proxmark3", - "quit", CmdQuit,1, "quit program" + "askdemod", Cmdaskdemod,1, " <0|1> -- Attempt to demodulate simple ASK tags", + "autocorr", CmdAutoCorr,1, " -- Autocorrelation over window", + "bitsamples", CmdBitsamples,0, " Get raw samples as bitstring", + "bitstream", Cmdbitstream,1, "[clock rate] -- Convert waveform into a bitstream", + "buffclear", CmdBuffClear,0, " Clear sample buffer and graph window", + "dec", CmdDec,1, " Decimate samples", + "detectclock", Cmddetectclockrate,1, " Detect clock rate", + "em410xsim", CmdEM410xsim,1, " -- Simulate EM410x tag", + "em410xread", CmdEM410xread,1, "[clock rate] -- Extract ID from EM410x tag", + "em410xwatch", CmdEM410xwatch,0, " Watches for EM410x tags", + "exit", CmdQuit,1, " Exit program", + "flexdemod", CmdFlexdemod,1, " Demodulate samples for FlexPass", + "fpgaoff", CmdFPGAOff,0, " Set FPGA off", // ## FPGA Control + "hexsamples", CmdHexsamples,0, " -- Dump big buffer as hex bytes", + "hi14alist", CmdHi14alist,0, " List ISO 14443a history", // ## New list command + "hi14areader", CmdHi14areader,0, " Act like an ISO14443 Type A reader", // ## New reader command + "hi14asim", CmdHi14asim,0, " -- Fake ISO 14443a tag", // ## Simulate 14443a tag + "hi14asnoop", CmdHi14asnoop,0, " Eavesdrop ISO 14443 Type A", // ## New snoop command + "hi14bdemod", CmdHi14bdemod,1, " Demodulate ISO14443 Type B from tag", + "hi14list", CmdHi14list,0, " List ISO 14443 history", + "hi14read", CmdHi14read,0, " Read HF tag (ISO 14443)", + "hi14sim", CmdHi14sim,0, " Fake ISO 14443 tag", + "hi14snoop", CmdHi14snoop,0, " Eavesdrop ISO 14443", + "hi15demod", CmdHi15demod,1, " Demodulate ISO15693 from tag", + "hi15read", CmdHi15read,0, " Read HF tag (ISO 15693)", + "hi15reader", CmdHi15reader,0, " Act like an ISO15693 reader", // new command greg + "hi15sim", CmdHi15tag,0, " Fake an ISO15693 tag", // new command greg + "hiddemod", CmdHiddemod,1, " Demodulate HID Prox Card II (not optimal)", + "hide", CmdHide,1, " Hide graph window", + "hidfskdemod", CmdHIDdemodFSK,0, " Realtime HID FSK demodulator", + "hidsimtag", CmdHIDsimTAG,0, " -- HID tag simulator", + "higet", CmdHi14read_sim,0, " -- Get samples HF, 'analog'", + "hisamples", CmdHisamples,0, " Get raw samples for HF tag", + "hisampless", CmdHisampless,0, " -- Get signed raw samples, HF tag", + "hisamplest", CmdHi14readt,0, " Get samples HF, for testing", + "hisimlisten", CmdHisimlisten,0, " Get HF samples as fake tag", + "hpf", CmdHpf,1, " Remove DC offset from trace", + "indalademod", CmdIndalademod,0, "['224'] -- Demodulate samples for Indala", + "lcd", CmdLcd,0, " -- Send command/data to LCD", + "lcdreset", CmdLcdReset,0, " Hardware reset LCD", + "load", CmdLoad,1, " -- Load trace (to graph window", + "loread", CmdLoread,0, "['h'] -- Read 125/134 kHz LF ID-only tag (option 'h' for 134)", + "losamples", CmdLosamples,0, "[128 - 16000] -- Get raw samples for LF tag", + "losim", CmdLosim,0, " Simulate LF tag", + "ltrim", CmdLtrim,1, " -- Trim samples from left of trace", + "mandemod", Cmdmanchesterdemod,1, "[i] [clock rate] -- Manchester demodulate binary stream (option 'i' to invert output)", + "manmod", Cmdmanchestermod,1, "[clock rate] -- Manchester modulate a binary stream", + "norm", CmdNorm,1, " Normalize max/min to +/-500", + "plot", CmdPlot,1, " Show graph window", + "quit", CmdQuit,1, " Quit program", + "reset", CmdReset,0, " Reset the Proxmark3", + "save", CmdSave,1, " -- Save trace (from graph window)", + "scale", CmdScale,1, " -- Set cursor display scale", + "setlfdivisor", CmdSetDivisor,0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)", + "sri512read", CmdSri512read,0, " -- Read contents of a SRI512 tag", + "sweeplf", CmdSweepLF,0, " Sweep through LF freq range and store results in buffer", + "tibits", CmdTibits,0, " Get raw bits for TI-type LF tag", + "tidemod", CmdTidemod,0, " Demodulate raw bits for TI-type LF tag", + "tiread", CmdTiread,0, " Read a TI-type 134 kHz tag", + "tune", CmdTune,0, " Measure antenna tuning", + "vchdemod", CmdVchdemod,0, "['clone'] -- Demodulate samples for VeriChip", + "zerocrossings", CmdZerocrossings,1, " Count time between zero-crossings", };