mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-07-12 00:06:09 -07:00
Some new commands (threshold and fskdemod) that act on the graph window
This commit is contained in:
parent
48f8a3d60d
commit
67853904cc
2 changed files with 227 additions and 89 deletions
|
@ -214,7 +214,7 @@ void ModThenAcquireRawAdcSamples125k(int delay_off,int period_0,int period_1,BYT
|
||||||
void AcquireTiType(void)
|
void AcquireTiType(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int n = 4000;
|
int n = sizeof(BigBuf);
|
||||||
|
|
||||||
// clear buffer
|
// clear buffer
|
||||||
memset(BigBuf,0,sizeof(BigBuf));
|
memset(BigBuf,0,sizeof(BigBuf));
|
||||||
|
|
|
@ -795,7 +795,6 @@ static void CmdHisamples(char *str)
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int CmdHisamplest(char *str, int nrlow)
|
static int CmdHisamplest(char *str, int nrlow)
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
@ -1406,7 +1405,8 @@ static void CmdTibits(char *str)
|
||||||
{
|
{
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < 1536; i += 12) {
|
// for(i = 0; i < 1536; i += 12) {
|
||||||
|
for(i = 0; i < 4000; i += 12) {
|
||||||
UsbCommand c;
|
UsbCommand c;
|
||||||
c.cmd = CMD_DOWNLOAD_RAW_BITS_TI_TYPE;
|
c.cmd = CMD_DOWNLOAD_RAW_BITS_TI_TYPE;
|
||||||
c.ext1 = i;
|
c.ext1 = i;
|
||||||
|
@ -1428,10 +1428,131 @@ static void CmdTibits(char *str)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
GraphTraceLen = 1536*32;
|
// GraphTraceLen = 1536*32;
|
||||||
|
GraphTraceLen = 4000*32;
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void CmdFSKdemod(char *cmdline)
|
||||||
|
{
|
||||||
|
static const int LowTone[] = {
|
||||||
|
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, -1, -1, -1, -1, -1
|
||||||
|
};
|
||||||
|
static const int HighTone[] = {
|
||||||
|
1, 1, 1, 1, 1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, -1, -1, -1, -1, -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
int convLen = max(arraylen(HighTone), arraylen(LowTone));
|
||||||
|
DWORD hi = 0, lo = 0;
|
||||||
|
|
||||||
|
int i, j;
|
||||||
|
int minMark=0, maxMark=0;
|
||||||
|
int lowLen = arraylen(LowTone);
|
||||||
|
int highLen = arraylen(HighTone);
|
||||||
|
|
||||||
|
for(i = 0; i < GraphTraceLen - convLen; i++) {
|
||||||
|
int lowSum = 0, highSum = 0;
|
||||||
|
|
||||||
|
for(j = 0; j < lowLen; j++) {
|
||||||
|
lowSum += LowTone[j]*GraphBuffer[i+j];
|
||||||
|
}
|
||||||
|
for(j = 0; j < highLen; j++) {
|
||||||
|
highSum += HighTone[j]*GraphBuffer[i+j];
|
||||||
|
}
|
||||||
|
lowSum = abs((100*lowSum) / lowLen);
|
||||||
|
highSum = abs((100*highSum) / highLen);
|
||||||
|
GraphBuffer[i] = (highSum << 16) | lowSum;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < GraphTraceLen - convLen - 16; i++) {
|
||||||
|
int j;
|
||||||
|
int lowTot = 0, highTot = 0;
|
||||||
|
// 10 and 8 are f_s divided by f_l and f_h, rounded
|
||||||
|
for(j = 0; j < 10; j++) {
|
||||||
|
lowTot += (GraphBuffer[i+j] & 0xffff);
|
||||||
|
}
|
||||||
|
for(j = 0; j < 8; j++) {
|
||||||
|
highTot += (GraphBuffer[i+j] >> 16);
|
||||||
|
}
|
||||||
|
GraphBuffer[i] = lowTot - highTot;
|
||||||
|
if (GraphBuffer[i]>maxMark) maxMark=GraphBuffer[i];
|
||||||
|
if (GraphBuffer[i]<minMark) minMark=GraphBuffer[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
GraphTraceLen -= (convLen + 16);
|
||||||
|
|
||||||
|
RepaintGraphWindow();
|
||||||
|
|
||||||
|
// Find bit-sync (3 lo followed by 3 high)
|
||||||
|
int max = 0, maxPos = 0;
|
||||||
|
for(i = 0; i < 6000; i++) {
|
||||||
|
int dec = 0;
|
||||||
|
for(j = 0; j < 3*arraylen(LowTone); j++) {
|
||||||
|
dec -= GraphBuffer[i+j];
|
||||||
|
}
|
||||||
|
for(; j < 3*(arraylen(LowTone) + arraylen(HighTone) ); j++) {
|
||||||
|
dec += GraphBuffer[i+j];
|
||||||
|
}
|
||||||
|
if(dec > max) {
|
||||||
|
max = dec;
|
||||||
|
maxPos = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// place start of bit sync marker in graph
|
||||||
|
GraphBuffer[maxPos] = maxMark;
|
||||||
|
GraphBuffer[maxPos+1] = minMark;
|
||||||
|
|
||||||
|
maxPos += j;
|
||||||
|
|
||||||
|
// place end of bit sync marker in graph
|
||||||
|
GraphBuffer[maxPos] = maxMark;
|
||||||
|
GraphBuffer[maxPos+1] = minMark;
|
||||||
|
|
||||||
|
PrintToScrollback("actual data bits start at sample %d", maxPos);
|
||||||
|
PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
|
||||||
|
|
||||||
|
BYTE bits[46];
|
||||||
|
bits[sizeof(bits)-1] = '\0';
|
||||||
|
|
||||||
|
// find bit pairs and manchester decode them
|
||||||
|
for(i = 0; i < arraylen(bits)-1; i++) {
|
||||||
|
int dec = 0;
|
||||||
|
for(j = 0; j < arraylen(LowTone); j++) {
|
||||||
|
dec -= GraphBuffer[maxPos+j];
|
||||||
|
}
|
||||||
|
for(; j < arraylen(LowTone) + arraylen(HighTone); j++) {
|
||||||
|
dec += GraphBuffer[maxPos+j];
|
||||||
|
}
|
||||||
|
maxPos += j;
|
||||||
|
// place inter bit marker in graph
|
||||||
|
GraphBuffer[maxPos] = maxMark;
|
||||||
|
GraphBuffer[maxPos+1] = minMark;
|
||||||
|
|
||||||
|
// hi and lo form a 64 bit pair
|
||||||
|
hi = (hi<<1)|(lo>>31);
|
||||||
|
lo = (lo<<1);
|
||||||
|
// store decoded bit as binary (in hi/lo) and text (in bits[])
|
||||||
|
if(dec<0) {
|
||||||
|
bits[i] = '1';
|
||||||
|
lo|=1;
|
||||||
|
} else {
|
||||||
|
bits[i] = '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PrintToScrollback("bits: '%s'", bits);
|
||||||
|
PrintToScrollback("hex: %08x %08x", hi, lo);
|
||||||
|
}
|
||||||
|
|
||||||
static void CmdTidemod(char *cmdline)
|
static void CmdTidemod(char *cmdline)
|
||||||
{
|
{
|
||||||
/* MATLAB as follows:
|
/* MATLAB as follows:
|
||||||
|
@ -1449,35 +1570,41 @@ l = sign(sin(cumsum(l)));
|
||||||
h = sign(sin(cumsum(h)));
|
h = sign(sin(cumsum(h)));
|
||||||
*/
|
*/
|
||||||
static const int LowTone[] = {
|
static const int LowTone[] = {
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1,
|
||||||
};
|
};
|
||||||
static const int HighTone[] = {
|
static const int HighTone[] = {
|
||||||
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1,
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
-1, -1, 1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1,
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||||
|
1, 1, 1, 1, 1, 1, 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
int convLen = max(arraylen(HighTone), arraylen(LowTone));
|
int convLen = max(arraylen(HighTone), arraylen(LowTone));
|
||||||
|
@ -1550,9 +1677,6 @@ h = sign(sin(cumsum(h)));
|
||||||
|
|
||||||
PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
|
PrintToScrollback("length %d/%d", arraylen(HighTone), arraylen(LowTone));
|
||||||
|
|
||||||
GraphBuffer[maxPos] = 800;
|
|
||||||
GraphBuffer[maxPos+1] = -800;
|
|
||||||
|
|
||||||
BYTE bits[64+16+8+1];
|
BYTE bits[64+16+8+1];
|
||||||
bits[sizeof(bits)-1] = '\0';
|
bits[sizeof(bits)-1] = '\0';
|
||||||
|
|
||||||
|
@ -1667,6 +1791,20 @@ static void CmdZerocrossings(char *str)
|
||||||
RepaintGraphWindow();
|
RepaintGraphWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void CmdThreshold(char *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int threshold = atoi(str);
|
||||||
|
|
||||||
|
for(i = 0; i < GraphTraceLen; i++) {
|
||||||
|
if(GraphBuffer[i]>= threshold)
|
||||||
|
GraphBuffer[i]=127;
|
||||||
|
else
|
||||||
|
GraphBuffer[i]=-128;
|
||||||
|
}
|
||||||
|
RepaintGraphWindow();
|
||||||
|
}
|
||||||
|
|
||||||
static void CmdLtrim(char *str)
|
static void CmdLtrim(char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -2423,8 +2561,6 @@ static void Cmdmanchesterdemod(char *str) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Usage ???
|
* Usage ???
|
||||||
*/
|
*/
|
||||||
|
@ -2595,6 +2731,7 @@ static struct {
|
||||||
{"exit", CmdQuit,1, " Exit program"},
|
{"exit", CmdQuit,1, " Exit program"},
|
||||||
{"flexdemod", CmdFlexdemod,1, " Demodulate samples for FlexPass"},
|
{"flexdemod", CmdFlexdemod,1, " Demodulate samples for FlexPass"},
|
||||||
{"fpgaoff", CmdFPGAOff,0, " Set FPGA off"}, // ## FPGA Control
|
{"fpgaoff", CmdFPGAOff,0, " Set FPGA off"}, // ## FPGA Control
|
||||||
|
{"fskdemod", CmdFSKdemod,1, " Demodulate graph window as a HID FSK"},
|
||||||
{"hexsamples", CmdHexsamples,0, "<blocks> -- Dump big buffer as hex bytes"},
|
{"hexsamples", CmdHexsamples,0, "<blocks> -- Dump big buffer as hex bytes"},
|
||||||
{"hi14alist", CmdHi14alist,0, " List ISO 14443a history"}, // ## New list command
|
{"hi14alist", CmdHi14alist,0, " List ISO 14443a history"}, // ## New list command
|
||||||
{"hi14areader", CmdHi14areader,0, " Act like an ISO14443 Type A reader"}, // ## New reader command
|
{"hi14areader", CmdHi14areader,0, " Act like an ISO14443 Type A reader"}, // ## New reader command
|
||||||
|
@ -2640,8 +2777,9 @@ static struct {
|
||||||
{"setlfdivisor", CmdSetDivisor,0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
|
{"setlfdivisor", CmdSetDivisor,0, "<19 - 255> -- Drive LF antenna at 12Mhz/(divisor+1)"},
|
||||||
{"sri512read", CmdSri512read,0, "<int> -- Read contents of a SRI512 tag"},
|
{"sri512read", CmdSri512read,0, "<int> -- Read contents of a SRI512 tag"},
|
||||||
{"tibits", CmdTibits,0, " Get raw bits for TI-type LF tag"},
|
{"tibits", CmdTibits,0, " Get raw bits for TI-type LF tag"},
|
||||||
{"tidemod", CmdTidemod,0, " Demodulate raw bits for TI-type LF tag"},
|
{"tidemod", CmdTidemod,1, " Demodulate raw bits for TI-type LF tag"},
|
||||||
{"tiread", CmdTiread,0, " Read a TI-type 134 kHz tag"},
|
{"tiread", CmdTiread,0, " Read a TI-type 134 kHz tag"},
|
||||||
|
{"threshold", CmdThreshold,1, " Maximize/minimize every value in the graph window depending on threshold"},
|
||||||
{"tune", CmdTune,0, " Measure antenna tuning"},
|
{"tune", CmdTune,0, " Measure antenna tuning"},
|
||||||
{"vchdemod", CmdVchdemod,0, "['clone'] -- Demodulate samples for VeriChip"},
|
{"vchdemod", CmdVchdemod,0, "['clone'] -- Demodulate samples for VeriChip"},
|
||||||
{"zerocrossings", CmdZerocrossings,1, " Count time between zero-crossings"},
|
{"zerocrossings", CmdZerocrossings,1, " Count time between zero-crossings"},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue