]> git.zerfleddert.de Git - proxmark3-svn/blobdiff - armsrc/iso15693.c
ADD: @icsom changes and additions to lua scripts for LEGIC
[proxmark3-svn] / armsrc / iso15693.c
index 5af6efb338b6744f23408f074b240e80ea02c82d..888f6aaf0709fdba641a79009bf3fa47291026b8 100644 (file)
 // *) document all the functions
 
 
 // *) document all the functions
 
 
-#include "../include/proxmark3.h"
+#include "proxmark3.h"
 #include "util.h"
 #include "apps.h"
 #include "string.h"
 #include "util.h"
 #include "apps.h"
 #include "string.h"
-#include "../common/iso15693tools.h"
-#include "../common/cmd.h"
-
+#include "iso15693tools.h"
+#include "cmd.h"
 
 #define arraylen(x) (sizeof(x)/sizeof((x)[0]))
 
 
 #define arraylen(x) (sizeof(x)/sizeof((x)[0]))
 
@@ -296,21 +295,19 @@ static void TransmitTo15693Reader(const uint8_t *cmd, int len, int *samples, int
 //             number of decoded bytes
 static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed)
 {
 //             number of decoded bytes
 static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed)
 {
-       int c = 0;
-       uint8_t *dest = (uint8_t *)BigBuf;
-       int getNext = 0;
+       uint8_t *dest = BigBuf_get_addr();
 
 
+       int c = 0;
+       int getNext = FALSE;
        int8_t prev = 0;
 
        int8_t prev = 0;
 
-// NOW READ RESPONSE
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
-       //spindelay(60);        // greg - experiment to get rid of some of the 0 byte/failed reads
-       c = 0;
-       getNext = FALSE;
+       SpinDelay(100); // greg - experiment to get rid of some of the 0 byte/failed reads
+
        for(;;) {
        for(;;) {
-               if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
+               if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))
                        AT91C_BASE_SSC->SSC_THR = 0x43;
                        AT91C_BASE_SSC->SSC_THR = 0x43;
-               }
+
                if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
                        int8_t b;
                        b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
                if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
                        int8_t b;
                        b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
@@ -322,11 +319,14 @@ static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *
                        if(getNext) {
                                int8_t r;
 
                        if(getNext) {
                                int8_t r;
 
-                               if(b < 0) {
-                                       r = -b;
-                               } else {
-                                       r = b;
-                               }
+                               r = ABS(b);
+                               
+                               // if(b < 0) {
+                                       // r = -b;
+                               // } else {
+                                       // r = b;
+                               // }
+                               // ABS(prev)
                                if(prev < 0) {
                                        r -= prev;
                                } else {
                                if(prev < 0) {
                                        r -= prev;
                                } else {
@@ -438,29 +438,26 @@ static int GetIso15693AnswerFromTag(uint8_t *receivedResponse, int maxLen, int *
        } // "end if correlation > 0"   (max/(arraylen(FrameSOF)/skip))
        return k; // return the number of bytes demodulated
 
        } // "end if correlation > 0"   (max/(arraylen(FrameSOF)/skip))
        return k; // return the number of bytes demodulated
 
-///    DbpString("CRC=%04x", Iso15693Crc(outBuf, k-2));
-
+//     DbpString("CRC=%04x", Iso15693Crc(outBuf, k-2));
 }
 
 
 // Now the GetISO15693 message from sniffing command
 static int GetIso15693AnswerFromSniff(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed)
 {
 }
 
 
 // Now the GetISO15693 message from sniffing command
 static int GetIso15693AnswerFromSniff(uint8_t *receivedResponse, int maxLen, int *samples, int *elapsed)
 {
-       int c = 0;
-       uint8_t *dest = (uint8_t *)BigBuf;
-       int getNext = 0;
+       uint8_t *dest = BigBuf_get_addr();
 
 
+       int c = 0;
+       int getNext = FALSE;
        int8_t prev = 0;
 
        int8_t prev = 0;
 
-    // NOW READ RESPONSE
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
-       //spindelay(60);        // greg - experiment to get rid of some of the 0 byte/failed reads
-       c = 0;
-       getNext = FALSE;
+       SpinDelay(100); // greg - experiment to get rid of some of the 0 byte/failed reads
+
        for(;;) {
        for(;;) {
-               if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
+               if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY))
                        AT91C_BASE_SSC->SSC_THR = 0x43;
                        AT91C_BASE_SSC->SSC_THR = 0x43;
-               }
+
                if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
                        int8_t b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
 
                if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
                        int8_t b = (int8_t)AT91C_BASE_SSC->SSC_RHR;
 
@@ -468,14 +465,15 @@ static int GetIso15693AnswerFromSniff(uint8_t *receivedResponse, int maxLen, int
                        // tone that the tag AM-modulates, so every other sample is I,
                        // every other is Q. We just want power, so abs(I) + abs(Q) is
                        // close to what we want.
                        // tone that the tag AM-modulates, so every other sample is I,
                        // every other is Q. We just want power, so abs(I) + abs(Q) is
                        // close to what we want.
-                       if (getNext) {
+                       if(getNext) {
                                int8_t r;
 
                                int8_t r;
 
-                               if(b < 0) {
-                                       r = -b;
-                               } else {
-                                       r = b;
-                               }
+                               r = ABS(b);
+                               // if(b < 0) {
+                                       // r = -b;
+                               // } else {
+                                       // r = b;
+                               // }
                                if(prev < 0) {
                                        r -= prev;
                                } else {
                                if(prev < 0) {
                                        r -= prev;
                                } else {
@@ -597,7 +595,7 @@ static void BuildIdentifyRequest(void);
 //-----------------------------------------------------------------------------
 void AcquireRawAdcSamplesIso15693(void)
 {
 //-----------------------------------------------------------------------------
 void AcquireRawAdcSamplesIso15693(void)
 {
-       uint8_t *dest = (uint8_t *)BigBuf;
+       uint8_t *dest = BigBuf_get_addr();
 
        int c = 0;
        int getNext = 0;
 
        int c = 0;
        int getNext = 0;
@@ -679,7 +677,7 @@ void AcquireRawAdcSamplesIso15693(void)
 
 void RecordRawAdcSamplesIso15693(void)
 {
 
 void RecordRawAdcSamplesIso15693(void)
 {
-       uint8_t *dest =  (uint8_t *)BigBuf;
+       uint8_t *dest = BigBuf_get_addr();
 
        int c = 0;
        int getNext = 0;
 
        int c = 0;
        int getNext = 0;
@@ -690,8 +688,8 @@ void RecordRawAdcSamplesIso15693(void)
        FpgaSetupSsc();
 
        // Start from off (no field generated)
        FpgaSetupSsc();
 
        // Start from off (no field generated)
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-       SpinDelay(200);
+       FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+       SpinDelay(200);
 
        SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
 
 
        SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
 
@@ -878,12 +876,12 @@ int SendDataTag(uint8_t *send, int sendlen, int init, int speed, uint8_t **recv)
        LED_C_OFF();
        LED_D_OFF();
        
        LED_C_OFF();
        LED_D_OFF();
        
+       if (init) Iso15693InitReader();
+
        int answerLen=0;
        int answerLen=0;
-       uint8_t *answer = (((uint8_t *)BigBuf) + 3660);
-       if (recv!=NULL) memset(BigBuf + 3660, 0, 100);
+       uint8_t *answer = BigBuf_get_addr() + 3660;
+       if (recv != NULL) memset(answer, 0, 100);
 
 
-       if (init) Iso15693InitReader();
-       
        if (!speed) {
                // low speed (1 out of 256)
                CodeIso15693AsReader256(send, sendlen);
        if (!speed) {
                // low speed (1 out of 256)
                CodeIso15693AsReader256(send, sendlen);
@@ -904,10 +902,7 @@ int SendDataTag(uint8_t *send, int sendlen, int init, int speed, uint8_t **recv)
                *recv=answer;
        }
 
                *recv=answer;
        }
 
-       LED_A_OFF();
-       LED_B_OFF();
-       LED_C_OFF();
-       LED_D_OFF();
+       LEDsoff();
        
        return answerLen;
 }
        
        return answerLen;
 }
@@ -993,17 +988,13 @@ void SetDebugIso15693(uint32_t debug) {
 // Simulate an ISO15693 reader, perform anti-collision and then attempt to read a sector
 // all demodulation performed in arm rather than host. - greg
 //-----------------------------------------------------------------------------
 // Simulate an ISO15693 reader, perform anti-collision and then attempt to read a sector
 // all demodulation performed in arm rather than host. - greg
 //-----------------------------------------------------------------------------
-void ReaderIso15693(uint32_t parameter )
+void ReaderIso15693(uint32_t parameter)
 {
        LED_A_ON();
        LED_B_ON();
        LED_C_OFF();
        LED_D_OFF();
 
 {
        LED_A_ON();
        LED_B_ON();
        LED_C_OFF();
        LED_D_OFF();
 
-       uint8_t *answer1 = (((uint8_t *)BigBuf) + 3660); //
-       uint8_t *answer2 = (((uint8_t *)BigBuf) + 3760);
-       uint8_t *answer3 = (((uint8_t *)BigBuf) + 3860);
-
        int answerLen1 = 0;
        int answerLen2 = 0;
        int answerLen3 = 0;
        int answerLen1 = 0;
        int answerLen2 = 0;
        int answerLen3 = 0;
@@ -1014,20 +1005,22 @@ void ReaderIso15693(uint32_t parameter )
        int elapsed = 0;
        uint8_t TagUID[8] = {0x00};
 
        int elapsed = 0;
        uint8_t TagUID[8] = {0x00};
 
-        
-       // Blank arrays
-       memset(BigBuf + 3660, 0x00, 300);
-
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
+       uint8_t *answer1 = BigBuf_get_addr() + 3660;
+       uint8_t *answer2 = BigBuf_get_addr() + 3760;
+       uint8_t *answer3 = BigBuf_get_addr() + 3860;
+       // Blank arrays
+       memset(answer1, 0x00, 300);
+
        SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
        // Setup SSC
        FpgaSetupSsc();
 
        // Start from off (no field generated)
        SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
        // Setup SSC
        FpgaSetupSsc();
 
        // Start from off (no field generated)
-       FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-       SpinDelay(200);
-       
+       FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
+       SpinDelay(200);
+
        // Give the tags time to energize
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
        SpinDelay(200);
        // Give the tags time to energize
        FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
        SpinDelay(200);
@@ -1066,7 +1059,7 @@ void ReaderIso15693(uint32_t parameter )
        Dbhexdump(answerLen1,answer1,true);
 
        // UID is reverse
        Dbhexdump(answerLen1,answer1,true);
 
        // UID is reverse
-       if (answerLen1 >= 12) 
+       if (answerLen1>=12) 
                Dbprintf("UID = %02hX%02hX%02hX%02hX%02hX%02hX%02hX%02hX",
                        TagUID[7],TagUID[6],TagUID[5],TagUID[4],
                        TagUID[3],TagUID[2],TagUID[1],TagUID[0]);
                Dbprintf("UID = %02hX%02hX%02hX%02hX%02hX%02hX%02hX%02hX",
                        TagUID[7],TagUID[6],TagUID[5],TagUID[4],
                        TagUID[3],TagUID[2],TagUID[1],TagUID[0]);
@@ -1080,14 +1073,14 @@ void ReaderIso15693(uint32_t parameter )
        DbdecodeIso15693Answer(answerLen3,answer3);
        Dbhexdump(answerLen3,answer3,true);
 
        DbdecodeIso15693Answer(answerLen3,answer3);
        Dbhexdump(answerLen3,answer3,true);
 
-       // read all pages
-       if (answerLen1 >= 12 && DEBUG) {
+       // read all pages
+       if (answerLen1>=12 && DEBUG) {
                i=0;                    
                i=0;                    
-               while (i < 32) {  // sanity check, assume max 32 pages
+               while (i<32) {  // sanity check, assume max 32 pages
                        BuildReadBlockRequest(TagUID,i);
                        BuildReadBlockRequest(TagUID,i);
-                       TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait);  
-                       answerLen2 = GetIso15693AnswerFromTag(answer2, 100, &samples, &elapsed);
-                       if (answerLen2 > 0) {
+             TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait);  
+         answerLen2 = GetIso15693AnswerFromTag(answer2, 100, &samples, &elapsed);
+                       if (answerLen2>0) {
                                Dbprintf("READ SINGLE BLOCK %d returned %d octets:",i,answerLen2);
                                DbdecodeIso15693Answer(answerLen2,answer2);
                                Dbhexdump(answerLen2,answer2,true);
                                Dbprintf("READ SINGLE BLOCK %d returned %d octets:",i,answerLen2);
                                DbdecodeIso15693Answer(answerLen2,answer2);
                                Dbhexdump(answerLen2,answer2,true);
@@ -1112,25 +1105,23 @@ void SimTagIso15693(uint32_t parameter, uint8_t *uid)
        LED_C_OFF();
        LED_D_OFF();
 
        LED_C_OFF();
        LED_D_OFF();
 
-       uint8_t *buf = (((uint8_t *)BigBuf) + 3660); //
-       
        int answerLen1 = 0;
        int samples = 0;
        int tsamples = 0;
        int wait = 0;
        int elapsed = 0;
        int answerLen1 = 0;
        int samples = 0;
        int tsamples = 0;
        int wait = 0;
        int elapsed = 0;
-       
-       memset(buf, 0x00, 100);
-       
+
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
        FpgaDownloadAndGo(FPGA_BITSTREAM_HF);
 
-       SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
+       uint8_t *buf = BigBuf_get_addr() + 3660;
+       memset(buf, 0x00, 100);
 
 
+       SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
        FpgaSetupSsc();
 
        // Start from off (no field generated)
     FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
        FpgaSetupSsc();
 
        // Start from off (no field generated)
     FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
-    SpinDelay(200);
+       SpinDelay(200);
 
        LED_A_OFF();
        LED_B_OFF();
 
        LED_A_OFF();
        LED_B_OFF();
@@ -1147,7 +1138,7 @@ void SimTagIso15693(uint32_t parameter, uint8_t *uid)
                
                BuildInventoryResponse(uid);
        
                
                BuildInventoryResponse(uid);
        
-               TransmitTo15693Reader(ToSend, ToSendMax, &tsamples, &wait);
+               TransmitTo15693Reader(ToSend,ToSendMax, &tsamples, &wait);
        }
 
        Dbprintf("%d octets read from reader command: %x %x %x %x %x %x %x %x %x", answerLen1,
        }
 
        Dbprintf("%d octets read from reader command: %x %x %x %x %x %x %x %x %x", answerLen1,
@@ -1214,7 +1205,7 @@ void BruteforceIso15693Afi(uint32_t speed)
 void DirectTag15693Command(uint32_t datalen,uint32_t speed, uint32_t recv, uint8_t data[]) {
 
        int recvlen=0;
 void DirectTag15693Command(uint32_t datalen,uint32_t speed, uint32_t recv, uint8_t data[]) {
 
        int recvlen=0;
-       uint8_t *recvbuf=(uint8_t *)BigBuf;
+       uint8_t *recvbuf = BigBuf_get_addr();
 //     UsbCommand n;
        
        if (DEBUG) {
 //     UsbCommand n;
        
        if (DEBUG) {
Impressum, Datenschutz