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         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 218         FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER
); 
 219         for (i
=255; i
>19; i
--) { 
 221                 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
); 
 223                 // Vref = 3.3V, and a 10000:240 voltage divider on the input 
 224                 // can measure voltages up to 137500 mV 
 225                 adcval 
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10); 
 226                 if (i
==95)      vLf125 
= adcval
; // voltage at 125Khz 
 227                 if (i
==89)      vLf134 
= adcval
; // voltage at 134Khz 
 229                 dest
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes 
 239         // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 240         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 241         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 243         // Vref = 3300mV, and an 10:1 voltage divider on the input 
 244         // can measure voltages up to 33000 mV 
 245         vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 247 //      c.cmd = CMD_MEASURED_ANTENNA_TUNING; 
 248 //      c.arg[0] = (vLf125 << 0) | (vLf134 << 16); 
 250 //      c.arg[2] = peakf | (peakv << 16); 
 252   DbpString("Measuring complete, sending report back to host"); 
 253   cmd_send(CMD_MEASURED_ANTENNA_TUNING
,vLf125
|(vLf134
<<16),vHf
,peakf
|(peakv
<<16),0,0); 
 254 //      UsbSendPacket((uint8_t *)&c, sizeof(c)); 
 255         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 261 void MeasureAntennaTuningHf(void) 
 263         int vHf 
= 0;    // in mV 
 265         DbpString("Measuring HF antenna, press button to exit"); 
 268                 // Let the FPGA drive the high-frequency antenna around 13.56 MHz. 
 269                 FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 270                 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
); 
 272                 // Vref = 3300mV, and an 10:1 voltage divider on the input 
 273                 // can measure voltages up to 33000 mV 
 274                 vHf 
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10; 
 276                 Dbprintf("%d mV",vHf
); 
 277                 if (BUTTON_PRESS()) break; 
 279         DbpString("cancelled"); 
 283 void SimulateTagHfListen(void) 
 285         uint8_t *dest 
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
; 
 290         // We're using this mode just so that I can test it out; the simulated 
 291         // tag mode would work just as well and be simpler. 
 292         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
 293         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR 
| FPGA_HF_READER_RX_XCORR_848_KHZ 
| FPGA_HF_READER_RX_XCORR_SNOOP
); 
 295         // We need to listen to the high-frequency, peak-detected path. 
 296         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
 302                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
)) { 
 303                         AT91C_BASE_SSC
->SSC_THR 
= 0xff; 
 305                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
 306                         uint8_t r 
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
; 
 320                                 if(i 
>= FREE_BUFFER_SIZE
) { 
 326         DbpString("simulate tag (now type bitsamples)"); 
 329 void ReadMem(int addr
) 
 331         const uint8_t *data 
= ((uint8_t *)addr
); 
 333         Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x", 
 334                 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]); 
 337 /* osimage version information is linked in */ 
 338 extern struct version_information version_information
; 
 339 /* bootrom version information is pointed to from _bootphase1_version_pointer */ 
 340 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
; 
 341 void SendVersion(void) 
 343         char temp
[256]; /* Limited data payload in USB packets */ 
 344         DbpString("Prox/RFID mark3 RFID instrument"); 
 346         /* Try to find the bootrom version information. Expect to find a pointer at 
 347          * symbol _bootphase1_version_pointer, perform slight sanity checks on the 
 348          * pointer, then use it. 
 350         char *bootrom_version 
= *(char**)&_bootphase1_version_pointer
; 
 351         if( bootrom_version 
< &_flash_start 
|| bootrom_version 
>= &_flash_end 
) { 
 352                 DbpString("bootrom version information appears invalid"); 
 354                 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
); 
 358         FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
); 
 361         FpgaGatherVersion(temp
, sizeof(temp
)); 
 364         cmd_send(CMD_ACK
,*(AT91C_DBGU_CIDR
),0,0,NULL
,0); 
 368 // samy's sniff and repeat routine 
 371         DbpString("Stand-alone mode! No PC necessary."); 
 372         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 374         // 3 possible options? no just 2 for now 
 377         int high
[OPTS
], low
[OPTS
]; 
 379         // Oooh pretty -- notify user we're in elite samy mode now 
 381         LED(LED_ORANGE
, 200); 
 383         LED(LED_ORANGE
, 200); 
 385         LED(LED_ORANGE
, 200); 
 387         LED(LED_ORANGE
, 200); 
 393         // Turn on selected LED 
 394         LED(selected 
+ 1, 0); 
 402                 // Was our button held down or pressed? 
 403                 int button_pressed 
= BUTTON_HELD(1000); 
 406                 // Button was held for a second, begin recording 
 407                 if (button_pressed 
> 0) 
 410                         LED(selected 
+ 1, 0); 
 414                         DbpString("Starting recording"); 
 416                         // wait for button to be released 
 417                         while(BUTTON_PRESS()) 
 420                         /* need this delay to prevent catching some weird data */ 
 423                         CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0); 
 424                         Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]); 
 427                         LED(selected 
+ 1, 0); 
 428                         // Finished recording 
 430                         // If we were previously playing, set playing off 
 431                         // so next button push begins playing what we recorded 
 435                 // Change where to record (or begin playing) 
 436                 else if (button_pressed
) 
 438                         // Next option if we were previously playing 
 440                                 selected 
= (selected 
+ 1) % OPTS
; 
 444                         LED(selected 
+ 1, 0); 
 446                         // Begin transmitting 
 450                                 DbpString("Playing"); 
 451                                 // wait for button to be released 
 452                                 while(BUTTON_PRESS()) 
 454                                 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]); 
 455                                 CmdHIDsimTAG(high
[selected
], low
[selected
], 0); 
 456                                 DbpString("Done playing"); 
 457                                 if (BUTTON_HELD(1000) > 0) 
 459                                         DbpString("Exiting"); 
 464                                 /* We pressed a button so ignore it here with a delay */ 
 467                                 // when done, we're done playing, move to next option 
 468                                 selected 
= (selected 
+ 1) % OPTS
; 
 471                                 LED(selected 
+ 1, 0); 
 474                                 while(BUTTON_PRESS()) 
 483 Listen and detect an external reader. Determine the best location 
 487 Inside the ListenReaderField() function, there is two mode. 
 488 By default, when you call the function, you will enter mode 1. 
 489 If you press the PM3 button one time, you will enter mode 2. 
 490 If you press the PM3 button a second time, you will exit the function. 
 492 DESCRIPTION OF MODE 1: 
 493 This mode just listens for an external reader field and lights up green 
 494 for HF and/or red for LF. This is the original mode of the detectreader 
 497 DESCRIPTION OF MODE 2: 
 498 This mode will visually represent, using the LEDs, the actual strength of the 
 499 current compared to the maximum current detected. Basically, once you know 
 500 what kind of external reader is present, it will help you spot the best location to place 
 501 your antenna. You will probably not get some good results if there is a LF and a HF reader 
 502 at the same place! :-) 
 506 static const char LIGHT_SCHEME
[] = { 
 507                 0x0, /* ----     | No field detected */ 
 508                 0x1, /* X---     | 14% of maximum current detected */ 
 509                 0x2, /* -X--     | 29% of maximum current detected */ 
 510                 0x4, /* --X-     | 43% of maximum current detected */ 
 511                 0x8, /* ---X     | 57% of maximum current detected */ 
 512                 0xC, /* --XX     | 71% of maximum current detected */ 
 513                 0xE, /* -XXX     | 86% of maximum current detected */ 
 514                 0xF, /* XXXX     | 100% of maximum current detected */ 
 516 static const int LIGHT_LEN 
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]); 
 518 void ListenReaderField(int limit
) 
 520         int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
; 
 521         int hf_av
, hf_av_new
,  hf_baseline
= 0, hf_count
= 0, hf_max
; 
 522         int mode
=1, display_val
, display_max
, i
; 
 529         lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
); 
 531         if(limit 
!= HF_ONLY
) { 
 532                 Dbprintf("LF 125/134 Baseline: %d", lf_av
); 
 536         hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
); 
 538         if (limit 
!= LF_ONLY
) { 
 539                 Dbprintf("HF 13.56 Baseline: %d", hf_av
); 
 544                 if (BUTTON_PRESS()) { 
 549                                         DbpString("Signal Strength Mode"); 
 553                                         DbpString("Stopped"); 
 561                 if (limit 
!= HF_ONLY
) { 
 563                                 if (abs(lf_av 
- lf_baseline
) > 10) LED_D_ON(); 
 568                         lf_av_new
= ReadAdc(ADC_CHAN_LF
); 
 569                         // see if there's a significant change 
 570                         if(abs(lf_av 
- lf_av_new
) > 10) { 
 571                                 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
); 
 579                 if (limit 
!= LF_ONLY
) { 
 581                                 if (abs(hf_av 
- hf_baseline
) > 10) LED_B_ON(); 
 586                         hf_av_new
= ReadAdc(ADC_CHAN_HF
); 
 587                         // see if there's a significant change 
 588                         if(abs(hf_av 
- hf_av_new
) > 10) { 
 589                                 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
); 
 598                         if (limit 
== LF_ONLY
) { 
 600                                 display_max 
= lf_max
; 
 601                         } else if (limit 
== HF_ONLY
) { 
 603                                 display_max 
= hf_max
; 
 604                         } else { /* Pick one at random */ 
 605                                 if( (hf_max 
- hf_baseline
) > (lf_max 
- lf_baseline
) ) { 
 607                                         display_max 
= hf_max
; 
 610                                         display_max 
= lf_max
; 
 613                         for (i
=0; i
<LIGHT_LEN
; i
++) { 
 614                                 if (display_val 
>= ((display_max
/LIGHT_LEN
)*i
) && display_val 
<= ((display_max
/LIGHT_LEN
)*(i
+1))) { 
 615                                         if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF(); 
 616                                         if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF(); 
 617                                         if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF(); 
 618                                         if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF(); 
 626 void UsbPacketReceived(uint8_t *packet
, int len
) 
 628         UsbCommand 
*c 
= (UsbCommand 
*)packet
; 
 630 //  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]); 
 634                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 635                         AcquireRawAdcSamples125k(c
->arg
[0]); 
 636                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 638                 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
: 
 639                         ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 641                 case CMD_HID_DEMOD_FSK
: 
 642                         CmdHIDdemodFSK(0, 0, 0, 1);                                     // Demodulate HID tag 
 644                 case CMD_HID_SIM_TAG
: 
 645                         CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1);                                  // Simulate HID tag by ID 
 647                 case CMD_HID_CLONE_TAG
: // Clone HID tag by ID to T55x7 
 648                         CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 650                 case CMD_IO_DEMOD_FSK
: 
 651                         CmdIOdemodFSK(1, 0, 0, 1);                                      // Demodulate IO tag 
 653                 case CMD_IO_CLONE_TAG
: // Clone IO tag by ID to T55x7 
 654                         CopyIOtoT55x7(c
->arg
[0], c
->arg
[1], c
->d
.asBytes
[0]); 
 656                 case CMD_EM410X_WRITE_TAG
: 
 657                         WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 659                 case CMD_READ_TI_TYPE
: 
 662                 case CMD_WRITE_TI_TYPE
: 
 663                         WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]); 
 665                 case CMD_SIMULATE_TAG_125K
: 
 667                         SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1); 
 670                 case CMD_LF_SIMULATE_BIDIR
: 
 671                         SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]); 
 673                 case CMD_INDALA_CLONE_TAG
:                                      // Clone Indala 64-bit tag by UID to T55x7 
 674                         CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);                                       
 676                 case CMD_INDALA_CLONE_TAG_L
:                                    // Clone Indala 224-bit tag by UID to T55x7 
 677                         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]); 
 679                 case CMD_T55XX_READ_BLOCK
: 
 680                         T55xxReadBlock(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 682                 case CMD_T55XX_WRITE_BLOCK
: 
 683                         T55xxWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 685                 case CMD_T55XX_READ_TRACE
: // Clone HID tag by ID to T55x7 
 688                 case CMD_PCF7931_READ
: // Read PCF7931 tag 
 690                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 691 //              UsbSendPacket((uint8_t*)&ack, sizeof(ack)); 
 693                 case CMD_EM4X_READ_WORD
: 
 694                         EM4xReadWord(c
->arg
[1], c
->arg
[2],c
->d
.asBytes
[0]); 
 696                 case CMD_EM4X_WRITE_WORD
: 
 697                         EM4xWriteWord(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
[0]); 
 702                 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type 
 703                         SnoopHitag(c
->arg
[0]); 
 705                 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content 
 706                         SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
); 
 708                 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function 
 709                         ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
); 
 714                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
: 
 715                         AcquireRawAdcSamplesIso15693(); 
 717                 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
: 
 718                         RecordRawAdcSamplesIso15693(); 
 721                 case CMD_ISO_15693_COMMAND
: 
 722                         DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 725                 case CMD_ISO_15693_FIND_AFI
: 
 726                         BruteforceIso15693Afi(c
->arg
[0]); 
 729                 case CMD_ISO_15693_DEBUG
: 
 730                         SetDebugIso15693(c
->arg
[0]); 
 733                 case CMD_READER_ISO_15693
: 
 734                         ReaderIso15693(c
->arg
[0]); 
 736                 case CMD_SIMTAG_ISO_15693
: 
 737                         SimTagIso15693(c
->arg
[0]); 
 742                 case CMD_SIMULATE_TAG_LEGIC_RF
: 
 743                         LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]); 
 746                 case CMD_WRITER_LEGIC_RF
: 
 747                         LegicRfWriter(c
->arg
[1], c
->arg
[0]); 
 750                 case CMD_READER_LEGIC_RF
: 
 751                         LegicRfReader(c
->arg
[0], c
->arg
[1]); 
 755 #ifdef WITH_ISO14443b 
 756                 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
: 
 757                         AcquireRawAdcSamplesIso14443(c
->arg
[0]); 
 759                 case CMD_READ_SRI512_TAG
: 
 760                         ReadSTMemoryIso14443(0x0F); 
 762                 case CMD_READ_SRIX4K_TAG
: 
 763                         ReadSTMemoryIso14443(0x7F); 
 765                 case CMD_SNOOP_ISO_14443
: 
 768                 case CMD_SIMULATE_TAG_ISO_14443
: 
 769                         SimulateIso14443Tag(); 
 771                 case CMD_ISO_14443B_COMMAND
: 
 772                         SendRawCommand14443B(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
); 
 776 #ifdef WITH_ISO14443a 
 777                 case CMD_SNOOP_ISO_14443a
: 
 778                         SnoopIso14443a(c
->arg
[0]); 
 780                 case CMD_READER_ISO_14443a
: 
 783                 case CMD_SIMULATE_TAG_ISO_14443a
: 
 784                         SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);  // ## Simulate iso14443a tag - pass tag type & UID 
 786                 case CMD_EPA_PACE_COLLECT_NONCE
: 
 787                         EPA_PACE_Collect_Nonce(c
); 
 790                 case CMD_READER_MIFARE
: 
 791             ReaderMifare(c
->arg
[0]); 
 793                 case CMD_MIFARE_READBL
: 
 794                         MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 796                 case CMD_MIFAREU_READBL
: 
 797                         MifareUReadBlock(c
->arg
[0],c
->d
.asBytes
); 
 799                 case CMD_MIFAREU_READCARD
: 
 800                         MifareUReadCard(c
->arg
[0],c
->d
.asBytes
); 
 802                 case CMD_MIFARE_READSC
: 
 803                         MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 805                 case CMD_MIFARE_WRITEBL
: 
 806                         MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 808                 case CMD_MIFAREU_WRITEBL_COMPAT
: 
 809                         MifareUWriteBlock(c
->arg
[0], c
->d
.asBytes
); 
 811                 case CMD_MIFAREU_WRITEBL
: 
 812                         MifareUWriteBlock_Special(c
->arg
[0], c
->d
.asBytes
); 
 814                 case CMD_MIFARE_NESTED
: 
 815                         MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 817                 case CMD_MIFARE_CHKKEYS
: 
 818                         MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 820                 case CMD_SIMULATE_MIFARE_CARD
: 
 821                         Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 825                 case CMD_MIFARE_SET_DBGMODE
: 
 826                         MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 828                 case CMD_MIFARE_EML_MEMCLR
: 
 829                         MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 831                 case CMD_MIFARE_EML_MEMSET
: 
 832                         MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 834                 case CMD_MIFARE_EML_MEMGET
: 
 835                         MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 837                 case CMD_MIFARE_EML_CARDLOAD
: 
 838                         MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 841                 // Work with "magic Chinese" card 
 842                 case CMD_MIFARE_EML_CSETBLOCK
: 
 843                         MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 845                 case CMD_MIFARE_EML_CGETBLOCK
: 
 846                         MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
); 
 850                 case CMD_MIFARE_SNIFFER
: 
 851                         SniffMifare(c
->arg
[0]); 
 856                 // Makes use of ISO14443a FPGA Firmware 
 857                 case CMD_SNOOP_ICLASS
: 
 860                 case CMD_SIMULATE_TAG_ICLASS
: 
 861                         SimulateIClass(c
->arg
[0], c
->d
.asBytes
); 
 863                 case CMD_READER_ICLASS
: 
 864                         ReaderIClass(c
->arg
[0]); 
 868                 case CMD_SIMULATE_TAG_HF_LISTEN
: 
 869                         SimulateTagHfListen(); 
 876                 case CMD_MEASURE_ANTENNA_TUNING
: 
 877                         MeasureAntennaTuning(); 
 880                 case CMD_MEASURE_ANTENNA_TUNING_HF
: 
 881                         MeasureAntennaTuningHf(); 
 884                 case CMD_LISTEN_READER_FIELD
: 
 885                         ListenReaderField(c
->arg
[0]); 
 888                 case CMD_FPGA_MAJOR_MODE_OFF
:           // ## FPGA Control 
 889                         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
 891                         LED_D_OFF(); // LED D indicates field ON or OFF 
 894                 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: 
 896 //                      if(c->cmd == CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K) { 
 897 //                              n.cmd = CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K; 
 899 //                              n.cmd = CMD_DOWNLOADED_RAW_BITS_TI_TYPE; 
 901 //                      n.arg[0] = c->arg[0]; 
 902       //                        memcpy(n.d.asBytes, BigBuf+c->arg[0], 48); // 12*sizeof(uint32_t) 
 904       //      usb_write((uint8_t *)&n, sizeof(n)); 
 905       //                        UsbSendPacket((uint8_t *)&n, sizeof(n)); 
 909                         for(size_t i
=0; i
<c
->arg
[1]; i 
+= USB_CMD_DATA_SIZE
) { 
 910                                 size_t len 
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
); 
 911                                 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
); 
 913                         // Trigger a finish downloading signal with an ACK frame 
 914                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 918                 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: { 
 919                         uint8_t *b 
= (uint8_t *)BigBuf
; 
 920                         memcpy(b
+c
->arg
[0], c
->d
.asBytes
, 48); 
 921                         //Dbprintf("copied 48 bytes to %i",b+c->arg[0]); 
 922 //                      UsbSendPacket((uint8_t*)&ack, sizeof(ack)); 
 923                         cmd_send(CMD_ACK
,0,0,0,0,0); 
 930                 case CMD_SET_LF_DIVISOR
: 
 931                         FpgaDownloadAndGo(FPGA_BITSTREAM_LF
); 
 932                         FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]); 
 935                 case CMD_SET_ADC_MUX
: 
 937                                 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break; 
 938                                 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break; 
 939                                 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break; 
 940                                 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break; 
 956                 case CMD_SETUP_WRITE
: 
 957                 case CMD_FINISH_WRITE
: 
 958                 case CMD_HARDWARE_RESET
: 
 962                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 964                                 // We're going to reset, and the bootrom will take control. 
 968                 case CMD_START_FLASH
: 
 969                         if(common_area
.flags
.bootrom_present
) { 
 970                                 common_area
.command 
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
; 
 973                         AT91C_BASE_RSTC
->RSTC_RCR 
= RST_CONTROL_KEY 
| AT91C_RSTC_PROCRST
; 
 977                 case CMD_DEVICE_INFO
: { 
 978                         uint32_t dev_info 
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT 
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
; 
 979                         if(common_area
.flags
.bootrom_present
) dev_info 
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
; 
 980 //                      UsbSendPacket((uint8_t*)&c, sizeof(c)); 
 981                         cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);      
 985                         Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
); 
 990 void  __attribute__((noreturn
)) AppMain(void) 
 994         if(common_area
.magic 
!= COMMON_AREA_MAGIC 
|| common_area
.version 
!= 1) { 
 995                 /* Initialize common area */ 
 996                 memset(&common_area
, 0, sizeof(common_area
)); 
 997                 common_area
.magic 
= COMMON_AREA_MAGIC
; 
 998                 common_area
.version 
= 1; 
1000         common_area
.flags
.osimage_present 
= 1; 
1011         // The FPGA gets its clock from us from PCK0 output, so set that up. 
1012         AT91C_BASE_PIOA
->PIO_BSR 
= GPIO_PCK0
; 
1013         AT91C_BASE_PIOA
->PIO_PDR 
= GPIO_PCK0
; 
1014         AT91C_BASE_PMC
->PMC_SCER 
= AT91C_PMC_PCK0
; 
1015         // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz 
1016         AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK 
| 
1017                 AT91C_PMC_PRES_CLK_4
; 
1018         AT91C_BASE_PIOA
->PIO_OER 
= GPIO_PCK0
; 
1021         AT91C_BASE_SPI
->SPI_CR 
= AT91C_SPI_SWRST
; 
1023         AT91C_BASE_SSC
->SSC_CR 
= AT91C_SSC_SWRST
; 
1025         // Load the FPGA image, which we have stored in our flash. 
1026         // (the HF version by default) 
1027         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1035   byte_t rx
[sizeof(UsbCommand
)]; 
1040       rx_len 
= usb_read(rx
,sizeof(UsbCommand
)); 
1042         UsbPacketReceived(rx
,rx_len
); 
1050                 if (BUTTON_HELD(1000) > 0)