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
: 
 671                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
 674                 case CMD_LF_SIMULATE_BIDIR
: 
 675                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
 677                 case CMD_INDALA_CLONE_TAG
: 
 678                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
 680                 case CMD_INDALA_CLONE_TAG_L
: 
 681                         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]); 
 683                 case CMD_T55XX_READ_BLOCK
: 
 684                         T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 686                 case CMD_T55XX_WRITE_BLOCK
: 
 687                         T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 689                 case CMD_T55XX_READ_TRACE
: 
 692                 case CMD_PCF7931_READ
: 
 694                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 696                 case CMD_EM4X_READ_WORD
: 
 697                         EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 699                 case CMD_EM4X_WRITE_WORD
: 
 700                         EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 705                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
 706                         SnoopHitag(c
->arg
[0]); 
 708                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
 709                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
 711                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
 712                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
 717                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
 718                         AcquireRawAdcSamplesIso15693(); 
 720                 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
: 
 721                         RecordRawAdcSamplesIso15693(); 
 724                 case CMD_ISO_15693_COMMAND
: 
 725                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 728                 case CMD_ISO_15693_FIND_AFI
: 
 729                         BruteforceIso15693Afi(c
->arg
[0]); 
 732                 case CMD_ISO_15693_DEBUG
: 
 733                         SetDebugIso15693(c
->arg
[0]); 
 736                 case CMD_READER_ISO_15693
: 
 737                         ReaderIso15693(c
->arg
[0]); 
 739                 case CMD_SIMTAG_ISO_15693
: 
 740                         SimTagIso15693(c
->arg
[0], c
->d
.asBytes
); 
 745                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
 746                         LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 749                 case CMD_WRITER_LEGIC_RF
: 
 750                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
 753                 case CMD_READER_LEGIC_RF
: 
 754                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
 758 #ifdef WITH_ISO14443b 
 759                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
: 
 760                         AcquireRawAdcSamplesIso14443(c
->arg
[0]); 
 762                 case CMD_READ_SRI512_TAG
: 
 763                         ReadSTMemoryIso14443(0x0F); 
 765                 case CMD_READ_SRIX4K_TAG
: 
 766                         ReadSTMemoryIso14443(0x7F); 
 768                 case CMD_SNOOP_ISO_14443
: 
 771                 case CMD_SIMULATE_TAG_ISO_14443
: 
 772                         SimulateIso14443Tag(); 
 774                 case CMD_ISO_14443B_COMMAND
: 
 775                         SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 779 #ifdef WITH_ISO14443a 
 780                 case CMD_SNOOP_ISO_14443a
: 
 781                         SnoopIso14443a(c
->arg
[0]); 
 783                 case CMD_READER_ISO_14443a
: 
 786                 case CMD_SIMULATE_TAG_ISO_14443a
: 
 787                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);  // ## Simulate iso14443a tag - pass tag type & UID 
 790                 case CMD_EPA_PACE_COLLECT_NONCE
: 
 791                         EPA_PACE_Collect_Nonce(c
); 
 794                 case CMD_READER_MIFARE
: 
 795             ReaderMifare(c
->arg
[0]); 
 797                 case CMD_MIFARE_READBL
: 
 798                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 800                 case CMD_MIFAREU_READBL
: 
 801                         MifareUReadBlock(c
->arg
[0],c
->d
.asBytes
); 
 803                 case CMD_MIFAREU_READCARD
: 
 804                         MifareUReadCard(c
->arg
[0],c
->d
.asBytes
); 
 806                 case CMD_MIFARE_READSC
: 
 807                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 809                 case CMD_MIFARE_WRITEBL
: 
 810                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 812                 case CMD_MIFAREU_WRITEBL_COMPAT
: 
 813                         MifareUWriteBlock(c
->arg
[0], c
->d
.asBytes
); 
 815                 case CMD_MIFAREU_WRITEBL
: 
 816                         MifareUWriteBlock_Special(c
->arg
[0], c
->d
.asBytes
); 
 818                 case CMD_MIFARE_NESTED
: 
 819                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 821                 case CMD_MIFARE_CHKKEYS
: 
 822                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 824                 case CMD_SIMULATE_MIFARE_CARD
: 
 825                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 829                 case CMD_MIFARE_SET_DBGMODE
: 
 830                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 832                 case CMD_MIFARE_EML_MEMCLR
: 
 833                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 835                 case CMD_MIFARE_EML_MEMSET
: 
 836                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 838                 case CMD_MIFARE_EML_MEMGET
: 
 839                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 841                 case CMD_MIFARE_EML_CARDLOAD
: 
 842                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 845                 // Work with "magic Chinese" card 
 846                 case CMD_MIFARE_CSETBLOCK
: 
 847                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 849                 case CMD_MIFARE_CGETBLOCK
: 
 850                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 852                 case CMD_MIFARE_CIDENT
: 
 857                 case CMD_MIFARE_SNIFFER
: 
 858                         SniffMifare(c
->arg
[0]); 
 863                 // Makes use of ISO14443a FPGA Firmware 
 864                 case CMD_SNOOP_ICLASS
: 
 867                 case CMD_SIMULATE_TAG_ICLASS
: 
 868                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 870                 case CMD_READER_ICLASS
: 
 871                         ReaderIClass(c
->arg
[0]); 
 873                 case CMD_READER_ICLASS_REPLAY
: 
 874                     ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
); 
 878                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 879                         SimulateTagHfListen(); 
 886                 case CMD_MEASURE_ANTENNA_TUNING
: 
 887                         MeasureAntennaTuning(); 
 890                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 891                         MeasureAntennaTuningHf(); 
 894                 case CMD_LISTEN_READER_FIELD
: 
 895                         ListenReaderField(c
->arg
[0]); 
 898                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 899                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 901                         LED_D_OFF(); // LED D indicates field ON or OFF 
 904                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 907                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 908                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 909                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
); 
 911                         // Trigger a finish downloading signal with an ACK frame 
 912                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 916                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 917                         uint8_t *b 
= (uint8_t *)BigBuf
; 
 918                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
 919                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 926                 case CMD_SET_LF_DIVISOR
: 
 927                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 928                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 931                 case CMD_SET_ADC_MUX
: 
 933                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 934                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 935                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 936                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 952                 case CMD_SETUP_WRITE
: 
 953                 case CMD_FINISH_WRITE
: 
 954                 case CMD_HARDWARE_RESET
: 
 958                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 960                                 // We're going to reset, and the bootrom will take control. 
 964                 case CMD_START_FLASH
: 
 965                         if(common_area
.flags
.bootrom_present
) { 
 966                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 969                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 973                 case CMD_DEVICE_INFO
: { 
 974                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 975                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 976                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
 980                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 985 void  __attribute__((noreturn
)) AppMain(void) 
 989         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 990                 /* Initialize common area */ 
 991                 memset(&common_area
, 0, sizeof(common_area
)); 
 992                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
 993                 common_area
.version 
= 1; 
 995         common_area
.flags
.osimage_present 
= 1; 
1005         // The FPGA gets its clock from us from PCK0 output, so set that up. 
1006         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
1007         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
1008         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
1009         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
1010         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1011                 AT91C_PMC_PRES_CLK_4
; 
1012         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1015         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1017         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1019         // Load the FPGA image, which we have stored in our flash. 
1020         // (the HF version by default) 
1021         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1029   byte_t rx
[sizeof(UsbCommand
)]; 
1034       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1036         UsbPacketReceived(rx
,rx_len
); 
1042                 if (BUTTON_HELD(1000) > 0)