}
}
-//Testing to fix timing issues by marshmellow (MM)
-void SimulateTagLowFrequencyMM(int period, int gap, int ledcontrol)
-{
- int i;
- uint8_t *tab = BigBuf_get_addr();
-
- FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
- FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_EDGE_DETECT);
-
- AT91C_BASE_PIOA->PIO_PER = GPIO_SSC_DOUT | GPIO_SSC_CLK;
-
- AT91C_BASE_PIOA->PIO_OER = GPIO_SSC_DOUT;
- AT91C_BASE_PIOA->PIO_ODR = GPIO_SSC_CLK;
-
- #define SHORT_COIL() LOW(GPIO_SSC_DOUT)
- #define OPEN_COIL() HIGH(GPIO_SSC_DOUT)
-
- i = 0;
- while(!BUTTON_PRESS()) {
-
- WDT_HIT();
- //wait until reader carrier is HIGH
- while(!(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK)) {
- WDT_HIT();
- }
- if (i>0){
- if (tab[i]!=tab[i-1]){
- // transition
- if (ledcontrol)
- LED_D_ON();
-
- // modulate coil
- if(tab[i])
- OPEN_COIL();
- else
- SHORT_COIL();
-
- if (ledcontrol)
- LED_D_OFF();
-
- } else { //no transition
- //NOTE: it appears the COIL transition messes with the detection of the carrier, so if a transition happened
- // skip test for readers Carrier = LOW, otherwise we get a bit behind
-
- //wait until reader carrier is LOW
- while(AT91C_BASE_PIOA->PIO_PDSR & GPIO_SSC_CLK) {
- WDT_HIT();
- }
- }
- } else {
- // transition
- if (ledcontrol)
- LED_D_ON();
-
- // modulate coil
- if(tab[i])
- OPEN_COIL();
- else
- SHORT_COIL();
-
- if (ledcontrol)
- LED_D_OFF();
- }
- WDT_HIT();
-
-
- i++;
- if(i == period) {
- // end of data stream, gap then repeat
- i = 0;
- if (gap) {
- SHORT_COIL();
- SpinDelayUs(gap);
- }
- }
- }
- DbpString("Stopped");
- return;
-}
-
#define DEBUG_FRAME_CONTENTS 1
void SimulateTagLowFrequencyBidir(int divisor, int t0)
{
for (idx=0; idx < (uint8_t) clock/c; idx++){
// loop through field clock length - put 1/2 FC length 1's and 1/2 0's per field clock wave (to create the wave)
for (fcCnt=0; fcCnt < c; fcCnt++){ //fudge slow transition from low to high - shorten wave by 1
- if (fcCnt < c/2+1){
+ if (fcCnt < c/2){
dest[((*n)++)]=0;
} else {
//fudge low to high transition
if ((mod>0) && modAdjOk){ //fsk2
if ((*modCnt % modAdj) == 0){ //if 4th 8 length wave in a rf/50 add extra 8 length wave
for (fcCnt=0; fcCnt < c; fcCnt++){ //fudge slow transition from low to high - shorten wave by 1
- if (fcCnt < c/2+1){
+ if (fcCnt < c/2){
dest[((*n)++)]=0;
} else {
//if (c==8 && fcCnt==5) continue;
*/
if (hi>0xFFF) {
- DbpString("Tags can only have 44 bits.");
+ DbpString("Tags can only have 44 bits. - USE lf simfsk for larger tags");
return;
}
fc(0,&n);
}
}
Dbprintf("Simulating with fcHigh: %d, fcLow: %d, clk: %d, invert: %d, n: %d",fcHigh, fcLow, clk, invert, n);
- Dbprintf("First 64:");
+ WDT_HIT();
+ /*Dbprintf("First 64:");
uint8_t *dest = BigBuf_get_addr();
i=0;
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
i+=16;
Dbprintf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", dest[i],dest[i+1],dest[i+2],dest[i+3],dest[i+4],dest[i+5],dest[i+6],dest[i+7],dest[i+8],dest[i+9],dest[i+10],dest[i+11],dest[i+12],dest[i+13],dest[i+14],dest[i+15]);
-
+ */
if (ledcontrol)
LED_A_ON();
- SimulateTagLowFrequencyMM(n, 0, ledcontrol);
+ SimulateTagLowFrequency(n, 0, ledcontrol);
if (ledcontrol)
LED_A_OFF();
uint8_t manchester = arg1 & 1;
uint8_t separator = arg2 & 1;
uint8_t invert = (arg2 >> 8) & 1;
- WDT_HIT();
for (i=0; i<size; i++){
askSimBit(BitStream[i]^invert, &n, clk, manchester);
}
if (ledcontrol)
LED_A_ON();
- SimulateTagLowFrequencyMM(n, 0, ledcontrol);
+ SimulateTagLowFrequency(n, 0, ledcontrol);
if (ledcontrol)
LED_A_OFF();
int i = 0;
if (phaseChg){
// write phase change
- for (i=0; i < waveLen/2; i++){
+ for (idx=0; idx < waveLen/2; idx++){
dest[((*n)++)] = *curPhase^1;
}
- for (i=0; i < waveLen/2; i++){
+ for (idx=0; idx < waveLen/2; idx++){
dest[((*n)++)] = *curPhase;
}
*curPhase ^= 1;
+ i+=waveLen;
}
//write each normal clock wave for the clock duration
for (; i < clk; i+=waveLen){
uint8_t invert = arg2 & 0xFF;
//uint8_t phase = carrier/2; //extra phase changing bits = 1/2 a carrier wave to change the phase
//uint8_t invert = (arg2 >> 8) & 1;
- uint8_t curPhase = 0;
WDT_HIT();
+ uint8_t curPhase = 0;
for (i=0; i<size; i++){
if (BitStream[i] == curPhase){
pskSimBit(carrier, &n, clk, &curPhase, FALSE);
}
}
Dbprintf("Simulating with Carrier: %d, clk: %d, invert: %d, n: %d",carrier, clk, invert, n);
+ WDT_HIT();
Dbprintf("First 128:");
uint8_t *dest = BigBuf_get_addr();
i=0;
if (ledcontrol)
LED_A_ON();
- SimulateTagLowFrequencyMM(n, 0, ledcontrol);
+ SimulateTagLowFrequency(n, 0, ledcontrol);
if (ledcontrol)
LED_A_OFF();
* Updates the Graph trace with 0/1 values
*
* Arguments:
- * c : 0 or 1
+ * c : 0 or 1 (or invert)
*/
- //this method is dependant on all highs and lows to be the same(or clipped) this creates issues[marshmellow] it also ignores the clock
+ //this method ignores the clock
+
+ //this function strictly converts highs and lows to 1s and 0s for each sample in the graphbuffer
int Cmdaskdemod(const char *Cmd)
{
int i;
int c, high = 0, low = 0;
- // TODO: complain if we do not give 2 arguments here !
- // (AL - this doesn't make sense! we're only using one argument!!!)
sscanf(Cmd, "%i", &c);
- /* Detect high and lows and clock */
- // (AL - clock???)
+ /* Detect high and lows */
for (i = 0; i < GraphTraceLen; ++i)
{
if (GraphBuffer[i] > high)
* down)
*/
//[marhsmellow] change == to >= for high and <= for low for fuzz
- if ((GraphBuffer[i] == high) && (GraphBuffer[i - 1] == c)) {
+ if ((GraphBuffer[i] >= high) && (GraphBuffer[i - 1] == c)) {
GraphBuffer[i] = 1 - c;
- } else if ((GraphBuffer[i] == low) && (GraphBuffer[i - 1] == (1 - c))){
+ } else if ((GraphBuffer[i] <= low) && (GraphBuffer[i - 1] == (1 - c))){
GraphBuffer[i] = c;
} else {
/* No transition */
return 0;
}
+//this function strictly converts >1 to 1 and <1 to 0 for each sample in the graphbuffer
+int CmdGetBitStream(const char *Cmd)
+{
+ int i;
+ CmdHpf(Cmd);
+ for (i = 0; i < GraphTraceLen; i++) {
+ if (GraphBuffer[i] >= 1) {
+ GraphBuffer[i] = 1;
+ } else {
+ GraphBuffer[i] = 0;
+ }
+ }
+ RepaintGraphWindow();
+ return 0;
+}
+
+
//by marshmellow
void printBitStream(uint8_t BitStream[], uint32_t bitLen)
{
return 0;
}
+//zero mean GraphBuffer
int CmdHpf(const char *Cmd)
{
int i;
{"fskpyramiddemod",CmdFSKdemodPyramid,1, "Demodulate a Pyramid FSK tag from GraphBuffer"},
{"fskparadoxdemod",CmdFSKdemodParadox,1, "Demodulate a Paradox FSK tag from GraphBuffer"},
//{"fskrawdemod", CmdFSKrawdemod, 1, "[clock rate] [invert] [rchigh] [rclow] Demodulate graph window from FSK to bin (clock = 50)(invert = 1|0)(rchigh = 10)(rclow=8)"},
+ {"getbitstream", CmdGetBitStream, 1, "Convert GraphBuffer's >=1 values to 1 and <1 to 0"},
{"grid", CmdGrid, 1, "<x> <y> -- overlay grid on graph window, use zero value to turn off either"},
{"hexsamples", CmdHexsamples, 0, "<bytes> [<offset>] -- Dump big buffer as hex bytes"},
{"hide", CmdHide, 1, "Hide graph window"},
int CmdPSK1rawDemod(const char *Cmd);
int CmdPSK2rawDemod(const char *Cmd);
int CmdGrid(const char *Cmd);
+int CmdGetBitStream(const char *Cmd);
int CmdHexsamples(const char *Cmd);
int CmdHide(const char *Cmd);
int CmdHpf(const char *Cmd);
static void ChkBitstream(const char *str)
{
int i;
-
+
/* convert to bitstream if necessary */
for (i = 0; i < (int)(GraphTraceLen / 2); i++){
if (GraphBuffer[i] > 1 || GraphBuffer[i] < 0) {
- CmdBitstream(str);
+ CmdGetBitStream("");
break;
}
}
sscanf(Cmd, "%i", &gap);
/* convert to bitstream if necessary */
+
ChkBitstream(Cmd);
//can send 512 bits at a time (1 byte sent per bit...)
uint16_t arg1, arg2;
arg1 = clk << 8 | carrier;
arg2 = invert;
+
UsbCommand c = {CMD_PSK_SIM_TAG, {arg1, arg2, DemodBufferLen}};
if (DemodBufferLen > USB_CMD_DATA_SIZE) {
PrintAndLog("DemodBuffer too long for current implementation - length: %d - max: %d", DemodBufferLen, USB_CMD_DATA_SIZE);
PrintAndLog("DEBUG: Sending DemodBuffer Length: %d", DemodBufferLen);
memcpy(c.d.asBytes, DemodBuffer, DemodBufferLen);
SendCommand(&c);
+
return 0;
}
}
/* simulate an LF Manchester encoded tag with specified bitstream, clock rate and inter-id gap */
+/*
int CmdLFSimManchester(const char *Cmd)
{
static int clock, gap;
CmdLFSim(gapstring);
return 0;
}
-
+*/
int CmdVchDemod(const char *Cmd)
{
{"read", CmdLFRead, 0, "Read 125/134 kHz LF ID-only tag. Do 'lf read h' for help"},
{"search", CmdLFfind, 1, "[offline] ['u'] Read and Search for valid known tag (in offline mode it you can load first then search) - 'u' to search for unknown tags"},
{"sim", CmdLFSim, 0, "[GAP] -- Simulate LF tag from buffer with optional GAP (in microseconds)"},
- {"simask", CmdLFaskSim, 0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [trs separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
+ {"simask", CmdLFaskSim, 0, "[clock] [invert <1|0>] [manchester/raw <'m'|'r'>] [msg separator 's'] [d <hexdata>] -- Simulate LF ASK tag from demodbuffer or input"},
{"simfsk", CmdLFfskSim, 0, "[c <clock>] [i] [H <fcHigh>] [L <fcLow>] [d <hexdata>] -- Simulate LF FSK tag from demodbuffer or input"},
{"simpsk", CmdLFpskSim, 0, "[1|2|3] [c <clock>] [i] [r <carrier>] [d <raw hex to sim>] -- Simulate LF PSK tag from demodbuffer or input"},
{"simbidir", CmdLFSimBidir, 0, "Simulate LF tag (with bidirectional data transmission between reader and tag)"},
- {"simman", CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
+ //{"simman", CmdLFSimManchester, 0, "<Clock> <Bitstream> [GAP] Simulate arbitrary Manchester LF tag"},
{"snoop", CmdLFSnoop, 0, "['l'|'h'|<divisor>] [trigger threshold]-- Snoop LF (l:125khz, h:134khz)"},
{"ti", CmdLFTI, 1, "{ TI RFIDs... }"},
{"hitag", CmdLFHitag, 1, "{ Hitag tags and transponders... }"},
int CmdLFfskSim(const char *Cmd);
int CmdLFpskSim(const char *Cmd);
int CmdLFSimBidir(const char *Cmd);
-int CmdLFSimManchester(const char *Cmd);
+//int CmdLFSimManchester(const char *Cmd);
int CmdLFSnoop(const char *Cmd);
int CmdVchDemod(const char *Cmd);
int CmdLFfind(const char *Cmd);
/* stop bit */
AppendGraph(1, clock, 0);
- CmdLFSim("240"); //240 start_gap.
+ CmdLFSim("0"); //240 start_gap.
return 0;
}
int i;
//set first half the clock bit (all 1's or 0's for a 0 or 1 bit)
for (i = 0; i < (int)(clock / 2); ++i)
- GraphBuffer[GraphTraceLen++] = bit ^ 1;
+ GraphBuffer[GraphTraceLen++] = bit ;
//set second half of the clock bit (all 0's or 1's for a 0 or 1 bit)
for (i = (int)(clock / 2); i < clock; ++i)
- GraphBuffer[GraphTraceLen++] = bit;
+ GraphBuffer[GraphTraceLen++] = bit ^ 1;
if (redraw)
RepaintGraphWindow();