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
[256]; /* 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
)); 
 360         cmd_send(CMD_ACK
,*(AT91C_DBGU_CIDR
),0,0,NULL
,0); 
 364 // samy's sniff and repeat routine 
 367         DbpString("Stand-alone mode! No PC necessary."); 
 369         // 3 possible options? no just 2 for now 
 372         int high
[OPTS
], low
[OPTS
]; 
 374         // Oooh pretty -- notify user we're in elite samy mode now 
 376         LED(LED_ORANGE
, 200); 
 378         LED(LED_ORANGE
, 200); 
 380         LED(LED_ORANGE
, 200); 
 382         LED(LED_ORANGE
, 200); 
 388         // Turn on selected LED 
 389         LED(selected 
+ 1, 0); 
 397                 // Was our button held down or pressed? 
 398                 int button_pressed 
= BUTTON_HELD(1000); 
 401                 // Button was held for a second, begin recording 
 402                 if (button_pressed 
> 0) 
 405                         LED(selected 
+ 1, 0); 
 409                         DbpString("Starting recording"); 
 411                         // wait for button to be released 
 412                         while(BUTTON_PRESS()) 
 415                         /* need this delay to prevent catching some weird data */ 
 418                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 419                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 422                         LED(selected 
+ 1, 0); 
 423                         // Finished recording 
 425                         // If we were previously playing, set playing off 
 426                         // so next button push begins playing what we recorded 
 430                 // Change where to record (or begin playing) 
 431                 else if (button_pressed
) 
 433                         // Next option if we were previously playing 
 435                                 selected 
= (selected 
+ 1) % OPTS
; 
 439                         LED(selected 
+ 1, 0); 
 441                         // Begin transmitting 
 445                                 DbpString("Playing"); 
 446                                 // wait for button to be released 
 447                                 while(BUTTON_PRESS()) 
 449                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 450                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 451                                 DbpString("Done playing"); 
 452                                 if (BUTTON_HELD(1000) > 0) 
 454                                         DbpString("Exiting"); 
 459                                 /* We pressed a button so ignore it here with a delay */ 
 462                                 // when done, we're done playing, move to next option 
 463                                 selected 
= (selected 
+ 1) % OPTS
; 
 466                                 LED(selected 
+ 1, 0); 
 469                                 while(BUTTON_PRESS()) 
 478 Listen and detect an external reader. Determine the best location 
 482 Inside the ListenReaderField() function, there is two mode. 
 483 By default, when you call the function, you will enter mode 1. 
 484 If you press the PM3 button one time, you will enter mode 2. 
 485 If you press the PM3 button a second time, you will exit the function. 
 487 DESCRIPTION OF MODE 1: 
 488 This mode just listens for an external reader field and lights up green 
 489 for HF and/or red for LF. This is the original mode of the detectreader 
 492 DESCRIPTION OF MODE 2: 
 493 This mode will visually represent, using the LEDs, the actual strength of the 
 494 current compared to the maximum current detected. Basically, once you know 
 495 what kind of external reader is present, it will help you spot the best location to place 
 496 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 497 at the same place! :-) 
 501 static const char LIGHT_SCHEME
[] = { 
 502                 0x0, /* ----     | No field detected */ 
 503                 0x1, /* X---     | 14% of maximum current detected */ 
 504                 0x2, /* -X--     | 29% of maximum current detected */ 
 505                 0x4, /* --X-     | 43% of maximum current detected */ 
 506                 0x8, /* ---X     | 57% of maximum current detected */ 
 507                 0xC, /* --XX     | 71% of maximum current detected */ 
 508                 0xE, /* -XXX     | 86% of maximum current detected */ 
 509                 0xF, /* XXXX     | 100% of maximum current detected */ 
 511 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 513 void ListenReaderField(int limit
) 
 515         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
; 
 516         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_count
= 0, hf_max
; 
 517         int mode
=1, display_val
, display_max
, i
; 
 524         lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
); 
 526         if(limit 
!= HF_ONLY
) { 
 527                 Dbprintf("LF 125/134 Baseline: %d", lf_av
); 
 531         hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
); 
 533         if (limit 
!= LF_ONLY
) { 
 534                 Dbprintf("HF 13.56 Baseline: %d", hf_av
); 
 539                 if (BUTTON_PRESS()) { 
 544                                         DbpString("Signal Strength Mode"); 
 548                                         DbpString("Stopped"); 
 556                 if (limit 
!= HF_ONLY
) { 
 558                                 if (abs(lf_av 
- lf_baseline
) > 10) LED_D_ON(); 
 563                         lf_av_new
= ReadAdc(ADC_CHAN_LF
); 
 564                         // see if there's a significant change 
 565                         if(abs(lf_av 
- lf_av_new
) > 10) { 
 566                                 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
); 
 574                 if (limit 
!= LF_ONLY
) { 
 576                                 if (abs(hf_av 
- hf_baseline
) > 10) LED_B_ON(); 
 581                         hf_av_new
= ReadAdc(ADC_CHAN_HF
); 
 582                         // see if there's a significant change 
 583                         if(abs(hf_av 
- hf_av_new
) > 10) { 
 584                                 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
); 
 593                         if (limit 
== LF_ONLY
) { 
 595                                 display_max 
= lf_max
; 
 596                         } else if (limit 
== HF_ONLY
) { 
 598                                 display_max 
= hf_max
; 
 599                         } else { /* Pick one at random */ 
 600                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 602                                         display_max 
= hf_max
; 
 605                                         display_max 
= lf_max
; 
 608                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 609                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 610                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 611                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 612                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 613                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 621 void UsbPacketReceived(uint8_t *packet
, int len
) 
 623         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 625 //  Dbprintf("received %d bytes, with command: 0x%04x and args: %d %d %d",len,c->cmd,c->arg[0],c->arg[1],c->arg[2]); 
 629                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 630                         AcquireRawAdcSamples125k(c
->arg
[0]); 
 631                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 633                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 634                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 636                 case CMD_HID_DEMOD_FSK
: 
 637                         CmdHIDdemodFSK(0, 0, 0, 1);                                     // Demodulate HID tag 
 639                 case CMD_HID_SIM_TAG
: 
 640                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1);                                  // Simulate HID tag by ID 
 642                 case CMD_HID_CLONE_TAG
: // Clone HID tag by ID to T55x7 
 643                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 645                 case CMD_IO_DEMOD_FSK
: 
 646                         CmdIOdemodFSK(1, 0, 0, 1);                                      // Demodulate IO tag 
 648                 case CMD_IO_CLONE_TAG
: // Clone IO tag by ID to T55x7 
 649                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]); 
 651                 case CMD_EM410X_WRITE_TAG
: 
 652                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 654                 case CMD_READ_TI_TYPE
: 
 657                 case CMD_WRITE_TI_TYPE
: 
 658                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 660                 case CMD_SIMULATE_TAG_125K
: 
 662                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
 665                 case CMD_LF_SIMULATE_BIDIR
: 
 666                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
 668                 case CMD_INDALA_CLONE_TAG
:                                      // Clone Indala 64-bit tag by UID to T55x7 
 669                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
 671                 case CMD_INDALA_CLONE_TAG_L
:                                    // Clone Indala 224-bit tag by UID to T55x7 
 672                         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]); 
 674                 case CMD_T55XX_READ_BLOCK
: 
 675                         T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 677                 case CMD_T55XX_WRITE_BLOCK
: 
 678                         T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 680                 case CMD_T55XX_READ_TRACE
: // Clone HID tag by ID to T55x7 
 683                 case CMD_PCF7931_READ
: // Read PCF7931 tag 
 685                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 686 //              UsbSendPacket((uint8_t*)&ack, sizeof(ack)); 
 688                 case CMD_EM4X_READ_WORD
: 
 689                         EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 691                 case CMD_EM4X_WRITE_WORD
: 
 692                         EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 697                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
 698                         SnoopHitag(c
->arg
[0]); 
 700                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
 701                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
 703                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
 704                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
 709                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
 710                         AcquireRawAdcSamplesIso15693(); 
 712                 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
: 
 713                         RecordRawAdcSamplesIso15693(); 
 716                 case CMD_ISO_15693_COMMAND
: 
 717                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 720                 case CMD_ISO_15693_FIND_AFI
: 
 721                         BruteforceIso15693Afi(c
->arg
[0]); 
 724                 case CMD_ISO_15693_DEBUG
: 
 725                         SetDebugIso15693(c
->arg
[0]); 
 728                 case CMD_READER_ISO_15693
: 
 729                         ReaderIso15693(c
->arg
[0]); 
 731                 case CMD_SIMTAG_ISO_15693
: 
 732                         SimTagIso15693(c
->arg
[0]); 
 737                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
 738                         LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 741                 case CMD_WRITER_LEGIC_RF
: 
 742                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
 745                 case CMD_READER_LEGIC_RF
: 
 746                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
 750 #ifdef WITH_ISO14443b 
 751                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
: 
 752                         AcquireRawAdcSamplesIso14443(c
->arg
[0]); 
 754                 case CMD_READ_SRI512_TAG
: 
 755                         ReadSTMemoryIso14443(0x0F); 
 757                 case CMD_READ_SRIX4K_TAG
: 
 758                         ReadSTMemoryIso14443(0x7F); 
 760                 case CMD_SNOOP_ISO_14443
: 
 763                 case CMD_SIMULATE_TAG_ISO_14443
: 
 764                         SimulateIso14443Tag(); 
 766                 case CMD_ISO_14443B_COMMAND
: 
 767                         SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 771 #ifdef WITH_ISO14443a 
 772                 case CMD_SNOOP_ISO_14443a
: 
 773                         SnoopIso14443a(c
->arg
[0]); 
 775                 case CMD_READER_ISO_14443a
: 
 778                 case CMD_SIMULATE_TAG_ISO_14443a
: 
 779                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);  // ## Simulate iso14443a tag - pass tag type & UID 
 781                 case CMD_EPA_PACE_COLLECT_NONCE
: 
 782                         EPA_PACE_Collect_Nonce(c
); 
 785                 case CMD_READER_MIFARE
: 
 786             ReaderMifare(c
->arg
[0]); 
 788                 case CMD_MIFARE_READBL
: 
 789                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 791                 case CMD_MIFAREU_READBL
: 
 792                         MifareUReadBlock(c
->arg
[0],c
->d
.asBytes
); 
 794                 case CMD_MIFAREU_READCARD
: 
 795                         MifareUReadCard(c
->arg
[0],c
->d
.asBytes
); 
 797                 case CMD_MIFARE_READSC
: 
 798                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 800                 case CMD_MIFARE_WRITEBL
: 
 801                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 803                 case CMD_MIFAREU_WRITEBL_COMPAT
: 
 804                         MifareUWriteBlock(c
->arg
[0], c
->d
.asBytes
); 
 806                 case CMD_MIFAREU_WRITEBL
: 
 807                         MifareUWriteBlock_Special(c
->arg
[0], c
->d
.asBytes
); 
 809                 case CMD_MIFARE_NESTED
: 
 810                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 812                 case CMD_MIFARE_CHKKEYS
: 
 813                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 815                 case CMD_SIMULATE_MIFARE_CARD
: 
 816                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 820                 case CMD_MIFARE_SET_DBGMODE
: 
 821                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 823                 case CMD_MIFARE_EML_MEMCLR
: 
 824                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 826                 case CMD_MIFARE_EML_MEMSET
: 
 827                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 829                 case CMD_MIFARE_EML_MEMGET
: 
 830                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 832                 case CMD_MIFARE_EML_CARDLOAD
: 
 833                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 836                 // Work with "magic Chinese" card 
 837                 case CMD_MIFARE_EML_CSETBLOCK
: 
 838                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 840                 case CMD_MIFARE_EML_CGETBLOCK
: 
 841                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 845                 case CMD_MIFARE_SNIFFER
: 
 846                         SniffMifare(c
->arg
[0]); 
 851                 // Makes use of ISO14443a FPGA Firmware 
 852                 case CMD_SNOOP_ICLASS
: 
 855                 case CMD_SIMULATE_TAG_ICLASS
: 
 856                         SimulateIClass(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 858                 case CMD_READER_ICLASS
: 
 859                         ReaderIClass(c
->arg
[0]); 
 863                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 864                         SimulateTagHfListen(); 
 871                 case CMD_MEASURE_ANTENNA_TUNING
: 
 872                         MeasureAntennaTuning(); 
 875                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 876                         MeasureAntennaTuningHf(); 
 879                 case CMD_LISTEN_READER_FIELD
: 
 880                         ListenReaderField(c
->arg
[0]); 
 883                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 884                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 886                         LED_D_OFF(); // LED D indicates field ON or OFF 
 889                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 891 //                      if(c->cmd == CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K) { 
 892 //                              n.cmd = CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K; 
 894 //                              n.cmd = CMD_DOWNLOADED_RAW_BITS_TI_TYPE; 
 896 //                      n.arg[0] = c->arg[0]; 
 897       //                        memcpy(n.d.asBytes, BigBuf+c->arg[0], 48); // 12*sizeof(uint32_t) 
 899       //      usb_write((uint8_t *)&n, sizeof(n)); 
 900       //                        UsbSendPacket((uint8_t *)&n, sizeof(n)); 
 904                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 905                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 906                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
); 
 908                         // Trigger a finish downloading signal with an ACK frame 
 909                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 913                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 914                         uint8_t *b 
= (uint8_t *)BigBuf
; 
 915                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, 48); 
 916                         //Dbprintf("copied 48 bytes to %i",b+c->arg[0]); 
 917 //                      UsbSendPacket((uint8_t*)&ack, sizeof(ack)); 
 918                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 925                 case CMD_SET_LF_DIVISOR
: 
 926                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 929                 case CMD_SET_ADC_MUX
: 
 931                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 932                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 933                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 934                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 950                 case CMD_SETUP_WRITE
: 
 951                 case CMD_FINISH_WRITE
: 
 952                 case CMD_HARDWARE_RESET
: 
 956                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 958                                 // We're going to reset, and the bootrom will take control. 
 962                 case CMD_START_FLASH
: 
 963                         if(common_area
.flags
.bootrom_present
) { 
 964                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 967                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 971                 case CMD_DEVICE_INFO
: { 
 972                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 973                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 974 //                      UsbSendPacket((uint8_t*)&c, sizeof(c)); 
 975                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
 979                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 984 void  __attribute__((noreturn
)) AppMain(void) 
 988         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 989                 /* Initialize common area */ 
 990                 memset(&common_area
, 0, sizeof(common_area
)); 
 991                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
 992                 common_area
.version 
= 1; 
 994         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         FpgaDownloadAndGo(); 
1028   byte_t rx
[sizeof(UsbCommand
)]; 
1033       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1035         UsbPacketReceived(rx
,rx_len
); 
1043                 if (BUTTON_HELD(1000) > 0)