1 //-----------------------------------------------------------------------------
2 // Jonathan Westhues, Mar 2006
3 // Edits by Gerhard de Koning Gans, Sep 2007 (##)
5 // This code is licensed to you under the terms of the GNU GPL, version 2 or,
6 // at your option, any later version. See the LICENSE.txt file for the text of
8 //-----------------------------------------------------------------------------
9 // The main application code. This is the first thing called after start.c
11 //-----------------------------------------------------------------------------
16 #include "proxmark3.h"
26 #include "lfsampling.h"
28 #include "mifareutil.h"
33 // Craig Young - 14a stand-alone code
34 #ifdef WITH_ISO14443a_StandAlone
35 #include "iso14443a.h"
38 #define abs(x) ( ((x)<0) ? -(x) : (x) )
40 //=============================================================================
41 // A buffer where we can queue things up to be sent through the FPGA, for
42 // any purpose (fake tag, as reader, whatever). We go MSB first, since that
43 // is the order in which they go out on the wire.
44 //=============================================================================
46 #define TOSEND_BUFFER_SIZE (9*MAX_FRAME_SIZE + 1 + 1 + 2) // 8 data bits and 1 parity bit per payload byte, 1 correction bit, 1 SOC bit, 2 EOC bits
47 uint8_t ToSend
[TOSEND_BUFFER_SIZE
];
50 struct common_area common_area
__attribute__((section(".commonarea")));
52 void ToSendReset(void)
58 void ToSendStuffBit(int b
)
62 ToSend
[ToSendMax
] = 0;
67 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
));
72 if(ToSendMax
>= sizeof(ToSend
)) {
74 DbpString("ToSendStuffBit overflowed!");
78 //=============================================================================
79 // Debug print functions, to go out over USB, to the usual PC-side client.
80 //=============================================================================
82 void DbpString(char *str
)
84 byte_t len
= strlen(str
);
85 cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
);
89 void DbpIntegers(int x1
, int x2
, int x3
)
91 cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0);
95 void Dbprintf(const char *fmt
, ...) {
96 // should probably limit size here; oh well, let's just use a big buffer
97 char output_string
[128];
101 kvsprintf(fmt
, output_string
, 10, ap
);
104 DbpString(output_string
);
107 // prints HEX & ASCII
108 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) {
121 if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.';
124 Dbprintf("%-8s %*D",ascii
,l
,d
," ");
126 Dbprintf("%*D",l
,d
," ");
134 //-----------------------------------------------------------------------------
135 // Read an ADC channel and block till it completes, then return the result
136 // in ADC units (0 to 1023). Also a routine to average 32 samples and
138 //-----------------------------------------------------------------------------
139 static int ReadAdc(int ch
)
143 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_SWRST
;
144 AT91C_BASE_ADC
->ADC_MR
=
145 ADC_MODE_PRESCALE(63 /* was 32 */) | // ADC_CLK = MCK / ((63+1) * 2) = 48MHz / 128 = 375kHz
146 ADC_MODE_STARTUP_TIME(1 /* was 16 */) | // Startup Time = (1+1) * 8 / ADC_CLK = 16 / 375kHz = 42,7us Note: must be > 20us
147 ADC_MODE_SAMPLE_HOLD_TIME(15 /* was 8 */); // Sample & Hold Time SHTIM = 15 / ADC_CLK = 15 / 375kHz = 40us
149 // Note: ADC_MODE_PRESCALE and ADC_MODE_SAMPLE_HOLD_TIME are set to the maximum allowed value.
150 // Both AMPL_LO and AMPL_HI are very high impedance (10MOhm) outputs, the input capacitance of the ADC is 12pF (typical). This results in a time constant
151 // of RC = 10MOhm * 12pF = 120us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged.
154 // If there is a voltage v_in at the input, the voltage v_cap at the capacitor (this is what we are measuring) will be
156 // v_cap = v_in * (1 - exp(-RC/SHTIM)) = v_in * (1 - exp(-3)) = v_in * 0,95 (i.e. an error of 5%)
158 // Note: with the "historic" values in the comments above, the error was 34% !!!
160 AT91C_BASE_ADC
->ADC_CHER
= ADC_CHANNEL(ch
);
162 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_START
;
164 while(!(AT91C_BASE_ADC
->ADC_SR
& ADC_END_OF_CONVERSION(ch
)))
166 d
= AT91C_BASE_ADC
->ADC_CDR
[ch
];
171 int AvgAdc(int ch
) // was static - merlok
176 for(i
= 0; i
< 32; i
++) {
180 return (a
+ 15) >> 5;
183 void MeasureAntennaTuning(void)
185 uint8_t LF_Results
[256];
186 int i
, adcval
= 0, peak
= 0, peakv
= 0, peakf
= 0; //ptr = 0
187 int vLf125
= 0, vLf134
= 0, vHf
= 0; // in mV
192 * Sweeps the useful LF range of the proxmark from
193 * 46.8kHz (divisor=255) to 600kHz (divisor=19) and
194 * read the voltage in the antenna, the result left
195 * in the buffer is a graph which should clearly show
196 * the resonating frequency of your LF antenna
197 * ( hopefully around 95 if it is tuned to 125kHz!)
200 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
);
201 FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC
| FPGA_LF_ADC_READER_FIELD
);
202 for (i
=255; i
>=19; i
--) {
204 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
);
206 adcval
= ((MAX_ADC_LF_VOLTAGE
* AvgAdc(ADC_CHAN_LF
)) >> 10);
207 if (i
==95) vLf125
= adcval
; // voltage at 125Khz
208 if (i
==89) vLf134
= adcval
; // voltage at 134Khz
210 LF_Results
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes
211 if(LF_Results
[i
] > peak
) {
213 peak
= LF_Results
[i
];
219 for (i
=18; i
>= 0; i
--) LF_Results
[i
] = 0;
222 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
223 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
224 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
226 vHf
= (MAX_ADC_HF_VOLTAGE
* AvgAdc(ADC_CHAN_HF
)) >> 10;
228 cmd_send(CMD_MEASURED_ANTENNA_TUNING
, vLf125
| (vLf134
<<16), vHf
, peakf
| (peakv
<<16), LF_Results
, 256);
229 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
235 void MeasureAntennaTuningHf(void)
237 int vHf
= 0; // in mV
239 DbpString("Measuring HF antenna, press button to exit");
241 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
242 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
243 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
247 vHf
= (MAX_ADC_HF_VOLTAGE
* AvgAdc(ADC_CHAN_HF
)) >> 10;
249 Dbprintf("%d mV",vHf
);
250 if (BUTTON_PRESS()) break;
252 DbpString("cancelled");
254 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
259 void ReadMem(int addr
)
261 const uint8_t *data
= ((uint8_t *)addr
);
263 Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x",
264 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]);
267 /* osimage version information is linked in */
268 extern struct version_information version_information
;
269 /* bootrom version information is pointed to from _bootphase1_version_pointer */
270 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
, _bootrom_start
, _bootrom_end
, __data_src_start__
;
271 void SendVersion(void)
273 char temp
[USB_CMD_DATA_SIZE
]; /* Limited data payload in USB packets */
274 char VersionString
[USB_CMD_DATA_SIZE
] = { '\0' };
276 /* Try to find the bootrom version information. Expect to find a pointer at
277 * symbol _bootphase1_version_pointer, perform slight sanity checks on the
278 * pointer, then use it.
280 char *bootrom_version
= *(char**)&_bootphase1_version_pointer
;
281 if( bootrom_version
< &_flash_start
|| bootrom_version
>= &_flash_end
) {
282 strcat(VersionString
, "bootrom version information appears invalid\n");
284 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
);
285 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
288 FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
);
289 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
291 FpgaGatherVersion(FPGA_BITSTREAM_LF
, temp
, sizeof(temp
));
292 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
293 FpgaGatherVersion(FPGA_BITSTREAM_HF
, temp
, sizeof(temp
));
294 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
296 // Send Chip ID and used flash memory
297 uint32_t text_and_rodata_section_size
= (uint32_t)&__data_src_start__
- (uint32_t)&_flash_start
;
298 uint32_t compressed_data_section_size
= common_area
.arg1
;
299 cmd_send(CMD_ACK
, *(AT91C_DBGU_CIDR
), text_and_rodata_section_size
+ compressed_data_section_size
, 0, VersionString
, strlen(VersionString
));
302 // measure the USB Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time.
303 // Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the UsbCommand structure included.
304 void printUSBSpeed(void)
306 Dbprintf("USB Speed:");
307 Dbprintf(" Sending USB packets to client...");
309 #define USB_SPEED_TEST_MIN_TIME 1500 // in milliseconds
310 uint8_t *test_data
= BigBuf_get_addr();
313 uint32_t start_time
= end_time
= GetTickCount();
314 uint32_t bytes_transferred
= 0;
317 while(end_time
< start_time
+ USB_SPEED_TEST_MIN_TIME
) {
318 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
, 0, USB_CMD_DATA_SIZE
, 0, test_data
, USB_CMD_DATA_SIZE
);
319 end_time
= GetTickCount();
320 bytes_transferred
+= USB_CMD_DATA_SIZE
;
324 Dbprintf(" Time elapsed: %dms", end_time
- start_time
);
325 Dbprintf(" Bytes transferred: %d", bytes_transferred
);
326 Dbprintf(" USB Transfer Speed PM3 -> Client = %d Bytes/s",
327 1000 * bytes_transferred
/ (end_time
- start_time
));
332 * Prints runtime information about the PM3.
334 void SendStatus(void)
336 BigBuf_print_status();
338 printConfig(); //LF Sampling config
341 Dbprintf(" MF_DBGLEVEL........%d", MF_DBGLEVEL
);
342 Dbprintf(" ToSendMax..........%d", ToSendMax
);
343 Dbprintf(" ToSendBit..........%d", ToSendBit
);
344 Dbprintf(" ToSend BUFFERSIZE..%d", TOSEND_BUFFER_SIZE
);
346 cmd_send(CMD_ACK
,1,0,0,0,0);
349 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF)
353 void StandAloneMode()
355 DbpString("Stand-alone mode! No PC necessary.");
356 // Oooh pretty -- notify user we're in elite samy mode now
358 LED(LED_ORANGE
, 200);
360 LED(LED_ORANGE
, 200);
362 LED(LED_ORANGE
, 200);
364 LED(LED_ORANGE
, 200);
373 #ifdef WITH_ISO14443a_StandAlone
374 void StandAloneMode14a()
377 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
380 int playing
= 0, iGotoRecord
= 0, iGotoClone
= 0;
381 int cardRead
[OPTS
] = {0};
382 uint8_t readUID
[10] = {0};
383 uint32_t uid_1st
[OPTS
]={0};
384 uint32_t uid_2nd
[OPTS
]={0};
385 uint32_t uid_tmp1
= 0;
386 uint32_t uid_tmp2
= 0;
387 iso14a_card_select_t hi14a_card
[OPTS
];
389 LED(selected
+ 1, 0);
397 if (iGotoRecord
== 1 || cardRead
[selected
] == 0)
401 LED(selected
+ 1, 0);
405 Dbprintf("Enabling iso14443a reader mode for [Bank: %u]...", selected
);
406 /* need this delay to prevent catching some weird data */
408 /* Code for reading from 14a tag */
409 uint8_t uid
[10] ={0};
411 iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD
);
416 if (BUTTON_PRESS()) {
417 if (cardRead
[selected
]) {
418 Dbprintf("Button press detected -- replaying card in bank[%d]", selected
);
421 else if (cardRead
[(selected
+1)%OPTS
]) {
422 Dbprintf("Button press detected but no card in bank[%d] so playing from bank[%d]", selected
, (selected
+1)%OPTS
);
423 selected
= (selected
+1)%OPTS
;
424 break; // playing = 1;
427 Dbprintf("Button press detected but no stored tag to play. (Ignoring button)");
431 if (!iso14443a_select_card(uid
, &hi14a_card
[selected
], &cuid
))
435 Dbprintf("Read UID:"); Dbhexdump(10,uid
,0);
436 memcpy(readUID
,uid
,10*sizeof(uint8_t));
437 uint8_t *dst
= (uint8_t *)&uid_tmp1
;
438 // Set UID byte order
439 for (int i
=0; i
<4; i
++)
441 dst
= (uint8_t *)&uid_tmp2
;
442 for (int i
=0; i
<4; i
++)
444 if (uid_1st
[(selected
+1)%OPTS
] == uid_tmp1
&& uid_2nd
[(selected
+1)%OPTS
] == uid_tmp2
) {
445 Dbprintf("Card selected has same UID as what is stored in the other bank. Skipping.");
449 Dbprintf("Bank[%d] received a 7-byte UID",selected
);
450 uid_1st
[selected
] = (uid_tmp1
)>>8;
451 uid_2nd
[selected
] = (uid_tmp1
<<24) + (uid_tmp2
>>8);
454 Dbprintf("Bank[%d] received a 4-byte UID",selected
);
455 uid_1st
[selected
] = uid_tmp1
;
456 uid_2nd
[selected
] = uid_tmp2
;
462 Dbprintf("ATQA = %02X%02X",hi14a_card
[selected
].atqa
[0],hi14a_card
[selected
].atqa
[1]);
463 Dbprintf("SAK = %02X",hi14a_card
[selected
].sak
);
466 LED(LED_ORANGE
, 200);
468 LED(LED_ORANGE
, 200);
471 LED(selected
+ 1, 0);
473 // Next state is replay:
476 cardRead
[selected
] = 1;
478 /* MF Classic UID clone */
479 else if (iGotoClone
==1)
483 LED(selected
+ 1, 0);
484 LED(LED_ORANGE
, 250);
488 Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected
, uid_1st
[selected
]);
490 // wait for button to be released
491 while(BUTTON_PRESS())
493 // Delay cloning until card is in place
496 Dbprintf("Starting clone. [Bank: %u]", selected
);
497 // need this delay to prevent catching some weird data
499 // Begin clone function here:
500 /* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards:
501 UsbCommand c = {CMD_MIFARE_CSETBLOCK, {wantWipe, params & (0xFE | (uid == NULL ? 0:1)), blockNo}};
502 memcpy(c.d.asBytes, data, 16);
505 Block read is similar:
506 UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, 0, blockNo}};
507 We need to imitate that call with blockNo 0 to set a uid.
509 The get and set commands are handled in this file:
510 // Work with "magic Chinese" card
511 case CMD_MIFARE_CSETBLOCK:
512 MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
514 case CMD_MIFARE_CGETBLOCK:
515 MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
518 mfCSetUID provides example logic for UID set workflow:
519 -Read block0 from card in field with MifareCGetBlock()
520 -Configure new values without replacing reserved bytes
521 memcpy(block0, uid, 4); // Copy UID bytes from byte array
523 block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5
524 Bytes 5-7 are reserved SAK and ATQA for mifare classic
525 -Use mfCSetBlock(0, block0, oldUID, wantWipe, CSETBLOCK_SINGLE_OPER) to write it
527 uint8_t oldBlock0
[16] = {0}, newBlock0
[16] = {0}, testBlock0
[16] = {0};
528 // arg0 = Flags == CSETBLOCK_SINGLE_OPER=0x1F, arg1=returnSlot, arg2=blockNo
529 MifareCGetBlock(0x3F, 1, 0, oldBlock0
);
530 if (oldBlock0
[0] == 0 && oldBlock0
[0] == oldBlock0
[1] && oldBlock0
[1] == oldBlock0
[2] && oldBlock0
[2] == oldBlock0
[3]) {
531 Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected
);
535 Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0
[0],oldBlock0
[1],oldBlock0
[2],oldBlock0
[3]);
536 memcpy(newBlock0
,oldBlock0
,16);
537 // Copy uid_1st for bank (2nd is for longer UIDs not supported if classic)
539 newBlock0
[0] = uid_1st
[selected
]>>24;
540 newBlock0
[1] = 0xFF & (uid_1st
[selected
]>>16);
541 newBlock0
[2] = 0xFF & (uid_1st
[selected
]>>8);
542 newBlock0
[3] = 0xFF & (uid_1st
[selected
]);
543 newBlock0
[4] = newBlock0
[0]^newBlock0
[1]^newBlock0
[2]^newBlock0
[3];
544 // arg0 = needWipe, arg1 = workFlags, arg2 = blockNo, datain
545 MifareCSetBlock(0, 0xFF,0, newBlock0
);
546 MifareCGetBlock(0x3F, 1, 0, testBlock0
);
547 if (memcmp(testBlock0
,newBlock0
,16)==0)
549 DbpString("Cloned successfull!");
550 cardRead
[selected
] = 0; // Only if the card was cloned successfully should we clear it
553 selected
= (selected
+ 1) % OPTS
;
556 Dbprintf("Clone failed. Back to replay mode on bank[%d]", selected
);
561 LED(selected
+ 1, 0);
564 // Change where to record (or begin playing)
565 else if (playing
==1) // button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected])
568 LED(selected
+ 1, 0);
570 // Begin transmitting
574 DbpString("Playing");
577 int button_action
= BUTTON_HELD(1000);
578 if (button_action
== 0) { // No button action, proceed with sim
579 uint8_t data
[512] = {0}; // in case there is a read command received we shouldn't break
580 uint8_t flags
= ( uid_2nd
[selected
] > 0x00 ) ? FLAG_7B_UID_IN_DATA
: FLAG_4B_UID_IN_DATA
;
581 num_to_bytes(uid_1st
[selected
], 3, data
);
582 num_to_bytes(uid_2nd
[selected
], 4, data
);
584 Dbprintf("Simulating ISO14443a tag with uid[0]: %08x, uid[1]: %08x [Bank: %u]", uid_1st
[selected
],uid_2nd
[selected
],selected
);
585 if (hi14a_card
[selected
].sak
== 8 && hi14a_card
[selected
].atqa
[0] == 4 && hi14a_card
[selected
].atqa
[1] == 0) {
586 DbpString("Mifare Classic");
587 SimulateIso14443aTag(1, flags
, data
); // Mifare Classic
589 else if (hi14a_card
[selected
].sak
== 0 && hi14a_card
[selected
].atqa
[0] == 0x44 && hi14a_card
[selected
].atqa
[1] == 0) {
590 DbpString("Mifare Ultralight");
591 SimulateIso14443aTag(2, flags
, data
); // Mifare Ultralight
593 else if (hi14a_card
[selected
].sak
== 20 && hi14a_card
[selected
].atqa
[0] == 0x44 && hi14a_card
[selected
].atqa
[1] == 3) {
594 DbpString("Mifare DESFire");
595 SimulateIso14443aTag(3, flags
, data
); // Mifare DESFire
598 Dbprintf("Unrecognized tag type -- defaulting to Mifare Classic emulation");
599 SimulateIso14443aTag(1, flags
, data
);
602 else if (button_action
== BUTTON_SINGLE_CLICK
) {
603 selected
= (selected
+ 1) % OPTS
;
604 Dbprintf("Done playing. Switching to record mode on bank %d",selected
);
608 else if (button_action
== BUTTON_HOLD
) {
609 Dbprintf("Playtime over. Begin cloning...");
616 /* We pressed a button so ignore it here with a delay */
619 LED(selected
+ 1, 0);
622 while(BUTTON_PRESS())
628 // samy's sniff and repeat routine
632 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
);
634 int high
[OPTS
], low
[OPTS
];
639 // Turn on selected LED
640 LED(selected
+ 1, 0);
647 // Was our button held down or pressed?
648 int button_pressed
= BUTTON_HELD(1000);
651 // Button was held for a second, begin recording
652 if (button_pressed
> 0 && cardRead
== 0)
655 LED(selected
+ 1, 0);
659 DbpString("Starting recording");
661 // wait for button to be released
662 while(BUTTON_PRESS())
665 /* need this delay to prevent catching some weird data */
668 CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0);
669 Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]);
672 LED(selected
+ 1, 0);
673 // Finished recording
675 // If we were previously playing, set playing off
676 // so next button push begins playing what we recorded
683 else if (button_pressed
> 0 && cardRead
== 1)
686 LED(selected
+ 1, 0);
690 Dbprintf("Cloning %x %x %x", selected
, high
[selected
], low
[selected
]);
692 // wait for button to be released
693 while(BUTTON_PRESS())
696 /* need this delay to prevent catching some weird data */
699 CopyHIDtoT55x7(high
[selected
], low
[selected
], 0, 0);
700 Dbprintf("Cloned %x %x %x", selected
, high
[selected
], low
[selected
]);
703 LED(selected
+ 1, 0);
704 // Finished recording
706 // If we were previously playing, set playing off
707 // so next button push begins playing what we recorded
714 // Change where to record (or begin playing)
715 else if (button_pressed
)
717 // Next option if we were previously playing
719 selected
= (selected
+ 1) % OPTS
;
723 LED(selected
+ 1, 0);
725 // Begin transmitting
729 DbpString("Playing");
730 // wait for button to be released
731 while(BUTTON_PRESS())
733 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]);
734 CmdHIDsimTAG(high
[selected
], low
[selected
], 0);
735 DbpString("Done playing");
736 if (BUTTON_HELD(1000) > 0)
738 DbpString("Exiting");
743 /* We pressed a button so ignore it here with a delay */
746 // when done, we're done playing, move to next option
747 selected
= (selected
+ 1) % OPTS
;
750 LED(selected
+ 1, 0);
753 while(BUTTON_PRESS())
762 Listen and detect an external reader. Determine the best location
766 Inside the ListenReaderField() function, there is two mode.
767 By default, when you call the function, you will enter mode 1.
768 If you press the PM3 button one time, you will enter mode 2.
769 If you press the PM3 button a second time, you will exit the function.
771 DESCRIPTION OF MODE 1:
772 This mode just listens for an external reader field and lights up green
773 for HF and/or red for LF. This is the original mode of the detectreader
776 DESCRIPTION OF MODE 2:
777 This mode will visually represent, using the LEDs, the actual strength of the
778 current compared to the maximum current detected. Basically, once you know
779 what kind of external reader is present, it will help you spot the best location to place
780 your antenna. You will probably not get some good results if there is a LF and a HF reader
781 at the same place! :-)
785 static const char LIGHT_SCHEME
[] = {
786 0x0, /* ---- | No field detected */
787 0x1, /* X--- | 14% of maximum current detected */
788 0x2, /* -X-- | 29% of maximum current detected */
789 0x4, /* --X- | 43% of maximum current detected */
790 0x8, /* ---X | 57% of maximum current detected */
791 0xC, /* --XX | 71% of maximum current detected */
792 0xE, /* -XXX | 86% of maximum current detected */
793 0xF, /* XXXX | 100% of maximum current detected */
795 static const int LIGHT_LEN
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]);
797 void ListenReaderField(int limit
)
799 int lf_av
, lf_av_new
, lf_baseline
= 0, lf_max
;
800 int hf_av
, hf_av_new
, hf_baseline
= 0, hf_max
;
801 int mode
=1, display_val
, display_max
, i
;
805 #define REPORT_CHANGE 10 // report new values only if they have changed at least by REPORT_CHANGE
808 // switch off FPGA - we don't want to measure our own signal
809 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
810 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
814 lf_av
= lf_max
= AvgAdc(ADC_CHAN_LF
);
816 if(limit
!= HF_ONLY
) {
817 Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE
* lf_av
) >> 10);
821 hf_av
= hf_max
= AvgAdc(ADC_CHAN_HF
);
823 if (limit
!= LF_ONLY
) {
824 Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE
* hf_av
) >> 10);
829 if (BUTTON_PRESS()) {
834 DbpString("Signal Strength Mode");
838 DbpString("Stopped");
846 if (limit
!= HF_ONLY
) {
848 if (abs(lf_av
- lf_baseline
) > REPORT_CHANGE
)
854 lf_av_new
= AvgAdc(ADC_CHAN_LF
);
855 // see if there's a significant change
856 if(abs(lf_av
- lf_av_new
) > REPORT_CHANGE
) {
857 Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE
* lf_av_new
) >> 10);
864 if (limit
!= LF_ONLY
) {
866 if (abs(hf_av
- hf_baseline
) > REPORT_CHANGE
)
872 hf_av_new
= AvgAdc(ADC_CHAN_HF
);
873 // see if there's a significant change
874 if(abs(hf_av
- hf_av_new
) > REPORT_CHANGE
) {
875 Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE
* hf_av_new
) >> 10);
883 if (limit
== LF_ONLY
) {
885 display_max
= lf_max
;
886 } else if (limit
== HF_ONLY
) {
888 display_max
= hf_max
;
889 } else { /* Pick one at random */
890 if( (hf_max
- hf_baseline
) > (lf_max
- lf_baseline
) ) {
892 display_max
= hf_max
;
895 display_max
= lf_max
;
898 for (i
=0; i
<LIGHT_LEN
; i
++) {
899 if (display_val
>= ((display_max
/LIGHT_LEN
)*i
) && display_val
<= ((display_max
/LIGHT_LEN
)*(i
+1))) {
900 if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF();
901 if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF();
902 if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF();
903 if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF();
911 void UsbPacketReceived(uint8_t *packet
, int len
)
913 UsbCommand
*c
= (UsbCommand
*)packet
;
915 //Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d",len,c->cmd,c->arg[0],c->arg[1],c->arg[2]);
919 case CMD_SET_LF_SAMPLING_CONFIG
:
920 setSamplingConfig((sample_config
*) c
->d
.asBytes
);
922 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
:
923 cmd_send(CMD_ACK
,SampleLF(c
->arg
[0]),0,0,0,0);
925 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
:
926 ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
928 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
:
929 cmd_send(CMD_ACK
,SnoopLF(),0,0,0,0);
931 case CMD_HID_DEMOD_FSK
:
932 CmdHIDdemodFSK(c
->arg
[0], 0, 0, 1);
934 case CMD_HID_SIM_TAG
:
935 CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1);
937 case CMD_FSK_SIM_TAG
:
938 CmdFSKsimTAG(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
940 case CMD_ASK_SIM_TAG
:
941 CmdASKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
943 case CMD_PSK_SIM_TAG
:
944 CmdPSKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
946 case CMD_HID_CLONE_TAG
:
947 CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]);
949 case CMD_IO_DEMOD_FSK
:
950 CmdIOdemodFSK(c
->arg
[0], 0, 0, 1);
952 case CMD_IO_CLONE_TAG
:
953 CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]);
955 case CMD_EM410X_DEMOD
:
956 CmdEM410xdemod(c
->arg
[0], 0, 0, 1);
958 case CMD_EM410X_WRITE_TAG
:
959 WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
961 case CMD_READ_TI_TYPE
:
964 case CMD_WRITE_TI_TYPE
:
965 WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]);
967 case CMD_SIMULATE_TAG_125K
:
969 SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1);
972 case CMD_LF_SIMULATE_BIDIR
:
973 SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]);
975 case CMD_INDALA_CLONE_TAG
:
976 CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);
978 case CMD_INDALA_CLONE_TAG_L
:
979 CopyIndala224toT55x7(c
->d
.asDwords
[0], c
->d
.asDwords
[1], c
->d
.asDwords
[2], c
->d
.asDwords
[3], c
->d
.asDwords
[4], c
->d
.asDwords
[5], c
->d
.asDwords
[6]);
981 case CMD_T55XX_READ_BLOCK
:
982 T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]);
984 case CMD_T55XX_WRITE_BLOCK
:
985 T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]);
986 cmd_send(CMD_ACK
,0,0,0,0,0);
988 case CMD_T55XX_READ_TRACE
:
991 case CMD_PCF7931_READ
:
993 cmd_send(CMD_ACK
,0,0,0,0,0);
995 case CMD_PCF7931_WRITE
:
996 WritePCF7931(c
->d
.asDwords
[0],c
->d
.asDwords
[1],c
->d
.asDwords
[2],c
->d
.asDwords
[3],c
->d
.asDwords
[4],c
->d
.asDwords
[5],c
->d
.asDwords
[6], c
->d
.asDwords
[9], c
->d
.asDwords
[7]-128,c
->d
.asDwords
[8]-128, c
->arg
[0], c
->arg
[1], c
->arg
[2]);
998 case CMD_EM4X_READ_WORD
:
999 EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]);
1001 case CMD_EM4X_WRITE_WORD
:
1002 EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]);
1004 case CMD_AWID_DEMOD_FSK
: // Set realtime AWID demodulation
1005 CmdAWIDdemodFSK(c
->arg
[0], 0, 0, 1);
1007 case CMD_VIKING_CLONE_TAG
:
1008 CopyViKingtoT55x7(c
->arg
[0],c
->arg
[1]);
1015 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type
1016 SnoopHitag(c
->arg
[0]);
1018 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content
1019 SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
);
1021 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function
1022 ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
);
1026 #ifdef WITH_ISO15693
1027 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
:
1028 AcquireRawAdcSamplesIso15693();
1030 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
:
1031 RecordRawAdcSamplesIso15693();
1034 case CMD_ISO_15693_COMMAND
:
1035 DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
1038 case CMD_ISO_15693_FIND_AFI
:
1039 BruteforceIso15693Afi(c
->arg
[0]);
1042 case CMD_ISO_15693_DEBUG
:
1043 SetDebugIso15693(c
->arg
[0]);
1046 case CMD_READER_ISO_15693
:
1047 ReaderIso15693(c
->arg
[0]);
1049 case CMD_SIMTAG_ISO_15693
:
1050 SimTagIso15693(c
->arg
[0], c
->d
.asBytes
);
1055 case CMD_SIMULATE_TAG_LEGIC_RF
:
1056 LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
1059 case CMD_WRITER_LEGIC_RF
:
1060 LegicRfWriter(c
->arg
[1], c
->arg
[0]);
1063 case CMD_READER_LEGIC_RF
:
1064 LegicRfReader(c
->arg
[0], c
->arg
[1]);
1068 #ifdef WITH_ISO14443b
1069 case CMD_READ_SRI512_TAG
:
1070 ReadSTMemoryIso14443b(0x0F);
1072 case CMD_READ_SRIX4K_TAG
:
1073 ReadSTMemoryIso14443b(0x7F);
1075 case CMD_SNOOP_ISO_14443B
:
1078 case CMD_SIMULATE_TAG_ISO_14443B
:
1079 SimulateIso14443bTag();
1081 case CMD_ISO_14443B_COMMAND
:
1082 SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
1086 #ifdef WITH_ISO14443a
1087 case CMD_SNOOP_ISO_14443a
:
1088 SniffIso14443a(c
->arg
[0]);
1090 case CMD_READER_ISO_14443a
:
1093 case CMD_SIMULATE_TAG_ISO_14443a
:
1094 SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); // ## Simulate iso14443a tag - pass tag type & UID
1097 case CMD_EPA_PACE_COLLECT_NONCE
:
1098 EPA_PACE_Collect_Nonce(c
);
1100 case CMD_EPA_PACE_REPLAY
:
1104 case CMD_READER_MIFARE
:
1105 ReaderMifare(c
->arg
[0]);
1107 case CMD_MIFARE_READBL
:
1108 MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1110 case CMD_MIFAREU_READBL
:
1111 MifareUReadBlock(c
->arg
[0],c
->arg
[1], c
->d
.asBytes
);
1113 case CMD_MIFAREUC_AUTH
:
1114 MifareUC_Auth(c
->arg
[0],c
->d
.asBytes
);
1116 case CMD_MIFAREU_READCARD
:
1117 MifareUReadCard(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1119 case CMD_MIFAREUC_SETPWD
:
1120 MifareUSetPwd(c
->arg
[0], c
->d
.asBytes
);
1122 case CMD_MIFARE_READSC
:
1123 MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1125 case CMD_MIFARE_WRITEBL
:
1126 MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1128 //case CMD_MIFAREU_WRITEBL_COMPAT:
1129 //MifareUWriteBlockCompat(c->arg[0], c->d.asBytes);
1131 case CMD_MIFAREU_WRITEBL
:
1132 MifareUWriteBlock(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
);
1134 case CMD_MIFARE_NESTED
:
1135 MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1137 case CMD_MIFARE_CHKKEYS
:
1138 MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1140 case CMD_SIMULATE_MIFARE_CARD
:
1141 Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1145 case CMD_MIFARE_SET_DBGMODE
:
1146 MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1148 case CMD_MIFARE_EML_MEMCLR
:
1149 MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1151 case CMD_MIFARE_EML_MEMSET
:
1152 MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1154 case CMD_MIFARE_EML_MEMGET
:
1155 MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1157 case CMD_MIFARE_EML_CARDLOAD
:
1158 MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1161 // Work with "magic Chinese" card
1162 case CMD_MIFARE_CSETBLOCK
:
1163 MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1165 case CMD_MIFARE_CGETBLOCK
:
1166 MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1168 case CMD_MIFARE_CIDENT
:
1173 case CMD_MIFARE_SNIFFER
:
1174 SniffMifare(c
->arg
[0]);
1178 case CMD_MIFARE_DESFIRE_READBL
: break;
1179 case CMD_MIFARE_DESFIRE_WRITEBL
: break;
1180 case CMD_MIFARE_DESFIRE_AUTH1
:
1181 MifareDES_Auth1(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1183 case CMD_MIFARE_DESFIRE_AUTH2
:
1184 //MifareDES_Auth2(c->arg[0],c->d.asBytes);
1186 case CMD_MIFARE_DES_READER
:
1187 //readermifaredes(c->arg[0], c->arg[1], c->d.asBytes);
1189 case CMD_MIFARE_DESFIRE_INFO
:
1190 MifareDesfireGetInformation();
1192 case CMD_MIFARE_DESFIRE
:
1193 MifareSendCommand(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
);
1196 case CMD_MIFARE_COLLECT_NONCES
:
1197 MifareCollectNonces(c
->arg
[0], c
->arg
[1]);
1202 // Makes use of ISO14443a FPGA Firmware
1203 case CMD_SNOOP_ICLASS
:
1206 case CMD_SIMULATE_TAG_ICLASS
:
1207 SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1209 case CMD_READER_ICLASS
:
1210 ReaderIClass(c
->arg
[0]);
1212 case CMD_READER_ICLASS_REPLAY
:
1213 ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
);
1215 case CMD_ICLASS_EML_MEMSET
:
1216 emlSet(c
->d
.asBytes
,c
->arg
[0], c
->arg
[1]);
1218 case CMD_ICLASS_WRITEBLOCK
:
1219 iClass_WriteBlock(c
->arg
[0], c
->d
.asBytes
);
1221 case CMD_ICLASS_READCHECK
: // auth step 1
1222 iClass_ReadCheck(c
->arg
[0], c
->arg
[1]);
1224 case CMD_ICLASS_READBLOCK
:
1225 iClass_ReadBlk(c
->arg
[0]);
1227 case CMD_ICLASS_AUTHENTICATION
: //check
1228 iClass_Authentication(c
->d
.asBytes
);
1230 case CMD_ICLASS_DUMP
:
1231 iClass_Dump(c
->arg
[0], c
->arg
[1]);
1233 case CMD_ICLASS_CLONE
:
1234 iClass_Clone(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
);
1238 case CMD_BUFF_CLEAR
:
1242 case CMD_MEASURE_ANTENNA_TUNING
:
1243 MeasureAntennaTuning();
1246 case CMD_MEASURE_ANTENNA_TUNING_HF
:
1247 MeasureAntennaTuningHf();
1250 case CMD_LISTEN_READER_FIELD
:
1251 ListenReaderField(c
->arg
[0]);
1254 case CMD_FPGA_MAJOR_MODE_OFF
: // ## FPGA Control
1255 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
1257 LED_D_OFF(); // LED D indicates field ON or OFF
1260 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
:
1263 uint8_t *BigBuf
= BigBuf_get_addr();
1265 for(size_t i
=0; i
<c
->arg
[1]; i
+= USB_CMD_DATA_SIZE
) {
1266 len
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
);
1267 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,BigBuf_get_traceLen(),BigBuf
+c
->arg
[0]+i
,len
);
1269 // Trigger a finish downloading signal with an ACK frame
1270 cmd_send(CMD_ACK
,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config
));
1274 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: {
1275 uint8_t *b
= BigBuf_get_addr();
1276 memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
);
1277 cmd_send(CMD_ACK
,0,0,0,0,0);
1284 case CMD_SET_LF_DIVISOR
:
1285 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
);
1286 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]);
1289 case CMD_SET_ADC_MUX
:
1291 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break;
1292 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break;
1293 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break;
1294 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break;
1305 cmd_send(CMD_ACK
,0,0,0,0,0);
1315 case CMD_SETUP_WRITE
:
1316 case CMD_FINISH_WRITE
:
1317 case CMD_HARDWARE_RESET
:
1320 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
1322 // We're going to reset, and the bootrom will take control.
1326 case CMD_START_FLASH
:
1327 if(common_area
.flags
.bootrom_present
) {
1328 common_area
.command
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
;
1331 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
1335 case CMD_DEVICE_INFO
: {
1336 uint32_t dev_info
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
;
1337 if(common_area
.flags
.bootrom_present
) dev_info
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
;
1338 cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);
1342 Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
);
1347 void __attribute__((noreturn
)) AppMain(void)
1351 if(common_area
.magic
!= COMMON_AREA_MAGIC
|| common_area
.version
!= 1) {
1352 /* Initialize common area */
1353 memset(&common_area
, 0, sizeof(common_area
));
1354 common_area
.magic
= COMMON_AREA_MAGIC
;
1355 common_area
.version
= 1;
1357 common_area
.flags
.osimage_present
= 1;
1367 // The FPGA gets its clock from us from PCK0 output, so set that up.
1368 AT91C_BASE_PIOA
->PIO_BSR
= GPIO_PCK0
;
1369 AT91C_BASE_PIOA
->PIO_PDR
= GPIO_PCK0
;
1370 AT91C_BASE_PMC
->PMC_SCER
= AT91C_PMC_PCK0
;
1371 // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz
1372 AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK
|
1373 AT91C_PMC_PRES_CLK_4
;
1374 AT91C_BASE_PIOA
->PIO_OER
= GPIO_PCK0
;
1377 AT91C_BASE_SPI
->SPI_CR
= AT91C_SPI_SWRST
;
1379 AT91C_BASE_SSC
->SSC_CR
= AT91C_SSC_SWRST
;
1381 // Load the FPGA image, which we have stored in our flash.
1382 // (the HF version by default)
1383 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
1391 byte_t rx
[sizeof(UsbCommand
)];
1396 rx_len
= usb_read(rx
,sizeof(UsbCommand
));
1398 UsbPacketReceived(rx
,rx_len
);
1404 #ifndef WITH_ISO14443a_StandAlone
1405 if (BUTTON_HELD(1000) > 0)
1409 #ifdef WITH_ISO14443a
1410 #ifdef WITH_ISO14443a_StandAlone
1411 if (BUTTON_HELD(1000) > 0)
1412 StandAloneMode14a();