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 //----------------------------------------------------------------------------- 
  13 #include "../common/usb_cdc.h" 
  14 #include "../common/cmd.h" 
  16 #include "../include/proxmark3.h" 
  25 #include "../include/hitag2.h" 
  32 #define abs(x) ( ((x)<0) ? -(x) : (x) ) 
  34 //============================================================================= 
  35 // A buffer where we can queue things up to be sent through the FPGA, for 
  36 // any purpose (fake tag, as reader, whatever). We go MSB first, since that 
  37 // is the order in which they go out on the wire. 
  38 //============================================================================= 
  40 #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 
  41 uint8_t ToSend
[TOSEND_BUFFER_SIZE
]; 
  44 struct common_area common_area 
__attribute__((section(".commonarea"))); 
  46 void BufferClear(void) 
  48         memset(BigBuf
,0,sizeof(BigBuf
)); 
  49         Dbprintf("Buffer cleared (%i bytes)",sizeof(BigBuf
)); 
  52 void ToSendReset(void) 
  58 void ToSendStuffBit(int b
) 
  62                 ToSend
[ToSendMax
] = 0; 
  67                 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
)); 
  72         if(ToSendMax  
>= sizeof(ToSend
)) { 
  74                 DbpString("ToSendStuffBit overflowed!"); 
  78 //============================================================================= 
  79 // Debug print functions, to go out over USB, to the usual PC-side client. 
  80 //============================================================================= 
  82 void DbpString(char *str
) 
  84   byte_t len 
= strlen(str
); 
  85   cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
); 
  89 void DbpIntegers(int x1
, int x2
, int x3
) 
  91   cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0); 
  95 void Dbprintf(const char *fmt
, ...) { 
  96 // should probably limit size here; oh well, let's just use a big buffer 
  97         char output_string
[128]; 
 101         kvsprintf(fmt
, output_string
, 10, ap
); 
 104         DbpString(output_string
); 
 107 // prints HEX & ASCII 
 108 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) { 
 121                         if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.'; 
 124                         Dbprintf("%-8s %*D",ascii
,l
,d
," "); 
 126                         Dbprintf("%*D",l
,d
," "); 
 134 //----------------------------------------------------------------------------- 
 135 // Read an ADC channel and block till it completes, then return the result 
 136 // in ADC units (0 to 1023). Also a routine to average 32 samples and 
 138 //----------------------------------------------------------------------------- 
 139 static int ReadAdc(int ch
) 
 143         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
 144         AT91C_BASE_ADC
->ADC_MR 
= 
 145                 ADC_MODE_PRESCALE(32) | 
 146                 ADC_MODE_STARTUP_TIME(16) | 
 147                 ADC_MODE_SAMPLE_HOLD_TIME(8); 
 148         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ch
); 
 150         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
 151         while(!(AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ch
))) 
 153         d 
= AT91C_BASE_ADC
->ADC_CDR
[ch
]; 
 158 int AvgAdc(int ch
) // was static - merlok 
 163         for(i 
= 0; i 
< 32; i
++) { 
 167         return (a 
+ 15) >> 5; 
 170 void MeasureAntennaTuning(void) 
 172         uint8_t LF_Results
[256]; 
 173         int i
, adcval 
= 0, peak 
= 0, peakv 
= 0, peakf 
= 0; //ptr = 0  
 174         int vLf125 
= 0, vLf134 
= 0, vHf 
= 0;    // in mV 
 179  * Sweeps the useful LF range of the proxmark from 
 180  * 46.8kHz (divisor=255) to 600kHz (divisor=19) and 
 181  * read the voltage in the antenna, the result left 
 182  * in the buffer is a graph which should clearly show 
 183  * the resonating frequency of your LF antenna 
 184  * ( hopefully around 95 if it is tuned to 125kHz!) 
 187         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 188         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC 
| FPGA_LF_ADC_READER_FIELD
); 
 189         for (i
=255; i
>=19; i
--) { 
 191                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 193                 // Vref = 3.3V, and a 10000:240 voltage divider on the input 
 194                 // can measure voltages up to 137500 mV 
 195                 adcval 
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10); 
 196                 if (i
==95)      vLf125 
= adcval
; // voltage at 125Khz 
 197                 if (i
==89)      vLf134 
= adcval
; // voltage at 134Khz 
 199                 LF_Results
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes 
 200                 if(LF_Results
[i
] > peak
) { 
 202                         peak 
= LF_Results
[i
]; 
 208         for (i
=18; i 
>= 0; i
--) LF_Results
[i
] = 0; 
 211         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 212         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 213         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 215         // Vref = 3300mV, and an 10:1 voltage divider on the input 
 216         // can measure voltages up to 33000 mV 
 217         vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 219         cmd_send(CMD_MEASURED_ANTENNA_TUNING
,vLf125
|(vLf134
<<16),vHf
,peakf
|(peakv
<<16),LF_Results
,256); 
 220         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 226 void MeasureAntennaTuningHf(void) 
 228         int vHf 
= 0;    // in mV 
 230         DbpString("Measuring HF antenna, press button to exit"); 
 233                 // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 234                 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 235                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 237                 // Vref = 3300mV, and an 10:1 voltage divider on the input 
 238                 // can measure voltages up to 33000 mV 
 239                 vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 241                 Dbprintf("%d mV",vHf
); 
 242                 if (BUTTON_PRESS()) break; 
 244         DbpString("cancelled"); 
 248 void SimulateTagHfListen(void) 
 250         uint8_t *dest 
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
; 
 255         // We're using this mode just so that I can test it out; the simulated 
 256         // tag mode would work just as well and be simpler. 
 257         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 258         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
 260         // We need to listen to the high-frequency, peak-detected path. 
 261         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 267                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 268                         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 270                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 271                         uint8_t r 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 285                                 if(i 
>= FREE_BUFFER_SIZE
) { 
 291         DbpString("simulate tag (now type bitsamples)"); 
 294 void ReadMem(int addr
) 
 296         const uint8_t *data 
= ((uint8_t *)addr
); 
 298         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 299                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 302 /* osimage version information is linked in */ 
 303 extern struct version_information version_information
; 
 304 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 305 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
; 
 306 void SendVersion(void) 
 308         char temp
[512]; /* Limited data payload in USB packets */ 
 309         DbpString("Prox/RFID mark3 RFID instrument"); 
 311         /* Try to find the bootrom version information. Expect to find a pointer at 
 312          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 313          * pointer, then use it. 
 315         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 316         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 317                 DbpString("bootrom version information appears invalid"); 
 319                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 323         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 326         FpgaGatherVersion(temp
, sizeof(temp
)); 
 329         cmd_send(CMD_ACK
,*(AT91C_DBGU_CIDR
),0,0,NULL
,0); 
 333 // samy's sniff and repeat routine 
 336         DbpString("Stand-alone mode! No PC necessary."); 
 337         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 339         // 3 possible options? no just 2 for now 
 342         int high
[OPTS
], low
[OPTS
]; 
 344         // Oooh pretty -- notify user we're in elite samy mode now 
 346         LED(LED_ORANGE
, 200); 
 348         LED(LED_ORANGE
, 200); 
 350         LED(LED_ORANGE
, 200); 
 352         LED(LED_ORANGE
, 200); 
 359         // Turn on selected LED 
 360         LED(selected 
+ 1, 0); 
 367                 // Was our button held down or pressed? 
 368                 int button_pressed 
= BUTTON_HELD(1000); 
 371                 // Button was held for a second, begin recording 
 372                 if (button_pressed 
> 0 && cardRead 
== 0) 
 375                         LED(selected 
+ 1, 0); 
 379                         DbpString("Starting recording"); 
 381                         // wait for button to be released 
 382                         while(BUTTON_PRESS()) 
 385                         /* need this delay to prevent catching some weird data */ 
 388                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 389                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 392                         LED(selected 
+ 1, 0); 
 393                         // Finished recording 
 395                         // If we were previously playing, set playing off 
 396                         // so next button push begins playing what we recorded 
 403                 else if (button_pressed 
> 0 && cardRead 
== 1) 
 406                                         LED(selected 
+ 1, 0); 
 410                                         Dbprintf("Cloning %x %x %x", selected
, high
[selected
], low
[selected
]); 
 412                                         // wait for button to be released 
 413                                         while(BUTTON_PRESS()) 
 416                                         /* need this delay to prevent catching some weird data */ 
 419                                         CopyHIDtoT55x7(high
[selected
], low
[selected
], 0, 0); 
 420                                         Dbprintf("Cloned %x %x %x", selected
, high
[selected
], low
[selected
]); 
 423                                         LED(selected 
+ 1, 0); 
 424                                         // Finished recording 
 426                                         // If we were previously playing, set playing off 
 427                                         // so next button push begins playing what we recorded 
 434                 // Change where to record (or begin playing) 
 435                 else if (button_pressed
) 
 437                         // Next option if we were previously playing 
 439                                 selected 
= (selected 
+ 1) % OPTS
; 
 443                         LED(selected 
+ 1, 0); 
 445                         // Begin transmitting 
 449                                 DbpString("Playing"); 
 450                                 // wait for button to be released 
 451                                 while(BUTTON_PRESS()) 
 453                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 454                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 455                                 DbpString("Done playing"); 
 456                                 if (BUTTON_HELD(1000) > 0) 
 458                                         DbpString("Exiting"); 
 463                                 /* We pressed a button so ignore it here with a delay */ 
 466                                 // when done, we're done playing, move to next option 
 467                                 selected 
= (selected 
+ 1) % OPTS
; 
 470                                 LED(selected 
+ 1, 0); 
 473                                 while(BUTTON_PRESS()) 
 482 Listen and detect an external reader. Determine the best location 
 486 Inside the ListenReaderField() function, there is two mode. 
 487 By default, when you call the function, you will enter mode 1. 
 488 If you press the PM3 button one time, you will enter mode 2. 
 489 If you press the PM3 button a second time, you will exit the function. 
 491 DESCRIPTION OF MODE 1: 
 492 This mode just listens for an external reader field and lights up green 
 493 for HF and/or red for LF. This is the original mode of the detectreader 
 496 DESCRIPTION OF MODE 2: 
 497 This mode will visually represent, using the LEDs, the actual strength of the 
 498 current compared to the maximum current detected. Basically, once you know 
 499 what kind of external reader is present, it will help you spot the best location to place 
 500 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 501 at the same place! :-) 
 505 static const char LIGHT_SCHEME
[] = { 
 506                 0x0, /* ----     | No field detected */ 
 507                 0x1, /* X---     | 14% of maximum current detected */ 
 508                 0x2, /* -X--     | 29% of maximum current detected */ 
 509                 0x4, /* --X-     | 43% of maximum current detected */ 
 510                 0x8, /* ---X     | 57% of maximum current detected */ 
 511                 0xC, /* --XX     | 71% of maximum current detected */ 
 512                 0xE, /* -XXX     | 86% of maximum current detected */ 
 513                 0xF, /* XXXX     | 100% of maximum current detected */ 
 515 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 517 void ListenReaderField(int limit
) 
 519         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
; 
 520         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_count
= 0, hf_max
; 
 521         int mode
=1, display_val
, display_max
, i
; 
 528         lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
); 
 530         if(limit 
!= HF_ONLY
) { 
 531                 Dbprintf("LF 125/134 Baseline: %d", lf_av
); 
 535         hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
); 
 537         if (limit 
!= LF_ONLY
) { 
 538                 Dbprintf("HF 13.56 Baseline: %d", hf_av
); 
 543                 if (BUTTON_PRESS()) { 
 548                                         DbpString("Signal Strength Mode"); 
 552                                         DbpString("Stopped"); 
 560                 if (limit 
!= HF_ONLY
) { 
 562                                 if (abs(lf_av 
- lf_baseline
) > 10) LED_D_ON(); 
 567                         lf_av_new
= ReadAdc(ADC_CHAN_LF
); 
 568                         // see if there's a significant change 
 569                         if(abs(lf_av 
- lf_av_new
) > 10) { 
 570                                 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
); 
 578                 if (limit 
!= LF_ONLY
) { 
 580                                 if (abs(hf_av 
- hf_baseline
) > 10) LED_B_ON(); 
 585                         hf_av_new
= ReadAdc(ADC_CHAN_HF
); 
 586                         // see if there's a significant change 
 587                         if(abs(hf_av 
- hf_av_new
) > 10) { 
 588                                 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
); 
 597                         if (limit 
== LF_ONLY
) { 
 599                                 display_max 
= lf_max
; 
 600                         } else if (limit 
== HF_ONLY
) { 
 602                                 display_max 
= hf_max
; 
 603                         } else { /* Pick one at random */ 
 604                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 606                                         display_max 
= hf_max
; 
 609                                         display_max 
= lf_max
; 
 612                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 613                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 614                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 615                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 616                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 617                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 625 void UsbPacketReceived(uint8_t *packet
, int len
) 
 627         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 629   //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]); 
 633                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 634                         AcquireRawAdcSamples125k(c
->arg
[0]); 
 635                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 637                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 638                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 640                 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
: 
 641                         SnoopLFRawAdcSamples(c
->arg
[0], c
->arg
[1]); 
 642                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 644                 case CMD_HID_DEMOD_FSK
: 
 645                         CmdHIDdemodFSK(c
->arg
[0], 0, 0, 1); 
 647                 case CMD_HID_SIM_TAG
: 
 648                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1); 
 650                 case CMD_HID_CLONE_TAG
: 
 651                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 653                 case CMD_IO_DEMOD_FSK
: 
 654                         CmdIOdemodFSK(c
->arg
[0], 0, 0, 1); 
 656                 case CMD_IO_CLONE_TAG
: 
 657                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]); 
 659                 case CMD_EM410X_WRITE_TAG
: 
 660                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 662                 case CMD_READ_TI_TYPE
: 
 665                 case CMD_WRITE_TI_TYPE
: 
 666                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 668                 case CMD_SIMULATE_TAG_125K
: 
 669                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 0); 
 670                         //SimulateTagLowFrequencyA(c->arg[0], c->arg[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
); 
 796                 case CMD_READER_MIFARE
: 
 797             ReaderMifare(c
->arg
[0]); 
 799                 case CMD_MIFARE_READBL
: 
 800                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 802                 case CMD_MIFAREU_READBL
: 
 803                         MifareUReadBlock(c
->arg
[0],c
->d
.asBytes
); 
 805                 case CMD_MIFAREUC_AUTH1
: 
 806                         MifareUC_Auth1(c
->arg
[0],c
->d
.asBytes
); 
 808                 case CMD_MIFAREUC_AUTH2
: 
 809                         MifareUC_Auth2(c
->arg
[0],c
->d
.asBytes
); 
 811                 case CMD_MIFAREU_READCARD
: 
 812                         MifareUReadCard(c
->arg
[0],c
->arg
[1],c
->d
.asBytes
); 
 814                 case CMD_MIFAREUC_READCARD
: 
 815                         MifareUReadCard(c
->arg
[0],c
->arg
[1],c
->d
.asBytes
); 
 817                 case CMD_MIFARE_READSC
: 
 818                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 820                 case CMD_MIFARE_WRITEBL
: 
 821                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 823                 case CMD_MIFAREU_WRITEBL_COMPAT
: 
 824                         MifareUWriteBlock(c
->arg
[0], c
->d
.asBytes
); 
 826                 case CMD_MIFAREU_WRITEBL
: 
 827                         MifareUWriteBlock_Special(c
->arg
[0], c
->d
.asBytes
); 
 829                 case CMD_MIFARE_NESTED
: 
 830                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 832                 case CMD_MIFARE_CHKKEYS
: 
 833                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 835                 case CMD_SIMULATE_MIFARE_CARD
: 
 836                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 840                 case CMD_MIFARE_SET_DBGMODE
: 
 841                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 843                 case CMD_MIFARE_EML_MEMCLR
: 
 844                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 846                 case CMD_MIFARE_EML_MEMSET
: 
 847                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 849                 case CMD_MIFARE_EML_MEMGET
: 
 850                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 852                 case CMD_MIFARE_EML_CARDLOAD
: 
 853                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 856                 // Work with "magic Chinese" card 
 857                 case CMD_MIFARE_EML_CSETBLOCK
: 
 858                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 860                 case CMD_MIFARE_EML_CGETBLOCK
: 
 861                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 865                 case CMD_MIFARE_SNIFFER
: 
 866                         SniffMifare(c
->arg
[0]); 
 870                 case CMD_MIFARE_DESFIRE_READBL
: 
 872                 case CMD_MIFARE_DESFIRE_WRITEBL
: 
 874                 case CMD_MIFARE_DESFIRE_AUTH1
: 
 875                         MifareDES_Auth1(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 877                 case CMD_MIFARE_DESFIRE_AUTH2
: 
 878                         //MifareDES_Auth2(c->arg[0],c->d.asBytes); 
 880                 // case CMD_MIFARE_DES_READER: 
 881                         // ReaderMifareDES(c->arg[0], c->arg[1], c->d.asBytes); 
 883                 case CMD_MIFARE_DESFIRE_INFO
: 
 884                         MifareDesfireGetInformation(); 
 886                 case CMD_MIFARE_DESFIRE
: 
 887                         MifareSendCommand(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
 893                 // Makes use of ISO14443a FPGA Firmware 
 894                 case CMD_SNOOP_ICLASS
: 
 897                 case CMD_SIMULATE_TAG_ICLASS
: 
 898                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 900                 case CMD_READER_ICLASS
: 
 901                         ReaderIClass(c
->arg
[0]); 
 903                 case CMD_READER_ICLASS_REPLAY
: 
 904                         ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
); 
 908                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 909                         SimulateTagHfListen(); 
 916                 case CMD_MEASURE_ANTENNA_TUNING
: 
 917                         MeasureAntennaTuning(); 
 920                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 921                         MeasureAntennaTuningHf(); 
 924                 case CMD_LISTEN_READER_FIELD
: 
 925                         ListenReaderField(c
->arg
[0]); 
 928                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 929                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 931                         LED_D_OFF(); // LED D indicates field ON or OFF 
 934                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 937                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 938                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 939                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
); 
 941                         // Trigger a finish downloading signal with an ACK frame 
 942                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 946                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 947                         uint8_t *b 
= (uint8_t *)BigBuf
; 
 948                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
 949                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 956                 case CMD_SET_LF_DIVISOR
: 
 957                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 958                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 961                 case CMD_SET_ADC_MUX
: 
 963                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 964                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 965                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 966                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 982                 case CMD_SETUP_WRITE
: 
 983                 case CMD_FINISH_WRITE
: 
 984                 case CMD_HARDWARE_RESET
: 
 988                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 990                                 // We're going to reset, and the bootrom will take control. 
 994                 case CMD_START_FLASH
: 
 995                         if(common_area
.flags
.bootrom_present
) { 
 996                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 999                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
1003                 case CMD_DEVICE_INFO
: { 
1004                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
1005                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
1006                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
1010                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
1015 void  __attribute__((noreturn
)) AppMain(void) 
1019         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
1020                 /* Initialize common area */ 
1021                 memset(&common_area
, 0, sizeof(common_area
)); 
1022                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
1023                 common_area
.version 
= 1; 
1025         common_area
.flags
.osimage_present 
= 1; 
1035         // The FPGA gets its clock from us from PCK0 output, so set that up. 
1036         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
1037         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
1038         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
1039         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
1040         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1041                 AT91C_PMC_PRES_CLK_4
; 
1042         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1045         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1047         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1049         // Load the FPGA image, which we have stored in our flash. 
1050         // (the HF version by default) 
1051         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1059   byte_t rx
[sizeof(UsbCommand
)]; 
1064                         rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1066                                 UsbPacketReceived(rx
,rx_len
); 
1072                 if (BUTTON_HELD(1000) > 0)