- BYTE outBuf[20];
- memset(outBuf, 0, sizeof(outBuf));
- BYTE mask = 0x01;
- for(;;) {
- int corr0 = 0, corr1 = 0, corrEOF = 0;
- for(j = 0; j < arraylen(Logic0); j += skip) {
- corr0 += Logic0[j]*dest[i+(j/skip)];
- }
- for(j = 0; j < arraylen(Logic1); j += skip) {
- corr1 += Logic1[j]*dest[i+(j/skip)];
- }
- for(j = 0; j < arraylen(FrameEOF); j += skip) {
- corrEOF += FrameEOF[j]*dest[i+(j/skip)];
- }
- // Even things out by the length of the target waveform.
- corr0 *= 4;
- corr1 *= 4;
-
- if(corrEOF > corr1 && corrEOF > corr0) {
-// DbpString("EOF at %d", i);
- break;
- } else if(corr1 > corr0) {
- i += arraylen(Logic1)/skip;
- outBuf[k] |= mask;
- } else {
- i += arraylen(Logic0)/skip;
- }
- mask <<= 1;
- if(mask == 0) {
- k++;
- mask = 0x01;
- }
- if((i+(int)arraylen(FrameEOF)) >= 2000) {
- DbpString("ran off end!");
- break;
- }
- }
- if(mask != 0x01) {
- DbpString("error, uneven octet! (discard extra bits!)");
-/// DbpString(" mask=%02x", mask);
- }
-// BYTE str1 [8];
-// itoa(k,str1);
-// strcat(str1," octets read");
-
-// DbpString( str1); // DbpString("%d octets", k);
-
-// for(i = 0; i < k; i+=3) {
-// //DbpString("# %2d: %02x ", i, outBuf[i]);
-// DbpIntegers(outBuf[i],outBuf[i+1],outBuf[i+2]);
-// }
-
- for(i = 0; i < k; i++) {
- receivedResponse[i] = outBuf[i];
- }
- } // "end if correlation > 0" (max/(arraylen(FrameSOF)/skip))
- return k; // return the number of bytes demodulated
-
-/// DbpString("CRC=%04x", Iso15693Crc(outBuf, k-2));
-
-}
-
-// Now the GetISO15693 message from sniffing command
-static int GetIso15693AnswerFromSniff(BYTE *receivedResponse, int maxLen, int *samples, int *elapsed)
-{
- int c = 0;
- BYTE *dest = (BYTE *)BigBuf;
- int getNext = 0;
-
- SBYTE prev = 0;
-
-// NOW READ RESPONSE
- 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;
- for(;;) {
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
- AT91C_BASE_SSC->SSC_THR = 0x43;
- }
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
- SBYTE b;
- b = (SBYTE)AT91C_BASE_SSC->SSC_RHR;
-
- // The samples are correlations against I and Q versions of the
- // 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) {
- SBYTE r;
-
- if(b < 0) {
- r = -b;
- } else {
- r = b;
- }
- if(prev < 0) {
- r -= prev;
- } else {
- r += prev;
- }
-
- dest[c++] = (BYTE)r;
-
- if(c >= 20000) {
- break;
- }
- } else {
- prev = b;
- }
-
- getNext = !getNext;
- }
- }
-
-//////////////////////////////////////////
-/////////// DEMODULATE ///////////////////
-//////////////////////////////////////////
-
- int i, j;
- int max = 0, maxPos=0;
-
- int skip = 4;
-
-// if(GraphTraceLen < 1000) return; // THIS CHECKS FOR A BUFFER TO SMALL
-
- // First, correlate for SOF
- for(i = 0; i < 19000; i++) {
- int corr = 0;
- for(j = 0; j < arraylen(FrameSOF); j += skip) {
- corr += FrameSOF[j]*dest[i+(j/skip)];
- }
- if(corr > max) {
- max = corr;
- maxPos = i;
- }
- }
-// DbpString("SOF at %d, correlation %d", maxPos,max/(arraylen(FrameSOF)/skip));
-
- int k = 0; // this will be our return value
-
- // greg - If correlation is less than 1 then there's little point in continuing
- if ((max/(arraylen(FrameSOF)/skip)) >= 1) // THIS SHOULD BE 1
- {
-
- i = maxPos + arraylen(FrameSOF)/skip;
-
- BYTE outBuf[20];
- memset(outBuf, 0, sizeof(outBuf));
- BYTE mask = 0x01;
- for(;;) {
- int corr0 = 0, corr1 = 0, corrEOF = 0;
- for(j = 0; j < arraylen(Logic0); j += skip) {
- corr0 += Logic0[j]*dest[i+(j/skip)];
- }
- for(j = 0; j < arraylen(Logic1); j += skip) {
- corr1 += Logic1[j]*dest[i+(j/skip)];
- }
- for(j = 0; j < arraylen(FrameEOF); j += skip) {
- corrEOF += FrameEOF[j]*dest[i+(j/skip)];
- }
- // Even things out by the length of the target waveform.
- corr0 *= 4;
- corr1 *= 4;
-
- if(corrEOF > corr1 && corrEOF > corr0) {
-// DbpString("EOF at %d", i);
- break;
- } else if(corr1 > corr0) {
- i += arraylen(Logic1)/skip;
- outBuf[k] |= mask;
- } else {
- i += arraylen(Logic0)/skip;
- }
- mask <<= 1;
- if(mask == 0) {
- k++;
- mask = 0x01;
- }
- if((i+(int)arraylen(FrameEOF)) >= 2000) {
- DbpString("ran off end!");
- break;
- }
- }
- if(mask != 0x01) {
- DbpString("error, uneven octet! (discard extra bits!)");
-/// DbpString(" mask=%02x", mask);
- }
-// BYTE str1 [8];
-// itoa(k,str1);
-// strcat(str1," octets read");
-
-// DbpString( str1); // DbpString("%d octets", k);
-
-// for(i = 0; i < k; i+=3) {
-// //DbpString("# %2d: %02x ", i, outBuf[i]);
-// DbpIntegers(outBuf[i],outBuf[i+1],outBuf[i+2]);
-// }
-
- for(i = 0; i < k; i++) {
- receivedResponse[i] = outBuf[i];
- }
- } // "end if correlation > 0" (max/(arraylen(FrameSOF)/skip))
- return k; // return the number of bytes demodulated
-
-/// DbpString("CRC=%04x", Iso15693Crc(outBuf, k-2));
-}
-
-//-----------------------------------------------------------------------------
-// Start to read an ISO 15693 tag. We send an identify request, then wait
-// for the response. The response is not demodulated, just left in the buffer
-// so that it can be downloaded to a PC and processed there.
-//-----------------------------------------------------------------------------
-void AcquireRawAdcSamplesIso15693(void)
-{
- int c = 0;
- BYTE *dest = (BYTE *)BigBuf;
- int getNext = 0;
-
- SBYTE prev = 0;
-
- BuildIdentifyRequest();
-
- SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
-
- // Give the tags time to energize
- FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
- SpinDelay(100);
-
- // Now send the command
- FpgaSetupSsc();
- FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_TX);
-
- c = 0;
- for(;;) {
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
- AT91C_BASE_SSC->SSC_THR = ToSend[c];
- c++;
- if(c == ToSendMax+3) {
- break;
- }
- }
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
- volatile DWORD r = AT91C_BASE_SSC->SSC_RHR;
- (void)r;
- }
- WDT_HIT();
- }
-
- FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
-
- c = 0;
- getNext = FALSE;
- for(;;) {
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_TXRDY)) {
- AT91C_BASE_SSC->SSC_THR = 0x43;
- }
- if(AT91C_BASE_SSC->SSC_SR & (AT91C_SSC_RXRDY)) {
- SBYTE b;
- b = (SBYTE)AT91C_BASE_SSC->SSC_RHR;
-
- // The samples are correlations against I and Q versions of the
- // 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) {
- SBYTE r;
-
- if(b < 0) {
- r = -b;
- } else {
- r = b;
- }
- if(prev < 0) {
- r -= prev;
- } else {
- r += prev;
- }
-
- dest[c++] = (BYTE)r;
-
- if(c >= 2000) {
- break;
- }
- } else {
- prev = b;
- }
-
- getNext = !getNext;
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// 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(DWORD parameter)
-{
- LED_A_ON();
- LED_B_ON();
- LED_C_OFF();
- LED_D_OFF();
-
-//DbpString(parameter);
-
- //BYTE *answer0 = (((BYTE *)BigBuf) + 3560); // allow 100 bytes per reponse (way too much)
- BYTE *answer1 = (((BYTE *)BigBuf) + 3660); //
- BYTE *answer2 = (((BYTE *)BigBuf) + 3760);
- BYTE *answer3 = (((BYTE *)BigBuf) + 3860);
- //BYTE *TagUID= (((BYTE *)BigBuf) + 3960); // where we hold the uid for hi15reader
-// int answerLen0 = 0;
- int answerLen1 = 0;
- int answerLen2 = 0;
- int answerLen3 = 0;
-
- // Blank arrays
- memset(BigBuf + 3660, 0, 300);
-
- // Setup SSC
- FpgaSetupSsc();
-
- // Start from off (no field generated)
- FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
- SpinDelay(200);
-
- SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
- FpgaSetupSsc();
-
- // Give the tags time to energize
- FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR);
- SpinDelay(200);
-
- LED_A_ON();
- LED_B_OFF();
- LED_C_OFF();
- LED_D_OFF();
-
- int samples = 0;
- int tsamples = 0;
- int wait = 0;
- int elapsed = 0;
-
- // FIRST WE RUN AN INVENTORY TO GET THE TAG UID
- // THIS MEANS WE CAN PRE-BUILD REQUESTS TO SAVE CPU TIME
- BYTE TagUID[7]; // where we hold the uid for hi15reader
-
-// BuildIdentifyRequest();
-// //TransmitTo15693Tag(ToSend,ToSendMax+3,&tsamples, &wait);
-// TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait); // No longer ToSendMax+3
-// // Now wait for a response
-// responseLen0 = GetIso15693AnswerFromTag(receivedAnswer0, 100, &samples, &elapsed) ;
-// if (responseLen0 >=12) // we should do a better check than this
-// {
-// // really we should check it is a valid mesg
-// // but for now just grab what we think is the uid
-// TagUID[0] = receivedAnswer0[2];
-// TagUID[1] = receivedAnswer0[3];
-// TagUID[2] = receivedAnswer0[4];
-// TagUID[3] = receivedAnswer0[5];
-// TagUID[4] = receivedAnswer0[6];
-// TagUID[5] = receivedAnswer0[7];
-// TagUID[6] = receivedAnswer0[8]; // IC Manufacturer code
-// DbpIntegers(TagUID[6],TagUID[5],TagUID[4]);
-//}
-
- // Now send the IDENTIFY command
- BuildIdentifyRequest();
- //TransmitTo15693Tag(ToSend,ToSendMax+3,&tsamples, &wait);
- TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait); // No longer ToSendMax+3
- // Now wait for a response
- answerLen1 = GetIso15693AnswerFromTag(answer1, 100, &samples, &elapsed) ;
-
- if (answerLen1 >=12) // we should do a better check than this
- {
-
- TagUID[0] = answer1[2];
- TagUID[1] = answer1[3];
- TagUID[2] = answer1[4];
- TagUID[3] = answer1[5];
- TagUID[4] = answer1[6];
- TagUID[5] = answer1[7];
- TagUID[6] = answer1[8]; // IC Manufacturer code
-
- // Now send the SELECT command
- BuildSelectRequest(TagUID);
- TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait); // No longer ToSendMax+3
- // Now wait for a response
- answerLen2 = GetIso15693AnswerFromTag(answer2, 100, &samples, &elapsed);
-
- // Now send the MULTI READ command
-// BuildArbitraryRequest(*TagUID,parameter);
- BuildArbitraryCustomRequest(TagUID,parameter);
-// BuildReadBlockRequest(*TagUID,parameter);
-// BuildSysInfoRequest(*TagUID);
- //TransmitTo15693Tag(ToSend,ToSendMax+3,&tsamples, &wait);
- TransmitTo15693Tag(ToSend,ToSendMax,&tsamples, &wait); // No longer ToSendMax+3
- // Now wait for a response
- answerLen3 = GetIso15693AnswerFromTag(answer3, 100, &samples, &elapsed) ;
-
- }
-
- Dbprintf("%d octets read from IDENTIFY request: %x %x %x %x %x %x %x %x %x", answerLen1,
- answer1[0], answer1[1], answer1[2],
- answer1[3], answer1[4], answer1[5],
- answer1[6], answer1[7], answer1[8]);
-
- Dbprintf("%d octets read from SELECT request: %x %x %x %x %x %x %x %x %x", answerLen2,
- answer2[0], answer2[1], answer2[2],
- answer2[3], answer2[4], answer2[5],
- answer2[6], answer2[7], answer2[8]);
-
- Dbprintf("%d octets read from XXX request: %x %x %x %x %x %x %x %x %x", answerLen3,
- answer3[0], answer3[1], answer3[2],
- answer3[3], answer3[4], answer3[5],
- answer3[6], answer3[7], answer3[8]);
-
-
-// str2[0]=0;
-// for(i = 0; i < responseLen3; i++) {
-// itoa(str1,receivedAnswer3[i]);
-// strcat(str2,str1);
-// }
-// DbpString(str2);
-
- LED_A_OFF();
- LED_B_OFF();
- LED_C_OFF();
- LED_D_OFF();
-}
-
-//-----------------------------------------------------------------------------
-// Simulate an ISO15693 TAG, perform anti-collision and then print any reader commands
-// all demodulation performed in arm rather than host. - greg
-//-----------------------------------------------------------------------------
-void SimTagIso15693(DWORD parameter)
-{
- LED_A_ON();
- LED_B_ON();
- LED_C_OFF();
- LED_D_OFF();
-
- BYTE *answer1 = (((BYTE *)BigBuf) + 3660); //
- int answerLen1 = 0;
-
- // Blank arrays
- memset(answer1, 0, 100);
-
- // Setup SSC
- FpgaSetupSsc();
-
- // Start from off (no field generated)
- FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF);
- SpinDelay(200);
-
- SetAdcMuxFor(GPIO_MUXSEL_HIPKD);
- FpgaSetupSsc();
-
- // Give the tags time to energize
-// FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER_RX_XCORR); // NO GOOD FOR SIM TAG!!!!
- SpinDelay(200);
-
- LED_A_OFF();
- LED_B_OFF();
- LED_C_ON();
- LED_D_OFF();
-
- int samples = 0;
- int tsamples = 0;
- int wait = 0;
- int elapsed = 0;
-
- answerLen1 = GetIso15693AnswerFromSniff(answer1, 100, &samples, &elapsed) ;
-
- if (answerLen1 >=1) // we should do a better check than this
- {
- // Build a suitable reponse to the reader INVENTORY cocmmand
- BuildInventoryResponse();
- TransmitTo15693Reader(ToSend,ToSendMax, &tsamples, &wait);
- }
-
- Dbprintf("%d octets read from reader command: %x %x %x %x %x %x %x %x %x", answerLen1,
- answer1[0], answer1[1], answer1[2],
- answer1[3], answer1[4], answer1[5],
- answer1[6], answer1[7], answer1[8]);
-
- LED_A_OFF();
- LED_B_OFF();
- LED_C_OFF();
- LED_D_OFF();
-}