#include "legicrf.h"
#include <hitag2.h>
#include "lfsampling.h"
+#include "BigBuf.h"
#ifdef WITH_LCD
#include "LCD.h"
#endif
}
-void SimulateTagHfListen(void)
-{
- // ToDo: historically this used the free buffer, which was 2744 Bytes long.
- // There might be a better size to be defined:
- #define HF_14B_SNOOP_BUFFER_SIZE 2744
- uint8_t *dest = BigBuf_malloc(HF_14B_SNOOP_BUFFER_SIZE);
- uint8_t v = 0;
- int i;
- int p = 0;
-
- // We're using this mode just so that I can test it out; the simulated
- // tag mode would work just as well and be simpler.
- FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
- FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ | FPGA_HF_READER_RX_XCORR_SNOOP);
-
- // We need to listen to the high-frequency, peak-detected path.
- SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
-
- FpgaSetupSsc();
-
- i = 0;
- for(;;) {
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
- AT91C_BASE_SSC->SSC_THR = 0xff;
- }
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
- uint8_t r = (uint8_t)AT91C_BASE_SSC->SSC_RHR;
-
- v <<= 1;
- if(r & 1) {
- v |= 1;
- }
- p++;
-
- if(p >= 8) {
- dest[i] = v;
- v = 0;
- p = 0;
- i++;
-
- if(i >= HF_14B_SNOOP_BUFFER_SIZE) {
- break;
- }
- }
- }
- }
- DbpString("simulate tag (now type bitsamples)");
-}
-
void ReadMem(int addr)
{
const uint8_t *data = ((uint8_t *)addr);
/* osimage version information is linked in */
extern struct version_information version_information;
/* bootrom version information is pointed to from _bootphase1_version_pointer */
-extern char *_bootphase1_version_pointer, _flash_start, _flash_end;
+extern char *_bootphase1_version_pointer, _flash_start, _flash_end, _bootrom_start, _bootrom_end, __data_src_start__;
void SendVersion(void)
{
- char temp[512]; /* Limited data payload in USB packets */
- DbpString("Prox/RFID mark3 RFID instrument");
+ char temp[USB_CMD_DATA_SIZE]; /* Limited data payload in USB packets */
+ char VersionString[USB_CMD_DATA_SIZE] = { '\0' };
/* Try to find the bootrom version information. Expect to find a pointer at
* symbol _bootphase1_version_pointer, perform slight sanity checks on the
*/
char *bootrom_version = *(char**)&_bootphase1_version_pointer;
if( bootrom_version < &_flash_start || bootrom_version >= &_flash_end ) {
- DbpString("bootrom version information appears invalid");
+ strcat(VersionString, "bootrom version information appears invalid\n");
} else {
FormatVersionInformation(temp, sizeof(temp), "bootrom: ", bootrom_version);
- DbpString(temp);
+ strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1);
}
FormatVersionInformation(temp, sizeof(temp), "os: ", &version_information);
- DbpString(temp);
+ strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1);
+
+ FpgaGatherVersion(FPGA_BITSTREAM_LF, temp, sizeof(temp));
+ strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1);
+ FpgaGatherVersion(FPGA_BITSTREAM_HF, temp, sizeof(temp));
+ strncat(VersionString, temp, sizeof(VersionString) - strlen(VersionString) - 1);
- FpgaGatherVersion(temp, sizeof(temp));
- DbpString(temp);
- // Send Chip ID
- cmd_send(CMD_ACK,*(AT91C_DBGU_CIDR),0,0,NULL,0);
+ // Send Chip ID and used flash memory
+ uint32_t text_and_rodata_section_size = (uint32_t)&__data_src_start__ - (uint32_t)&_flash_start;
+ uint32_t compressed_data_section_size = common_area.arg1;
+ cmd_send(CMD_ACK, *(AT91C_DBGU_CIDR), text_and_rodata_section_size + compressed_data_section_size, 0, VersionString, strlen(VersionString));
}
#ifdef WITH_LF
setSamplingConfig((sample_config *) c->d.asBytes);
break;
case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K:
- cmd_send(CMD_ACK,SampleLF(),0,0,0,0);
+ cmd_send(CMD_ACK,SampleLF(c->arg[0]),0,0,0,0);
break;
case CMD_MOD_THEN_ACQUIRE_RAW_ADC_SAMPLES_125K:
ModThenAcquireRawAdcSamples125k(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes);
case CMD_HID_SIM_TAG:
CmdHIDsimTAG(c->arg[0], c->arg[1], 1);
break;
+ case CMD_FSK_SIM_TAG:
+ CmdFSKsimTAG(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+ break;
+ case CMD_ASK_SIM_TAG:
+ CmdASKsimTag(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+ break;
+ case CMD_PSK_SIM_TAG:
+ CmdPSKsimTag(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+ break;
case CMD_HID_CLONE_TAG:
CopyHIDtoT55x7(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
break;
ReaderHitag((hitag_function)c->arg[0],(hitag_data*)c->d.asBytes);
break;
#endif
-
+
#ifdef WITH_ISO15693
case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_15693:
AcquireRawAdcSamplesIso15693();
#endif
#ifdef WITH_ISO14443b
- case CMD_ACQUIRE_RAW_ADC_SAMPLES_ISO_14443:
- AcquireRawAdcSamplesIso14443(c->arg[0]);
- break;
case CMD_READ_SRI512_TAG:
- ReadSTMemoryIso14443(0x0F);
+ ReadSTMemoryIso14443b(0x0F);
break;
case CMD_READ_SRIX4K_TAG:
- ReadSTMemoryIso14443(0x7F);
+ ReadSTMemoryIso14443b(0x7F);
break;
- case CMD_SNOOP_ISO_14443:
- SnoopIso14443();
+ case CMD_SNOOP_ISO_14443B:
+ SnoopIso14443b();
break;
- case CMD_SIMULATE_TAG_ISO_14443:
- SimulateIso14443Tag();
+ case CMD_SIMULATE_TAG_ISO_14443B:
+ SimulateIso14443bTag();
break;
case CMD_ISO_14443B_COMMAND:
SendRawCommand14443B(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes);
case CMD_EPA_PACE_COLLECT_NONCE:
EPA_PACE_Collect_Nonce(c);
break;
+ case CMD_EPA_PACE_REPLAY:
+ EPA_PACE_Replay(c);
+ break;
case CMD_READER_MIFARE:
- ReaderMifare(c->arg[0]);
+ ReaderMifare(c->arg[0]);
break;
case CMD_MIFARE_READBL:
MifareReadBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
break;
case CMD_MIFAREU_READBL:
- MifareUReadBlock(c->arg[0],c->d.asBytes);
+ MifareUReadBlock(c->arg[0],c->arg[1], c->d.asBytes);
break;
- case CMD_MIFAREUC_AUTH1:
- MifareUC_Auth1(c->arg[0],c->d.asBytes);
- break;
- case CMD_MIFAREUC_AUTH2:
- MifareUC_Auth2(c->arg[0],c->d.asBytes);
+ case CMD_MIFAREUC_AUTH:
+ MifareUC_Auth(c->arg[0],c->d.asBytes);
break;
case CMD_MIFAREU_READCARD:
- MifareUReadCard(c->arg[0], c->arg[1], c->d.asBytes);
+ MifareUReadCard(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
break;
- case CMD_MIFAREUC_READCARD:
- MifareUReadCard(c->arg[0], c->arg[1], c->d.asBytes);
+ case CMD_MIFAREUC_SETPWD:
+ MifareUSetPwd(c->arg[0], c->d.asBytes);
break;
case CMD_MIFARE_READSC:
MifareReadSector(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
case CMD_MIFARE_WRITEBL:
MifareWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
break;
- case CMD_MIFAREU_WRITEBL_COMPAT:
- MifareUWriteBlock(c->arg[0], c->d.asBytes);
- break;
+ //case CMD_MIFAREU_WRITEBL_COMPAT:
+ //MifareUWriteBlockCompat(c->arg[0], c->d.asBytes);
+ //break;
case CMD_MIFAREU_WRITEBL:
- MifareUWriteBlock_Special(c->arg[0], c->d.asBytes);
- break;
+ MifareUWriteBlock(c->arg[0], c->arg[1], c->d.asBytes);
+ break;
case CMD_MIFARE_NESTED:
MifareNested(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
break;
case CMD_READER_ICLASS_REPLAY:
ReaderIClass_Replay(c->arg[0], c->d.asBytes);
break;
-#endif
-
- case CMD_SIMULATE_TAG_HF_LISTEN:
- SimulateTagHfListen();
+ case CMD_ICLASS_EML_MEMSET:
+ emlSet(c->d.asBytes,c->arg[0], c->arg[1]);
break;
+#endif
case CMD_BUFF_CLEAR:
BigBuf_Clear();
uint8_t *BigBuf = BigBuf_get_addr();
for(size_t i=0; i<c->arg[1]; i += USB_CMD_DATA_SIZE) {
size_t len = MIN((c->arg[1] - i),USB_CMD_DATA_SIZE);
- cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K,i,len,traceLen,BigBuf+c->arg[0]+i,len);
+ cmd_send(CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K,i,len,BigBuf_get_traceLen(),BigBuf+c->arg[0]+i,len);
}
// Trigger a finish downloading signal with an ACK frame
- cmd_send(CMD_ACK,1,0,traceLen,getSamplingConfig(),sizeof(sample_config));
+ cmd_send(CMD_ACK,1,0,BigBuf_get_traceLen(),getSamplingConfig(),sizeof(sample_config));
LED_B_OFF();
break;
void __attribute__((noreturn)) AppMain(void)
{
SpinDelay(100);
-
+ clear_trace();
if(common_area.magic != COMMON_AREA_MAGIC || common_area.version != 1) {
/* Initialize common area */
memset(&common_area, 0, sizeof(common_area));