1 //----------------------------------------------------------------------------- 
   2 // Jonathan Westhues, Mar 2006 
   3 // Edits by Gerhard de Koning Gans, Sep 2007 (##) 
   5 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   6 // at your option, any later version. See the LICENSE.txt file for the text of 
   8 //----------------------------------------------------------------------------- 
   9 // The main application code. This is the first thing called after start.c 
  11 //----------------------------------------------------------------------------- 
  16 #include "proxmark3.h" 
  31 #define abs(x) ( ((x)<0) ? -(x) : (x) ) 
  33 //============================================================================= 
  34 // A buffer where we can queue things up to be sent through the FPGA, for 
  35 // any purpose (fake tag, as reader, whatever). We go MSB first, since that 
  36 // is the order in which they go out on the wire. 
  37 //============================================================================= 
  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(ToSendBit 
>= 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
); 
  84 //      /* this holds up stuff unless we're connected to usb */ 
  85 //      if (!UsbConnected()) 
  89 //      c.cmd = CMD_DEBUG_PRINT_STRING; 
  90 //      c.arg[0] = strlen(str); 
  91 //      if(c.arg[0] > sizeof(c.d.asBytes)) { 
  92 //              c.arg[0] = sizeof(c.d.asBytes); 
  94 //      memcpy(c.d.asBytes, str, c.arg[0]); 
  96 //      UsbSendPacket((uint8_t *)&c, sizeof(c)); 
  97 //      // TODO fix USB so stupid things like this aren't req'd 
 102 void DbpIntegers(int x1
, int x2
, int x3
) 
 104   cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0); 
 105 //      /* this holds up stuff unless we're connected to usb */ 
 106 //      if (!UsbConnected()) 
 110 //      c.cmd = CMD_DEBUG_PRINT_INTEGERS; 
 115 //      UsbSendPacket((uint8_t *)&c, sizeof(c)); 
 121 void Dbprintf(const char *fmt
, ...) { 
 122 // should probably limit size here; oh well, let's just use a big buffer 
 123         char output_string
[128]; 
 127         kvsprintf(fmt
, output_string
, 10, ap
); 
 130         DbpString(output_string
); 
 133 // prints HEX & ASCII 
 134 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) { 
 147                         if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.'; 
 150                         Dbprintf("%-8s %*D",ascii
,l
,d
," "); 
 152                         Dbprintf("%*D",l
,d
," "); 
 160 //----------------------------------------------------------------------------- 
 161 // Read an ADC channel and block till it completes, then return the result 
 162 // in ADC units (0 to 1023). Also a routine to average 32 samples and 
 164 //----------------------------------------------------------------------------- 
 165 static int ReadAdc(int ch
) 
 169         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_SWRST
; 
 170         AT91C_BASE_ADC
->ADC_MR 
= 
 171                 ADC_MODE_PRESCALE(32) | 
 172                 ADC_MODE_STARTUP_TIME(16) | 
 173                 ADC_MODE_SAMPLE_HOLD_TIME(8); 
 174         AT91C_BASE_ADC
->ADC_CHER 
= ADC_CHANNEL(ch
); 
 176         AT91C_BASE_ADC
->ADC_CR 
= AT91C_ADC_START
; 
 177         while(!(AT91C_BASE_ADC
->ADC_SR 
& ADC_END_OF_CONVERSION(ch
))) 
 179         d 
= AT91C_BASE_ADC
->ADC_CDR
[ch
]; 
 184 int AvgAdc(int ch
) // was static - merlok 
 189         for(i 
= 0; i 
< 32; i
++) { 
 193         return (a 
+ 15) >> 5; 
 196 void MeasureAntennaTuning(void) 
 198         uint8_t *dest 
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
; 
 199         int i
, adcval 
= 0, peak 
= 0, peakv 
= 0, peakf 
= 0; //ptr = 0  
 200         int vLf125 
= 0, vLf134 
= 0, vHf 
= 0;    // in mV 
 205         DbpString("Measuring antenna characteristics, please wait..."); 
 206         memset(dest
,0,sizeof(FREE_BUFFER_SIZE
)); 
 209  * Sweeps the useful LF range of the proxmark from 
 210  * 46.8kHz (divisor=255) to 600kHz (divisor=19) and 
 211  * read the voltage in the antenna, the result left 
 212  * in the buffer is a graph which should clearly show 
 213  * the resonating frequency of your LF antenna 
 214  * ( hopefully around 95 if it is tuned to 125kHz!) 
 217         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER
); 
 218         for (i
=255; i
>19; i
--) { 
 220                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 222                 // Vref = 3.3V, and a 10000:240 voltage divider on the input 
 223                 // can measure voltages up to 137500 mV 
 224                 adcval 
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10); 
 225                 if (i
==95)      vLf125 
= adcval
; // voltage at 125Khz 
 226                 if (i
==89)      vLf134 
= adcval
; // voltage at 134Khz 
 228                 dest
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes 
 238         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 239         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 241         // Vref = 3300mV, and an 10:1 voltage divider on the input 
 242         // can measure voltages up to 33000 mV 
 243         vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 245 //      c.cmd = CMD_MEASURED_ANTENNA_TUNING; 
 246 //      c.arg[0] = (vLf125 << 0) | (vLf134 << 16); 
 248 //      c.arg[2] = peakf | (peakv << 16); 
 250   DbpString("Measuring complete, sending report back to host"); 
 251   cmd_send(CMD_MEASURED_ANTENNA_TUNING
,vLf125
|(vLf134
<<16),vHf
,peakf
|(peakv
<<16),0,0); 
 252 //      UsbSendPacket((uint8_t *)&c, sizeof(c)); 
 253         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 259 void MeasureAntennaTuningHf(void) 
 261         int vHf 
= 0;    // in mV 
 263         DbpString("Measuring HF antenna, press button to exit"); 
 266                 // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 267                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 269                 // Vref = 3300mV, and an 10:1 voltage divider on the input 
 270                 // can measure voltages up to 33000 mV 
 271                 vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 273                 Dbprintf("%d mV",vHf
); 
 274                 if (BUTTON_PRESS()) break; 
 276         DbpString("cancelled"); 
 280 void SimulateTagHfListen(void) 
 282         uint8_t *dest 
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
; 
 287         // We're using this mode just so that I can test it out; the simulated 
 288         // tag mode would work just as well and be simpler. 
 289         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
 291         // We need to listen to the high-frequency, peak-detected path. 
 292         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 298                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 299                         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 301                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 302                         uint8_t r 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 316                                 if(i 
>= FREE_BUFFER_SIZE
) { 
 322         DbpString("simulate tag (now type bitsamples)"); 
 325 void ReadMem(int addr
) 
 327         const uint8_t *data 
= ((uint8_t *)addr
); 
 329         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 330                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 333 /* osimage version information is linked in */ 
 334 extern struct version_information version_information
; 
 335 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 336 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
; 
 337 void SendVersion(void) 
 339         char temp
[48]; /* Limited data payload in USB packets */ 
 340         DbpString("Prox/RFID mark3 RFID instrument"); 
 342         /* Try to find the bootrom version information. Expect to find a pointer at 
 343          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 344          * pointer, then use it. 
 346         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 347         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 348                 DbpString("bootrom version information appears invalid"); 
 350                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 354         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 357         FpgaGatherVersion(temp
, sizeof(temp
)); 
 362 // samy's sniff and repeat routine 
 365         DbpString("Stand-alone mode! No PC necessary."); 
 367         // 3 possible options? no just 2 for now 
 370         int high
[OPTS
], low
[OPTS
]; 
 372         // Oooh pretty -- notify user we're in elite samy mode now 
 374         LED(LED_ORANGE
, 200); 
 376         LED(LED_ORANGE
, 200); 
 378         LED(LED_ORANGE
, 200); 
 380         LED(LED_ORANGE
, 200); 
 386         // Turn on selected LED 
 387         LED(selected 
+ 1, 0); 
 395                 // Was our button held down or pressed? 
 396                 int button_pressed 
= BUTTON_HELD(1000); 
 399                 // Button was held for a second, begin recording 
 400                 if (button_pressed 
> 0) 
 403                         LED(selected 
+ 1, 0); 
 407                         DbpString("Starting recording"); 
 409                         // wait for button to be released 
 410                         while(BUTTON_PRESS()) 
 413                         /* need this delay to prevent catching some weird data */ 
 416                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 417                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 420                         LED(selected 
+ 1, 0); 
 421                         // Finished recording 
 423                         // If we were previously playing, set playing off 
 424                         // so next button push begins playing what we recorded 
 428                 // Change where to record (or begin playing) 
 429                 else if (button_pressed
) 
 431                         // Next option if we were previously playing 
 433                                 selected 
= (selected 
+ 1) % OPTS
; 
 437                         LED(selected 
+ 1, 0); 
 439                         // Begin transmitting 
 443                                 DbpString("Playing"); 
 444                                 // wait for button to be released 
 445                                 while(BUTTON_PRESS()) 
 447                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 448                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 449                                 DbpString("Done playing"); 
 450                                 if (BUTTON_HELD(1000) > 0) 
 452                                         DbpString("Exiting"); 
 457                                 /* We pressed a button so ignore it here with a delay */ 
 460                                 // when done, we're done playing, move to next option 
 461                                 selected 
= (selected 
+ 1) % OPTS
; 
 464                                 LED(selected 
+ 1, 0); 
 467                                 while(BUTTON_PRESS()) 
 476 Listen and detect an external reader. Determine the best location 
 480 Inside the ListenReaderField() function, there is two mode. 
 481 By default, when you call the function, you will enter mode 1. 
 482 If you press the PM3 button one time, you will enter mode 2. 
 483 If you press the PM3 button a second time, you will exit the function. 
 485 DESCRIPTION OF MODE 1: 
 486 This mode just listens for an external reader field and lights up green 
 487 for HF and/or red for LF. This is the original mode of the detectreader 
 490 DESCRIPTION OF MODE 2: 
 491 This mode will visually represent, using the LEDs, the actual strength of the 
 492 current compared to the maximum current detected. Basically, once you know 
 493 what kind of external reader is present, it will help you spot the best location to place 
 494 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 495 at the same place! :-) 
 499 static const char LIGHT_SCHEME
[] = { 
 500                 0x0, /* ----     | No field detected */ 
 501                 0x1, /* X---     | 14% of maximum current detected */ 
 502                 0x2, /* -X--     | 29% of maximum current detected */ 
 503                 0x4, /* --X-     | 43% of maximum current detected */ 
 504                 0x8, /* ---X     | 57% of maximum current detected */ 
 505                 0xC, /* --XX     | 71% of maximum current detected */ 
 506                 0xE, /* -XXX     | 86% of maximum current detected */ 
 507                 0xF, /* XXXX     | 100% of maximum current detected */ 
 509 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 511 void ListenReaderField(int limit
) 
 513         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
; 
 514         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_count
= 0, hf_max
; 
 515         int mode
=1, display_val
, display_max
, i
; 
 522         lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
); 
 524         if(limit 
!= HF_ONLY
) { 
 525                 Dbprintf("LF 125/134 Baseline: %d", lf_av
); 
 529         hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
); 
 531         if (limit 
!= LF_ONLY
) { 
 532                 Dbprintf("HF 13.56 Baseline: %d", hf_av
); 
 537                 if (BUTTON_PRESS()) { 
 542                                         DbpString("Signal Strength Mode"); 
 546                                         DbpString("Stopped"); 
 554                 if (limit 
!= HF_ONLY
) { 
 556                                 if (abs(lf_av 
- lf_baseline
) > 10) LED_D_ON(); 
 561                         lf_av_new
= ReadAdc(ADC_CHAN_LF
); 
 562                         // see if there's a significant change 
 563                         if(abs(lf_av 
- lf_av_new
) > 10) { 
 564                                 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
); 
 572                 if (limit 
!= LF_ONLY
) { 
 574                                 if (abs(hf_av 
- hf_baseline
) > 10) LED_B_ON(); 
 579                         hf_av_new
= ReadAdc(ADC_CHAN_HF
); 
 580                         // see if there's a significant change 
 581                         if(abs(hf_av 
- hf_av_new
) > 10) { 
 582                                 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
); 
 591                         if (limit 
== LF_ONLY
) { 
 593                                 display_max 
= lf_max
; 
 594                         } else if (limit 
== HF_ONLY
) { 
 596                                 display_max 
= hf_max
; 
 597                         } else { /* Pick one at random */ 
 598                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 600                                         display_max 
= hf_max
; 
 603                                         display_max 
= lf_max
; 
 606                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 607                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 608                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 609                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 610                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 611                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 619 void UsbPacketReceived(uint8_t *packet
, int len
) 
 621         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 623 //  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]); 
 627                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 628                         AcquireRawAdcSamples125k(c
->arg
[0]); 
 629       cmd_send(CMD_ACK
,0,0,0,0,0); 
 631                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 632                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 634                 case CMD_HID_DEMOD_FSK
: 
 635                         CmdHIDdemodFSK(0, 0, 0, 1);                                     // Demodulate HID tag 
 637                 case CMD_HID_SIM_TAG
: 
 638                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1);                                  // Simulate HID tag by ID 
 640     case CMD_HID_CLONE_TAG
: // Clone HID tag by ID to T55x7 
 641       CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 643                 case CMD_EM410X_WRITE_TAG
: 
 644                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 646                 case CMD_READ_TI_TYPE
: 
 649                 case CMD_WRITE_TI_TYPE
: 
 650                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 652                 case CMD_SIMULATE_TAG_125K
: 
 654                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
 657                 case CMD_LF_SIMULATE_BIDIR
: 
 658                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
 660                 case CMD_INDALA_CLONE_TAG
:                                      // Clone Indala 64-bit tag by UID to T55x7 
 661                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
 663                 case CMD_INDALA_CLONE_TAG_L
:                                    // Clone Indala 224-bit tag by UID to T55x7 
 664                         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]); 
 666     case CMD_T55XX_READ_BLOCK
: 
 667       T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 669     case CMD_T55XX_WRITE_BLOCK
: 
 670       T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 672     case CMD_T55XX_READ_TRACE
: // Clone HID tag by ID to T55x7 
 675     case CMD_PCF7931_READ
: // Read PCF7931 tag 
 677       cmd_send(CMD_ACK
,0,0,0,0,0); 
 678 //      UsbSendPacket((uint8_t*)&ack, sizeof(ack)); 
 680     case CMD_EM4X_READ_WORD
: 
 681       EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 683     case CMD_EM4X_WRITE_WORD
: 
 684       EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 689                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
 690                         SnoopHitag(c
->arg
[0]); 
 692                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
 693                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
 695                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
 696                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
 701                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
 702                         AcquireRawAdcSamplesIso15693(); 
 704                 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
: 
 705                         RecordRawAdcSamplesIso15693(); 
 708                 case CMD_ISO_15693_COMMAND
: 
 709                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 712                 case CMD_ISO_15693_FIND_AFI
: 
 713                         BruteforceIso15693Afi(c
->arg
[0]); 
 716                 case CMD_ISO_15693_DEBUG
: 
 717                         SetDebugIso15693(c
->arg
[0]); 
 720                 case CMD_READER_ISO_15693
: 
 721                         ReaderIso15693(c
->arg
[0]); 
 723                 case CMD_SIMTAG_ISO_15693
: 
 724                         SimTagIso15693(c
->arg
[0]); 
 729                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
 730                         LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 733                 case CMD_WRITER_LEGIC_RF
: 
 734                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
 737                 case CMD_READER_LEGIC_RF
: 
 738                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
 742 #ifdef WITH_ISO14443b 
 743                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
: 
 744                         AcquireRawAdcSamplesIso14443(c
->arg
[0]); 
 746                 case CMD_READ_SRI512_TAG
: 
 747                         ReadSRI512Iso14443(c
->arg
[0]); 
 749                 case CMD_READ_SRIX4K_TAG
: 
 750                         ReadSRIX4KIso14443(c
->arg
[0]); 
 752                 case CMD_SNOOP_ISO_14443
: 
 755                 case CMD_SIMULATE_TAG_ISO_14443
: 
 756                         SimulateIso14443Tag(); 
 760 #ifdef WITH_ISO14443a 
 761                 case CMD_SNOOP_ISO_14443a
: 
 762                         SnoopIso14443a(c
->arg
[0]); 
 764                 case CMD_READER_ISO_14443a
: 
 767                 case CMD_SIMULATE_TAG_ISO_14443a
: 
 768                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2]);  // ## Simulate iso14443a tag - pass tag type & UID 
 770                 case CMD_EPA_PACE_COLLECT_NONCE
: 
 771                         EPA_PACE_Collect_Nonce(c
); 
 774                 case CMD_READER_MIFARE
: 
 775                         ReaderMifare(c
->arg
[0]); 
 777                 case CMD_MIFARE_READBL
: 
 778                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 780                 case CMD_MIFARE_READSC
: 
 781                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 783                 case CMD_MIFARE_WRITEBL
: 
 784                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 786                 case CMD_MIFARE_NESTED
: 
 787                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 789                 case CMD_MIFARE_CHKKEYS
: 
 790                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 792                 case CMD_SIMULATE_MIFARE_CARD
: 
 793                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 797                 case CMD_MIFARE_SET_DBGMODE
: 
 798                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 800                 case CMD_MIFARE_EML_MEMCLR
: 
 801                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 803                 case CMD_MIFARE_EML_MEMSET
: 
 804                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 806                 case CMD_MIFARE_EML_MEMGET
: 
 807                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 809                 case CMD_MIFARE_EML_CARDLOAD
: 
 810                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 813                 // Work with "magic Chinese" card 
 814                 case CMD_MIFARE_EML_CSETBLOCK
: 
 815                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 817                 case CMD_MIFARE_EML_CGETBLOCK
: 
 818                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 822                 case CMD_MIFARE_SNIFFER
: 
 823                         SniffMifare(c
->arg
[0]); 
 828                 // Makes use of ISO14443a FPGA Firmware 
 829                 case CMD_SNOOP_ICLASS
: 
 832                 case CMD_SIMULATE_TAG_ICLASS
: 
 833                         SimulateIClass(c
->arg
[0], c
->d
.asBytes
); 
 835                 case CMD_READER_ICLASS
: 
 836                         ReaderIClass(c
->arg
[0]); 
 840                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 841                         SimulateTagHfListen(); 
 848                 case CMD_MEASURE_ANTENNA_TUNING
: 
 849                         MeasureAntennaTuning(); 
 852                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 853                         MeasureAntennaTuningHf(); 
 856                 case CMD_LISTEN_READER_FIELD
: 
 857                         ListenReaderField(c
->arg
[0]); 
 860                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 861                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 863                         LED_D_OFF(); // LED D indicates field ON or OFF 
 866                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: { 
 868 //                      if(c->cmd == CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K) { 
 869 //                              n.cmd = CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K; 
 871 //                              n.cmd = CMD_DOWNLOADED_RAW_BITS_TI_TYPE; 
 873 //                      n.arg[0] = c->arg[0]; 
 874       //                        memcpy(n.d.asBytes, BigBuf+c->arg[0], 48); // 12*sizeof(uint32_t) 
 876       //      usb_write((uint8_t *)&n, sizeof(n)); 
 877       //                        UsbSendPacket((uint8_t *)&n, sizeof(n)); 
 881       for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 882         size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 883         cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
); 
 885       // Trigger a finish downloading signal with an ACK frame 
 886       cmd_send(CMD_ACK
,0,0,0,0,0); 
 890                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 891                         uint8_t *b 
= (uint8_t *)BigBuf
; 
 892                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, 48); 
 893                         //Dbprintf("copied 48 bytes to %i",b+c->arg[0]); 
 894 //                      UsbSendPacket((uint8_t*)&ack, sizeof(ack)); 
 895       cmd_send(CMD_ACK
,0,0,0,0,0); 
 902                 case CMD_SET_LF_DIVISOR
: 
 903                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 906                 case CMD_SET_ADC_MUX
: 
 908                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 909                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 910                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 911                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 927                 case CMD_SETUP_WRITE
: 
 928                 case CMD_FINISH_WRITE
: 
 929                 case CMD_HARDWARE_RESET
: { 
 933                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 935                                 // We're going to reset, and the bootrom will take control. 
 939                 case CMD_START_FLASH
: { 
 940                         if(common_area
.flags
.bootrom_present
) { 
 941                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 944                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 948                 case CMD_DEVICE_INFO
: { 
 949                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 950                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 951 //                      UsbSendPacket((uint8_t*)&c, sizeof(c)); 
 952       cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0); 
 956                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 961 void  __attribute__((noreturn
)) AppMain(void) 
 965         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 966                 /* Initialize common area */ 
 967                 memset(&common_area
, 0, sizeof(common_area
)); 
 968                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
 969                 common_area
.version 
= 1; 
 971         common_area
.flags
.osimage_present 
= 1; 
 982         // The FPGA gets its clock from us from PCK0 output, so set that up. 
 983         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
 984         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
 985         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
 986         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
 987         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
 988                 AT91C_PMC_PRES_CLK_4
; 
 989         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
 992         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
 994         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
 996         // Load the FPGA image, which we have stored in our flash. 
1005   byte_t rx
[sizeof(UsbCommand
)]; 
1010       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1012         UsbPacketReceived(rx
,rx_len
); 
1020                 if (BUTTON_HELD(1000) > 0)