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"
27 #include "lfsampling.h"
29 #include "mifareutil.h"
35 // Craig Young - 14a stand-alone code
36 #ifdef WITH_ISO14443a_StandAlone
37 #include "iso14443a.h"
40 #define abs(x) ( ((x)<0) ? -(x) : (x) )
42 //=============================================================================
43 // A buffer where we can queue things up to be sent through the FPGA, for
44 // any purpose (fake tag, as reader, whatever). We go MSB first, since that
45 // is the order in which they go out on the wire.
46 //=============================================================================
48 #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
49 uint8_t ToSend
[TOSEND_BUFFER_SIZE
];
52 struct common_area common_area
__attribute__((section(".commonarea")));
54 void ToSendReset(void)
60 void ToSendStuffBit(int b
)
64 ToSend
[ToSendMax
] = 0;
69 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
));
74 if(ToSendMax
>= sizeof(ToSend
)) {
76 DbpString("ToSendStuffBit overflowed!");
80 //=============================================================================
81 // Debug print functions, to go out over USB, to the usual PC-side client.
82 //=============================================================================
84 void DbpString(char *str
)
86 byte_t len
= strlen(str
);
87 cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
);
91 void DbpIntegers(int x1
, int x2
, int x3
)
93 cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0);
97 void Dbprintf(const char *fmt
, ...) {
98 // should probably limit size here; oh well, let's just use a big buffer
99 char output_string
[128];
103 kvsprintf(fmt
, output_string
, 10, ap
);
106 DbpString(output_string
);
109 // prints HEX & ASCII
110 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) {
123 if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.';
126 Dbprintf("%-8s %*D",ascii
,l
,d
," ");
128 Dbprintf("%*D",l
,d
," ");
136 //-----------------------------------------------------------------------------
137 // Read an ADC channel and block till it completes, then return the result
138 // in ADC units (0 to 1023). Also a routine to average 32 samples and
140 //-----------------------------------------------------------------------------
141 static int ReadAdc(int ch
)
145 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_SWRST
;
146 AT91C_BASE_ADC
->ADC_MR
=
147 ADC_MODE_PRESCALE(63 /* was 32 */) | // ADC_CLK = MCK / ((63+1) * 2) = 48MHz / 128 = 375kHz
148 ADC_MODE_STARTUP_TIME(1 /* was 16 */) | // Startup Time = (1+1) * 8 / ADC_CLK = 16 / 375kHz = 42,7us Note: must be > 20us
149 ADC_MODE_SAMPLE_HOLD_TIME(15 /* was 8 */); // Sample & Hold Time SHTIM = 15 / ADC_CLK = 15 / 375kHz = 40us
151 // Note: ADC_MODE_PRESCALE and ADC_MODE_SAMPLE_HOLD_TIME are set to the maximum allowed value.
152 // 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
153 // of RC = 10MOhm * 12pF = 120us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged.
156 // 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
158 // v_cap = v_in * (1 - exp(-RC/SHTIM)) = v_in * (1 - exp(-3)) = v_in * 0,95 (i.e. an error of 5%)
160 // Note: with the "historic" values in the comments above, the error was 34% !!!
162 AT91C_BASE_ADC
->ADC_CHER
= ADC_CHANNEL(ch
);
164 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_START
;
166 while(!(AT91C_BASE_ADC
->ADC_SR
& ADC_END_OF_CONVERSION(ch
)))
168 d
= AT91C_BASE_ADC
->ADC_CDR
[ch
];
173 int AvgAdc(int ch
) // was static - merlok
178 for(i
= 0; i
< 32; i
++) {
182 return (a
+ 15) >> 5;
185 void MeasureAntennaTuningLfOnly(int *vLf125
, int *vLf134
, int *peakf
, int *peakv
, uint8_t LF_Results
[])
187 int i
, adcval
= 0, peak
= 0;
190 * Sweeps the useful LF range of the proxmark from
191 * 46.8kHz (divisor=255) to 600kHz (divisor=19) and
192 * read the voltage in the antenna, the result left
193 * in the buffer is a graph which should clearly show
194 * the resonating frequency of your LF antenna
195 * ( hopefully around 95 if it is tuned to 125kHz!)
198 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
);
199 FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC
| FPGA_LF_ADC_READER_FIELD
);
200 for (i
=255; i
>=19; i
--) {
202 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
);
204 adcval
= ((MAX_ADC_LF_VOLTAGE
* AvgAdc(ADC_CHAN_LF
)) >> 10);
205 if (i
==95) *vLf125
= adcval
; // voltage at 125Khz
206 if (i
==89) *vLf134
= adcval
; // voltage at 134Khz
208 LF_Results
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes
209 if(LF_Results
[i
] > peak
) {
211 peak
= LF_Results
[i
];
217 for (i
=18; i
>= 0; i
--) LF_Results
[i
] = 0;
222 void MeasureAntennaTuningHfOnly(int *vHf
)
224 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
226 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
227 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
229 *vHf
= (MAX_ADC_HF_VOLTAGE
* AvgAdc(ADC_CHAN_HF
)) >> 10;
235 void MeasureAntennaTuning(int mode
)
237 uint8_t LF_Results
[256] = {0};
238 int peakv
= 0, peakf
= 0;
239 int vLf125
= 0, vLf134
= 0, vHf
= 0; // in mV
243 if (((mode
& FLAG_TUNE_ALL
) == FLAG_TUNE_ALL
) && (FpgaGetCurrent() == FPGA_BITSTREAM_HF
)) {
244 // Reverse "standard" order if HF already loaded, to avoid unnecessary swap.
245 MeasureAntennaTuningHfOnly(&vHf
);
246 MeasureAntennaTuningLfOnly(&vLf125
, &vLf134
, &peakf
, &peakv
, LF_Results
);
248 if (mode
& FLAG_TUNE_LF
) {
249 MeasureAntennaTuningLfOnly(&vLf125
, &vLf134
, &peakf
, &peakv
, LF_Results
);
251 if (mode
& FLAG_TUNE_HF
) {
252 MeasureAntennaTuningHfOnly(&vHf
);
256 cmd_send(CMD_MEASURED_ANTENNA_TUNING
, vLf125
| (vLf134
<<16), vHf
, peakf
| (peakv
<<16), LF_Results
, 256);
257 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
262 void MeasureAntennaTuningHf(void)
264 int vHf
= 0; // in mV
266 DbpString("Measuring HF antenna, press button to exit");
268 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
269 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
270 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
274 vHf
= (MAX_ADC_HF_VOLTAGE
* AvgAdc(ADC_CHAN_HF
)) >> 10;
276 Dbprintf("%d mV",vHf
);
277 if (BUTTON_PRESS()) break;
279 DbpString("cancelled");
281 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
286 void ReadMem(int addr
)
288 const uint8_t *data
= ((uint8_t *)addr
);
290 Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x",
291 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]);
294 /* osimage version information is linked in */
295 extern struct version_information version_information
;
296 /* bootrom version information is pointed to from _bootphase1_version_pointer */
297 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
, _bootrom_start
, _bootrom_end
, __data_src_start__
;
298 void SendVersion(void)
300 char temp
[USB_CMD_DATA_SIZE
]; /* Limited data payload in USB packets */
301 char VersionString
[USB_CMD_DATA_SIZE
] = { '\0' };
303 /* Try to find the bootrom version information. Expect to find a pointer at
304 * symbol _bootphase1_version_pointer, perform slight sanity checks on the
305 * pointer, then use it.
307 char *bootrom_version
= *(char**)&_bootphase1_version_pointer
;
308 if( bootrom_version
< &_flash_start
|| bootrom_version
>= &_flash_end
) {
309 strcat(VersionString
, "bootrom version information appears invalid\n");
311 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
);
312 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
315 FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
);
316 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
318 FpgaGatherVersion(FPGA_BITSTREAM_LF
, temp
, sizeof(temp
));
319 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
320 FpgaGatherVersion(FPGA_BITSTREAM_HF
, temp
, sizeof(temp
));
321 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1);
323 // Send Chip ID and used flash memory
324 uint32_t text_and_rodata_section_size
= (uint32_t)&__data_src_start__
- (uint32_t)&_flash_start
;
325 uint32_t compressed_data_section_size
= common_area
.arg1
;
326 cmd_send(CMD_ACK
, *(AT91C_DBGU_CIDR
), text_and_rodata_section_size
+ compressed_data_section_size
, 0, VersionString
, strlen(VersionString
));
329 // measure the USB Speed by sending SpeedTestBufferSize bytes to client and measuring the elapsed time.
330 // Note: this mimics GetFromBigbuf(), i.e. we have the overhead of the UsbCommand structure included.
331 void printUSBSpeed(void)
333 Dbprintf("USB Speed:");
334 Dbprintf(" Sending USB packets to client...");
336 #define USB_SPEED_TEST_MIN_TIME 1500 // in milliseconds
337 uint8_t *test_data
= BigBuf_get_addr();
340 uint32_t start_time
= end_time
= GetTickCount();
341 uint32_t bytes_transferred
= 0;
344 while(end_time
< start_time
+ USB_SPEED_TEST_MIN_TIME
) {
345 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
, 0, USB_CMD_DATA_SIZE
, 0, test_data
, USB_CMD_DATA_SIZE
);
346 end_time
= GetTickCount();
347 bytes_transferred
+= USB_CMD_DATA_SIZE
;
351 Dbprintf(" Time elapsed: %dms", end_time
- start_time
);
352 Dbprintf(" Bytes transferred: %d", bytes_transferred
);
353 Dbprintf(" USB Transfer Speed PM3 -> Client = %d Bytes/s",
354 1000 * bytes_transferred
/ (end_time
- start_time
));
359 * Prints runtime information about the PM3.
361 void SendStatus(void)
363 BigBuf_print_status();
365 printConfig(); //LF Sampling config
368 Dbprintf(" MF_DBGLEVEL......%d", MF_DBGLEVEL
);
369 Dbprintf(" ToSendMax........%d",ToSendMax
);
370 Dbprintf(" ToSendBit........%d",ToSendBit
);
372 cmd_send(CMD_ACK
,1,0,0,0,0);
375 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF)
379 void StandAloneMode()
381 DbpString("Stand-alone mode! No PC necessary.");
382 // Oooh pretty -- notify user we're in elite samy mode now
384 LED(LED_ORANGE
, 200);
386 LED(LED_ORANGE
, 200);
388 LED(LED_ORANGE
, 200);
390 LED(LED_ORANGE
, 200);
399 #ifdef WITH_ISO14443a_StandAlone
400 void StandAloneMode14a()
403 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
406 int playing
= 0, iGotoRecord
= 0, iGotoClone
= 0;
407 int cardRead
[OPTS
] = {0};
408 uint8_t readUID
[10] = {0};
409 uint32_t uid_1st
[OPTS
]={0};
410 uint32_t uid_2nd
[OPTS
]={0};
411 uint32_t uid_tmp1
= 0;
412 uint32_t uid_tmp2
= 0;
413 iso14a_card_select_t hi14a_card
[OPTS
];
415 LED(selected
+ 1, 0);
423 if (iGotoRecord
== 1 || cardRead
[selected
] == 0)
427 LED(selected
+ 1, 0);
431 Dbprintf("Enabling iso14443a reader mode for [Bank: %u]...", selected
);
432 /* need this delay to prevent catching some weird data */
434 /* Code for reading from 14a tag */
435 uint8_t uid
[10] ={0};
437 iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD
);
442 if (BUTTON_PRESS()) {
443 if (cardRead
[selected
]) {
444 Dbprintf("Button press detected -- replaying card in bank[%d]", selected
);
447 else if (cardRead
[(selected
+1)%OPTS
]) {
448 Dbprintf("Button press detected but no card in bank[%d] so playing from bank[%d]", selected
, (selected
+1)%OPTS
);
449 selected
= (selected
+1)%OPTS
;
450 break; // playing = 1;
453 Dbprintf("Button press detected but no stored tag to play. (Ignoring button)");
457 if (!iso14443a_select_card(uid
, &hi14a_card
[selected
], &cuid
))
461 Dbprintf("Read UID:"); Dbhexdump(10,uid
,0);
462 memcpy(readUID
,uid
,10*sizeof(uint8_t));
463 uint8_t *dst
= (uint8_t *)&uid_tmp1
;
464 // Set UID byte order
465 for (int i
=0; i
<4; i
++)
467 dst
= (uint8_t *)&uid_tmp2
;
468 for (int i
=0; i
<4; i
++)
470 if (uid_1st
[(selected
+1)%OPTS
] == uid_tmp1
&& uid_2nd
[(selected
+1)%OPTS
] == uid_tmp2
) {
471 Dbprintf("Card selected has same UID as what is stored in the other bank. Skipping.");
475 Dbprintf("Bank[%d] received a 7-byte UID",selected
);
476 uid_1st
[selected
] = (uid_tmp1
)>>8;
477 uid_2nd
[selected
] = (uid_tmp1
<<24) + (uid_tmp2
>>8);
480 Dbprintf("Bank[%d] received a 4-byte UID",selected
);
481 uid_1st
[selected
] = uid_tmp1
;
482 uid_2nd
[selected
] = uid_tmp2
;
488 Dbprintf("ATQA = %02X%02X",hi14a_card
[selected
].atqa
[0],hi14a_card
[selected
].atqa
[1]);
489 Dbprintf("SAK = %02X",hi14a_card
[selected
].sak
);
492 LED(LED_ORANGE
, 200);
494 LED(LED_ORANGE
, 200);
497 LED(selected
+ 1, 0);
499 // Next state is replay:
502 cardRead
[selected
] = 1;
504 /* MF Classic UID clone */
505 else if (iGotoClone
==1)
509 LED(selected
+ 1, 0);
510 LED(LED_ORANGE
, 250);
514 Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected
, uid_1st
[selected
]);
516 // wait for button to be released
517 while(BUTTON_PRESS())
519 // Delay cloning until card is in place
522 Dbprintf("Starting clone. [Bank: %u]", selected
);
523 // need this delay to prevent catching some weird data
525 // Begin clone function here:
526 /* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards:
527 UsbCommand c = {CMD_MIFARE_CSETBLOCK, {wantWipe, params & (0xFE | (uid == NULL ? 0:1)), blockNo}};
528 memcpy(c.d.asBytes, data, 16);
531 Block read is similar:
532 UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, 0, blockNo}};
533 We need to imitate that call with blockNo 0 to set a uid.
535 The get and set commands are handled in this file:
536 // Work with "magic Chinese" card
537 case CMD_MIFARE_CSETBLOCK:
538 MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
540 case CMD_MIFARE_CGETBLOCK:
541 MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
544 mfCSetUID provides example logic for UID set workflow:
545 -Read block0 from card in field with MifareCGetBlock()
546 -Configure new values without replacing reserved bytes
547 memcpy(block0, uid, 4); // Copy UID bytes from byte array
549 block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5
550 Bytes 5-7 are reserved SAK and ATQA for mifare classic
551 -Use mfCSetBlock(0, block0, oldUID, wantWipe, CSETBLOCK_SINGLE_OPER) to write it
553 uint8_t oldBlock0
[16] = {0}, newBlock0
[16] = {0}, testBlock0
[16] = {0};
554 // arg0 = Flags == CSETBLOCK_SINGLE_OPER=0x1F, arg1=returnSlot, arg2=blockNo
555 MifareCGetBlock(0x3F, 1, 0, oldBlock0
);
556 if (oldBlock0
[0] == 0 && oldBlock0
[0] == oldBlock0
[1] && oldBlock0
[1] == oldBlock0
[2] && oldBlock0
[2] == oldBlock0
[3]) {
557 Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected
);
561 Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0
[0],oldBlock0
[1],oldBlock0
[2],oldBlock0
[3]);
562 memcpy(newBlock0
,oldBlock0
,16);
563 // Copy uid_1st for bank (2nd is for longer UIDs not supported if classic)
565 newBlock0
[0] = uid_1st
[selected
]>>24;
566 newBlock0
[1] = 0xFF & (uid_1st
[selected
]>>16);
567 newBlock0
[2] = 0xFF & (uid_1st
[selected
]>>8);
568 newBlock0
[3] = 0xFF & (uid_1st
[selected
]);
569 newBlock0
[4] = newBlock0
[0]^newBlock0
[1]^newBlock0
[2]^newBlock0
[3];
570 // arg0 = needWipe, arg1 = workFlags, arg2 = blockNo, datain
571 MifareCSetBlock(0, 0xFF,0, newBlock0
);
572 MifareCGetBlock(0x3F, 1, 0, testBlock0
);
573 if (memcmp(testBlock0
,newBlock0
,16)==0)
575 DbpString("Cloned successfull!");
576 cardRead
[selected
] = 0; // Only if the card was cloned successfully should we clear it
579 selected
= (selected
+1) % OPTS
;
582 Dbprintf("Clone failed. Back to replay mode on bank[%d]", selected
);
587 LED(selected
+ 1, 0);
590 // Change where to record (or begin playing)
591 else if (playing
==1) // button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected])
594 LED(selected
+ 1, 0);
596 // Begin transmitting
600 DbpString("Playing");
603 int button_action
= BUTTON_HELD(1000);
604 if (button_action
== 0) { // No button action, proceed with sim
605 uint8_t data
[512] = {0}; // in case there is a read command received we shouldn't break
606 Dbprintf("Simulating ISO14443a tag with uid[0]: %08x, uid[1]: %08x [Bank: %u]", uid_1st
[selected
],uid_2nd
[selected
],selected
);
607 if (hi14a_card
[selected
].sak
== 8 && hi14a_card
[selected
].atqa
[0] == 4 && hi14a_card
[selected
].atqa
[1] == 0) {
608 DbpString("Mifare Classic");
609 SimulateIso14443aTag(1,uid_1st
[selected
], uid_2nd
[selected
], data
); // Mifare Classic
611 else if (hi14a_card
[selected
].sak
== 0 && hi14a_card
[selected
].atqa
[0] == 0x44 && hi14a_card
[selected
].atqa
[1] == 0) {
612 DbpString("Mifare Ultralight");
613 SimulateIso14443aTag(2,uid_1st
[selected
],uid_2nd
[selected
],data
); // Mifare Ultralight
615 else if (hi14a_card
[selected
].sak
== 20 && hi14a_card
[selected
].atqa
[0] == 0x44 && hi14a_card
[selected
].atqa
[1] == 3) {
616 DbpString("Mifare DESFire");
617 SimulateIso14443aTag(3,uid_1st
[selected
],uid_2nd
[selected
],data
); // Mifare DESFire
620 Dbprintf("Unrecognized tag type -- defaulting to Mifare Classic emulation");
621 SimulateIso14443aTag(1,uid_1st
[selected
], uid_2nd
[selected
], data
);
624 else if (button_action
== BUTTON_SINGLE_CLICK
) {
625 selected
= (selected
+ 1) % OPTS
;
626 Dbprintf("Done playing. Switching to record mode on bank %d",selected
);
630 else if (button_action
== BUTTON_HOLD
) {
631 Dbprintf("Playtime over. Begin cloning...");
638 /* We pressed a button so ignore it here with a delay */
641 LED(selected
+ 1, 0);
644 while(BUTTON_PRESS())
650 // samy's sniff and repeat routine
654 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
);
656 int high
[OPTS
], low
[OPTS
];
661 // Turn on selected LED
662 LED(selected
+ 1, 0);
669 // Was our button held down or pressed?
670 int button_pressed
= BUTTON_HELD(1000);
673 // Button was held for a second, begin recording
674 if (button_pressed
> 0 && cardRead
== 0)
677 LED(selected
+ 1, 0);
681 DbpString("Starting recording");
683 // wait for button to be released
684 while(BUTTON_PRESS())
687 /* need this delay to prevent catching some weird data */
690 CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0);
691 Dbprintf("Recorded %x %x%08x", selected
, high
[selected
], low
[selected
]);
694 LED(selected
+ 1, 0);
695 // Finished recording
697 // If we were previously playing, set playing off
698 // so next button push begins playing what we recorded
705 else if (button_pressed
> 0 && cardRead
== 1)
708 LED(selected
+ 1, 0);
712 Dbprintf("Cloning %x %x%08x", selected
, high
[selected
], low
[selected
]);
714 // wait for button to be released
715 while(BUTTON_PRESS())
718 /* need this delay to prevent catching some weird data */
721 CopyHIDtoT55x7(0, high
[selected
], low
[selected
], 0);
722 Dbprintf("Cloned %x %x%08x", selected
, high
[selected
], low
[selected
]);
725 LED(selected
+ 1, 0);
726 // Finished recording
728 // If we were previously playing, set playing off
729 // so next button push begins playing what we recorded
736 // Change where to record (or begin playing)
737 else if (button_pressed
)
739 // Next option if we were previously playing
741 selected
= (selected
+ 1) % OPTS
;
745 LED(selected
+ 1, 0);
747 // Begin transmitting
751 DbpString("Playing");
752 // wait for button to be released
753 while(BUTTON_PRESS())
755 Dbprintf("%x %x%08x", selected
, high
[selected
], low
[selected
]);
756 CmdHIDsimTAG(high
[selected
], low
[selected
], 0);
757 DbpString("Done playing");
758 if (BUTTON_HELD(1000) > 0)
760 DbpString("Exiting");
765 /* We pressed a button so ignore it here with a delay */
768 // when done, we're done playing, move to next option
769 selected
= (selected
+ 1) % OPTS
;
772 LED(selected
+ 1, 0);
775 while(BUTTON_PRESS())
784 Listen and detect an external reader. Determine the best location
788 Inside the ListenReaderField() function, there is two mode.
789 By default, when you call the function, you will enter mode 1.
790 If you press the PM3 button one time, you will enter mode 2.
791 If you press the PM3 button a second time, you will exit the function.
793 DESCRIPTION OF MODE 1:
794 This mode just listens for an external reader field and lights up green
795 for HF and/or red for LF. This is the original mode of the detectreader
798 DESCRIPTION OF MODE 2:
799 This mode will visually represent, using the LEDs, the actual strength of the
800 current compared to the maximum current detected. Basically, once you know
801 what kind of external reader is present, it will help you spot the best location to place
802 your antenna. You will probably not get some good results if there is a LF and a HF reader
803 at the same place! :-)
807 static const char LIGHT_SCHEME
[] = {
808 0x0, /* ---- | No field detected */
809 0x1, /* X--- | 14% of maximum current detected */
810 0x2, /* -X-- | 29% of maximum current detected */
811 0x4, /* --X- | 43% of maximum current detected */
812 0x8, /* ---X | 57% of maximum current detected */
813 0xC, /* --XX | 71% of maximum current detected */
814 0xE, /* -XXX | 86% of maximum current detected */
815 0xF, /* XXXX | 100% of maximum current detected */
817 static const int LIGHT_LEN
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]);
819 void ListenReaderField(int limit
)
821 int lf_av
, lf_av_new
, lf_baseline
= 0, lf_max
;
822 int hf_av
, hf_av_new
, hf_baseline
= 0, hf_max
;
823 int mode
=1, display_val
, display_max
, i
;
827 #define REPORT_CHANGE 10 // report new values only if they have changed at least by REPORT_CHANGE
830 // switch off FPGA - we don't want to measure our own signal
831 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
832 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
836 lf_av
= lf_max
= AvgAdc(ADC_CHAN_LF
);
838 if(limit
!= HF_ONLY
) {
839 Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE
* lf_av
) >> 10);
843 hf_av
= hf_max
= AvgAdc(ADC_CHAN_HF
);
845 if (limit
!= LF_ONLY
) {
846 Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE
* hf_av
) >> 10);
851 if (BUTTON_PRESS()) {
856 DbpString("Signal Strength Mode");
860 DbpString("Stopped");
868 if (limit
!= HF_ONLY
) {
870 if (abs(lf_av
- lf_baseline
) > REPORT_CHANGE
)
876 lf_av_new
= AvgAdc(ADC_CHAN_LF
);
877 // see if there's a significant change
878 if(abs(lf_av
- lf_av_new
) > REPORT_CHANGE
) {
879 Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE
* lf_av_new
) >> 10);
886 if (limit
!= LF_ONLY
) {
888 if (abs(hf_av
- hf_baseline
) > REPORT_CHANGE
)
894 hf_av_new
= AvgAdc(ADC_CHAN_HF
);
895 // see if there's a significant change
896 if(abs(hf_av
- hf_av_new
) > REPORT_CHANGE
) {
897 Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE
* hf_av_new
) >> 10);
905 if (limit
== LF_ONLY
) {
907 display_max
= lf_max
;
908 } else if (limit
== HF_ONLY
) {
910 display_max
= hf_max
;
911 } else { /* Pick one at random */
912 if( (hf_max
- hf_baseline
) > (lf_max
- lf_baseline
) ) {
914 display_max
= hf_max
;
917 display_max
= lf_max
;
920 for (i
=0; i
<LIGHT_LEN
; i
++) {
921 if (display_val
>= ((display_max
/LIGHT_LEN
)*i
) && display_val
<= ((display_max
/LIGHT_LEN
)*(i
+1))) {
922 if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF();
923 if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF();
924 if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF();
925 if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF();
933 void UsbPacketReceived(uint8_t *packet
, int len
)
935 UsbCommand
*c
= (UsbCommand
*)packet
;
937 // 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]);
941 case CMD_SET_LF_SAMPLING_CONFIG
:
942 setSamplingConfig((sample_config
*) c
->d
.asBytes
);
944 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
:
945 cmd_send(CMD_ACK
,SampleLF(c
->arg
[0]),0,0,0,0);
947 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
:
948 ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
950 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
:
951 cmd_send(CMD_ACK
,SnoopLF(),0,0,0,0);
953 case CMD_HID_DEMOD_FSK
:
954 CmdHIDdemodFSK(c
->arg
[0], 0, 0, 1);
956 case CMD_HID_SIM_TAG
:
957 CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1);
959 case CMD_FSK_SIM_TAG
:
960 CmdFSKsimTAG(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
962 case CMD_ASK_SIM_TAG
:
963 CmdASKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
965 case CMD_PSK_SIM_TAG
:
966 CmdPSKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
968 case CMD_HID_CLONE_TAG
:
969 CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]);
971 case CMD_IO_DEMOD_FSK
:
972 CmdIOdemodFSK(c
->arg
[0], 0, 0, 1);
974 case CMD_IO_CLONE_TAG
:
975 CopyIOtoT55x7(c
->arg
[0], c
->arg
[1]);
977 case CMD_EM410X_DEMOD
:
978 CmdEM410xdemod(c
->arg
[0], 0, 0, 1);
980 case CMD_EM410X_WRITE_TAG
:
981 WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
983 case CMD_READ_TI_TYPE
:
986 case CMD_WRITE_TI_TYPE
:
987 WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]);
989 case CMD_SIMULATE_TAG_125K
:
991 SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1);
994 case CMD_LF_SIMULATE_BIDIR
:
995 SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]);
997 case CMD_INDALA_CLONE_TAG
:
998 CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);
1000 case CMD_INDALA_CLONE_TAG_L
:
1001 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]);
1003 case CMD_T55XX_READ_BLOCK
:
1004 T55xxReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
1006 case CMD_T55XX_WRITE_BLOCK
:
1007 T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]);
1009 case CMD_T55XX_WAKEUP
:
1010 T55xxWakeUp(c
->arg
[0]);
1012 case CMD_T55XX_RESET_READ
:
1015 case CMD_PCF7931_READ
:
1018 case CMD_PCF7931_WRITE
:
1019 WritePCF7931(c
->d
.asBytes
[0],c
->d
.asBytes
[1],c
->d
.asBytes
[2],c
->d
.asBytes
[3],c
->d
.asBytes
[4],c
->d
.asBytes
[5],c
->d
.asBytes
[6], c
->d
.asBytes
[9], c
->d
.asBytes
[7]-128,c
->d
.asBytes
[8]-128, c
->arg
[0], c
->arg
[1], c
->arg
[2]);
1021 case CMD_EM4X_READ_WORD
:
1022 EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]);
1024 case CMD_EM4X_WRITE_WORD
:
1025 EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]);
1027 case CMD_AWID_DEMOD_FSK
: // Set realtime AWID demodulation
1028 CmdAWIDdemodFSK(c
->arg
[0], 0, 0, 1);
1030 case CMD_VIKING_CLONE_TAG
:
1031 CopyVikingtoT55xx(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
1036 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type
1037 SnoopHitag(c
->arg
[0]);
1039 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content
1040 SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
);
1042 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function
1043 ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
);
1045 case CMD_SIMULATE_HITAG_S
:// Simulate Hitag s tag, args = memory content
1046 SimulateHitagSTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
);
1048 case CMD_TEST_HITAGS_TRACES
:// Tests every challenge within the given file
1049 check_challenges((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
);
1051 case CMD_READ_HITAG_S
://Reader for only Hitag S tags, args = key or challenge
1052 ReadHitagS((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
);
1054 case CMD_WR_HITAG_S
://writer for Hitag tags args=data to write,page and key or challenge
1055 WritePageHitagS((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
,c
->arg
[2]);
1059 #ifdef WITH_ISO15693
1060 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
:
1061 AcquireRawAdcSamplesIso15693();
1063 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
:
1064 RecordRawAdcSamplesIso15693();
1067 case CMD_ISO_15693_COMMAND
:
1068 DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
1071 case CMD_ISO_15693_FIND_AFI
:
1072 BruteforceIso15693Afi(c
->arg
[0]);
1075 case CMD_ISO_15693_DEBUG
:
1076 SetDebugIso15693(c
->arg
[0]);
1079 case CMD_READER_ISO_15693
:
1080 ReaderIso15693(c
->arg
[0]);
1082 case CMD_SIMTAG_ISO_15693
:
1083 SimTagIso15693(c
->arg
[0], c
->d
.asBytes
);
1088 case CMD_SIMULATE_TAG_LEGIC_RF
:
1089 LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
1092 case CMD_WRITER_LEGIC_RF
:
1093 LegicRfWriter(c
->arg
[1], c
->arg
[0]);
1096 case CMD_READER_LEGIC_RF
:
1097 LegicRfReader(c
->arg
[0], c
->arg
[1]);
1101 #ifdef WITH_ISO14443b
1102 case CMD_READ_SRI512_TAG
:
1103 ReadSTMemoryIso14443b(0x0F);
1105 case CMD_READ_SRIX4K_TAG
:
1106 ReadSTMemoryIso14443b(0x7F);
1108 case CMD_SNOOP_ISO_14443B
:
1111 case CMD_SIMULATE_TAG_ISO_14443B
:
1112 SimulateIso14443bTag();
1114 case CMD_ISO_14443B_COMMAND
:
1115 SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
1119 #ifdef WITH_ISO14443a
1120 case CMD_SNOOP_ISO_14443a
:
1121 SnoopIso14443a(c
->arg
[0]);
1123 case CMD_READER_ISO_14443a
:
1126 case CMD_SIMULATE_TAG_ISO_14443a
:
1127 SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); // ## Simulate iso14443a tag - pass tag type & UID
1130 case CMD_EPA_PACE_COLLECT_NONCE
:
1131 EPA_PACE_Collect_Nonce(c
);
1133 case CMD_EPA_PACE_REPLAY
:
1137 case CMD_READER_MIFARE
:
1138 ReaderMifare(c
->arg
[0]);
1140 case CMD_MIFARE_READBL
:
1141 MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1143 case CMD_MIFAREU_READBL
:
1144 MifareUReadBlock(c
->arg
[0],c
->arg
[1], c
->d
.asBytes
);
1146 case CMD_MIFAREUC_AUTH
:
1147 MifareUC_Auth(c
->arg
[0],c
->d
.asBytes
);
1149 case CMD_MIFAREU_READCARD
:
1150 MifareUReadCard(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1152 case CMD_MIFAREUC_SETPWD
:
1153 MifareUSetPwd(c
->arg
[0], c
->d
.asBytes
);
1155 case CMD_MIFARE_READSC
:
1156 MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1158 case CMD_MIFARE_WRITEBL
:
1159 MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1161 //case CMD_MIFAREU_WRITEBL_COMPAT:
1162 //MifareUWriteBlockCompat(c->arg[0], c->d.asBytes);
1164 case CMD_MIFAREU_WRITEBL
:
1165 MifareUWriteBlock(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
);
1167 case CMD_MIFARE_NESTED
:
1168 MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1170 case CMD_MIFARE_CHKKEYS
:
1171 MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1173 case CMD_SIMULATE_MIFARE_CARD
:
1174 Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1178 case CMD_MIFARE_SET_DBGMODE
:
1179 MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1181 case CMD_MIFARE_EML_MEMCLR
:
1182 MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1184 case CMD_MIFARE_EML_MEMSET
:
1185 MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1187 case CMD_MIFARE_EML_MEMGET
:
1188 MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1190 case CMD_MIFARE_EML_CARDLOAD
:
1191 MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1194 // Work with "magic Chinese" card
1195 case CMD_MIFARE_CSETBLOCK
:
1196 MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1198 case CMD_MIFARE_CGETBLOCK
:
1199 MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1201 case CMD_MIFARE_CIDENT
:
1206 case CMD_MIFARE_SNIFFER
:
1207 SniffMifare(c
->arg
[0]);
1213 // Makes use of ISO14443a FPGA Firmware
1214 case CMD_SNOOP_ICLASS
:
1217 case CMD_SIMULATE_TAG_ICLASS
:
1218 SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
1220 case CMD_READER_ICLASS
:
1221 ReaderIClass(c
->arg
[0]);
1223 case CMD_READER_ICLASS_REPLAY
:
1224 ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
);
1226 case CMD_ICLASS_EML_MEMSET
:
1227 emlSet(c
->d
.asBytes
,c
->arg
[0], c
->arg
[1]);
1229 case CMD_ICLASS_WRITEBLOCK
:
1230 iClass_WriteBlock(c
->arg
[0], c
->d
.asBytes
);
1232 case CMD_ICLASS_READCHECK
: // auth step 1
1233 iClass_ReadCheck(c
->arg
[0], c
->arg
[1]);
1235 case CMD_ICLASS_READBLOCK
:
1236 iClass_ReadBlk(c
->arg
[0]);
1238 case CMD_ICLASS_AUTHENTICATION
: //check
1239 iClass_Authentication(c
->d
.asBytes
);
1241 case CMD_ICLASS_DUMP
:
1242 iClass_Dump(c
->arg
[0], c
->arg
[1]);
1244 case CMD_ICLASS_CLONE
:
1245 iClass_Clone(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
);
1249 case CMD_HF_SNIFFER
:
1250 HfSnoop(c
->arg
[0], c
->arg
[1]);
1254 case CMD_BUFF_CLEAR
:
1258 case CMD_MEASURE_ANTENNA_TUNING
:
1259 MeasureAntennaTuning(c
->arg
[0]);
1262 case CMD_MEASURE_ANTENNA_TUNING_HF
:
1263 MeasureAntennaTuningHf();
1266 case CMD_LISTEN_READER_FIELD
:
1267 ListenReaderField(c
->arg
[0]);
1270 case CMD_FPGA_MAJOR_MODE_OFF
: // ## FPGA Control
1271 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
1273 LED_D_OFF(); // LED D indicates field ON or OFF
1276 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
:
1279 uint8_t *BigBuf
= BigBuf_get_addr();
1280 for(size_t i
=0; i
<c
->arg
[1]; i
+= USB_CMD_DATA_SIZE
) {
1281 size_t len
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
);
1282 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,BigBuf_get_traceLen(),BigBuf
+c
->arg
[0]+i
,len
);
1284 // Trigger a finish downloading signal with an ACK frame
1285 cmd_send(CMD_ACK
,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config
));
1289 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: {
1290 uint8_t *b
= BigBuf_get_addr();
1291 memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
);
1292 cmd_send(CMD_ACK
,0,0,0,0,0);
1299 case CMD_SET_LF_DIVISOR
:
1300 FpgaDownloadAndGo(FPGA_BITSTREAM_LF
);
1301 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]);
1304 case CMD_SET_ADC_MUX
:
1306 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break;
1307 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break;
1308 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break;
1309 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break;
1320 cmd_send(CMD_ACK
,0,0,0,0,0);
1330 case CMD_SETUP_WRITE
:
1331 case CMD_FINISH_WRITE
:
1332 case CMD_HARDWARE_RESET
:
1336 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
1338 // We're going to reset, and the bootrom will take control.
1342 case CMD_START_FLASH
:
1343 if(common_area
.flags
.bootrom_present
) {
1344 common_area
.command
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
;
1347 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
1351 case CMD_DEVICE_INFO
: {
1352 uint32_t dev_info
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
;
1353 if(common_area
.flags
.bootrom_present
) dev_info
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
;
1354 cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);
1358 Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
);
1363 void __attribute__((noreturn
)) AppMain(void)
1367 if(common_area
.magic
!= COMMON_AREA_MAGIC
|| common_area
.version
!= 1) {
1368 /* Initialize common area */
1369 memset(&common_area
, 0, sizeof(common_area
));
1370 common_area
.magic
= COMMON_AREA_MAGIC
;
1371 common_area
.version
= 1;
1373 common_area
.flags
.osimage_present
= 1;
1383 // The FPGA gets its clock from us from PCK0 output, so set that up.
1384 AT91C_BASE_PIOA
->PIO_BSR
= GPIO_PCK0
;
1385 AT91C_BASE_PIOA
->PIO_PDR
= GPIO_PCK0
;
1386 AT91C_BASE_PMC
->PMC_SCER
= AT91C_PMC_PCK0
;
1387 // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz
1388 AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK
|
1389 AT91C_PMC_PRES_CLK_4
; // 4 for 24Mhz pck0, 2 for 48 MHZ pck0
1390 AT91C_BASE_PIOA
->PIO_OER
= GPIO_PCK0
;
1393 AT91C_BASE_SPI
->SPI_CR
= AT91C_SPI_SWRST
;
1395 AT91C_BASE_SSC
->SSC_CR
= AT91C_SSC_SWRST
;
1397 // Load the FPGA image, which we have stored in our flash.
1398 // (the HF version by default)
1399 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
);
1407 byte_t rx
[sizeof(UsbCommand
)];
1412 rx_len
= usb_read(rx
,sizeof(UsbCommand
));
1414 UsbPacketReceived(rx
,rx_len
);
1420 #ifndef WITH_ISO14443a_StandAlone
1421 if (BUTTON_HELD(1000) > 0)
1425 #ifdef WITH_ISO14443a
1426 #ifdef WITH_ISO14443a_StandAlone
1427 if (BUTTON_HELD(1000) > 0)
1428 StandAloneMode14a();