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 cmd_send(CMD_DEBUG_PRINT_STRING
,strlen(str
),0,0,(byte_t
*)str
,strlen(str
));
83 // /* this holds up stuff unless we're connected to usb */
84 // if (!UsbConnected())
88 // c.cmd = CMD_DEBUG_PRINT_STRING;
89 // c.arg[0] = strlen(str);
90 // if(c.arg[0] > sizeof(c.d.asBytes)) {
91 // c.arg[0] = sizeof(c.d.asBytes);
93 // memcpy(c.d.asBytes, str, c.arg[0]);
95 // UsbSendPacket((uint8_t *)&c, sizeof(c));
96 // // TODO fix USB so stupid things like this aren't req'd
101 void DbpIntegers(int x1
, int x2
, int x3
)
103 cmd_send(CMD_DEBUG_PRINT_INTEGERS
,x1
,x2
,x3
,0,0);
104 // /* this holds up stuff unless we're connected to usb */
105 // if (!UsbConnected())
109 // c.cmd = CMD_DEBUG_PRINT_INTEGERS;
114 // UsbSendPacket((uint8_t *)&c, sizeof(c));
120 void Dbprintf(const char *fmt
, ...) {
121 // should probably limit size here; oh well, let's just use a big buffer
122 char output_string
[128];
126 kvsprintf(fmt
, output_string
, 10, ap
);
129 DbpString(output_string
);
132 // prints HEX & ASCII
133 void Dbhexdump(int len
, uint8_t *d
, bool bAsci
) {
146 if (ascii
[i
]<32 || ascii
[i
]>126) ascii
[i
]='.';
149 Dbprintf("%-8s %*D",ascii
,l
,d
," ");
151 Dbprintf("%*D",l
,d
," ");
159 //-----------------------------------------------------------------------------
160 // Read an ADC channel and block till it completes, then return the result
161 // in ADC units (0 to 1023). Also a routine to average 32 samples and
163 //-----------------------------------------------------------------------------
164 static int ReadAdc(int ch
)
168 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_SWRST
;
169 AT91C_BASE_ADC
->ADC_MR
=
170 ADC_MODE_PRESCALE(32) |
171 ADC_MODE_STARTUP_TIME(16) |
172 ADC_MODE_SAMPLE_HOLD_TIME(8);
173 AT91C_BASE_ADC
->ADC_CHER
= ADC_CHANNEL(ch
);
175 AT91C_BASE_ADC
->ADC_CR
= AT91C_ADC_START
;
176 while(!(AT91C_BASE_ADC
->ADC_SR
& ADC_END_OF_CONVERSION(ch
)))
178 d
= AT91C_BASE_ADC
->ADC_CDR
[ch
];
183 int AvgAdc(int ch
) // was static - merlok
188 for(i
= 0; i
< 32; i
++) {
192 return (a
+ 15) >> 5;
195 void MeasureAntennaTuning(void)
197 uint8_t *dest
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
;
198 int i
, adcval
= 0, peak
= 0, peakv
= 0, peakf
= 0; //ptr = 0
199 int vLf125
= 0, vLf134
= 0, vHf
= 0; // in mV
204 DbpString("Measuring antenna characteristics, please wait...");
205 memset(dest
,0,sizeof(FREE_BUFFER_SIZE
));
208 * Sweeps the useful LF range of the proxmark from
209 * 46.8kHz (divisor=255) to 600kHz (divisor=19) and
210 * read the voltage in the antenna, the result left
211 * in the buffer is a graph which should clearly show
212 * the resonating frequency of your LF antenna
213 * ( hopefully around 95 if it is tuned to 125kHz!)
216 FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER
);
217 for (i
=255; i
>19; i
--) {
219 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, i
);
221 // Vref = 3.3V, and a 10000:240 voltage divider on the input
222 // can measure voltages up to 137500 mV
223 adcval
= ((137500 * AvgAdc(ADC_CHAN_LF
)) >> 10);
224 if (i
==95) vLf125
= adcval
; // voltage at 125Khz
225 if (i
==89) vLf134
= adcval
; // voltage at 134Khz
227 dest
[i
] = adcval
>>8; // scale int to fit in byte for graphing purposes
237 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
238 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
240 // Vref = 3300mV, and an 10:1 voltage divider on the input
241 // can measure voltages up to 33000 mV
242 vHf
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10;
244 // c.cmd = CMD_MEASURED_ANTENNA_TUNING;
245 // c.arg[0] = (vLf125 << 0) | (vLf134 << 16);
247 // c.arg[2] = peakf | (peakv << 16);
249 DbpString("Measuring complete, sending report back to host");
250 cmd_send(CMD_MEASURED_ANTENNA_TUNING
,vLf125
|(vLf134
<<16),vHf
,peakf
|(peakv
<<16),0,0);
251 // UsbSendPacket((uint8_t *)&c, sizeof(c));
252 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
258 void MeasureAntennaTuningHf(void)
260 int vHf
= 0; // in mV
262 DbpString("Measuring HF antenna, press button to exit");
265 // Let the FPGA drive the high-frequency antenna around 13.56 MHz.
266 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
);
268 // Vref = 3300mV, and an 10:1 voltage divider on the input
269 // can measure voltages up to 33000 mV
270 vHf
= (33000 * AvgAdc(ADC_CHAN_HF
)) >> 10;
272 Dbprintf("%d mV",vHf
);
273 if (BUTTON_PRESS()) break;
275 DbpString("cancelled");
279 void SimulateTagHfListen(void)
281 uint8_t *dest
= (uint8_t *)BigBuf
+FREE_BUFFER_OFFSET
;
286 // We're using this mode just so that I can test it out; the simulated
287 // tag mode would work just as well and be simpler.
288 FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR
| FPGA_HF_READER_RX_XCORR_848_KHZ
| FPGA_HF_READER_RX_XCORR_SNOOP
);
290 // We need to listen to the high-frequency, peak-detected path.
291 SetAdcMuxFor(GPIO_MUXSEL_HIPKD
);
297 if(AT91C_BASE_SSC
->SSC_SR
& (AT91C_SSC_TXRDY
)) {
298 AT91C_BASE_SSC
->SSC_THR
= 0xff;
300 if(AT91C_BASE_SSC
->SSC_SR
& (AT91C_SSC_RXRDY
)) {
301 uint8_t r
= (uint8_t)AT91C_BASE_SSC
->SSC_RHR
;
315 if(i
>= FREE_BUFFER_SIZE
) {
321 DbpString("simulate tag (now type bitsamples)");
324 void ReadMem(int addr
)
326 const uint8_t *data
= ((uint8_t *)addr
);
328 Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x",
329 addr
, data
[0], data
[1], data
[2], data
[3], data
[4], data
[5], data
[6], data
[7]);
332 /* osimage version information is linked in */
333 extern struct version_information version_information
;
334 /* bootrom version information is pointed to from _bootphase1_version_pointer */
335 extern char *_bootphase1_version_pointer
, _flash_start
, _flash_end
;
336 void SendVersion(void)
338 char temp
[48]; /* Limited data payload in USB packets */
339 DbpString("Prox/RFID mark3 RFID instrument");
341 /* Try to find the bootrom version information. Expect to find a pointer at
342 * symbol _bootphase1_version_pointer, perform slight sanity checks on the
343 * pointer, then use it.
345 char *bootrom_version
= *(char**)&_bootphase1_version_pointer
;
346 if( bootrom_version
< &_flash_start
|| bootrom_version
>= &_flash_end
) {
347 DbpString("bootrom version information appears invalid");
349 FormatVersionInformation(temp
, sizeof(temp
), "bootrom: ", bootrom_version
);
353 FormatVersionInformation(temp
, sizeof(temp
), "os: ", &version_information
);
356 FpgaGatherVersion(temp
, sizeof(temp
));
361 // samy's sniff and repeat routine
364 DbpString("Stand-alone mode! No PC necessary.");
366 // 3 possible options? no just 2 for now
369 int high
[OPTS
], low
[OPTS
];
371 // Oooh pretty -- notify user we're in elite samy mode now
373 LED(LED_ORANGE
, 200);
375 LED(LED_ORANGE
, 200);
377 LED(LED_ORANGE
, 200);
379 LED(LED_ORANGE
, 200);
385 // Turn on selected LED
386 LED(selected
+ 1, 0);
394 // Was our button held down or pressed?
395 int button_pressed
= BUTTON_HELD(1000);
398 // Button was held for a second, begin recording
399 if (button_pressed
> 0)
402 LED(selected
+ 1, 0);
406 DbpString("Starting recording");
408 // wait for button to be released
409 while(BUTTON_PRESS())
412 /* need this delay to prevent catching some weird data */
415 CmdHIDdemodFSK(1, &high
[selected
], &low
[selected
], 0);
416 Dbprintf("Recorded %x %x %x", selected
, high
[selected
], low
[selected
]);
419 LED(selected
+ 1, 0);
420 // Finished recording
422 // If we were previously playing, set playing off
423 // so next button push begins playing what we recorded
427 // Change where to record (or begin playing)
428 else if (button_pressed
)
430 // Next option if we were previously playing
432 selected
= (selected
+ 1) % OPTS
;
436 LED(selected
+ 1, 0);
438 // Begin transmitting
442 DbpString("Playing");
443 // wait for button to be released
444 while(BUTTON_PRESS())
446 Dbprintf("%x %x %x", selected
, high
[selected
], low
[selected
]);
447 CmdHIDsimTAG(high
[selected
], low
[selected
], 0);
448 DbpString("Done playing");
449 if (BUTTON_HELD(1000) > 0)
451 DbpString("Exiting");
456 /* We pressed a button so ignore it here with a delay */
459 // when done, we're done playing, move to next option
460 selected
= (selected
+ 1) % OPTS
;
463 LED(selected
+ 1, 0);
466 while(BUTTON_PRESS())
475 Listen and detect an external reader. Determine the best location
479 Inside the ListenReaderField() function, there is two mode.
480 By default, when you call the function, you will enter mode 1.
481 If you press the PM3 button one time, you will enter mode 2.
482 If you press the PM3 button a second time, you will exit the function.
484 DESCRIPTION OF MODE 1:
485 This mode just listens for an external reader field and lights up green
486 for HF and/or red for LF. This is the original mode of the detectreader
489 DESCRIPTION OF MODE 2:
490 This mode will visually represent, using the LEDs, the actual strength of the
491 current compared to the maximum current detected. Basically, once you know
492 what kind of external reader is present, it will help you spot the best location to place
493 your antenna. You will probably not get some good results if there is a LF and a HF reader
494 at the same place! :-)
498 static const char LIGHT_SCHEME
[] = {
499 0x0, /* ---- | No field detected */
500 0x1, /* X--- | 14% of maximum current detected */
501 0x2, /* -X-- | 29% of maximum current detected */
502 0x4, /* --X- | 43% of maximum current detected */
503 0x8, /* ---X | 57% of maximum current detected */
504 0xC, /* --XX | 71% of maximum current detected */
505 0xE, /* -XXX | 86% of maximum current detected */
506 0xF, /* XXXX | 100% of maximum current detected */
508 static const int LIGHT_LEN
= sizeof(LIGHT_SCHEME
)/sizeof(LIGHT_SCHEME
[0]);
510 void ListenReaderField(int limit
)
512 int lf_av
, lf_av_new
, lf_baseline
= 0, lf_count
= 0, lf_max
;
513 int hf_av
, hf_av_new
, hf_baseline
= 0, hf_count
= 0, hf_max
;
514 int mode
=1, display_val
, display_max
, i
;
521 lf_av
=lf_max
=ReadAdc(ADC_CHAN_LF
);
523 if(limit
!= HF_ONLY
) {
524 Dbprintf("LF 125/134 Baseline: %d", lf_av
);
528 hf_av
=hf_max
=ReadAdc(ADC_CHAN_HF
);
530 if (limit
!= LF_ONLY
) {
531 Dbprintf("HF 13.56 Baseline: %d", hf_av
);
536 if (BUTTON_PRESS()) {
541 DbpString("Signal Strength Mode");
545 DbpString("Stopped");
553 if (limit
!= HF_ONLY
) {
555 if (abs(lf_av
- lf_baseline
) > 10) LED_D_ON();
560 lf_av_new
= ReadAdc(ADC_CHAN_LF
);
561 // see if there's a significant change
562 if(abs(lf_av
- lf_av_new
) > 10) {
563 Dbprintf("LF 125/134 Field Change: %x %x %x", lf_av
, lf_av_new
, lf_count
);
571 if (limit
!= LF_ONLY
) {
573 if (abs(hf_av
- hf_baseline
) > 10) LED_B_ON();
578 hf_av_new
= ReadAdc(ADC_CHAN_HF
);
579 // see if there's a significant change
580 if(abs(hf_av
- hf_av_new
) > 10) {
581 Dbprintf("HF 13.56 Field Change: %x %x %x", hf_av
, hf_av_new
, hf_count
);
590 if (limit
== LF_ONLY
) {
592 display_max
= lf_max
;
593 } else if (limit
== HF_ONLY
) {
595 display_max
= hf_max
;
596 } else { /* Pick one at random */
597 if( (hf_max
- hf_baseline
) > (lf_max
- lf_baseline
) ) {
599 display_max
= hf_max
;
602 display_max
= lf_max
;
605 for (i
=0; i
<LIGHT_LEN
; i
++) {
606 if (display_val
>= ((display_max
/LIGHT_LEN
)*i
) && display_val
<= ((display_max
/LIGHT_LEN
)*(i
+1))) {
607 if (LIGHT_SCHEME
[i
] & 0x1) LED_C_ON(); else LED_C_OFF();
608 if (LIGHT_SCHEME
[i
] & 0x2) LED_A_ON(); else LED_A_OFF();
609 if (LIGHT_SCHEME
[i
] & 0x4) LED_B_ON(); else LED_B_OFF();
610 if (LIGHT_SCHEME
[i
] & 0x8) LED_D_ON(); else LED_D_OFF();
618 void UsbPacketReceived(uint8_t *packet
, int len
)
620 UsbCommand
*c
= (UsbCommand
*)packet
;
622 // 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]);
626 case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K
:
627 AcquireRawAdcSamples125k(c
->arg
[0]);
628 cmd_send(CMD_ACK
,0,0,0,0,0);
630 case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K
:
631 ModThenAcquireRawAdcSamples125k(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
633 case CMD_HID_DEMOD_FSK
:
634 CmdHIDdemodFSK(0, 0, 0, 1); // Demodulate HID tag
636 case CMD_HID_SIM_TAG
:
637 CmdHIDsimTAG(c
->arg
[0], c
->arg
[1], 1); // Simulate HID tag by ID
639 case CMD_HID_CLONE_TAG
:
640 CopyHIDtoT55x7(c
->arg
[0], c
->arg
[1]); // Clone HID tag by ID to T55x7
642 case CMD_EM410X_WRITE_TAG
:
643 WriteEM410x(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
645 case CMD_READ_TI_TYPE
:
648 case CMD_WRITE_TI_TYPE
:
649 WriteTItag(c
->arg
[0],c
->arg
[1],c
->arg
[2]);
651 case CMD_SIMULATE_TAG_125K
:
653 SimulateTagLowFrequency(c
->arg
[0], c
->arg
[1], 1);
656 case CMD_LF_SIMULATE_BIDIR
:
657 SimulateTagLowFrequencyBidir(c
->arg
[0], c
->arg
[1]);
659 case CMD_INDALA_CLONE_TAG
: // Clone Indala 64-bit tag by UID to T55x7
660 CopyIndala64toT55x7(c
->arg
[0], c
->arg
[1]);
662 case CMD_INDALA_CLONE_TAG_L
: // Clone Indala 224-bit tag by UID to T55x7
663 CopyIndala224toT55x7(c
->d
.asDwords
[0], c
->d
.asDwords
[1], c
->d
.asDwords
[2], c
->d
.asDwords
[3], c
->d
.asDwords
[4], c
->d
.asDwords
[5], c
->d
.asDwords
[6]);
668 case CMD_SNOOP_HITAG
: // Eavesdrop Hitag tag, args = type
669 SnoopHitag(c
->arg
[0]);
671 case CMD_SIMULATE_HITAG
: // Simulate Hitag tag, args = memory content
672 SimulateHitagTag((bool)c
->arg
[0],(byte_t
*)c
->d
.asBytes
);
674 case CMD_READER_HITAG
: // Reader for Hitag tags, args = type and function
675 ReaderHitag((hitag_function
)c
->arg
[0],(hitag_data
*)c
->d
.asBytes
);
680 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693
:
681 AcquireRawAdcSamplesIso15693();
683 case CMD_RECORD_RAW_ADC_SAMPLES_ISO_15693
:
684 RecordRawAdcSamplesIso15693();
687 case CMD_ISO_15693_COMMAND
:
688 DirectTag15693Command(c
->arg
[0],c
->arg
[1],c
->arg
[2],c
->d
.asBytes
);
691 case CMD_ISO_15693_FIND_AFI
:
692 BruteforceIso15693Afi(c
->arg
[0]);
695 case CMD_ISO_15693_DEBUG
:
696 SetDebugIso15693(c
->arg
[0]);
699 case CMD_READER_ISO_15693
:
700 ReaderIso15693(c
->arg
[0]);
702 case CMD_SIMTAG_ISO_15693
:
703 SimTagIso15693(c
->arg
[0]);
708 case CMD_SIMULATE_TAG_LEGIC_RF
:
709 LegicRfSimulate(c
->arg
[0], c
->arg
[1], c
->arg
[2]);
712 case CMD_WRITER_LEGIC_RF
:
713 LegicRfWriter(c
->arg
[1], c
->arg
[0]);
716 case CMD_READER_LEGIC_RF
:
717 LegicRfReader(c
->arg
[0], c
->arg
[1]);
721 #ifdef WITH_ISO14443b
722 case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443
:
723 AcquireRawAdcSamplesIso14443(c
->arg
[0]);
725 case CMD_READ_SRI512_TAG
:
726 ReadSRI512Iso14443(c
->arg
[0]);
728 case CMD_READ_SRIX4K_TAG
:
729 ReadSRIX4KIso14443(c
->arg
[0]);
731 case CMD_SNOOP_ISO_14443
:
734 case CMD_SIMULATE_TAG_ISO_14443
:
735 SimulateIso14443Tag();
739 #ifdef WITH_ISO14443a
740 case CMD_SNOOP_ISO_14443a
:
741 SnoopIso14443a(c
->arg
[0]);
743 case CMD_READER_ISO_14443a
:
746 case CMD_SIMULATE_TAG_ISO_14443a
:
747 SimulateIso14443aTag(c
->arg
[0], c
->arg
[1], c
->arg
[2]); // ## Simulate iso14443a tag - pass tag type & UID
749 case CMD_EPA_PACE_COLLECT_NONCE
:
750 EPA_PACE_Collect_Nonce(c
);
753 case CMD_READER_MIFARE
:
754 ReaderMifare(c
->arg
[0]);
756 case CMD_MIFARE_READBL
:
757 MifareReadBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
759 case CMD_MIFARE_READSC
:
760 MifareReadSector(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
762 case CMD_MIFARE_WRITEBL
:
763 MifareWriteBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
765 case CMD_MIFARE_NESTED
:
766 MifareNested(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
768 case CMD_MIFARE_CHKKEYS
:
769 MifareChkKeys(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
771 case CMD_SIMULATE_MIFARE_CARD
:
772 Mifare1ksim(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
776 case CMD_MIFARE_SET_DBGMODE
:
777 MifareSetDbgLvl(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
779 case CMD_MIFARE_EML_MEMCLR
:
780 MifareEMemClr(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
782 case CMD_MIFARE_EML_MEMSET
:
783 MifareEMemSet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
785 case CMD_MIFARE_EML_MEMGET
:
786 MifareEMemGet(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
788 case CMD_MIFARE_EML_CARDLOAD
:
789 MifareECardLoad(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
792 // Work with "magic Chinese" card
793 case CMD_MIFARE_EML_CSETBLOCK
:
794 MifareCSetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
796 case CMD_MIFARE_EML_CGETBLOCK
:
797 MifareCGetBlock(c
->arg
[0], c
->arg
[1], c
->arg
[2], c
->d
.asBytes
);
801 case CMD_MIFARE_SNIFFER
:
802 SniffMifare(c
->arg
[0]);
807 // Makes use of ISO14443a FPGA Firmware
808 case CMD_SNOOP_ICLASS
:
811 case CMD_SIMULATE_TAG_ICLASS
:
812 SimulateIClass(c
->arg
[0], c
->d
.asBytes
);
814 case CMD_READER_ICLASS
:
815 ReaderIClass(c
->arg
[0]);
819 case CMD_SIMULATE_TAG_HF_LISTEN
:
820 SimulateTagHfListen();
827 case CMD_MEASURE_ANTENNA_TUNING
:
828 MeasureAntennaTuning();
831 case CMD_MEASURE_ANTENNA_TUNING_HF
:
832 MeasureAntennaTuningHf();
835 case CMD_LISTEN_READER_FIELD
:
836 ListenReaderField(c
->arg
[0]);
839 case CMD_FPGA_MAJOR_MODE_OFF
: // ## FPGA Control
840 FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
);
842 LED_D_OFF(); // LED D indicates field ON or OFF
845 case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K
: {
847 // if(c->cmd == CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K) {
848 // n.cmd = CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K;
850 // n.cmd = CMD_DOWNLOADED_RAW_BITS_TI_TYPE;
852 // n.arg[0] = c->arg[0];
853 // memcpy(n.d.asBytes, BigBuf+c->arg[0], 48); // 12*sizeof(uint32_t)
855 // usb_write((uint8_t *)&n, sizeof(n));
856 // UsbSendPacket((uint8_t *)&n, sizeof(n));
860 for(size_t i
=0; i
<c
->arg
[1]; i
+= USB_CMD_DATA_SIZE
) {
861 size_t len
= MIN((c
->arg
[1] - i
),USB_CMD_DATA_SIZE
);
862 cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K
,i
,len
,0,((byte_t
*)BigBuf
)+c
->arg
[0]+i
,len
);
864 // Trigger a finish downloading signal with an ACK frame
865 cmd_send(CMD_ACK
,0,0,0,0,0);
869 case CMD_DOWNLOADED_SIM_SAMPLES_125K
: {
870 uint8_t *b
= (uint8_t *)BigBuf
;
871 memcpy(b
+c
->arg
[0], c
->d
.asBytes
, 48);
872 //Dbprintf("copied 48 bytes to %i",b+c->arg[0]);
873 // UsbSendPacket((uint8_t*)&ack, sizeof(ack));
874 cmd_send(CMD_ACK
,0,0,0,0,0);
881 case CMD_SET_LF_DIVISOR
:
882 FpgaSendCommand(FPGA_CMD_SET_DIVISOR
, c
->arg
[0]);
885 case CMD_SET_ADC_MUX
:
887 case 0: SetAdcMuxFor(GPIO_MUXSEL_LOPKD
); break;
888 case 1: SetAdcMuxFor(GPIO_MUXSEL_LORAW
); break;
889 case 2: SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); break;
890 case 3: SetAdcMuxFor(GPIO_MUXSEL_HIRAW
); break;
906 case CMD_SETUP_WRITE
:
907 case CMD_FINISH_WRITE
:
908 case CMD_HARDWARE_RESET
: {
912 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
914 // We're going to reset, and the bootrom will take control.
918 case CMD_START_FLASH
: {
919 if(common_area
.flags
.bootrom_present
) {
920 common_area
.command
= COMMON_AREA_COMMAND_ENTER_FLASH_MODE
;
923 AT91C_BASE_RSTC
->RSTC_RCR
= RST_CONTROL_KEY
| AT91C_RSTC_PROCRST
;
927 case CMD_DEVICE_INFO
: {
928 uint32_t dev_info
= DEVICE_INFO_FLAG_OSIMAGE_PRESENT
| DEVICE_INFO_FLAG_CURRENT_MODE_OS
;
929 if(common_area
.flags
.bootrom_present
) dev_info
|= DEVICE_INFO_FLAG_BOOTROM_PRESENT
;
930 // UsbSendPacket((uint8_t*)&c, sizeof(c));
931 cmd_send(CMD_DEVICE_INFO
,dev_info
,0,0,0,0);
935 Dbprintf("%s: 0x%04x","unknown command:",c
->cmd
);
940 void __attribute__((noreturn
)) AppMain(void)
944 if(common_area
.magic
!= COMMON_AREA_MAGIC
|| common_area
.version
!= 1) {
945 /* Initialize common area */
946 memset(&common_area
, 0, sizeof(common_area
));
947 common_area
.magic
= COMMON_AREA_MAGIC
;
948 common_area
.version
= 1;
950 common_area
.flags
.osimage_present
= 1;
961 // The FPGA gets its clock from us from PCK0 output, so set that up.
962 AT91C_BASE_PIOA
->PIO_BSR
= GPIO_PCK0
;
963 AT91C_BASE_PIOA
->PIO_PDR
= GPIO_PCK0
;
964 AT91C_BASE_PMC
->PMC_SCER
= AT91C_PMC_PCK0
;
965 // PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz
966 AT91C_BASE_PMC
->PMC_PCKR
[0] = AT91C_PMC_CSS_PLL_CLK
|
967 AT91C_PMC_PRES_CLK_4
;
968 AT91C_BASE_PIOA
->PIO_OER
= GPIO_PCK0
;
971 AT91C_BASE_SPI
->SPI_CR
= AT91C_SPI_SWRST
;
973 AT91C_BASE_SSC
->SSC_CR
= AT91C_SSC_SWRST
;
975 // Load the FPGA image, which we have stored in our flash.
984 byte_t rx
[sizeof(UsbCommand
)];
989 rx_len
= usb_read(rx
,sizeof(UsbCommand
));
991 UsbPacketReceived(rx
,rx_len
);
999 if (BUTTON_HELD(1000) > 0)