X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/54a942b05dd2a601b85e9851a5799929cbdffd5f..79db03ef6302ab9cda439cff0bf5ab7808646a21:/armsrc/appmain.c

diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index eef208a7..2061f6b3 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -214,7 +214,8 @@ void MeasureAntennaTuning(void)
  * ( hopefully around 95 if it is tuned to 125kHz!)
  */
   
-	FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_READER);
+  	FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
+	FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
 	for (i=255; i>19; i--) {
     WDT_HIT();
 		FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i);
@@ -236,6 +237,7 @@ void MeasureAntennaTuning(void)
 
   LED_A_ON();
 	// Let the FPGA drive the high-frequency antenna around 13.56 MHz.
+  	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
 	SpinDelay(20);
 	// Vref = 3300mV, and an 10:1 voltage divider on the input
@@ -264,6 +266,7 @@ void MeasureAntennaTuningHf(void)
 
 	for (;;) {
 		// Let the FPGA drive the high-frequency antenna around 13.56 MHz.
+		FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 		FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
 		SpinDelay(20);
 		// Vref = 3300mV, and an 10:1 voltage divider on the input
@@ -286,6 +289,7 @@ void SimulateTagHfListen(void)
 
 	// 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.
@@ -336,7 +340,7 @@ extern struct version_information version_information;
 extern char *_bootphase1_version_pointer, _flash_start, _flash_end;
 void SendVersion(void)
 {
-	char temp[48]; /* Limited data payload in USB packets */
+	char temp[256]; /* Limited data payload in USB packets */
 	DbpString("Prox/RFID mark3 RFID instrument");
 
 	/* Try to find the bootrom version information. Expect to find a pointer at
@@ -356,6 +360,8 @@ void SendVersion(void)
 
 	FpgaGatherVersion(temp, sizeof(temp));
 	DbpString(temp);
+	// Send Chip ID
+	cmd_send(CMD_ACK,*(AT91C_DBGU_CIDR),0,0,NULL,0);
 }
 
 #ifdef WITH_LF
@@ -363,6 +369,7 @@ void SendVersion(void)
 void SamyRun()
 {
 	DbpString("Stand-alone mode! No PC necessary.");
+	FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
 
 	// 3 possible options? no just 2 for now
 #define OPTS 2
@@ -626,19 +633,29 @@ void UsbPacketReceived(uint8_t *packet, int len)
 #ifdef WITH_LF
 		case CMD_ACQUIRE_RAW_ADC_SAMPLES_125K:
 			AcquireRawAdcSamples125k(c->arg[0]);
-      cmd_send(CMD_ACK,0,0,0,0,0);
+			cmd_send(CMD_ACK,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);
 			break;
+		case CMD_LF_SNOOP_RAW_ADC_SAMPLES:
+			SnoopLFRawAdcSamples(c->arg[0], c->arg[1]);
+			cmd_send(CMD_ACK,0,0,0,0,0);
+			break;
 		case CMD_HID_DEMOD_FSK:
 			CmdHIDdemodFSK(0, 0, 0, 1);					// Demodulate HID tag
 			break;
 		case CMD_HID_SIM_TAG:
 			CmdHIDsimTAG(c->arg[0], c->arg[1], 1);					// Simulate HID tag by ID
 			break;
-    case CMD_HID_CLONE_TAG: // Clone HID tag by ID to T55x7
-      CopyHIDtoT55x7(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
+		case CMD_HID_CLONE_TAG: // Clone HID tag by ID to T55x7
+			CopyHIDtoT55x7(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
+			break;
+		case CMD_IO_DEMOD_FSK:
+			CmdIOdemodFSK(1, 0, 0, 1);					// Demodulate IO tag
+			break;
+		case CMD_IO_CLONE_TAG: // Clone IO tag by ID to T55x7
+			CopyIOtoT55x7(c->arg[0], c->arg[1], c->d.asBytes[0]);
 			break;
 		case CMD_EM410X_WRITE_TAG:
 			WriteEM410x(c->arg[0], c->arg[1], c->arg[2]);
@@ -663,26 +680,26 @@ void UsbPacketReceived(uint8_t *packet, int len)
 		case CMD_INDALA_CLONE_TAG_L:					// Clone Indala 224-bit tag by UID to T55x7
 			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]);
 			break;
-    case CMD_T55XX_READ_BLOCK:
-      T55xxReadBlock(c->arg[1], c->arg[2],c->d.asBytes[0]);
-      break;
-    case CMD_T55XX_WRITE_BLOCK:
-      T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
-      break;
-    case CMD_T55XX_READ_TRACE: // Clone HID tag by ID to T55x7
-      T55xxReadTrace();
-      break;
-    case CMD_PCF7931_READ: // Read PCF7931 tag
-      ReadPCF7931();
-      cmd_send(CMD_ACK,0,0,0,0,0);
-//      UsbSendPacket((uint8_t*)&ack, sizeof(ack));
-      break;
-    case CMD_EM4X_READ_WORD:
-      EM4xReadWord(c->arg[1], c->arg[2],c->d.asBytes[0]);
-      break;
-    case CMD_EM4X_WRITE_WORD:
-      EM4xWriteWord(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
-      break;
+		case CMD_T55XX_READ_BLOCK:
+			T55xxReadBlock(c->arg[1], c->arg[2],c->d.asBytes[0]);
+			break;
+		case CMD_T55XX_WRITE_BLOCK:
+			T55xxWriteBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
+			break;
+		case CMD_T55XX_READ_TRACE: // Clone HID tag by ID to T55x7
+			T55xxReadTrace();
+			break;
+		case CMD_PCF7931_READ: // Read PCF7931 tag
+			ReadPCF7931();
+			cmd_send(CMD_ACK,0,0,0,0,0);
+//      	UsbSendPacket((uint8_t*)&ack, sizeof(ack));
+			break;
+		case CMD_EM4X_READ_WORD:
+			EM4xReadWord(c->arg[1], c->arg[2],c->d.asBytes[0]);
+			break;
+		case CMD_EM4X_WRITE_WORD:
+			EM4xWriteWord(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes[0]);
+			break;
 #endif
 
 #ifdef WITH_HITAG
@@ -744,10 +761,10 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			AcquireRawAdcSamplesIso14443(c->arg[0]);
 			break;
 		case CMD_READ_SRI512_TAG:
-			ReadSRI512Iso14443(c->arg[0]);
+			ReadSTMemoryIso14443(0x0F);
 			break;
 		case CMD_READ_SRIX4K_TAG:
-			ReadSRIX4KIso14443(c->arg[0]);
+			ReadSTMemoryIso14443(0x7F);
 			break;
 		case CMD_SNOOP_ISO_14443:
 			SnoopIso14443();
@@ -755,6 +772,9 @@ void UsbPacketReceived(uint8_t *packet, int len)
 		case CMD_SIMULATE_TAG_ISO_14443:
 			SimulateIso14443Tag();
 			break;
+		case CMD_ISO_14443B_COMMAND:
+			SendRawCommand14443B(c->arg[0],c->arg[1],c->arg[2],c->d.asBytes);
+			break;
 #endif
 
 #ifdef WITH_ISO14443a
@@ -765,24 +785,36 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			ReaderIso14443a(c);
 			break;
 		case CMD_SIMULATE_TAG_ISO_14443a:
-			SimulateIso14443aTag(c->arg[0], c->arg[1], c->arg[2]);  // ## Simulate iso14443a tag - pass tag type & UID
+			SimulateIso14443aTag(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);  // ## Simulate iso14443a tag - pass tag type & UID
 			break;
 		case CMD_EPA_PACE_COLLECT_NONCE:
 			EPA_PACE_Collect_Nonce(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);
+			break;
+		case CMD_MIFAREU_READCARD:
+			MifareUReadCard(c->arg[0],c->d.asBytes);
+                        break;
 		case CMD_MIFARE_READSC:
 			MifareReadSector(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
 			break;
 		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:
+                        MifareUWriteBlock_Special(c->arg[0], c->d.asBytes);
+                        break;
 		case CMD_MIFARE_NESTED:
 			MifareNested(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
 			break;
@@ -830,7 +862,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			SnoopIClass();
 			break;
 		case CMD_SIMULATE_TAG_ICLASS:
-			SimulateIClass(c->arg[0], c->d.asBytes);
+			SimulateIClass(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
 			break;
 		case CMD_READER_ICLASS:
 			ReaderIClass(c->arg[0]);
@@ -863,7 +895,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			LED_D_OFF(); // LED D indicates field ON or OFF
 			break;
 
-		case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K: {
+		case CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K:
 //			UsbCommand n;
 //			if(c->cmd == CMD_DOWNLOAD_RAW_ADC_SAMPLES_125K) {
 //				n.cmd = CMD_DOWNLOADED_RAW_ADC_SAMPLES_125K;
@@ -877,29 +909,30 @@ void UsbPacketReceived(uint8_t *packet, int len)
       //			UsbSendPacket((uint8_t *)&n, sizeof(n));
       //			LED_B_OFF();
 
-      LED_B_ON();
-      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,0,((byte_t*)BigBuf)+c->arg[0]+i,len);
-      }
-      // Trigger a finish downloading signal with an ACK frame
-      cmd_send(CMD_ACK,0,0,0,0,0);
+			LED_B_ON();
+			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,0,((byte_t*)BigBuf)+c->arg[0]+i,len);
+			}
+			// Trigger a finish downloading signal with an ACK frame
+			cmd_send(CMD_ACK,0,0,0,0,0);
 			LED_B_OFF();
-		} break;
+			break;
 
 		case CMD_DOWNLOADED_SIM_SAMPLES_125K: {
 			uint8_t *b = (uint8_t *)BigBuf;
 			memcpy(b+c->arg[0], c->d.asBytes, 48);
 			//Dbprintf("copied 48 bytes to %i",b+c->arg[0]);
 //			UsbSendPacket((uint8_t*)&ack, sizeof(ack));
-      cmd_send(CMD_ACK,0,0,0,0,0);
-		} break;
-
+			cmd_send(CMD_ACK,0,0,0,0,0);
+			break;
+		}	
 		case CMD_READ_MEM:
 			ReadMem(c->arg[0]);
 			break;
 
 		case CMD_SET_LF_DIVISOR:
+		  	FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
 			FpgaSendCommand(FPGA_CMD_SET_DIVISOR, c->arg[0]);
 			break;
 
@@ -926,35 +959,35 @@ void UsbPacketReceived(uint8_t *packet, int len)
 #endif
 		case CMD_SETUP_WRITE:
 		case CMD_FINISH_WRITE:
-		case CMD_HARDWARE_RESET: {
-      usb_disable();
+		case CMD_HARDWARE_RESET:
+			usb_disable();
 			SpinDelay(1000);
 			SpinDelay(1000);
 			AT91C_BASE_RSTC->RSTC_RCR = RST_CONTROL_KEY | AT91C_RSTC_PROCRST;
 			for(;;) {
 				// We're going to reset, and the bootrom will take control.
 			}
-        } break;
+			break;
 
-		case CMD_START_FLASH: {
+		case CMD_START_FLASH:
 			if(common_area.flags.bootrom_present) {
 				common_area.command = COMMON_AREA_COMMAND_ENTER_FLASH_MODE;
 			}
-      usb_disable();
+			usb_disable();
 			AT91C_BASE_RSTC->RSTC_RCR = RST_CONTROL_KEY | AT91C_RSTC_PROCRST;
 			for(;;);
-        } break;
+			break;
 
 		case CMD_DEVICE_INFO: {
 			uint32_t dev_info = DEVICE_INFO_FLAG_OSIMAGE_PRESENT | DEVICE_INFO_FLAG_CURRENT_MODE_OS;
 			if(common_area.flags.bootrom_present) dev_info |= DEVICE_INFO_FLAG_BOOTROM_PRESENT;
 //			UsbSendPacket((uint8_t*)&c, sizeof(c));
-      cmd_send(CMD_DEVICE_INFO,dev_info,0,0,0,0);
-		} break;
-            
-		default: {
+			cmd_send(CMD_DEVICE_INFO,dev_info,0,0,0,0);	
+			break;
+		}
+		default:
 			Dbprintf("%s: 0x%04x","unknown command:",c->cmd);
-        } break;
+			break;
 	}
 }
 
@@ -994,7 +1027,8 @@ void  __attribute__((noreturn)) AppMain(void)
 	AT91C_BASE_SSC->SSC_CR = AT91C_SSC_SWRST;
 
 	// Load the FPGA image, which we have stored in our flash.
-	FpgaDownloadAndGo();
+	// (the HF version by default)
+	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
 	StartTickCount();