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" 
  26 #include "lfsampling.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 ToSendReset(void) 
  52 void ToSendStuffBit(int b
) 
  56                 ToSend
[ToSendMax
] = 0; 
  61                 ToSend
[ToSendMax
] |= (1 << (7 - ToSendBit
)); 
  66         if(ToSendMax 
>= sizeof(ToSend
)) { 
  68                 DbpString("ToSendStuffBit overflowed!"); 
  72 //============================================================================= 
  73 // Debug print functions, to go out over USB, to the usual PC-side client. 
  74 //============================================================================= 
  76 void DbpString(char *str
) 
  78   byte_t len 
= strlen(str
); 
  79   cmd_send(CMD_DEBUG_PRINT_STRING
,len
,0,0,(byte_t
*)str
,len
); 
  83 void DbpIntegers(int x1
, int x2
, int x3
) 
  85   cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0); 
  89 void Dbprintf(const char *fmt
, ...) { 
  90 // should probably limit size here; oh well, let's just use a big buffer 
  91         char output_string
[128]; 
  95         kvsprintf(fmt
, output_string
, 10, ap
); 
  98         DbpString(output_string
); 
 101 // prints HEX & ASCII 
 102 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) { 
 115                         if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.'; 
 118                         Dbprintf("%-8s %*D",ascii
,l
,d
," "); 
 120                         Dbprintf("%*D",l
,d
," "); 
 128 //----------------------------------------------------------------------------- 
 129 // Read an ADC channel and block till it completes, then return the result 
 130 // in ADC units (0 to 1023). Also a routine to average 32 samples and 
 132 //----------------------------------------------------------------------------- 
 133 static int ReadAdc(int ch
) 
 137         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
 138         AT91C_BASE_ADC
->ADC_MR 
= 
 139                 ADC_MODE_PRESCALE(63  /* was 32 */) |                                                   // ADC_CLK = MCK / ((63+1) * 2) = 48MHz / 128 = 375kHz 
 140                 ADC_MODE_STARTUP_TIME(1  /* was 16 */) |                                                // Startup Time = (1+1) * 8 / ADC_CLK = 16 / 375kHz = 42,7us     Note: must be > 20us 
 141                 ADC_MODE_SAMPLE_HOLD_TIME(15  /* was 8 */);                                     // Sample & Hold Time SHTIM = 15 / ADC_CLK = 15 / 375kHz = 40us 
 143         // Note: ADC_MODE_PRESCALE and ADC_MODE_SAMPLE_HOLD_TIME are set to the maximum allowed value.  
 144         // Both AMPL_LO and AMPL_HI are very high impedance (10MOhm) outputs, the input capacitance of the ADC is 12pF (typical). This results in a time constant 
 145         // of RC = 10MOhm * 12pF = 120us. Even after the maximum configurable sample&hold time of 40us the input capacitor will not be fully charged.  
 148         // If there is a voltage v_in at the input, the voltage v_cap at the capacitor (this is what we are measuring) will be 
 150         //       v_cap = v_in * (1 - exp(-RC/SHTIM))  =   v_in * (1 - exp(-3))  =  v_in * 0,95                   (i.e. an error of 5%) 
 152         // Note: with the "historic" values in the comments above, the error was 34%  !!! 
 154         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ch
); 
 156         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
 158         while(!(AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ch
))) 
 160         d 
= AT91C_BASE_ADC
->ADC_CDR
[ch
]; 
 165 int AvgAdc(int ch
) // was static - merlok 
 170         for(i 
= 0; i 
< 32; i
++) { 
 174         return (a 
+ 15) >> 5; 
 177 void MeasureAntennaTuning(void) 
 179         uint8_t LF_Results
[256]; 
 180         int i
, adcval 
= 0, peak 
= 0, peakv 
= 0, peakf 
= 0; //ptr = 0  
 181         int vLf125 
= 0, vLf134 
= 0, vHf 
= 0;    // in mV 
 186  * Sweeps the useful LF range of the proxmark from 
 187  * 46.8kHz (divisor=255) to 600kHz (divisor=19) and 
 188  * read the voltage in the antenna, the result left 
 189  * in the buffer is a graph which should clearly show 
 190  * the resonating frequency of your LF antenna 
 191  * ( hopefully around 95 if it is tuned to 125kHz!) 
 194         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 195         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC 
| FPGA_LF_ADC_READER_FIELD
); 
 196         for (i
=255; i
>=19; i
--) { 
 198                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 200                 adcval 
= ((MAX_ADC_LF_VOLTAGE 
* AvgAdc(ADC_CHAN_LF
)) >> 10); 
 201                 if (i
==95)      vLf125 
= adcval
; // voltage at 125Khz 
 202                 if (i
==89)      vLf134 
= adcval
; // voltage at 134Khz 
 204                 LF_Results
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes 
 205                 if(LF_Results
[i
] > peak
) { 
 207                         peak 
= LF_Results
[i
]; 
 213         for (i
=18; i 
>= 0; i
--) LF_Results
[i
] = 0; 
 216         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 217         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 218         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 220         vHf 
= (MAX_ADC_HF_VOLTAGE 
* AvgAdc(ADC_CHAN_HF
)) >> 10; 
 222         cmd_send(CMD_MEASURED_ANTENNA_TUNING
, vLf125 
| (vLf134
<<16), vHf
, peakf 
| (peakv
<<16), LF_Results
, 256); 
 223         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 229 void MeasureAntennaTuningHf(void) 
 231         int vHf 
= 0;    // in mV 
 233         DbpString("Measuring HF antenna, press button to exit"); 
 235         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 236         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 237         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 241                 vHf 
= (MAX_ADC_HF_VOLTAGE 
* AvgAdc(ADC_CHAN_HF
)) >> 10; 
 243                 Dbprintf("%d mV",vHf
); 
 244                 if (BUTTON_PRESS()) break; 
 246         DbpString("cancelled"); 
 248         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 253 void ReadMem(int addr
) 
 255         const uint8_t *data 
= ((uint8_t *)addr
); 
 257         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 258                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 261 /* osimage version information is linked in */ 
 262 extern struct version_information version_information
; 
 263 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 264 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
, _bootrom_start
, _bootrom_end
, __data_src_start__
; 
 265 void SendVersion(void) 
 267         char temp
[USB_CMD_DATA_SIZE
]; /* Limited data payload in USB packets */ 
 268         char VersionString
[USB_CMD_DATA_SIZE
] = { '\0' }; 
 270         /* Try to find the bootrom version information. Expect to find a pointer at 
 271          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 272          * pointer, then use it. 
 274         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 275         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 276                 strcat(VersionString
, "bootrom version information appears invalid\n"); 
 278                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 279                 strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1); 
 282         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 283         strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1); 
 285         FpgaGatherVersion(FPGA_BITSTREAM_LF
, temp
, sizeof(temp
)); 
 286         strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1); 
 287         FpgaGatherVersion(FPGA_BITSTREAM_HF
, temp
, sizeof(temp
)); 
 288         strncat(VersionString
, temp
, sizeof(VersionString
) - strlen(VersionString
) - 1); 
 290         // Send Chip ID and used flash memory 
 291         uint32_t text_and_rodata_section_size 
= (uint32_t)&__data_src_start__ 
- (uint32_t)&_flash_start
; 
 292         uint32_t compressed_data_section_size 
= common_area
.arg1
; 
 293         cmd_send(CMD_ACK
, *(AT91C_DBGU_CIDR
), text_and_rodata_section_size 
+ compressed_data_section_size
, 0, VersionString
, strlen(VersionString
)); 
 297 // samy's sniff and repeat routine 
 300         DbpString("Stand-alone mode! No PC necessary."); 
 301         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 303         // 3 possible options? no just 2 for now 
 306         int high
[OPTS
], low
[OPTS
]; 
 308         // Oooh pretty -- notify user we're in elite samy mode now 
 310         LED(LED_ORANGE
, 200); 
 312         LED(LED_ORANGE
, 200); 
 314         LED(LED_ORANGE
, 200); 
 316         LED(LED_ORANGE
, 200); 
 323         // Turn on selected LED 
 324         LED(selected 
+ 1, 0); 
 331                 // Was our button held down or pressed? 
 332                 int button_pressed 
= BUTTON_HELD(1000); 
 335                 // Button was held for a second, begin recording 
 336                 if (button_pressed 
> 0 && cardRead 
== 0) 
 339                         LED(selected 
+ 1, 0); 
 343                         DbpString("Starting recording"); 
 345                         // wait for button to be released 
 346                         while(BUTTON_PRESS()) 
 349                         /* need this delay to prevent catching some weird data */ 
 352                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 353                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 356                         LED(selected 
+ 1, 0); 
 357                         // Finished recording 
 359                         // If we were previously playing, set playing off 
 360                         // so next button push begins playing what we recorded 
 367                 else if (button_pressed 
> 0 && cardRead 
== 1) 
 370                                         LED(selected 
+ 1, 0); 
 374                                         Dbprintf("Cloning %x %x %x", selected
, high
[selected
], low
[selected
]); 
 376                                         // wait for button to be released 
 377                                         while(BUTTON_PRESS()) 
 380                                         /* need this delay to prevent catching some weird data */ 
 383                                         CopyHIDtoT55x7(high
[selected
], low
[selected
], 0, 0); 
 384                                         Dbprintf("Cloned %x %x %x", selected
, high
[selected
], low
[selected
]); 
 387                                         LED(selected 
+ 1, 0); 
 388                                         // Finished recording 
 390                                         // If we were previously playing, set playing off 
 391                                         // so next button push begins playing what we recorded 
 398                 // Change where to record (or begin playing) 
 399                 else if (button_pressed
) 
 401                         // Next option if we were previously playing 
 403                                 selected 
= (selected 
+ 1) % OPTS
; 
 407                         LED(selected 
+ 1, 0); 
 409                         // Begin transmitting 
 413                                 DbpString("Playing"); 
 414                                 // wait for button to be released 
 415                                 while(BUTTON_PRESS()) 
 417                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 418                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 419                                 DbpString("Done playing"); 
 420                                 if (BUTTON_HELD(1000) > 0) 
 422                                         DbpString("Exiting"); 
 427                                 /* We pressed a button so ignore it here with a delay */ 
 430                                 // when done, we're done playing, move to next option 
 431                                 selected 
= (selected 
+ 1) % OPTS
; 
 434                                 LED(selected 
+ 1, 0); 
 437                                 while(BUTTON_PRESS()) 
 446 Listen and detect an external reader. Determine the best location 
 450 Inside the ListenReaderField() function, there is two mode. 
 451 By default, when you call the function, you will enter mode 1. 
 452 If you press the PM3 button one time, you will enter mode 2. 
 453 If you press the PM3 button a second time, you will exit the function. 
 455 DESCRIPTION OF MODE 1: 
 456 This mode just listens for an external reader field and lights up green 
 457 for HF and/or red for LF. This is the original mode of the detectreader 
 460 DESCRIPTION OF MODE 2: 
 461 This mode will visually represent, using the LEDs, the actual strength of the 
 462 current compared to the maximum current detected. Basically, once you know 
 463 what kind of external reader is present, it will help you spot the best location to place 
 464 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 465 at the same place! :-) 
 469 static const char LIGHT_SCHEME
[] = { 
 470                 0x0, /* ----     | No field detected */ 
 471                 0x1, /* X---     | 14% of maximum current detected */ 
 472                 0x2, /* -X--     | 29% of maximum current detected */ 
 473                 0x4, /* --X-     | 43% of maximum current detected */ 
 474                 0x8, /* ---X     | 57% of maximum current detected */ 
 475                 0xC, /* --XX     | 71% of maximum current detected */ 
 476                 0xE, /* -XXX     | 86% of maximum current detected */ 
 477                 0xF, /* XXXX     | 100% of maximum current detected */ 
 479 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 481 void ListenReaderField(int limit
) 
 483         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_max
; 
 484         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_max
; 
 485         int mode
=1, display_val
, display_max
, i
; 
 489 #define REPORT_CHANGE                           10    // report new values only if they have changed at least by REPORT_CHANGE 
 492         // switch off FPGA - we don't want to measure our own signal 
 493         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 494         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 498         lf_av 
= lf_max 
= AvgAdc(ADC_CHAN_LF
); 
 500         if(limit 
!= HF_ONLY
) { 
 501                 Dbprintf("LF 125/134kHz Baseline: %dmV", (MAX_ADC_LF_VOLTAGE 
* lf_av
) >> 10); 
 505         hf_av 
= hf_max 
= AvgAdc(ADC_CHAN_HF
); 
 507         if (limit 
!= LF_ONLY
) { 
 508                 Dbprintf("HF 13.56MHz Baseline: %dmV", (MAX_ADC_HF_VOLTAGE 
* hf_av
) >> 10); 
 513                 if (BUTTON_PRESS()) { 
 518                                         DbpString("Signal Strength Mode"); 
 522                                         DbpString("Stopped"); 
 530                 if (limit 
!= HF_ONLY
) { 
 532                                 if (abs(lf_av 
- lf_baseline
) > REPORT_CHANGE
)  
 538                         lf_av_new 
= AvgAdc(ADC_CHAN_LF
); 
 539                         // see if there's a significant change 
 540                         if(abs(lf_av 
- lf_av_new
) > REPORT_CHANGE
) { 
 541                                 Dbprintf("LF 125/134kHz Field Change: %5dmV", (MAX_ADC_LF_VOLTAGE 
* lf_av_new
) >> 10); 
 548                 if (limit 
!= LF_ONLY
) { 
 550                                 if (abs(hf_av 
- hf_baseline
) > REPORT_CHANGE
)    
 556                         hf_av_new 
= AvgAdc(ADC_CHAN_HF
); 
 557                         // see if there's a significant change 
 558                         if(abs(hf_av 
- hf_av_new
) > REPORT_CHANGE
) { 
 559                                 Dbprintf("HF 13.56MHz Field Change: %5dmV", (MAX_ADC_HF_VOLTAGE 
* hf_av_new
) >> 10); 
 567                         if (limit 
== LF_ONLY
) { 
 569                                 display_max 
= lf_max
; 
 570                         } else if (limit 
== HF_ONLY
) { 
 572                                 display_max 
= hf_max
; 
 573                         } else { /* Pick one at random */ 
 574                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 576                                         display_max 
= hf_max
; 
 579                                         display_max 
= lf_max
; 
 582                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 583                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 584                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 585                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 586                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 587                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 595 void UsbPacketReceived(uint8_t *packet
, int len
) 
 597         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 599 //  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]); 
 603                 case CMD_SET_LF_SAMPLING_CONFIG
: 
 604                         setSamplingConfig((sample_config 
*) c
->d
.asBytes
); 
 606                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 607                         cmd_send(CMD_ACK
,SampleLF(c
->arg
[0]),0,0,0,0); 
 609                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 610                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 612                 case CMD_LF_SNOOP_RAW_ADC_SAMPLES
: 
 613                         cmd_send(CMD_ACK
,SnoopLF(),0,0,0,0); 
 615                 case CMD_HID_DEMOD_FSK
: 
 616                         CmdHIDdemodFSK(c
->arg
[0], 0, 0, 1); 
 618                 case CMD_HID_SIM_TAG
: 
 619                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1); 
 621                 case CMD_FSK_SIM_TAG
: 
 622                         CmdFSKsimTAG(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 624                 case CMD_ASK_SIM_TAG
: 
 625                         CmdASKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 627                 case CMD_PSK_SIM_TAG
: 
 628                         CmdPSKsimTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 630                 case CMD_HID_CLONE_TAG
: 
 631                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 633                 case CMD_IO_DEMOD_FSK
: 
 634                         CmdIOdemodFSK(c
->arg
[0], 0, 0, 1); 
 636                 case CMD_IO_CLONE_TAG
: 
 637                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]); 
 639                 case CMD_EM410X_DEMOD
: 
 640                         CmdEM410xdemod(c
->arg
[0], 0, 0, 1); 
 642                 case CMD_EM410X_WRITE_TAG
: 
 643                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 645                 case CMD_READ_TI_TYPE
: 
 648                 case CMD_WRITE_TI_TYPE
: 
 649                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 651                 case CMD_SIMULATE_TAG_125K
: 
 653                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
 656                 case CMD_LF_SIMULATE_BIDIR
: 
 657                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
 659                 case CMD_INDALA_CLONE_TAG
: 
 660                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
 662                 case CMD_INDALA_CLONE_TAG_L
: 
 663                         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]); 
 665                 case CMD_T55XX_READ_BLOCK
: 
 666                         T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 668                 case CMD_T55XX_WRITE_BLOCK
: 
 669                         T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 671                 case CMD_T55XX_READ_TRACE
: 
 674                 case CMD_PCF7931_READ
: 
 676                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 678                 case CMD_EM4X_READ_WORD
: 
 679                         EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 681                 case CMD_EM4X_WRITE_WORD
: 
 682                         EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 687                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
 688                         SnoopHitag(c
->arg
[0]); 
 690                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
 691                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
 693                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
 694                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
 699                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
 700                         AcquireRawAdcSamplesIso15693(); 
 702                 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
: 
 703                         RecordRawAdcSamplesIso15693(); 
 706                 case CMD_ISO_15693_COMMAND
: 
 707                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 710                 case CMD_ISO_15693_FIND_AFI
: 
 711                         BruteforceIso15693Afi(c
->arg
[0]); 
 714                 case CMD_ISO_15693_DEBUG
: 
 715                         SetDebugIso15693(c
->arg
[0]); 
 718                 case CMD_READER_ISO_15693
: 
 719                         ReaderIso15693(c
->arg
[0]); 
 721                 case CMD_SIMTAG_ISO_15693
: 
 722                         SimTagIso15693(c
->arg
[0], c
->d
.asBytes
); 
 727                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
 728                         LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 731                 case CMD_WRITER_LEGIC_RF
: 
 732                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
 735                 case CMD_READER_LEGIC_RF
: 
 736                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
 740 #ifdef WITH_ISO14443b 
 741                 case CMD_READ_SRI512_TAG
: 
 742                         ReadSTMemoryIso14443b(0x0F); 
 744                 case CMD_READ_SRIX4K_TAG
: 
 745                         ReadSTMemoryIso14443b(0x7F); 
 747                 case CMD_SNOOP_ISO_14443B
: 
 750                 case CMD_SIMULATE_TAG_ISO_14443B
: 
 751                         SimulateIso14443bTag(); 
 753                 case CMD_ISO_14443B_COMMAND
: 
 754                         SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 758 #ifdef WITH_ISO14443a 
 759                 case CMD_SNOOP_ISO_14443a
: 
 760                         SnoopIso14443a(c
->arg
[0]); 
 762                 case CMD_READER_ISO_14443a
: 
 765                 case CMD_SIMULATE_TAG_ISO_14443a
: 
 766                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);  // ## Simulate iso14443a tag - pass tag type & UID 
 769                 case CMD_EPA_PACE_COLLECT_NONCE
: 
 770                         EPA_PACE_Collect_Nonce(c
); 
 772                 case CMD_EPA_PACE_REPLAY
: 
 776                 case CMD_READER_MIFARE
: 
 777                         ReaderMifare(c
->arg
[0]); 
 779                 case CMD_MIFARE_READBL
: 
 780                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 782                 case CMD_MIFAREU_READBL
: 
 783                         MifareUReadBlock(c
->arg
[0],c
->arg
[1], c
->d
.asBytes
); 
 785                 case CMD_MIFAREUC_AUTH
: 
 786                         MifareUC_Auth(c
->arg
[0],c
->d
.asBytes
); 
 788                 case CMD_MIFAREU_READCARD
: 
 789                         MifareUReadCard(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 791                 case CMD_MIFAREUC_SETPWD
:  
 792                         MifareUSetPwd(c
->arg
[0], c
->d
.asBytes
); 
 794                 case CMD_MIFARE_READSC
: 
 795                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 797                 case CMD_MIFARE_WRITEBL
: 
 798                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 800                 //case CMD_MIFAREU_WRITEBL_COMPAT: 
 801                         //MifareUWriteBlockCompat(c->arg[0], c->d.asBytes); 
 803                 case CMD_MIFAREU_WRITEBL
: 
 804                         MifareUWriteBlock(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
); 
 806                 case CMD_MIFARE_NESTED
: 
 807                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 809                 case CMD_MIFARE_CHKKEYS
: 
 810                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 812                 case CMD_SIMULATE_MIFARE_CARD
: 
 813                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 817                 case CMD_MIFARE_SET_DBGMODE
: 
 818                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 820                 case CMD_MIFARE_EML_MEMCLR
: 
 821                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 823                 case CMD_MIFARE_EML_MEMSET
: 
 824                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 826                 case CMD_MIFARE_EML_MEMGET
: 
 827                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 829                 case CMD_MIFARE_EML_CARDLOAD
: 
 830                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 833                 // Work with "magic Chinese" card 
 834                 case CMD_MIFARE_CSETBLOCK
: 
 835                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 837                 case CMD_MIFARE_CGETBLOCK
: 
 838                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 840                 case CMD_MIFARE_CIDENT
: 
 845                 case CMD_MIFARE_SNIFFER
: 
 846                         SniffMifare(c
->arg
[0]); 
 852                 // Makes use of ISO14443a FPGA Firmware 
 853                 case CMD_SNOOP_ICLASS
: 
 856                 case CMD_SIMULATE_TAG_ICLASS
: 
 857                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 859                 case CMD_READER_ICLASS
: 
 860                         ReaderIClass(c
->arg
[0]); 
 862                 case CMD_READER_ICLASS_REPLAY
: 
 863                     ReaderIClass_Replay(c
->arg
[0], c
->d
.asBytes
); 
 865         case CMD_ICLASS_EML_MEMSET
: 
 866                         emlSet(c
->d
.asBytes
,c
->arg
[0], c
->arg
[1]); 
 874                 case CMD_MEASURE_ANTENNA_TUNING
: 
 875                         MeasureAntennaTuning(); 
 878                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 879                         MeasureAntennaTuningHf(); 
 882                 case CMD_LISTEN_READER_FIELD
: 
 883                         ListenReaderField(c
->arg
[0]); 
 886                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 887                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 889                         LED_D_OFF(); // LED D indicates field ON or OFF 
 892                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 895                         uint8_t *BigBuf 
= BigBuf_get_addr(); 
 896                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 897                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 898                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,BigBuf_get_traceLen(),BigBuf
+c
->arg
[0]+i
,len
); 
 900                         // Trigger a finish downloading signal with an ACK frame 
 901                         cmd_send(CMD_ACK
,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config
)); 
 905                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 906                         uint8_t *b 
= BigBuf_get_addr(); 
 907                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, USB_CMD_DATA_SIZE
); 
 908                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 915                 case CMD_SET_LF_DIVISOR
: 
 916                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 917                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 920                 case CMD_SET_ADC_MUX
: 
 922                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 923                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 924                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 925                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 941                 case CMD_SETUP_WRITE
: 
 942                 case CMD_FINISH_WRITE
: 
 943                 case CMD_HARDWARE_RESET
: 
 947                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 949                                 // We're going to reset, and the bootrom will take control. 
 953                 case CMD_START_FLASH
: 
 954                         if(common_area
.flags
.bootrom_present
) { 
 955                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 958                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 962                 case CMD_DEVICE_INFO
: { 
 963                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 964                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 965                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
 969                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 974 void  __attribute__((noreturn
)) AppMain(void) 
 978         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 979                 /* Initialize common area */ 
 980                 memset(&common_area
, 0, sizeof(common_area
)); 
 981                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
 982                 common_area
.version 
= 1; 
 984         common_area
.flags
.osimage_present 
= 1; 
 994         // The FPGA gets its clock from us from PCK0 output, so set that up. 
 995         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
 996         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
 997         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
 998         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
 999         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1000                 AT91C_PMC_PRES_CLK_4
; 
1001         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1004         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1006         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1008         // Load the FPGA image, which we have stored in our flash. 
1009         // (the HF version by default) 
1010         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1018   byte_t rx
[sizeof(UsbCommand
)]; 
1023       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1025         UsbPacketReceived(rx
,rx_len
); 
1031                 if (BUTTON_HELD(1000) > 0)