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" 
  31 #define abs(x) ( ((x)<0) ? -(x) : (x) ) 
  33 //============================================================================= 
  34 // A buffer where we can queue things up to be sent through the FPGA, for 
  35 // any purpose (fake tag, as reader, whatever). We go MSB first, since that 
  36 // is the order in which they go out on the wire. 
  37 //============================================================================= 
  39 #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  
  40 uint8_t ToSend
[TOSEND_BUFFER_SIZE
]; 
  43 struct common_area common_area 
__attribute__((section(".commonarea"))); 
  45 void ToSendReset(void) 
  51 void ToSendStuffBit(int b
) 
  55                 ToSend
[ToSendMax
] = 0; 
  60                 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
)); 
  65         if(ToSendMax 
>= sizeof(ToSend
)) { 
  67                 DbpString("ToSendStuffBit overflowed!"); 
  71 //============================================================================= 
  72 // Debug print functions, to go out over USB, to the usual PC-side client. 
  73 //============================================================================= 
  75 void DbpString(char *str
) 
  77   byte_t len 
= strlen(str
); 
  78   cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
); 
  82 void DbpIntegers(int x1
, int x2
, int x3
) 
  84   cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0); 
  88 void Dbprintf(const char *fmt
, ...) { 
  89 // should probably limit size here; oh well, let's just use a big buffer 
  90         char output_string
[128]; 
  94         kvsprintf(fmt
, output_string
, 10, ap
); 
  97         DbpString(output_string
); 
 100 // prints HEX & ASCII 
 101 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) { 
 114                         if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.'; 
 117                         Dbprintf("%-8s %*D",ascii
,l
,d
," "); 
 119                         Dbprintf("%*D",l
,d
," "); 
 127 //----------------------------------------------------------------------------- 
 128 // Read an ADC channel and block till it completes, then return the result 
 129 // in ADC units (0 to 1023). Also a routine to average 32 samples and 
 131 //----------------------------------------------------------------------------- 
 132 static int ReadAdc(int ch
) 
 136         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
 137         AT91C_BASE_ADC
->ADC_MR 
= 
 138                 ADC_MODE_PRESCALE(32) | 
 139                 ADC_MODE_STARTUP_TIME(16) | 
 140                 ADC_MODE_SAMPLE_HOLD_TIME(8); 
 141         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ch
); 
 143         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
 144         while(!(AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ch
))) 
 146         d 
= AT91C_BASE_ADC
->ADC_CDR
[ch
]; 
 151 int AvgAdc(int ch
) // was static - merlok 
 156         for(i 
= 0; i 
< 32; i
++) { 
 160         return (a 
+ 15) >> 5; 
 163 void MeasureAntennaTuning(void) 
 165         uint8_t LF_Results
[256]; 
 166         int i
, adcval 
= 0, peak 
= 0, peakv 
= 0, peakf 
= 0; //ptr = 0  
 167         int vLf125 
= 0, vLf134 
= 0, vHf 
= 0;    // in mV 
 172  * Sweeps the useful LF range of the proxmark from 
 173  * 46.8kHz (divisor=255) to 600kHz (divisor=19) and 
 174  * read the voltage in the antenna, the result left 
 175  * in the buffer is a graph which should clearly show 
 176  * the resonating frequency of your LF antenna 
 177  * ( hopefully around 95 if it is tuned to 125kHz!) 
 180         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 181         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC 
| FPGA_LF_ADC_READER_FIELD
); 
 182         for (i
=255; i
>=19; i
--) { 
 184                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 186                 // Vref = 3.3V, and a 10000:240 voltage divider on the input 
 187                 // can measure voltages up to 137500 mV 
 188                 adcval 
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10); 
 189                 if (i
==95)      vLf125 
= adcval
; // voltage at 125Khz 
 190                 if (i
==89)      vLf134 
= adcval
; // voltage at 134Khz 
 192                 LF_Results
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes 
 193                 if(LF_Results
[i
] > peak
) { 
 195                         peak 
= LF_Results
[i
]; 
 201         for (i
=18; i 
>= 0; i
--) LF_Results
[i
] = 0; 
 204         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 205         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 206         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 208         // Vref = 3300mV, and an 10:1 voltage divider on the input 
 209         // can measure voltages up to 33000 mV 
 210         vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 212         cmd_send(CMD_MEASURED_ANTENNA_TUNING
,vLf125
|(vLf134
<<16),vHf
,peakf
|(peakv
<<16),LF_Results
,256); 
 213         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 219 void MeasureAntennaTuningHf(void) 
 221         int vHf 
= 0;    // in mV 
 223         DbpString("Measuring HF antenna, press button to exit"); 
 226                 // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 227                 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 228                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 230                 // Vref = 3300mV, and an 10:1 voltage divider on the input 
 231                 // can measure voltages up to 33000 mV 
 232                 vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 234                 Dbprintf("%d mV",vHf
); 
 235                 if (BUTTON_PRESS()) break; 
 237         DbpString("cancelled"); 
 241 void SimulateTagHfListen(void) 
 243         // ToDo: historically this used the free buffer, which was 2744 Bytes long.  
 244         // There might be a better size to be defined: 
 245         #define HF_14B_SNOOP_BUFFER_SIZE 2744 
 246         uint8_t *dest 
= BigBuf_malloc(HF_14B_SNOOP_BUFFER_SIZE
); 
 251         // We're using this mode just so that I can test it out; the simulated 
 252         // tag mode would work just as well and be simpler. 
 253         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 254         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
 256         // We need to listen to the high-frequency, peak-detected path. 
 257         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 263                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 264                         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 266                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 267                         uint8_t r 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 281                                 if(i 
>= HF_14B_SNOOP_BUFFER_SIZE
) { 
 287         DbpString("simulate tag (now type bitsamples)"); 
 290 void ReadMem(int addr
) 
 292         const uint8_t *data 
= ((uint8_t *)addr
); 
 294         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 295                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 298 /* osimage version information is linked in */ 
 299 extern struct version_information version_information
; 
 300 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 301 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
; 
 302 void SendVersion(void) 
 304         char temp
[512]; /* Limited data payload in USB packets */ 
 305         DbpString("Prox/RFID mark3 RFID instrument"); 
 307         /* Try to find the bootrom version information. Expect to find a pointer at 
 308          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 309          * pointer, then use it. 
 311         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 312         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 313                 DbpString("bootrom version information appears invalid"); 
 315                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 319         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 322         FpgaGatherVersion(temp
, sizeof(temp
)); 
 325         cmd_send(CMD_ACK
,*(AT91C_DBGU_CIDR
),0,0,NULL
,0); 
 329 // samy's sniff and repeat routine 
 332         DbpString("Stand-alone mode! No PC necessary."); 
 333         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 335         // 3 possible options? no just 2 for now 
 338         int high
[OPTS
], low
[OPTS
]; 
 340         // Oooh pretty -- notify user we're in elite samy mode now 
 342         LED(LED_ORANGE
, 200); 
 344         LED(LED_ORANGE
, 200); 
 346         LED(LED_ORANGE
, 200); 
 348         LED(LED_ORANGE
, 200); 
 355         // Turn on selected LED 
 356         LED(selected 
+ 1, 0); 
 363                 // Was our button held down or pressed? 
 364                 int button_pressed 
= BUTTON_HELD(1000); 
 367                 // Button was held for a second, begin recording 
 368                 if (button_pressed 
> 0 && cardRead 
== 0) 
 371                         LED(selected 
+ 1, 0); 
 375                         DbpString("Starting recording"); 
 377                         // wait for button to be released 
 378                         while(BUTTON_PRESS()) 
 381                         /* need this delay to prevent catching some weird data */ 
 384                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 385                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 388                         LED(selected 
+ 1, 0); 
 389                         // Finished recording 
 391                         // If we were previously playing, set playing off 
 392                         // so next button push begins playing what we recorded 
 399                 else if (button_pressed 
> 0 && cardRead 
== 1) 
 402                                         LED(selected 
+ 1, 0); 
 406                                         Dbprintf("Cloning %x %x %x", selected
, high
[selected
], low
[selected
]); 
 408                                         // wait for button to be released 
 409                                         while(BUTTON_PRESS()) 
 412                                         /* need this delay to prevent catching some weird data */ 
 415                                         CopyHIDtoT55x7(high
[selected
], low
[selected
], 0, 0); 
 416                                         Dbprintf("Cloned %x %x %x", selected
, high
[selected
], low
[selected
]); 
 419                                         LED(selected 
+ 1, 0); 
 420                                         // Finished recording 
 422                                         // If we were previously playing, set playing off 
 423                                         // so next button push begins playing what we recorded 
 430                 // Change where to record (or begin playing) 
 431                 else if (button_pressed
) 
 433                         // Next option if we were previously playing 
 435                                 selected 
= (selected 
+ 1) % OPTS
; 
 439                         LED(selected 
+ 1, 0); 
 441                         // Begin transmitting 
 445                                 DbpString("Playing"); 
 446                                 // wait for button to be released 
 447                                 while(BUTTON_PRESS()) 
 449                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 450                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 451                                 DbpString("Done playing"); 
 452                                 if (BUTTON_HELD(1000) > 0) 
 454                                         DbpString("Exiting"); 
 459                                 /* We pressed a button so ignore it here with a delay */ 
 462                                 // when done, we're done playing, move to next option 
 463                                 selected 
= (selected 
+ 1) % OPTS
; 
 466                                 LED(selected 
+ 1, 0); 
 469                                 while(BUTTON_PRESS()) 
 478 Listen and detect an external reader. Determine the best location 
 482 Inside the ListenReaderField() function, there is two mode. 
 483 By default, when you call the function, you will enter mode 1. 
 484 If you press the PM3 button one time, you will enter mode 2. 
 485 If you press the PM3 button a second time, you will exit the function. 
 487 DESCRIPTION OF MODE 1: 
 488 This mode just listens for an external reader field and lights up green 
 489 for HF and/or red for LF. This is the original mode of the detectreader 
 492 DESCRIPTION OF MODE 2: 
 493 This mode will visually represent, using the LEDs, the actual strength of the 
 494 current compared to the maximum current detected. Basically, once you know 
 495 what kind of external reader is present, it will help you spot the best location to place 
 496 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 497 at the same place! :-) 
 501 static const char LIGHT_SCHEME
[] = { 
 502                 0x0, /* ----     | No field detected */ 
 503                 0x1, /* X---     | 14% of maximum current detected */ 
 504                 0x2, /* -X--     | 29% of maximum current detected */ 
 505                 0x4, /* --X-     | 43% of maximum current detected */ 
 506                 0x8, /* ---X     | 57% of maximum current detected */ 
 507                 0xC, /* --XX     | 71% of maximum current detected */ 
 508                 0xE, /* -XXX     | 86% of maximum current detected */ 
 509                 0xF, /* XXXX     | 100% of maximum current detected */ 
 511 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 513 void ListenReaderField(int limit
) 
 515         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
; 
 516         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_count
= 0, hf_max
; 
 517         int mode
=1, display_val
, display_max
, i
; 
 524         lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
); 
 526         if(limit 
!= HF_ONLY
) { 
 527                 Dbprintf("LF 125/134 Baseline: %d", lf_av
); 
 531         hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
); 
 533         if (limit 
!= LF_ONLY
) { 
 534                 Dbprintf("HF 13.56 Baseline: %d", hf_av
); 
 539                 if (BUTTON_PRESS()) { 
 544                                         DbpString("Signal Strength Mode"); 
 548                                         DbpString("Stopped"); 
 556                 if (limit 
!= HF_ONLY
) { 
 558                                 if (abs(lf_av 
- lf_baseline
) > 10) LED_D_ON(); 
 563                         lf_av_new
= ReadAdc(ADC_CHAN_LF
); 
 564                         // see if there's a significant change 
 565                         if(abs(lf_av 
- lf_av_new
) > 10) { 
 566                                 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
); 
 574                 if (limit 
!= LF_ONLY
) { 
 576                                 if (abs(hf_av 
- hf_baseline
) > 10) LED_B_ON(); 
 581                         hf_av_new
= ReadAdc(ADC_CHAN_HF
); 
 582                         // see if there's a significant change 
 583                         if(abs(hf_av 
- hf_av_new
) > 10) { 
 584                                 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
); 
 593                         if (limit 
== LF_ONLY
) { 
 595                                 display_max 
= lf_max
; 
 596                         } else if (limit 
== HF_ONLY
) { 
 598                                 display_max 
= hf_max
; 
 599                         } else { /* Pick one at random */ 
 600                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 602                                         display_max 
= hf_max
; 
 605                                         display_max 
= lf_max
; 
 608                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 609                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 610                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 611                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 612                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 613                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 621 void UsbPacketReceived(uint8_t *packet
, int len
) 
 623         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 625 //  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]); 
 629                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 630                         AcquireRawAdcSamples125k(c
->arg
[0]); 
 631                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 633                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 634                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 636                 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
: 
 637                         SnoopLFRawAdcSamples(c
->arg
[0], c
->arg
[1]); 
 638                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 640                 case CMD_HID_DEMOD_FSK
: 
 641                         CmdHIDdemodFSK(c
->arg
[0], 0, 0, 1); 
 643                 case CMD_HID_SIM_TAG
: 
 644                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1); 
 646                 case CMD_HID_CLONE_TAG
: 
 647                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 649                 case CMD_IO_DEMOD_FSK
: 
 650                         CmdIOdemodFSK(c
->arg
[0], 0, 0, 1); 
 652                 case CMD_IO_CLONE_TAG
: 
 653                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]); 
 655                 case CMD_EM410X_DEMOD
: 
 656                         CmdEM410xdemod(c
->arg
[0], 0, 0, 1); 
 658                 case CMD_EM410X_WRITE_TAG
: 
 659                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 661                 case CMD_READ_TI_TYPE
: 
 664                 case CMD_WRITE_TI_TYPE
: 
 665                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 667                 case CMD_SIMULATE_TAG_125K
: 
 669                         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_MIFAREUC_AUTH1
: 
 802                         MifareUC_Auth1(c
->arg
[0],c
->d
.asBytes
); 
 804                 case CMD_MIFAREUC_AUTH2
: 
 805                         MifareUC_Auth2(c
->arg
[0],c
->d
.asBytes
); 
 807                 case CMD_MIFAREU_READCARD
: 
 808                         MifareUReadCard(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
 810                 case CMD_MIFAREUC_READCARD
: 
 811                         MifareUReadCard(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
 813                 case CMD_MIFARE_READSC
: 
 814                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 816                 case CMD_MIFARE_WRITEBL
: 
 817                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 819                 case CMD_MIFAREU_WRITEBL_COMPAT
: 
 820                         MifareUWriteBlock(c
->arg
[0], c
->d
.asBytes
); 
 822                 case CMD_MIFAREU_WRITEBL
: 
 823                         MifareUWriteBlock_Special(c
->arg
[0], c
->d
.asBytes
); 
 825                 case CMD_MIFARE_NESTED
: 
 826                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 828                 case CMD_MIFARE_CHKKEYS
: 
 829                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 831                 case CMD_SIMULATE_MIFARE_CARD
: 
 832                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 836                 case CMD_MIFARE_SET_DBGMODE
: 
 837                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 839                 case CMD_MIFARE_EML_MEMCLR
: 
 840                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 842                 case CMD_MIFARE_EML_MEMSET
: 
 843                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 845                 case CMD_MIFARE_EML_MEMGET
: 
 846                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 848                 case CMD_MIFARE_EML_CARDLOAD
: 
 849                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 852                 // Work with "magic Chinese" card 
 853                 case CMD_MIFARE_CSETBLOCK
: 
 854                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 856                 case CMD_MIFARE_CGETBLOCK
: 
 857                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 859                 case CMD_MIFARE_CIDENT
: 
 864                 case CMD_MIFARE_SNIFFER
: 
 865                         SniffMifare(c
->arg
[0]); 
 871                 // Makes use of ISO14443a FPGA Firmware 
 872                 case CMD_SNOOP_ICLASS
: 
 875                 case CMD_SIMULATE_TAG_ICLASS
: 
 876                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 878                 case CMD_READER_ICLASS
: 
 879                         ReaderIClass(c
->arg
[0]); 
 881                 case CMD_READER_ICLASS_REPLAY
: 
 882                     ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
); 
 886                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 887                         SimulateTagHfListen(); 
 894                 case CMD_MEASURE_ANTENNA_TUNING
: 
 895                         MeasureAntennaTuning(); 
 898                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 899                         MeasureAntennaTuningHf(); 
 902                 case CMD_LISTEN_READER_FIELD
: 
 903                         ListenReaderField(c
->arg
[0]); 
 906                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 907                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 909                         LED_D_OFF(); // LED D indicates field ON or OFF 
 912                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 915                         uint8_t *BigBuf 
= BigBuf_get_addr(); 
 916                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 917                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 918                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,traceLen
,BigBuf
+c
->arg
[0]+i
,len
); 
 920                         // Trigger a finish downloading signal with an ACK frame 
 921                         cmd_send(CMD_ACK
,0,0,traceLen
,0,0); 
 925                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 926                         uint8_t *b 
= BigBuf_get_addr(); 
 927                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
 928                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 935                 case CMD_SET_LF_DIVISOR
: 
 936                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 937                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 940                 case CMD_SET_ADC_MUX
: 
 942                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 943                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 944                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 945                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 961                 case CMD_SETUP_WRITE
: 
 962                 case CMD_FINISH_WRITE
: 
 963                 case CMD_HARDWARE_RESET
: 
 967                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 969                                 // We're going to reset, and the bootrom will take control. 
 973                 case CMD_START_FLASH
: 
 974                         if(common_area
.flags
.bootrom_present
) { 
 975                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 978                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 982                 case CMD_DEVICE_INFO
: { 
 983                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 984                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 985                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
 989                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 994 void  __attribute__((noreturn
)) AppMain(void) 
 998         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 999                 /* Initialize common area */ 
1000                 memset(&common_area
, 0, sizeof(common_area
)); 
1001                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
1002                 common_area
.version 
= 1; 
1004         common_area
.flags
.osimage_present 
= 1; 
1014         // The FPGA gets its clock from us from PCK0 output, so set that up. 
1015         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
1016         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
1017         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
1018         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
1019         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1020                 AT91C_PMC_PRES_CLK_4
; 
1021         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1024         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1026         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1028         // Load the FPGA image, which we have stored in our flash. 
1029         // (the HF version by default) 
1030         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1038   byte_t rx
[sizeof(UsbCommand
)]; 
1043       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1045         UsbPacketReceived(rx
,rx_len
); 
1051                 if (BUTTON_HELD(1000) > 0)