X-Git-Url: http://cvs.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/1c8fbeb93e82f6aafb885b57b9afbfadcf85c171..4469412e88d37b988729fed47c6bc21d98cc6e88:/armsrc/appmain.c

diff --git a/armsrc/appmain.c b/armsrc/appmain.c
index 8b8f2594..ebfd8228 100644
--- a/armsrc/appmain.c
+++ b/armsrc/appmain.c
@@ -34,6 +34,7 @@
 // Craig Young - 14a stand-alone code
 #ifdef WITH_ISO14443a_StandAlone
  #include "iso14443a.h"
+ #include "protocols.h"
 #endif
 
 #define abs(x) ( ((x)<0) ? -(x) : (x) )
@@ -56,19 +57,17 @@ void ToSendReset(void)
 	ToSendBit = 8;
 }
 
-void ToSendStuffBit(int b)
-{
+void ToSendStuffBit(int b) {
 	if(ToSendBit >= 8) {
-		ToSendMax++;
+		++ToSendMax;
 		ToSend[ToSendMax] = 0;
 		ToSendBit = 0;
 	}
 
-	if(b) {
+	if(b)
 		ToSend[ToSendMax] |= (1 << (7 - ToSendBit));
-	}
 
-	ToSendBit++;
+	++ToSendBit;
 
 	if(ToSendMax >= sizeof(ToSend)) {
 		ToSendBit = 0;
@@ -80,22 +79,20 @@ void ToSendStuffBit(int b)
 // Debug print functions, to go out over USB, to the usual PC-side client.
 //=============================================================================
 
-void DbpString(char *str)
-{
+void DbpString(char *str) {
   byte_t len = strlen(str);
   cmd_send(CMD_DEBUG_PRINT_STRING,len,0,0,(byte_t*)str,len);
 }
 
 #if 0
-void DbpIntegers(int x1, int x2, int x3)
-{
+void DbpIntegers(int x1, int x2, int x3) {
   cmd_send(CMD_DEBUG_PRINT_INTEGERS,x1,x2,x3,0,0);
 }
 #endif
 
 void Dbprintf(const char *fmt, ...) {
-// should probably limit size here; oh well, let's just use a big buffer
-	char output_string[128];
+	// should probably limit size here; oh well, let's just use a big buffer
+	char output_string[128] = {0x00};
 	va_list ap;
 
 	va_start(ap, fmt);
@@ -107,28 +104,27 @@ void Dbprintf(const char *fmt, ...) {
 
 // prints HEX & ASCII
 void Dbhexdump(int len, uint8_t *d, bool bAsci) {
-	int l=0,i;
+	int l=0, i;
 	char ascii[9];
     
 	while (len>0) {
-		if (len>8) l=8;
-		else l=len;
+
+		l = (len>8) ? 8 : len;
 		
 		memcpy(ascii,d,l);
 		ascii[l]=0;
 		
 		// filter safe ascii
-		for (i=0;i<l;i++)
+		for (i=0; i<l; ++i)
 			if (ascii[i]<32 || ascii[i]>126) ascii[i]='.';
         
-		if (bAsci) {
+		if (bAsci)
 			Dbprintf("%-8s %*D",ascii,l,d," ");
-		} else {
+		else
 			Dbprintf("%*D",l,d," ");
-		}
         
-		len-=8;
-		d+=8;		
+		len -= 8;
+		d += 8;		
 	}
 }
 
@@ -162,10 +158,9 @@ static int ReadAdc(int ch)
 
 	AT91C_BASE_ADC->ADC_CR = AT91C_ADC_START;
 
-	while(!(AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ch)))
-		;
+	while (!(AT91C_BASE_ADC->ADC_SR & ADC_END_OF_CONVERSION(ch))) ;
+	
 	d = AT91C_BASE_ADC->ADC_CDR[ch];
-
 	return d;
 }
 
@@ -174,15 +169,13 @@ int AvgAdc(int ch) // was static - merlok
 	int i;
 	int a = 0;
 
-	for(i = 0; i < 32; i++) {
+	for(i = 0; i < 32; ++i)
 		a += ReadAdc(ch);
-	}
 
 	return (a + 15) >> 5;
 }
 
-void MeasureAntennaTuning(void)
-{
+void MeasureAntennaTuning(void) {
 	uint8_t LF_Results[256];
 	int i, adcval = 0, peak = 0, peakv = 0, peakf = 0; //ptr = 0 
 	int vLf125 = 0, vLf134 = 0, vHf = 0;	// in mV
@@ -200,8 +193,9 @@ void MeasureAntennaTuning(void)
   
   	FpgaDownloadAndGo(FPGA_BITSTREAM_LF);
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_LF_ADC | FPGA_LF_ADC_READER_FIELD);
+
 	for (i=255; i>=19; i--) {
-    WDT_HIT();
+		WDT_HIT();
 		FpgaSendCommand(FPGA_CMD_SET_DIVISOR, i);
 		SpinDelay(20);
 		adcval = ((MAX_ADC_LF_VOLTAGE * AvgAdc(ADC_CHAN_LF)) >> 10);
@@ -228,13 +222,11 @@ void MeasureAntennaTuning(void)
 
 	cmd_send(CMD_MEASURED_ANTENNA_TUNING, vLf125 | (vLf134<<16), vHf, peakf | (peakv<<16), LF_Results, 256);
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-	LED_A_OFF();
-	LED_B_OFF();
-  return;
+
+	LEDsoff();
 }
 
-void MeasureAntennaTuningHf(void)
-{
+void MeasureAntennaTuningHf(void) {
 	int vHf = 0;	// in mV
 
 	DbpString("Measuring HF antenna, press button to exit");
@@ -250,15 +242,13 @@ void MeasureAntennaTuningHf(void)
 		Dbprintf("%d mV",vHf);
 		if (BUTTON_PRESS()) break;
 	}
+	
 	DbpString("cancelled");
-
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-
 }
 
 
-void ReadMem(int addr)
-{
+void ReadMem(int addr) {
 	const uint8_t *data = ((uint8_t *)addr);
 
 	Dbprintf("%x: %02x %02x %02x %02x %02x %02x %02x %02x",
@@ -279,6 +269,7 @@ void SendVersion(void)
 	 * pointer, then use it.
 	 */
 	char *bootrom_version = *(char**)&_bootphase1_version_pointer;
+	
 	if( bootrom_version < &_flash_start || bootrom_version >= &_flash_end ) {
 		strcat(VersionString, "bootrom version information appears invalid\n");
 	} else {
@@ -291,6 +282,7 @@ void SendVersion(void)
 
 	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);
 
@@ -332,8 +324,7 @@ void printUSBSpeed(void)
 /**
   * Prints runtime information about the PM3.
 **/
-void SendStatus(void)
-{
+void SendStatus(void) {
 	BigBuf_print_status();
 	Fpga_print_status();
 	printConfig(); //LF Sampling config
@@ -350,7 +341,6 @@ void SendStatus(void)
 #if defined(WITH_ISO14443a_StandAlone) || defined(WITH_LF)
 
 #define OPTS 2
-
 void StandAloneMode()
 {
 	DbpString("Stand-alone mode! No PC necessary.");
@@ -364,13 +354,9 @@ void StandAloneMode()
 	LED(LED_GREEN,	200);
 	LED(LED_ORANGE, 200);
 	LED(LED_RED,	200);
-
 }
-
 #endif
 
-
-
 #ifdef WITH_ISO14443a_StandAlone
 void StandAloneMode14a()
 {
@@ -387,6 +373,8 @@ void StandAloneMode14a()
 	uint32_t uid_tmp2 = 0;
 	iso14a_card_select_t hi14a_card[OPTS];
 
+	uint8_t params = (MAGIC_SINGLE | MAGIC_DATAIN);
+					
 	LED(selected + 1, 0);
 
 	for (;;)
@@ -407,8 +395,8 @@ void StandAloneMode14a()
 			/* need this delay to prevent catching some weird data */
 			SpinDelay(500);
 			/* Code for reading from 14a tag */
-			uint8_t uid[10]  ={0};
-			uint32_t cuid;
+			uint8_t uid[10] = {0};
+			uint32_t cuid = 0;
 			iso14443a_setup(FPGA_HF_ISO14443A_READER_MOD);
 
 			for ( ; ; )
@@ -429,7 +417,7 @@ void StandAloneMode14a()
 						SpinDelay(300);
 					}
 				}
-				if (!iso14443a_select_card(uid, &hi14a_card[selected], &cuid))
+				if (!iso14443a_select_card(uid, &hi14a_card[selected], &cuid, true, 0))
 					continue;
 				else
 				{
@@ -480,87 +468,84 @@ void StandAloneMode14a()
 		else if (iGotoClone==1)
 		{
 			iGotoClone=0;
-					LEDsoff();
-					LED(selected + 1, 0);
-					LED(LED_ORANGE, 250);
+			LEDsoff();
+			LED(selected + 1, 0);
+			LED(LED_ORANGE, 250);
 
+			// record
+			Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected, uid_1st[selected]);
 
-					// record
-					Dbprintf("Preparing to Clone card [Bank: %x]; uid: %08x", selected, uid_1st[selected]);
+			// wait for button to be released
+			// Delay cloning until card is in place
+			while(BUTTON_PRESS())
+				WDT_HIT();
 
-					// wait for button to be released
-					while(BUTTON_PRESS())
-					{
-						// Delay cloning until card is in place
-						WDT_HIT();
-					}
-					Dbprintf("Starting clone. [Bank: %u]", selected);
-					// need this delay to prevent catching some weird data
-					SpinDelay(500);
-					// Begin clone function here:
-					/* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards:
-							UsbCommand c = {CMD_MIFARE_CSETBLOCK, {wantWipe, params & (0xFE | (uid == NULL ? 0:1)), blockNo}};
-							memcpy(c.d.asBytes, data, 16);
-							SendCommand(&c);
-
-						Block read is similar:
-							UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, 0, blockNo}};
-						We need to imitate that call with blockNo 0 to set a uid.
-
-						The get and set commands are handled in this file:
-							// Work with "magic Chinese" card
-							case CMD_MIFARE_CSETBLOCK:
-									MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
-									break;
-							case CMD_MIFARE_CGETBLOCK:
-									MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
-									break;
-
-						mfCSetUID provides example logic for UID set workflow:
-							-Read block0 from card in field with MifareCGetBlock()
-							-Configure new values without replacing reserved bytes
-									memcpy(block0, uid, 4); // Copy UID bytes from byte array
-									// Mifare UID BCC
-									block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5
-									Bytes 5-7 are reserved SAK and ATQA for mifare classic
-							-Use mfCSetBlock(0, block0, oldUID, wantWipe, CSETBLOCK_SINGLE_OPER) to write it
-					*/
-					uint8_t oldBlock0[16] = {0}, newBlock0[16] = {0}, testBlock0[16] = {0};
-					// arg0 = Flags == CSETBLOCK_SINGLE_OPER=0x1F, arg1=returnSlot, arg2=blockNo
-			MifareCGetBlock(0x3F, 1, 0, oldBlock0);
+			Dbprintf("Starting clone. [Bank: %u]", selected);
+			// need this delay to prevent catching some weird data
+			SpinDelay(500);
+			// Begin clone function here:
+			/* Example from client/mifarehost.c for commanding a block write for "magic Chinese" cards:
+					UsbCommand c = {CMD_MIFARE_CSETBLOCK, {params & (0xFE | (uid == NULL ? 0:1)), blockNo, 0}};
+					memcpy(c.d.asBytes, data, 16);
+					SendCommand(&c);
+
+				Block read is similar:
+					UsbCommand c = {CMD_MIFARE_CGETBLOCK, {params, blockNo, 0}};
+				We need to imitate that call with blockNo 0 to set a uid.
+
+				The get and set commands are handled in this file:
+					// Work with "magic Chinese" card
+					case CMD_MIFARE_CSETBLOCK:
+							MifareCSetBlock(c->arg[0], c->arg[1], c->d.asBytes);
+							break;
+					case CMD_MIFARE_CGETBLOCK:
+							MifareCGetBlock(c->arg[0], c->arg[1], c->d.asBytes);
+							break;
+
+				mfCSetUID provides example logic for UID set workflow:
+					-Read block0 from card in field with MifareCGetBlock()
+					-Configure new values without replacing reserved bytes
+							memcpy(block0, uid, 4); // Copy UID bytes from byte array
+							// Mifare UID BCC
+							block0[4] = block0[0]^block0[1]^block0[2]^block0[3]; // BCC on byte 5
+							Bytes 5-7 are reserved SAK and ATQA for mifare classic
+					-Use mfCSetBlock(0, block0, oldUID, wantWipe, MAGIC_SINGLE) to write it
+			*/
+			uint8_t oldBlock0[16] = {0}, newBlock0[16] = {0}, testBlock0[16] = {0};
+			// arg0 = Flags, arg1=blockNo
+			MifareCGetBlock(params, 0, oldBlock0);
 			if (oldBlock0[0] == 0 && oldBlock0[0] == oldBlock0[1]  && oldBlock0[1] == oldBlock0[2] && oldBlock0[2] == oldBlock0[3]) {
 				Dbprintf("No changeable tag detected. Returning to replay mode for bank[%d]", selected);
 				playing = 1;
 			}
 			else {
-					Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0[0],oldBlock0[1],oldBlock0[2],oldBlock0[3]);
-					memcpy(newBlock0,oldBlock0,16);
-					// Copy uid_1st for bank (2nd is for longer UIDs not supported if classic)
-
-					newBlock0[0] = uid_1st[selected]>>24;
-					newBlock0[1] = 0xFF & (uid_1st[selected]>>16);
-					newBlock0[2] = 0xFF & (uid_1st[selected]>>8);
-					newBlock0[3] = 0xFF & (uid_1st[selected]);
-					newBlock0[4] = newBlock0[0]^newBlock0[1]^newBlock0[2]^newBlock0[3];
-					// arg0 = needWipe, arg1 = workFlags, arg2 = blockNo, datain
-					MifareCSetBlock(0, 0xFF,0, newBlock0);
-				MifareCGetBlock(0x3F, 1, 0, testBlock0);
-					if (memcmp(testBlock0,newBlock0,16)==0)
-					{
-						DbpString("Cloned successfull!");
-						cardRead[selected] = 0; // Only if the card was cloned successfully should we clear it
+				Dbprintf("UID from target tag: %02X%02X%02X%02X", oldBlock0[0],oldBlock0[1],oldBlock0[2],oldBlock0[3]);
+				memcpy(newBlock0,oldBlock0,16);
+				// Copy uid_1st for bank (2nd is for longer UIDs not supported if classic)
+
+				newBlock0[0] = uid_1st[selected]>>24;
+				newBlock0[1] = 0xFF & (uid_1st[selected]>>16);
+				newBlock0[2] = 0xFF & (uid_1st[selected]>>8);
+				newBlock0[3] = 0xFF & (uid_1st[selected]);
+				newBlock0[4] = newBlock0[0]^newBlock0[1]^newBlock0[2]^newBlock0[3];
+
+				// arg0 = workFlags, arg1 = blockNo, datain
+				MifareCSetBlock(params, 0, newBlock0);
+				MifareCGetBlock(params, 0, testBlock0);
+				
+				if (memcmp(testBlock0, newBlock0, 16)==0) {
+					DbpString("Cloned successfull!");
+					cardRead[selected] = 0; // Only if the card was cloned successfully should we clear it
 					playing = 0;
 					iGotoRecord = 1;
-				selected = (selected + 1) % OPTS;
-				}
-				else {
+					selected = (selected + 1) % OPTS;
+				} else {
 					Dbprintf("Clone failed. Back to replay mode on bank[%d]", selected);
 					playing = 1;
 				}
 			}
 			LEDsoff();
 			LED(selected + 1, 0);
-
 		}
 		// Change where to record (or begin playing)
 		else if (playing==1) // button_pressed == BUTTON_SINGLE_CLICK && cardRead[selected])
@@ -640,8 +625,7 @@ void SamyRun()
 	// Turn on selected LED
 	LED(selected + 1, 0);
 
-	for (;;)
-	{
+	for (;;) {
 		usb_poll();
 		WDT_HIT();
 
@@ -667,54 +651,46 @@ void SamyRun()
 			SpinDelay(500);
 
 			CmdHIDdemodFSK(1, &high[selected], &low[selected], 0);
-			Dbprintf("Recorded %x %x %x", selected, high[selected], low[selected]);
+			Dbprintf("Recorded %x %x %08x", selected, high[selected], low[selected]);
 
 			LEDsoff();
 			LED(selected + 1, 0);
 			// Finished recording
-
 			// If we were previously playing, set playing off
 			// so next button push begins playing what we recorded
-			playing = 0;
-			
-			cardRead = 1;
-	
+			playing = 0;			
+			cardRead = 1;	
 		}
+		else if (button_pressed > 0 && cardRead == 1) {
+			LEDsoff();
+			LED(selected + 1, 0);
+			LED(LED_ORANGE, 0);
 
-		else if (button_pressed > 0 && cardRead == 1)
-		{
-					LEDsoff();
-					LED(selected + 1, 0);
-					LED(LED_ORANGE, 0);
-
-					// record
-					Dbprintf("Cloning %x %x %x", selected, high[selected], low[selected]);
+			// record
+			Dbprintf("Cloning %x %x %08x", selected, high[selected], low[selected]);
 
-					// wait for button to be released
-					while(BUTTON_PRESS())
-						WDT_HIT();
+			// wait for button to be released
+			while(BUTTON_PRESS())
+				WDT_HIT();
 
-					/* need this delay to prevent catching some weird data */
-					SpinDelay(500);
+			/* need this delay to prevent catching some weird data */
+			SpinDelay(500);
 
-					CopyHIDtoT55x7(high[selected], low[selected], 0, 0);
-					Dbprintf("Cloned %x %x %x", selected, high[selected], low[selected]);
+			CopyHIDtoT55x7(0, high[selected], low[selected], 0);
+			Dbprintf("Cloned %x %x %08x", selected, high[selected], low[selected]);
 
-					LEDsoff();
-					LED(selected + 1, 0);
-					// Finished recording
+			LEDsoff();
+			LED(selected + 1, 0);
+			// Finished recording
 
-					// If we were previously playing, set playing off
-					// so next button push begins playing what we recorded
-					playing = 0;
-					
-					cardRead = 0;
-			
+			// If we were previously playing, set playing off
+			// so next button push begins playing what we recorded
+			playing = 0;			
+			cardRead = 0;			
 		}
 
 		// Change where to record (or begin playing)
-		else if (button_pressed)
-		{
+		else if (button_pressed) {
 			// Next option if we were previously playing
 			if (playing)
 				selected = (selected + 1) % OPTS;
@@ -731,15 +707,16 @@ void SamyRun()
 				// wait for button to be released
 				while(BUTTON_PRESS())
 					WDT_HIT();
-				Dbprintf("%x %x %x", selected, high[selected], low[selected]);
-				CmdHIDsimTAG(high[selected], low[selected], 0);
+				
+				Dbprintf("%x %x %08x", selected, high[selected], low[selected]);
+				CmdHIDsimTAG(high[selected], low[selected], 0);		
 				DbpString("Done playing");
-				if (BUTTON_HELD(1000) > 0)
-					{
+				
+				if (BUTTON_HELD(1000) > 0) {
 					DbpString("Exiting");
 					LEDsoff();
 					return;
-					}
+				}
 
 				/* We pressed a button so ignore it here with a delay */
 				SpinDelay(300);
@@ -795,16 +772,14 @@ static const char LIGHT_SCHEME[] = {
 };
 static const int LIGHT_LEN = sizeof(LIGHT_SCHEME)/sizeof(LIGHT_SCHEME[0]);
 
-void ListenReaderField(int limit)
-{
-	int lf_av, lf_av_new, lf_baseline= 0, lf_max;
-	int hf_av, hf_av_new,  hf_baseline= 0, hf_max;
-	int mode=1, display_val, display_max, i;
-
+void ListenReaderField(int limit) {
 #define LF_ONLY						1
 #define HF_ONLY						2
 #define REPORT_CHANGE			 	10    // report new values only if they have changed at least by REPORT_CHANGE
 
+	int lf_av, lf_av_new, lf_baseline= 0, lf_max;
+	int hf_av, hf_av_new,  hf_baseline= 0, hf_max;
+	int mode=1, display_val, display_max, i;
 
 	// switch off FPGA - we don't want to measure our own signal
 	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
@@ -951,7 +926,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			CmdIOdemodFSK(c->arg[0], 0, 0, 1);
 			break;
 		case CMD_IO_CLONE_TAG:
-			CopyIOtoT55x7(c->arg[0], c->arg[1], c->d.asBytes[0]);
+			CopyIOtoT55x7(c->arg[0], c->arg[1]);
 			break;
 		case CMD_EM410X_DEMOD:
 			CmdEM410xdemod(c->arg[0], 0, 0, 1);
@@ -985,12 +960,12 @@ void UsbPacketReceived(uint8_t *packet, int len)
 		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:
-			T55xxReadTrace();
-			break;
 		case CMD_T55XX_WAKEUP:
 			T55xxWakeUp(c->arg[0]);
 			break;
+		case CMD_T55XX_RESET_READ:
+			T55xxResetRead();
+			break;
 		case CMD_PCF7931_READ:
 			ReadPCF7931();
 			break;
@@ -1005,12 +980,10 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			break;
 		case CMD_AWID_DEMOD_FSK: // Set realtime AWID demodulation
 			CmdAWIDdemodFSK(c->arg[0], 0, 0, 1);
-                        break;
+			break;
         case CMD_VIKING_CLONE_TAG:
-            CopyViKingtoT55x7(c->arg[0],c->arg[1]);
+			CopyVikingtoT55xx(c->arg[0], c->arg[1], c->arg[2]);
             break;
-
-    
 #endif
 
 #ifdef WITH_HITAG
@@ -1104,7 +1077,7 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			break;
 			
 		case CMD_READER_MIFARE:
-            ReaderMifare(c->arg[0]);
+            ReaderMifare(c->arg[0], c->arg[1]);
 			break;
 		case CMD_MIFARE_READBL:
 			MifareReadBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
@@ -1133,6 +1106,9 @@ void UsbPacketReceived(uint8_t *packet, int len)
 		case CMD_MIFAREU_WRITEBL:
 			MifareUWriteBlock(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
+		case CMD_MIFARE_ACQUIRE_ENCRYPTED_NONCES:
+			MifareAcquireEncryptedNonces(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+			break;
 		case CMD_MIFARE_NESTED:
 			MifareNested(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
 			break;
@@ -1162,10 +1138,10 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			
 		// Work with "magic Chinese" card
 		case CMD_MIFARE_CSETBLOCK:
-			MifareCSetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+			MifareCSetBlock(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
 		case CMD_MIFARE_CGETBLOCK:
-			MifareCGetBlock(c->arg[0], c->arg[1], c->arg[2], c->d.asBytes);
+			MifareCGetBlock(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
 		case CMD_MIFARE_CIDENT:
 			MifareCIdent();
@@ -1196,10 +1172,21 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			break;
 
 		case CMD_MIFARE_COLLECT_NONCES:
-			MifareCollectNonces(c->arg[0], c->arg[1]);
 			break;
 #endif
-
+#ifdef WITH_EMV
+		case CMD_EMV_TRANSACTION:
+			EMVTransaction();
+			break;
+        case CMD_EMV_GET_RANDOM_NUM:
+            //EMVgetUDOL();
+            break;
+        case CMD_EMV_LOAD_VALUE:
+            EMVloadvalue(c->arg[0], c->d.asBytes);  
+            break;
+        case CMD_EMV_DUMP_CARD:
+            EMVdumpcard();
+#endif
 #ifdef WITH_ICLASS
 		// Makes use of ISO14443a FPGA Firmware
 		case CMD_SNOOP_ICLASS:
@@ -1236,6 +1223,11 @@ void UsbPacketReceived(uint8_t *packet, int len)
 			iClass_Clone(c->arg[0], c->arg[1], c->d.asBytes);
 			break;
 #endif
+#ifdef WITH_HFSNOOP
+		case CMD_HF_SNIFFER:
+			HfSnoop(c->arg[0], c->arg[1]);
+			break;
+#endif
 
 		case CMD_BUFF_CLEAR:
 			BigBuf_Clear();
@@ -1372,7 +1364,7 @@ void  __attribute__((noreturn)) AppMain(void)
 	AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_PCK0;
 	// PCK0 is PLL clock / 4 = 96Mhz / 4 = 24Mhz
 	AT91C_BASE_PMC->PMC_PCKR[0] = AT91C_PMC_CSS_PLL_CLK |
-		AT91C_PMC_PRES_CLK_4;
+		AT91C_PMC_PRES_CLK_4; //  4 for 24Mhz pck0, 2 for 48 MHZ pck0
 	AT91C_BASE_PIOA->PIO_OER = GPIO_PCK0;
 
 	// Reset SPI
@@ -1396,9 +1388,8 @@ void  __attribute__((noreturn)) AppMain(void)
 	for(;;) {
 		if (usb_poll()) {
 			rx_len = usb_read(rx,sizeof(UsbCommand));
-			if (rx_len) {
+			if (rx_len)
 				UsbPacketReceived(rx,rx_len);
-			}
 		}
 		WDT_HIT();