mirror of
https://github.com/Proxmark/proxmark3.git
synced 2025-08-14 10:36:58 -07:00
Added LF frequency adjustments from d18c7db, cleaned up code,
typo fixes in iso14443a code, added the missing "tools" directory, added initial elements for online/offline detection for commands.
This commit is contained in:
parent
974ba9a205
commit
30f2a7d38f
16 changed files with 10914 additions and 161 deletions
|
@ -1598,6 +1598,7 @@ static void Cmdaskdemod(char *str) {
|
|||
* routine, feel free to improve...
|
||||
*
|
||||
* 1st argument: clock rate (as number of samples per clock rate)
|
||||
* Typical values can be 64, 32, 128...
|
||||
*/
|
||||
static void Cmdmanchesterdemod(char *str) {
|
||||
int i;
|
||||
|
@ -1605,18 +1606,23 @@ static void Cmdmanchesterdemod(char *str) {
|
|||
int lastval;
|
||||
int lc = 0;
|
||||
int bitidx = 0;
|
||||
int bitidx2;
|
||||
int bit2idx = 0;
|
||||
|
||||
|
||||
sscanf(str, "%i", &clock);
|
||||
|
||||
int tolerance = clock/4;
|
||||
/* Holds the decoded bitstream. */
|
||||
int BitStream[MAX_GRAPH_TRACE_LEN*2];
|
||||
int BitStream2[MAX_GRAPH_TRACE_LEN];
|
||||
/* 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 */
|
||||
/* int BitStream[GraphTraceLen*2/clock+10]; */
|
||||
|
||||
/* But it does not work if compiling on WIndows: therefore we just allocate a */
|
||||
/* large array */
|
||||
int BitStream[MAX_GRAPH_TRACE_LEN];
|
||||
|
||||
/* Detect first transition */
|
||||
/* Lo-Hi (arbitrary) */
|
||||
/* Lo-Hi (arbitrary) */
|
||||
for(i=1;i<GraphTraceLen;i++) {
|
||||
if (GraphBuffer[i-1]<GraphBuffer[i]) {
|
||||
lastval = i;
|
||||
|
@ -1626,18 +1632,24 @@ static void Cmdmanchesterdemod(char *str) {
|
|||
}
|
||||
|
||||
/* Then detect duration between 2 successive transitions */
|
||||
/* At this stage, GraphTrace is either 0 or 1 */
|
||||
for(bitidx = 1 ;i<GraphTraceLen;i++) {
|
||||
if (GraphBuffer[i-1] != GraphBuffer[i]) {
|
||||
lc = i-lastval;
|
||||
lastval = i;
|
||||
// Error check: if bitidx becomes too large, we do not
|
||||
// have a Manchester encoded bitstream or the clock is really
|
||||
// wrong!
|
||||
if (bitidx > (GraphTraceLen*2/clock+8) ) {
|
||||
PrintToScrollback("Error: the clock you gave is probably wrong, aborting.");
|
||||
return;
|
||||
}
|
||||
// Then switch depending on lc length:
|
||||
// Tolerance is 1/4 of clock rate (arbitrary)
|
||||
if ((lc-clock/2) < tolerance) {
|
||||
// Short pulse
|
||||
if (abs(lc-clock/2) < tolerance) {
|
||||
// Short pulse : either "1" or "0"
|
||||
BitStream[bitidx++]=GraphBuffer[i-1];
|
||||
} else if ((lc-clock) < tolerance) {
|
||||
// Long pulse
|
||||
} else if (abs(lc-clock) < tolerance) {
|
||||
// Long pulse: either "11" or "00"
|
||||
BitStream[bitidx++]=GraphBuffer[i-1];
|
||||
BitStream[bitidx++]=GraphBuffer[i-1];
|
||||
} else {
|
||||
|
@ -1649,39 +1661,41 @@ static void Cmdmanchesterdemod(char *str) {
|
|||
}
|
||||
|
||||
// At this stage, we now have a bitstream of "01" ("1") or "10" ("0"), parse it into final decoded bitstream
|
||||
for (bitidx2 = 0; bitidx2<bitidx; bitidx2 += 2) {
|
||||
if ((BitStream[bitidx2] == 0) && (BitStream[bitidx2+1] == 1)) {
|
||||
BitStream2[bitidx2/2] = 1;
|
||||
} else if ((BitStream[bitidx2] == 1) && (BitStream[bitidx2+1] == 0)) {
|
||||
BitStream2[bitidx2/2] = 0;
|
||||
// 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;
|
||||
} else if ((BitStream[i] == 1) && (BitStream[i+1] == 0)) {
|
||||
BitStream[bit2idx++] = 0;
|
||||
} else {
|
||||
// We cannot end up in this state, this means we are unsynchronized,
|
||||
// move up 1 bit:
|
||||
bitidx2++;
|
||||
i++;
|
||||
PrintToScrollback("Unsynchronized, resync...");
|
||||
PrintToScrollback("(too many of those messages mean the stream is not Manchester encoded)");
|
||||
}
|
||||
}
|
||||
PrintToScrollback("Manchester decoded bitstream \n---------");
|
||||
// Now output the bitstream to the scrollback by line of 16 bits
|
||||
for (i = 0; i<bitidx/2; i+=16) {
|
||||
for (i = 0; i < (bit2idx-16); i+=16) {
|
||||
PrintToScrollback("%i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i",
|
||||
BitStream2[i],
|
||||
BitStream2[i+1],
|
||||
BitStream2[i+2],
|
||||
BitStream2[i+3],
|
||||
BitStream2[i+4],
|
||||
BitStream2[i+5],
|
||||
BitStream2[i+6],
|
||||
BitStream2[i+7],
|
||||
BitStream2[i+8],
|
||||
BitStream2[i+9],
|
||||
BitStream2[i+10],
|
||||
BitStream2[i+11],
|
||||
BitStream2[i+12],
|
||||
BitStream2[i+13],
|
||||
BitStream2[i+14],
|
||||
BitStream2[i+15]);
|
||||
BitStream[i],
|
||||
BitStream[i+1],
|
||||
BitStream[i+2],
|
||||
BitStream[i+3],
|
||||
BitStream[i+4],
|
||||
BitStream[i+5],
|
||||
BitStream[i+6],
|
||||
BitStream[i+7],
|
||||
BitStream[i+8],
|
||||
BitStream[i+9],
|
||||
BitStream[i+10],
|
||||
BitStream[i+11],
|
||||
BitStream[i+12],
|
||||
BitStream[i+13],
|
||||
BitStream[i+14],
|
||||
BitStream[i+15]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1805,6 +1819,32 @@ static void CmdLcd(char *str)
|
|||
static void CmdTest(char *str)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets the divisor for LF frequency clock: lets the user choose any LF frequency below
|
||||
* 600kHz.
|
||||
*/
|
||||
static void CmdSetDivisor(char *str)
|
||||
{
|
||||
UsbCommand c;
|
||||
c.cmd = CMD_SET_LF_DIVISOR;
|
||||
c.ext1 = atoi(str);
|
||||
if (( c.ext1<0) || (c.ext1>255)) {
|
||||
PrintToScrollback("divisor must be between 19 and 255");
|
||||
} else {
|
||||
SendCommand(&c, FALSE);
|
||||
PrintToScrollback("Divisor set, expected freq=%dHz", 12000000/(c.ext1+1));
|
||||
}
|
||||
}
|
||||
|
||||
static void CmdSweepLF(char *str)
|
||||
{
|
||||
UsbCommand c;
|
||||
c.cmd = CMD_SWEEP_LF;
|
||||
SendCommand(&c, FALSE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
typedef void HandlerFunction(char *cmdline);
|
||||
|
||||
|
@ -1863,6 +1903,8 @@ static struct {
|
|||
"lcdreset", CmdLcdReset, "Hardware reset LCD",
|
||||
"lcd", CmdLcd, "Send command/data to LCD",
|
||||
"test", CmdTest, "Placeholder command for testing new code",
|
||||
"setlfdivisor", CmdSetDivisor, "Drive LF antenna at 12Mhz/(divisor+1)",
|
||||
"sweeplf", CmdSweepLF, "Sweep through LF freq range and store results in buffer",
|
||||
"quit", CmdQuit, "quit program"
|
||||
};
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ void ExecCmd(char *cmd)
|
|||
|
||||
}
|
||||
int CommandFinished;
|
||||
int offset = 64;
|
||||
|
||||
static void ResizeCommandWindow(void)
|
||||
{
|
||||
|
@ -122,8 +123,8 @@ static void PaintGraph(HDC hdc)
|
|||
|
||||
SelectObject(hdc, WhitePen);
|
||||
|
||||
MoveToEx(hdc, r.left + 40, r.top, NULL);
|
||||
LineTo(hdc, r.left + 40, r.bottom);
|
||||
MoveToEx(hdc, r.left + offset, r.top, NULL);
|
||||
LineTo(hdc, r.left + offset, r.bottom);
|
||||
|
||||
int zeroHeight = r.top + (r.bottom - r.top) / 2;
|
||||
SelectObject(hdc, GreyPen);
|
||||
|
@ -131,7 +132,7 @@ static void PaintGraph(HDC hdc)
|
|||
LineTo(hdc, r.right, zeroHeight);
|
||||
|
||||
int startMax =
|
||||
(GraphTraceLen - (int)((r.right - r.left - 40) / GraphPixelsPerPoint));
|
||||
(GraphTraceLen - (int)((r.right - r.left - offset) / GraphPixelsPerPoint));
|
||||
if(startMax < 0) {
|
||||
startMax = 0;
|
||||
}
|
||||
|
@ -151,7 +152,7 @@ static void PaintGraph(HDC hdc)
|
|||
if(fabs((double)GraphBuffer[i]) > absYMax) {
|
||||
absYMax = (int)fabs((double)GraphBuffer[i]);
|
||||
}
|
||||
int x = 40 + (int)((i - GraphStart)*GraphPixelsPerPoint);
|
||||
int x = offset + (int)((i - GraphStart)*GraphPixelsPerPoint);
|
||||
if(x > r.right) {
|
||||
break;
|
||||
}
|
||||
|
@ -163,12 +164,15 @@ static void PaintGraph(HDC hdc)
|
|||
SetBkColor(hdc, RGB(0, 0, 0));
|
||||
|
||||
// number of points that will be plotted
|
||||
int span = (int)((r.right - r.left) / GraphPixelsPerPoint);
|
||||
// one label every 100 pixels, let us say
|
||||
int labels = (r.right - r.left - 40) / 100;
|
||||
double span = (int)((r.right - r.left) / GraphPixelsPerPoint);
|
||||
|
||||
// one label every offset pixels, let us say
|
||||
int labels = (r.right - r.left - offset) / offset;
|
||||
if(labels <= 0) labels = 1;
|
||||
int pointsPerLabel = span / labels;
|
||||
// round to nearest power of 2
|
||||
int pointsPerLabel = (int)(log(span / labels)/log(2.0));
|
||||
if(pointsPerLabel <= 0) pointsPerLabel = 1;
|
||||
pointsPerLabel = (int)pow(2.0,pointsPerLabel);
|
||||
|
||||
int yMin = INT_MAX;
|
||||
int yMax = INT_MIN;
|
||||
|
@ -179,7 +183,7 @@ static void PaintGraph(HDC hdc)
|
|||
if(i >= GraphTraceLen) {
|
||||
break;
|
||||
}
|
||||
int x = 40 + (int)((i - GraphStart)*GraphPixelsPerPoint);
|
||||
int x = offset + (int)((i - GraphStart)*GraphPixelsPerPoint);
|
||||
if(x > r.right + GraphPixelsPerPoint) {
|
||||
break;
|
||||
}
|
||||
|
@ -212,8 +216,8 @@ static void PaintGraph(HDC hdc)
|
|||
|
||||
if(((i - GraphStart) % pointsPerLabel == 0) && i != GraphStart) {
|
||||
SelectObject(hdc, WhitePen);
|
||||
MoveToEx(hdc, x, zeroHeight - 3, NULL);
|
||||
LineTo(hdc, x, zeroHeight + 3);
|
||||
MoveToEx(hdc, x, zeroHeight - 8, NULL);
|
||||
LineTo(hdc, x, zeroHeight + 8);
|
||||
|
||||
char str[100];
|
||||
sprintf(str, "+%d", (i - GraphStart));
|
||||
|
@ -244,9 +248,9 @@ static void PaintGraph(HDC hdc)
|
|||
}
|
||||
|
||||
char str[100];
|
||||
sprintf(str, "@%d max=%d min=%d mean=%d n=%d/%d dt=%d [%.3f]",
|
||||
sprintf(str, "@%d max=%d min=%d mean=%d n=%d/%d dt=%d [%.3f] zoom=%.3f",
|
||||
GraphStart, yMax, yMin, yMean, n, GraphTraceLen,
|
||||
CursorBPos - CursorAPos, (CursorBPos - CursorAPos)/CursorScaleFactor);
|
||||
CursorBPos - CursorAPos, (CursorBPos - CursorAPos)/CursorScaleFactor, GraphPixelsPerPoint);
|
||||
TextOut(hdc, 50, r.bottom - 20, str, strlen(str));
|
||||
}
|
||||
|
||||
|
@ -277,28 +281,28 @@ static LRESULT CALLBACK
|
|||
case WM_KEYDOWN:
|
||||
switch(wParam) {
|
||||
case VK_DOWN:
|
||||
if(GraphPixelsPerPoint <= 50) {
|
||||
if(GraphPixelsPerPoint <= 8) {
|
||||
GraphPixelsPerPoint *= 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_UP:
|
||||
if(GraphPixelsPerPoint >= 0.02) {
|
||||
if(GraphPixelsPerPoint >= 0.01) {
|
||||
GraphPixelsPerPoint /= 2;
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_RIGHT:
|
||||
if(GraphPixelsPerPoint < 20) {
|
||||
GraphStart += (int)(20 / GraphPixelsPerPoint);
|
||||
if(GraphPixelsPerPoint < 16) {
|
||||
GraphStart += (int)(16 / GraphPixelsPerPoint);
|
||||
} else {
|
||||
GraphStart++;
|
||||
}
|
||||
break;
|
||||
|
||||
case VK_LEFT:
|
||||
if(GraphPixelsPerPoint < 20) {
|
||||
GraphStart -= (int)(20 / GraphPixelsPerPoint);
|
||||
if(GraphPixelsPerPoint < 16) {
|
||||
GraphStart -= (int)(16 / GraphPixelsPerPoint);
|
||||
} else {
|
||||
GraphStart--;
|
||||
}
|
||||
|
@ -314,7 +318,7 @@ nopaint:
|
|||
case WM_LBUTTONDOWN:
|
||||
case WM_RBUTTONDOWN: {
|
||||
int x = LOWORD(lParam);
|
||||
x -= 40;
|
||||
x -= offset;
|
||||
x = (int)(x / GraphPixelsPerPoint);
|
||||
x += GraphStart;
|
||||
if(msg == WM_LBUTTONDOWN) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue