X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/proxmark3-svn/blobdiff_plain/d8af608f8e4e6dc520045bac69e8e9dac6de7d42..0db6ed9a7177295a48e8595066a56808bf4b939f:/armsrc/iso14443b.c

diff --git a/armsrc/iso14443b.c b/armsrc/iso14443b.c
index 2bdce7cb..0ea66a8d 100644
--- a/armsrc/iso14443b.c
+++ b/armsrc/iso14443b.c
@@ -13,13 +13,12 @@
 #include "apps.h"
 #include "util.h"
 #include "string.h"
-
 #include "iso14443crc.h"
-
-#define RECEIVE_SAMPLES_TIMEOUT 0x0004FFFF
+#include "common.h"
+#define RECEIVE_SAMPLES_TIMEOUT 600000
 #define ISO14443B_DMA_BUFFER_SIZE 256
 
-uint8_t PowerOn = TRUE;
+
 // PCB Block number for APDUs
 static uint8_t pcb_blocknum = 0;
 
@@ -270,6 +269,7 @@ static void UartReset()
 	Uart.state = STATE_UNSYNCD;
 	Uart.byteCnt = 0;
 	Uart.bitCnt = 0;
+	Uart.posCnt = 0;
 	memset(Uart.output, 0x00, MAX_FRAME_SIZE);
 }
 
@@ -525,9 +525,14 @@ static struct {
  *          false if we are still waiting for some more
  *
  */
+ #define abs(x) ( ((x)<0) ? -(x) : (x) )
 static RAMFUNC int Handle14443bSamplesDemod(int ci, int cq)
 {
-	int v;
+	int v = 0;
+	int ai = abs(ci);
+	int aq = abs(cq);
+	int halfci = (ai >> 1);
+	int halfcq = (aq >> 1);
 
 // The soft decision on the bit uses an estimate of just the
 // quadrant of the reference angle, not the exact angle.
@@ -546,50 +551,12 @@ static RAMFUNC int Handle14443bSamplesDemod(int ci, int cq)
 
 #define SUBCARRIER_DETECT_THRESHOLD	8
 
-// Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by abs(ci) + abs(cq)
-/* #define CHECK_FOR_SUBCARRIER() { \
-		v = ci; \
-		if(v < 0) v = -v; \
-		if(cq > 0) { \
-			v += cq; \
-		} else { \
-			v -= cq; \
-		} \
-	}		
- */
 // Subcarrier amplitude v = sqrt(ci^2 + cq^2), approximated here by max(abs(ci),abs(cq)) + 1/2*min(abs(ci),abs(cq)))
 #define CHECK_FOR_SUBCARRIER() { \
-		if(ci < 0) { \
-			if(cq < 0) { /* ci < 0, cq < 0 */ \
-				if (cq < ci) { \
-					v = -cq - (ci >> 1); \
-				} else { \
-					v = -ci - (cq >> 1); \
-				} \
-			} else {	/* ci < 0, cq >= 0 */ \
-				if (cq < -ci) { \
-					v = -ci + (cq >> 1); \
-				} else { \
-					v = cq - (ci >> 1); \
-				} \
-			} \
-		} else { \
-			if(cq < 0) { /* ci >= 0, cq < 0 */ \
-				if (-cq < ci) { \
-					v = ci - (cq >> 1); \
-				} else { \
-					v = -cq + (ci >> 1); \
-				} \
-			} else {	/* ci >= 0, cq >= 0 */ \
-				if (cq < ci) { \
-					v = ci + (cq >> 1); \
-				} else { \
-					v = cq + (ci >> 1); \
-				} \
-			} \
-		} \
-	}
-	
+		v = MAX(ai, aq) + MIN(halfci, halfcq); \
+}
+
+
 	switch(Demod.state) {
 		case DEMOD_UNSYNCD:
 			CHECK_FOR_SUBCARRIER();
@@ -602,7 +569,8 @@ static RAMFUNC int Handle14443bSamplesDemod(int ci, int cq)
 			break;
 
 		case DEMOD_PHASE_REF_TRAINING:
-			if(Demod.posCount < 10*2) {
+			if(Demod.posCount < 8) {
+			//if(Demod.posCount < 10*2) {
 				CHECK_FOR_SUBCARRIER();
 				if (v > SUBCARRIER_DETECT_THRESHOLD) {
 					// set the reference phase (will code a logic '1') by averaging over 32 1/fs.
@@ -620,11 +588,11 @@ static RAMFUNC int Handle14443bSamplesDemod(int ci, int cq)
 
 		case DEMOD_AWAITING_FALLING_EDGE_OF_SOF:
 			MAKE_SOFT_DECISION();
-			if(v < 0) {	// logic '0' detected
+			//Dbprintf("ICE: %d %d %d %d %d", v, Demod.sumI, Demod.sumQ, ci, cq );
+			if(v <= 0) {	// logic '0' detected
 				Demod.state = DEMOD_GOT_FALLING_EDGE_OF_SOF;
 				Demod.posCount = 0;	// start of SOF sequence
 			} else {
-				//if(Demod.posCount > 200/4) {	// maximum length of TR1 = 200 1/fs
 				if(Demod.posCount > 25*2) {	// maximum length of TR1 = 200 1/fs
 					Demod.state = DEMOD_UNSYNCD;
 				}
@@ -731,6 +699,11 @@ static void DemodReset()
 	Demod.len = 0;
 	Demod.state = DEMOD_UNSYNCD;
 	Demod.posCount = 0;
+	Demod.sumI = 0;
+	Demod.sumQ = 0;
+	Demod.bitCount = 0;
+	Demod.thisBit = 0;
+	Demod.shiftReg = 0;
 	memset(Demod.output, 0x00, MAX_FRAME_SIZE);
 }
 
@@ -760,25 +733,20 @@ static void GetSamplesFor14443bDemod(int n, bool quiet)
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR | FPGA_HF_READER_RX_XCORR_848_KHZ);
 
 	// The response (tag -> reader) that we're receiving.
-	uint8_t *resp = BigBuf_malloc(MAX_FRAME_SIZE);
-
 	// Set up the demodulator for tag -> reader responses.
-	DemodInit(resp);
+	DemodInit(BigBuf_malloc(MAX_FRAME_SIZE));
 	
 	// The DMA buffer, used to stream samples from the FPGA
 	int8_t *dmaBuf = (int8_t*) BigBuf_malloc(ISO14443B_DMA_BUFFER_SIZE);
 
-
+	// Setup and start DMA.
+	FpgaSetupSscDma((uint8_t*) dmaBuf, ISO14443B_DMA_BUFFER_SIZE);
+	
 	int8_t *upTo = dmaBuf;
 	lastRxCounter = ISO14443B_DMA_BUFFER_SIZE;
 
 	// Signal field is ON with the appropriate LED:
 	LED_D_ON();
-
-	// Setup and start DMA.
-	FpgaSetupSscDma((uint8_t*) dmaBuf, ISO14443B_DMA_BUFFER_SIZE);
-
-	
 	for(;;) {
 		int behindBy = lastRxCounter - AT91C_BASE_PDC_SSC->PDC_RCR;
 		if(behindBy > max) max = behindBy;
@@ -794,16 +762,16 @@ static void GetSamplesFor14443bDemod(int n, bool quiet)
 			}
 			lastRxCounter -= 2;
 			if(lastRxCounter <= 0) {
-				lastRxCounter += ISO14443B_DMA_BUFFER_SIZE;
+				lastRxCounter = ISO14443B_DMA_BUFFER_SIZE;
 			}
 
 			samples += 2;
 
-			if(Handle14443bSamplesDemod(ci | 0x01 , cq | 0x01)) {
-				gotFrame = TRUE;
+			//
+			gotFrame = Handle14443bSamplesDemod(ci , cq );
+			if ( gotFrame )
 				break;
 		}
-	}
 
 		if(samples > n || gotFrame) {
 			break;
@@ -839,9 +807,6 @@ static void TransmitFor14443b(void)
 	int c;
 
 	FpgaSetupSsc();
-
-	// Start the timer
-	StartCountSspClk();
 	
 	while(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
 		AT91C_BASE_SSC->SSC_THR = 0xff;
@@ -852,8 +817,6 @@ static void TransmitFor14443b(void)
 	// Signal we are transmitting with the Green LED
 	LED_B_ON();
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX | FPGA_HF_READER_TX_SHALLOW_MOD);
-	if ( !PowerOn )
-		SpinDelay(200);
 	
 	for(c = 0; c < 10;) {
 		if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
@@ -898,7 +861,7 @@ static void CodeIso14443bAsReader(const uint8_t *cmd, int len)
 	ToSendReset();
 
 	// Establish initial reference level
-	for(i = 0; i < 80; i++) {
+	for(i = 0; i < 40; i++) {
 		ToSendStuffBit(1);
 	}
 	// Send SOF
@@ -1032,7 +995,9 @@ int iso14443b_select_card()
 
 // Set up ISO 14443 Type B communication (similar to iso14443a_setup)
 void iso14443b_setup() {
+
 	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
+
 	BigBuf_free();
 	// Set up the synchronous serial port
 	FpgaSetupSsc();
@@ -1042,9 +1007,11 @@ void iso14443b_setup() {
 	// Signal field is on with the appropriate LED
     LED_D_ON();
 	FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX | FPGA_HF_READER_TX_SHALLOW_MOD);
+	
+	//SpinDelay(100);
 
 	// Start the timer
-	StartCountSspClk();
+	//StartCountSspClk();
 
 	DemodReset();
 	UartReset();
@@ -1308,7 +1275,7 @@ void RAMFUNC SnoopIso14443b(void)
 
 		if(!ReaderIsActive) {						// no need to try decoding tag data if the reader is sending - and we cannot afford the time
 			// is this | 0x01 the error?   & 0xfe  in https://github.com/Proxmark/proxmark3/issues/103
-			if(Handle14443bSamplesDemod(ci | 0x01, cq | 0x01)) {
+			if(Handle14443bSamplesDemod(ci & 0xfe, cq & 0xfe)) {
 
 			//Use samples as a time measurement
 			if(tracing)
@@ -1353,22 +1320,10 @@ void RAMFUNC SnoopIso14443b(void)
 void SendRawCommand14443B(uint32_t datalen, uint32_t recv, uint8_t powerfield, uint8_t data[])
 {
 	iso14443b_setup();
-	FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
-	BigBuf_free();
-	if ( !PowerOn ){
-		FpgaSetupSsc();
-	}
-	SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
-	
-	// Start the timer
-	StartCountSspClk();
-
-	DemodReset();
-	UartReset();
 	
 	if ( datalen == 0 && recv == 0 && powerfield == 0){
-		clear_trace();
-	} else {
+		
+	} else {		
 		set_tracing(TRUE);
 		CodeAndTransmit14443bAsReader(data, datalen);
 	}
@@ -1383,7 +1338,6 @@ void SendRawCommand14443B(uint32_t datalen, uint32_t recv, uint8_t powerfield, u
 		FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
 		FpgaDisableSscDma();
 		LED_D_OFF();
-		PowerOn = 0;
 	}
 }