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" 
  30 #define abs(x) ( ((x)<0) ? -(x) : (x) ) 
  32 //============================================================================= 
  33 // A buffer where we can queue things up to be sent through the FPGA, for 
  34 // any purpose (fake tag, as reader, whatever). We go MSB first, since that 
  35 // is the order in which they go out on the wire. 
  36 //============================================================================= 
  38 #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  
  39 uint8_t ToSend
[TOSEND_BUFFER_SIZE
]; 
  42 struct common_area common_area 
__attribute__((section(".commonarea"))); 
  44 void BufferClear(void) 
  46         memset(BigBuf
,0,sizeof(BigBuf
)); 
  47         Dbprintf("Buffer cleared (%i bytes)",sizeof(BigBuf
)); 
  50 void ToSendReset(void) 
  56 void ToSendStuffBit(int b
) 
  60                 ToSend
[ToSendMax
] = 0; 
  65                 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
)); 
  70         if(ToSendMax 
>= sizeof(ToSend
)) { 
  72                 DbpString("ToSendStuffBit overflowed!"); 
  76 //============================================================================= 
  77 // Debug print functions, to go out over USB, to the usual PC-side client. 
  78 //============================================================================= 
  80 void DbpString(char *str
) 
  82   byte_t len 
= strlen(str
); 
  83   cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
); 
  87 void DbpIntegers(int x1
, int x2
, int x3
) 
  89   cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0); 
  93 void Dbprintf(const char *fmt
, ...) { 
  94 // should probably limit size here; oh well, let's just use a big buffer 
  95         char output_string
[128]; 
  99         kvsprintf(fmt
, output_string
, 10, ap
); 
 102         DbpString(output_string
); 
 105 // prints HEX & ASCII 
 106 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) { 
 119                         if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.'; 
 122                         Dbprintf("%-8s %*D",ascii
,l
,d
," "); 
 124                         Dbprintf("%*D",l
,d
," "); 
 132 //----------------------------------------------------------------------------- 
 133 // Read an ADC channel and block till it completes, then return the result 
 134 // in ADC units (0 to 1023). Also a routine to average 32 samples and 
 136 //----------------------------------------------------------------------------- 
 137 static int ReadAdc(int ch
) 
 141         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
 142         AT91C_BASE_ADC
->ADC_MR 
= 
 143                 ADC_MODE_PRESCALE(32) | 
 144                 ADC_MODE_STARTUP_TIME(16) | 
 145                 ADC_MODE_SAMPLE_HOLD_TIME(8); 
 146         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ch
); 
 148         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
 149         while(!(AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ch
))) 
 151         d 
= AT91C_BASE_ADC
->ADC_CDR
[ch
]; 
 156 int AvgAdc(int ch
) // was static - merlok 
 161         for(i 
= 0; i 
< 32; i
++) { 
 165         return (a 
+ 15) >> 5; 
 168 void MeasureAntennaTuning(void) 
 170         uint8_t LF_Results
[256]; 
 171         int i
, adcval 
= 0, peak 
= 0, peakv 
= 0, peakf 
= 0; //ptr = 0  
 172         int vLf125 
= 0, vLf134 
= 0, vHf 
= 0;    // in mV 
 177  * Sweeps the useful LF range of the proxmark from 
 178  * 46.8kHz (divisor=255) to 600kHz (divisor=19) and 
 179  * read the voltage in the antenna, the result left 
 180  * in the buffer is a graph which should clearly show 
 181  * the resonating frequency of your LF antenna 
 182  * ( hopefully around 95 if it is tuned to 125kHz!) 
 185         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 186         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC 
| FPGA_LF_ADC_READER_FIELD
); 
 187         for (i
=255; i
>=19; i
--) { 
 189                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 191                 // Vref = 3.3V, and a 10000:240 voltage divider on the input 
 192                 // can measure voltages up to 137500 mV 
 193                 adcval 
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10); 
 194                 if (i
==95)      vLf125 
= adcval
; // voltage at 125Khz 
 195                 if (i
==89)      vLf134 
= adcval
; // voltage at 134Khz 
 197                 LF_Results
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes 
 198                 if(LF_Results
[i
] > peak
) { 
 200                         peak 
= LF_Results
[i
]; 
 206         for (i
=18; i 
>= 0; i
--) LF_Results
[i
] = 0; 
 209         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 210         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 211         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 213         // Vref = 3300mV, and an 10:1 voltage divider on the input 
 214         // can measure voltages up to 33000 mV 
 215         vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 217         cmd_send(CMD_MEASURED_ANTENNA_TUNING
,vLf125
|(vLf134
<<16),vHf
,peakf
|(peakv
<<16),LF_Results
,256); 
 218         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 224 void MeasureAntennaTuningHf(void) 
 226         int vHf 
= 0;    // in mV 
 228         DbpString("Measuring HF antenna, press button to exit"); 
 231                 // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 232                 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 233                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 235                 // Vref = 3300mV, and an 10:1 voltage divider on the input 
 236                 // can measure voltages up to 33000 mV 
 237                 vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 239                 Dbprintf("%d mV",vHf
); 
 240                 if (BUTTON_PRESS()) break; 
 242         DbpString("cancelled"); 
 246 void SimulateTagHfListen(void) 
 248         uint8_t *dest 
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
; 
 253         // We're using this mode just so that I can test it out; the simulated 
 254         // tag mode would work just as well and be simpler. 
 255         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 256         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
 258         // We need to listen to the high-frequency, peak-detected path. 
 259         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 265                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 266                         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 268                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 269                         uint8_t r 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 283                                 if(i 
>= FREE_BUFFER_SIZE
) { 
 289         DbpString("simulate tag (now type bitsamples)"); 
 292 void ReadMem(int addr
) 
 294         const uint8_t *data 
= ((uint8_t *)addr
); 
 296         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 297                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 300 /* osimage version information is linked in */ 
 301 extern struct version_information version_information
; 
 302 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 303 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
; 
 304 void SendVersion(void) 
 306         char temp
[512]; /* Limited data payload in USB packets */ 
 307         DbpString("Prox/RFID mark3 RFID instrument"); 
 309         /* Try to find the bootrom version information. Expect to find a pointer at 
 310          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 311          * pointer, then use it. 
 313         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 314         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 315                 DbpString("bootrom version information appears invalid"); 
 317                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 321         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 324         FpgaGatherVersion(temp
, sizeof(temp
)); 
 327         cmd_send(CMD_ACK
,*(AT91C_DBGU_CIDR
),0,0,NULL
,0); 
 331 // samy's sniff and repeat routine 
 334         DbpString("Stand-alone mode! No PC necessary."); 
 335         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 337         // 3 possible options? no just 2 for now 
 340         int high
[OPTS
], low
[OPTS
]; 
 342         // Oooh pretty -- notify user we're in elite samy mode now 
 344         LED(LED_ORANGE
, 200); 
 346         LED(LED_ORANGE
, 200); 
 348         LED(LED_ORANGE
, 200); 
 350         LED(LED_ORANGE
, 200); 
 357         // Turn on selected LED 
 358         LED(selected 
+ 1, 0); 
 365                 // Was our button held down or pressed? 
 366                 int button_pressed 
= BUTTON_HELD(1000); 
 369                 // Button was held for a second, begin recording 
 370                 if (button_pressed 
> 0 && cardRead 
== 0) 
 373                         LED(selected 
+ 1, 0); 
 377                         DbpString("Starting recording"); 
 379                         // wait for button to be released 
 380                         while(BUTTON_PRESS()) 
 383                         /* need this delay to prevent catching some weird data */ 
 386                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 387                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 390                         LED(selected 
+ 1, 0); 
 391                         // Finished recording 
 393                         // If we were previously playing, set playing off 
 394                         // so next button push begins playing what we recorded 
 401                 else if (button_pressed 
> 0 && cardRead 
== 1) 
 404                                         LED(selected 
+ 1, 0); 
 408                                         Dbprintf("Cloning %x %x %x", selected
, high
[selected
], low
[selected
]); 
 410                                         // wait for button to be released 
 411                                         while(BUTTON_PRESS()) 
 414                                         /* need this delay to prevent catching some weird data */ 
 417                                         CopyHIDtoT55x7(high
[selected
], low
[selected
], 0, 0); 
 418                                         Dbprintf("Cloned %x %x %x", selected
, high
[selected
], low
[selected
]); 
 421                                         LED(selected 
+ 1, 0); 
 422                                         // Finished recording 
 424                                         // If we were previously playing, set playing off 
 425                                         // so next button push begins playing what we recorded 
 432                 // Change where to record (or begin playing) 
 433                 else if (button_pressed
) 
 435                         // Next option if we were previously playing 
 437                                 selected 
= (selected 
+ 1) % OPTS
; 
 441                         LED(selected 
+ 1, 0); 
 443                         // Begin transmitting 
 447                                 DbpString("Playing"); 
 448                                 // wait for button to be released 
 449                                 while(BUTTON_PRESS()) 
 451                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 452                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 453                                 DbpString("Done playing"); 
 454                                 if (BUTTON_HELD(1000) > 0) 
 456                                         DbpString("Exiting"); 
 461                                 /* We pressed a button so ignore it here with a delay */ 
 464                                 // when done, we're done playing, move to next option 
 465                                 selected 
= (selected 
+ 1) % OPTS
; 
 468                                 LED(selected 
+ 1, 0); 
 471                                 while(BUTTON_PRESS()) 
 480 Listen and detect an external reader. Determine the best location 
 484 Inside the ListenReaderField() function, there is two mode. 
 485 By default, when you call the function, you will enter mode 1. 
 486 If you press the PM3 button one time, you will enter mode 2. 
 487 If you press the PM3 button a second time, you will exit the function. 
 489 DESCRIPTION OF MODE 1: 
 490 This mode just listens for an external reader field and lights up green 
 491 for HF and/or red for LF. This is the original mode of the detectreader 
 494 DESCRIPTION OF MODE 2: 
 495 This mode will visually represent, using the LEDs, the actual strength of the 
 496 current compared to the maximum current detected. Basically, once you know 
 497 what kind of external reader is present, it will help you spot the best location to place 
 498 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 499 at the same place! :-) 
 503 static const char LIGHT_SCHEME
[] = { 
 504                 0x0, /* ----     | No field detected */ 
 505                 0x1, /* X---     | 14% of maximum current detected */ 
 506                 0x2, /* -X--     | 29% of maximum current detected */ 
 507                 0x4, /* --X-     | 43% of maximum current detected */ 
 508                 0x8, /* ---X     | 57% of maximum current detected */ 
 509                 0xC, /* --XX     | 71% of maximum current detected */ 
 510                 0xE, /* -XXX     | 86% of maximum current detected */ 
 511                 0xF, /* XXXX     | 100% of maximum current detected */ 
 513 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 515 void ListenReaderField(int limit
) 
 517         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
; 
 518         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_count
= 0, hf_max
; 
 519         int mode
=1, display_val
, display_max
, i
; 
 526         lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
); 
 528         if(limit 
!= HF_ONLY
) { 
 529                 Dbprintf("LF 125/134 Baseline: %d", lf_av
); 
 533         hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
); 
 535         if (limit 
!= LF_ONLY
) { 
 536                 Dbprintf("HF 13.56 Baseline: %d", hf_av
); 
 541                 if (BUTTON_PRESS()) { 
 546                                         DbpString("Signal Strength Mode"); 
 550                                         DbpString("Stopped"); 
 558                 if (limit 
!= HF_ONLY
) { 
 560                                 if (abs(lf_av 
- lf_baseline
) > 10) LED_D_ON(); 
 565                         lf_av_new
= ReadAdc(ADC_CHAN_LF
); 
 566                         // see if there's a significant change 
 567                         if(abs(lf_av 
- lf_av_new
) > 10) { 
 568                                 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
); 
 576                 if (limit 
!= LF_ONLY
) { 
 578                                 if (abs(hf_av 
- hf_baseline
) > 10) LED_B_ON(); 
 583                         hf_av_new
= ReadAdc(ADC_CHAN_HF
); 
 584                         // see if there's a significant change 
 585                         if(abs(hf_av 
- hf_av_new
) > 10) { 
 586                                 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
); 
 595                         if (limit 
== LF_ONLY
) { 
 597                                 display_max 
= lf_max
; 
 598                         } else if (limit 
== HF_ONLY
) { 
 600                                 display_max 
= hf_max
; 
 601                         } else { /* Pick one at random */ 
 602                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 604                                         display_max 
= hf_max
; 
 607                                         display_max 
= lf_max
; 
 610                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 611                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 612                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 613                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 614                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 615                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 623 void UsbPacketReceived(uint8_t *packet
, int len
) 
 625         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 627 //  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]); 
 631                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 632                         AcquireRawAdcSamples125k(c
->arg
[0]); 
 633                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 635                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 636                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 638                 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
: 
 639                         SnoopLFRawAdcSamples(c
->arg
[0], c
->arg
[1]); 
 640                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 642                 case CMD_HID_DEMOD_FSK
: 
 643                         CmdHIDdemodFSK(c
->arg
[0], 0, 0, 1); 
 645                 case CMD_HID_SIM_TAG
: 
 646                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1); 
 648                 case CMD_HID_CLONE_TAG
: 
 649                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 651                 case CMD_IO_DEMOD_FSK
: 
 652                         CmdIOdemodFSK(c
->arg
[0], 0, 0, 1); 
 654                 case CMD_IO_CLONE_TAG
: 
 655                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]); 
 657                 case CMD_EM410X_DEMOD
: 
 658                         CmdEM410xdemod(c
->arg
[0], 0, 0, 1); 
 660                 case CMD_EM410X_WRITE_TAG
: 
 661                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 663                 case CMD_READ_TI_TYPE
: 
 666                 case CMD_WRITE_TI_TYPE
: 
 667                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 669                 case CMD_SIMULATE_TAG_125K
: 
 670                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
 672                 case CMD_LF_SIMULATE_BIDIR
: 
 673                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
 675                 case CMD_INDALA_CLONE_TAG
: 
 676                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
 678                 case CMD_INDALA_CLONE_TAG_L
: 
 679                         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]); 
 681                 case CMD_T55XX_READ_BLOCK
: 
 682                         T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 684                 case CMD_T55XX_WRITE_BLOCK
: 
 685                         T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 687                 case CMD_T55XX_READ_TRACE
: 
 690                 case CMD_PCF7931_READ
: 
 692                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 694                 case CMD_EM4X_READ_WORD
: 
 695                         EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 697                 case CMD_EM4X_WRITE_WORD
: 
 698                         EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 703                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
 704                         SnoopHitag(c
->arg
[0]); 
 706                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
 707                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
 709                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
 710                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
 715                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
 716                         AcquireRawAdcSamplesIso15693(); 
 718                 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
: 
 719                         RecordRawAdcSamplesIso15693(); 
 722                 case CMD_ISO_15693_COMMAND
: 
 723                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 726                 case CMD_ISO_15693_FIND_AFI
: 
 727                         BruteforceIso15693Afi(c
->arg
[0]); 
 730                 case CMD_ISO_15693_DEBUG
: 
 731                         SetDebugIso15693(c
->arg
[0]); 
 734                 case CMD_READER_ISO_15693
: 
 735                         ReaderIso15693(c
->arg
[0]); 
 737                 case CMD_SIMTAG_ISO_15693
: 
 738                         SimTagIso15693(c
->arg
[0], c
->d
.asBytes
); 
 743                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
 744                         LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 747                 case CMD_WRITER_LEGIC_RF
: 
 748                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
 751                 case CMD_READER_LEGIC_RF
: 
 752                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
 756 #ifdef WITH_ISO14443b 
 757                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
: 
 758                         AcquireRawAdcSamplesIso14443(c
->arg
[0]); 
 760                 case CMD_READ_SRI512_TAG
: 
 761                         ReadSTMemoryIso14443(0x0F); 
 763                 case CMD_READ_SRIX4K_TAG
: 
 764                         ReadSTMemoryIso14443(0x7F); 
 766                 case CMD_SNOOP_ISO_14443
: 
 769                 case CMD_SIMULATE_TAG_ISO_14443
: 
 770                         SimulateIso14443Tag(); 
 772                 case CMD_ISO_14443B_COMMAND
: 
 773                         SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 777 #ifdef WITH_ISO14443a 
 778                 case CMD_SNOOP_ISO_14443a
: 
 779                         SnoopIso14443a(c
->arg
[0]); 
 781                 case CMD_READER_ISO_14443a
: 
 784                 case CMD_SIMULATE_TAG_ISO_14443a
: 
 785                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);  // ## Simulate iso14443a tag - pass tag type & UID 
 788                 case CMD_EPA_PACE_COLLECT_NONCE
: 
 789                         EPA_PACE_Collect_Nonce(c
); 
 792                 case CMD_READER_MIFARE
: 
 793             ReaderMifare(c
->arg
[0]); 
 795                 case CMD_MIFARE_READBL
: 
 796                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 798                 case CMD_MIFAREU_READBL
: 
 799                         MifareUReadBlock(c
->arg
[0],c
->d
.asBytes
); 
 801                 case CMD_MIFAREU_READCARD
: 
 802                         MifareUReadCard(c
->arg
[0],c
->d
.asBytes
); 
 804                 case CMD_MIFARE_READSC
: 
 805                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 807                 case CMD_MIFARE_WRITEBL
: 
 808                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 810                 case CMD_MIFAREU_WRITEBL_COMPAT
: 
 811                         MifareUWriteBlock(c
->arg
[0], c
->d
.asBytes
); 
 813                 case CMD_MIFAREU_WRITEBL
: 
 814                         MifareUWriteBlock_Special(c
->arg
[0], c
->d
.asBytes
); 
 816                 case CMD_MIFARE_NESTED
: 
 817                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 819                 case CMD_MIFARE_CHKKEYS
: 
 820                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 822                 case CMD_SIMULATE_MIFARE_CARD
: 
 823                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 827                 case CMD_MIFARE_SET_DBGMODE
: 
 828                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 830                 case CMD_MIFARE_EML_MEMCLR
: 
 831                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 833                 case CMD_MIFARE_EML_MEMSET
: 
 834                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 836                 case CMD_MIFARE_EML_MEMGET
: 
 837                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 839                 case CMD_MIFARE_EML_CARDLOAD
: 
 840                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 843                 // Work with "magic Chinese" card 
 844                 case CMD_MIFARE_CSETBLOCK
: 
 845                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 847                 case CMD_MIFARE_CGETBLOCK
: 
 848                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 850                 case CMD_MIFARE_CIDENT
: 
 855                 case CMD_MIFARE_SNIFFER
: 
 856                         SniffMifare(c
->arg
[0]); 
 861                 // Makes use of ISO14443a FPGA Firmware 
 862                 case CMD_SNOOP_ICLASS
: 
 865                 case CMD_SIMULATE_TAG_ICLASS
: 
 866                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 868                 case CMD_READER_ICLASS
: 
 869                         ReaderIClass(c
->arg
[0]); 
 871                 case CMD_READER_ICLASS_REPLAY
: 
 872                     ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
); 
 876                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 877                         SimulateTagHfListen(); 
 884                 case CMD_MEASURE_ANTENNA_TUNING
: 
 885                         MeasureAntennaTuning(); 
 888                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 889                         MeasureAntennaTuningHf(); 
 892                 case CMD_LISTEN_READER_FIELD
: 
 893                         ListenReaderField(c
->arg
[0]); 
 896                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 897                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 899                         LED_D_OFF(); // LED D indicates field ON or OFF 
 902                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 905                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 906                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 907                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
); 
 909                         // Trigger a finish downloading signal with an ACK frame 
 910                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 914                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 915                         uint8_t *b 
= (uint8_t *)BigBuf
; 
 916                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
 917                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 924                 case CMD_SET_LF_DIVISOR
: 
 925                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 926                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 929                 case CMD_SET_ADC_MUX
: 
 931                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 932                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 933                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 934                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 950                 case CMD_SETUP_WRITE
: 
 951                 case CMD_FINISH_WRITE
: 
 952                 case CMD_HARDWARE_RESET
: 
 956                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 958                                 // We're going to reset, and the bootrom will take control. 
 962                 case CMD_START_FLASH
: 
 963                         if(common_area
.flags
.bootrom_present
) { 
 964                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 967                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 971                 case CMD_DEVICE_INFO
: { 
 972                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 973                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 974                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
 978                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 983 void  __attribute__((noreturn
)) AppMain(void) 
 987         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 988                 /* Initialize common area */ 
 989                 memset(&common_area
, 0, sizeof(common_area
)); 
 990                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
 991                 common_area
.version 
= 1; 
 993         common_area
.flags
.osimage_present 
= 1; 
1003         // The FPGA gets its clock from us from PCK0 output, so set that up. 
1004         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
1005         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
1006         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
1007         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
1008         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1009                 AT91C_PMC_PRES_CLK_4
; 
1010         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1013         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1015         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1017         // Load the FPGA image, which we have stored in our flash. 
1018         // (the HF version by default) 
1019         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1027   byte_t rx
[sizeof(UsbCommand
)]; 
1032       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1034         UsbPacketReceived(rx
,rx_len
); 
1040                 if (BUTTON_HELD(1000) > 0)