1 //----------------------------------------------------------------------------- 
   2 // Jonathan Westhues, split Nov 2006 
   3 // Modified by Greg Jones, Jan 2009 
   4 // Modified by Adrian Dabrowski "atrox", Mar-Sept 2010,Oct 2011 
   5 // Modified by piwi, Oct 2018 
   7 // This code is licensed to you under the terms of the GNU GPL, version 2 or, 
   8 // at your option, any later version. See the LICENSE.txt file for the text of 
  10 //----------------------------------------------------------------------------- 
  11 // Routines to support ISO 15693. This includes both the reader software and 
  12 // the `fake tag' modes. 
  13 //----------------------------------------------------------------------------- 
  15 // The ISO 15693 describes two transmission modes from reader to tag, and four 
  16 // transmission modes from tag to reader. As of Oct 2018 this code supports 
  17 // both reader modes and the high speed variant with one subcarrier from card to reader. 
  18 // As long as the card fully support ISO 15693 this is no problem, since the 
  19 // reader chooses both data rates, but some non-standard tags do not. 
  20 // For card simulation, the code supports both high and low speed modes with one subcarrier. 
  22 // VCD (reader) -> VICC (tag) 
  24 //  data rate: 1,66 kbit/s (fc/8192) 
  25 //  used for long range 
  27 //  data rate: 26,48 kbit/s (fc/512) 
  28 //  used for short range, high speed 
  30 // VICC (tag) -> VCD (reader) 
  32 //      ASK / one subcarrier (423,75 khz) 
  33 //      FSK / two subcarriers (423,75 khz && 484,28 khz) 
  34 // Data Rates / Modes: 
  35 //  low ASK: 6,62 kbit/s 
  36 //  low FSK: 6.67 kbit/s 
  37 //  high ASK: 26,48 kbit/s 
  38 //  high FSK: 26,69 kbit/s 
  39 //----------------------------------------------------------------------------- 
  43 // *) UID is always used "transmission order" (LSB), which is reverse to display order 
  45 // TODO / BUGS / ISSUES: 
  46 // *) signal decoding is unable to detect collisions. 
  47 // *) add anti-collision support for inventory-commands 
  48 // *) read security status of a block 
  49 // *) sniffing and simulation do not support two subcarrier modes. 
  50 // *) remove or refactor code under "deprecated" 
  51 // *) document all the functions 
  55 #include "proxmark3.h" 
  59 #include "iso15693tools.h" 
  60 #include "protocols.h" 
  63 #include "fpgaloader.h" 
  65 #define arraylen(x) (sizeof(x)/sizeof((x)[0])) 
  69 /////////////////////////////////////////////////////////////////////// 
  70 // ISO 15693 Part 2 - Air Interface 
  71 // This section basically contains transmission and receiving of bits 
  72 /////////////////////////////////////////////////////////////////////// 
  75 #define ISO15693_DMA_BUFFER_SIZE       2048 // must be a power of 2 
  76 #define ISO15693_MAX_RESPONSE_LENGTH     36 // allows read single block with the maximum block size of 256bits. Read multiple blocks not supported yet 
  77 #define ISO15693_MAX_COMMAND_LENGTH      45 // allows write single block with the maximum block size of 256bits. Write multiple blocks not supported yet 
  79 // --------------------------- 
  81 // --------------------------- 
  83 // prepare data using "1 out of 4" code for later transmission 
  84 // resulting data rate is 26.48 kbit/s (fc/512) 
  86 // n ... length of data 
  87 static void CodeIso15693AsReader(uint8_t *cmd
, int n
) 
  93         // Give it a bit of slack at the beginning 
  94         for(i 
= 0; i 
< 24; i
++) { 
 107         for(i 
= 0; i 
< n
; i
++) { 
 108                 for(j 
= 0; j 
< 8; j 
+= 2) { 
 109                         int these 
= (cmd
[i
] >> j
) & 3; 
 160         // Fill remainder of last byte with 1 
 161         for(i 
= 0; i 
< 4; i
++) { 
 168 // encode data using "1 out of 256" scheme 
 169 // data rate is 1,66 kbit/s (fc/8192) 
 170 // is designed for more robust communication over longer distances 
 171 static void CodeIso15693AsReader256(uint8_t *cmd
, int n
) 
 177         // Give it a bit of slack at the beginning 
 178         for(i 
= 0; i 
< 24; i
++) { 
 192         for(i 
= 0; i 
< n
; i
++) { 
 193                 for (j 
= 0; j
<=255; j
++) { 
 209         // Fill remainder of last byte with 1 
 210         for(i 
= 0; i 
< 4; i
++) { 
 218 // static uint8_t encode4Bits(const uint8_t b) { 
 219         // uint8_t c = b & 0xF; 
 220         // // OTA, the least significant bits first 
 221         // //         The columns are 
 222         // //               1 - Bit value to send 
 223         // //               2 - Reversed (big-endian) 
 224         // //               3 - Manchester Encoded 
 229           // case 15: return 0x55; // 1111 -> 1111 -> 01010101 -> 0x55 
 230           // case 14: return 0x95; // 1110 -> 0111 -> 10010101 -> 0x95 
 231           // case 13: return 0x65; // 1101 -> 1011 -> 01100101 -> 0x65 
 232           // case 12: return 0xa5; // 1100 -> 0011 -> 10100101 -> 0xa5 
 233           // case 11: return 0x59; // 1011 -> 1101 -> 01011001 -> 0x59 
 234           // case 10: return 0x99; // 1010 -> 0101 -> 10011001 -> 0x99 
 235           // case 9:  return 0x69; // 1001 -> 1001 -> 01101001 -> 0x69 
 236           // case 8:  return 0xa9; // 1000 -> 0001 -> 10101001 -> 0xa9 
 237           // case 7:  return 0x56; // 0111 -> 1110 -> 01010110 -> 0x56 
 238           // case 6:  return 0x96; // 0110 -> 0110 -> 10010110 -> 0x96 
 239           // case 5:  return 0x66; // 0101 -> 1010 -> 01100110 -> 0x66 
 240           // case 4:  return 0xa6; // 0100 -> 0010 -> 10100110 -> 0xa6 
 241           // case 3:  return 0x5a; // 0011 -> 1100 -> 01011010 -> 0x5a 
 242           // case 2:  return 0x9a; // 0010 -> 0100 -> 10011010 -> 0x9a 
 243           // case 1:  return 0x6a; // 0001 -> 1000 -> 01101010 -> 0x6a 
 244           // default: return 0xaa; // 0000 -> 0000 -> 10101010 -> 0xaa 
 249 static const uint8_t encode_4bits
[16] = { 0xaa, 0x6a, 0x9a, 0x5a, 0xa6, 0x66, 0x96, 0x56, 0xa9, 0x69, 0x99, 0x59, 0xa5, 0x65, 0x95, 0x55 }; 
 251 void CodeIso15693AsTag(uint8_t *cmd
, size_t len
) { 
 253          * SOF comprises 3 parts; 
 254          * * An unmodulated time of 56.64 us 
 255          * * 24 pulses of 423.75 kHz (fc/32) 
 256          * * A logic 1, which starts with an unmodulated time of 18.88us 
 257          *   followed by 8 pulses of 423.75kHz (fc/32) 
 259          * EOF comprises 3 parts: 
 260          * - A logic 0 (which starts with 8 pulses of fc/32 followed by an unmodulated 
 262          * - 24 pulses of fc/32 
 263          * - An unmodulated time of 56.64 us 
 265          * A logic 0 starts with 8 pulses of fc/32 
 266          * followed by an unmodulated time of 256/fc (~18,88us). 
 268          * A logic 0 starts with unmodulated time of 256/fc (~18,88us) followed by 
 269          * 8 pulses of fc/32 (also 18.88us) 
 271          * A bit here becomes 8 pulses of fc/32. Therefore: 
 272          * The SOF can be written as 00011101 = 0x1D 
 273          * The EOF can be written as 10111000 = 0xb8 
 282         ToSend
[++ToSendMax
] = 0x1D;  // 00011101 
 285         for (int i 
= 0; i 
< len
; i
++) { 
 286                 ToSend
[++ToSendMax
] = encode_4bits
[cmd
[i
] & 0xF]; 
 287                 ToSend
[++ToSendMax
] = encode_4bits
[cmd
[i
] >> 4]; 
 291         ToSend
[++ToSendMax
] = 0xB8; // 10111000 
 297 // Transmit the command (to the tag) that was placed in cmd[]. 
 298 static void TransmitTo15693Tag(const uint8_t *cmd
, int len
, uint32_t start_time
) 
 300         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_MODE_SEND_FULL_MOD
); 
 301         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
 303         while (GetCountSspClk() < start_time
) ; 
 306         for(int c 
= 0; c 
< len
; c
++) { 
 307                 uint8_t data 
= cmd
[c
]; 
 308                 for (int i 
= 0; i 
< 8; i
++) { 
 309                         uint16_t send_word 
= (data 
& 0x80) ? 0x0000 : 0xffff; 
 310                         while (!(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
))) ; 
 311                         AT91C_BASE_SSC
->SSC_THR 
= send_word
; 
 312                         while (!(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_TXRDY
))) ; 
 313                         AT91C_BASE_SSC
->SSC_THR 
= send_word
; 
 322 //----------------------------------------------------------------------------- 
 323 // Transmit the tag response (to the reader) that was placed in cmd[]. 
 324 //----------------------------------------------------------------------------- 
 325 void TransmitTo15693Reader(const uint8_t *cmd
, size_t len
, uint32_t *start_time
, uint32_t slot_time
, bool slow
) { 
 326         // don't use the FPGA_HF_SIMULATOR_MODULATE_424K_8BIT minor mode. It would spoil GetCountSspClk() 
 327         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_MODULATE_424K
); 
 329         uint32_t modulation_start_time 
= *start_time 
+ 3 * 8;  // no need to transfer the unmodulated start of SOF 
 331         while (GetCountSspClk() > (modulation_start_time 
& 0xfffffff8) + 3) { // we will miss the intended time 
 333                         modulation_start_time 
+= slot_time
; // use next available slot 
 335                         modulation_start_time 
= (modulation_start_time 
& 0xfffffff8) + 8; // next possible time 
 339         while (GetCountSspClk() < (modulation_start_time 
& 0xfffffff8))  
 342         uint8_t shift_delay 
= modulation_start_time 
& 0x00000007; 
 344         *start_time 
= modulation_start_time 
- 3 * 8; 
 347         uint8_t bits_to_shift 
= 0x00; 
 348         uint8_t bits_to_send 
= 0x00; 
 349         for (size_t c 
= 0; c 
< len
; c
++) { 
 350                 for (int i 
= (c
==0?4:7); i 
>= 0; i
--) { 
 351                         uint8_t cmd_bits 
= ((cmd
[c
] >> i
) & 0x01) ? 0xff : 0x00; 
 352                         for (int j 
= 0; j 
< (slow
?4:1); ) { 
 353                                 if (AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXRDY
) { 
 354                                         bits_to_send 
= bits_to_shift 
<< (8 - shift_delay
) | cmd_bits 
>> shift_delay
; 
 355                                         AT91C_BASE_SSC
->SSC_THR 
= bits_to_send
; 
 356                                         bits_to_shift 
= cmd_bits
; 
 363         // send the remaining bits, padded with 0: 
 364         bits_to_send 
= bits_to_shift 
<< (8 - shift_delay
); 
 366                 if (AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXRDY
) { 
 367                         AT91C_BASE_SSC
->SSC_THR 
= bits_to_send
; 
 375 //============================================================================= 
 376 // An ISO 15693 decoder for tag responses (one subcarrier only). 
 377 // Uses cross correlation to identify each bit and EOF. 
 378 // This function is called 8 times per bit (every 2 subcarrier cycles). 
 379 // Subcarrier frequency fs is 424kHz, 1/fs = 2,36us, 
 380 // i.e. function is called every 4,72us 
 382 //    LED C -> ON once we have received the SOF and are expecting the rest. 
 383 //    LED C -> OFF once we have received EOF or are unsynced 
 385 // Returns: true if we received a EOF 
 386 //          false if we are still waiting for some more 
 387 //============================================================================= 
 389 #define NOISE_THRESHOLD    160      // don't try to correlate noise 
 391 typedef struct DecodeTag 
{ 
 395                 STATE_TAG_SOF_HIGH_END
, 
 396                 STATE_TAG_RECEIVING_DATA
, 
 415 static int inline __attribute__((always_inline
)) Handle15693SamplesFromTag(uint16_t amplitude
, DecodeTag_t 
*DecodeTag
) 
 417         switch(DecodeTag
->state
) { 
 418                 case STATE_TAG_SOF_LOW
: 
 419                         // waiting for 12 times low (11 times low is accepted as well) 
 420                         if (amplitude 
< NOISE_THRESHOLD
) { 
 421                                 DecodeTag
->posCount
++; 
 423                                 if (DecodeTag
->posCount 
> 10) { 
 424                                         DecodeTag
->posCount 
= 1; 
 426                                         DecodeTag
->state 
= STATE_TAG_SOF_HIGH
; 
 428                                         DecodeTag
->posCount 
= 0; 
 433                 case STATE_TAG_SOF_HIGH
: 
 434                         // waiting for 10 times high. Take average over the last 8 
 435                         if (amplitude 
> NOISE_THRESHOLD
) { 
 436                                 DecodeTag
->posCount
++; 
 437                                 if (DecodeTag
->posCount 
> 2) { 
 438                                         DecodeTag
->sum1 
+= amplitude
; // keep track of average high value 
 440                                 if (DecodeTag
->posCount 
== 10) { 
 441                                         DecodeTag
->sum1 
>>= 4;        // calculate half of average high value (8 samples) 
 442                                         DecodeTag
->state 
= STATE_TAG_SOF_HIGH_END
; 
 444                         } else { // high phase was too short 
 445                                 DecodeTag
->posCount 
= 1; 
 446                                 DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 450                 case STATE_TAG_SOF_HIGH_END
: 
 451                         // waiting for a falling edge 
 452                         if (amplitude 
< DecodeTag
->sum1
) {   // signal drops below 50% average high: a falling edge 
 453                                 DecodeTag
->lastBit 
= SOF_PART1
;  // detected 1st part of SOF (12 samples low and 12 samples high) 
 454                                 DecodeTag
->shiftReg 
= 0; 
 455                                 DecodeTag
->bitCount 
= 0; 
 457                                 DecodeTag
->sum1 
= amplitude
; 
 459                                 DecodeTag
->posCount 
= 2; 
 460                                 DecodeTag
->state 
= STATE_TAG_RECEIVING_DATA
; 
 463                                 DecodeTag
->posCount
++; 
 464                                 if (DecodeTag
->posCount 
> 13) { // high phase too long 
 465                                         DecodeTag
->posCount 
= 0; 
 466                                         DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 472                 case STATE_TAG_RECEIVING_DATA
: 
 473                         if (DecodeTag
->posCount 
== 1) { 
 477                         if (DecodeTag
->posCount 
<= 4) { 
 478                                 DecodeTag
->sum1 
+= amplitude
; 
 480                                 DecodeTag
->sum2 
+= amplitude
; 
 482                         if (DecodeTag
->posCount 
== 8) { 
 483                                 int32_t corr_1 
= DecodeTag
->sum2 
- DecodeTag
->sum1
; 
 484                                 int32_t corr_0 
= -corr_1
; 
 485                                 int32_t corr_EOF 
= (DecodeTag
->sum1 
+ DecodeTag
->sum2
) / 2; 
 486                                 if (corr_EOF 
> corr_0 
&& corr_EOF 
> corr_1
) { 
 487                                         if (DecodeTag
->lastBit 
== LOGIC0
) {  // this was already part of EOF 
 488                                                 DecodeTag
->state 
= STATE_TAG_EOF
; 
 490                                                 DecodeTag
->posCount 
= 0; 
 491                                                 DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 494                                 } else if (corr_1 
> corr_0
) { 
 496                                         if (DecodeTag
->lastBit 
== SOF_PART1
) { // still part of SOF 
 497                                                 DecodeTag
->lastBit 
= SOF_PART2
;    // SOF completed 
 499                                                 DecodeTag
->lastBit 
= LOGIC1
; 
 500                                                 DecodeTag
->shiftReg 
>>= 1; 
 501                                                 DecodeTag
->shiftReg 
|= 0x80; 
 502                                                 DecodeTag
->bitCount
++; 
 503                                                 if (DecodeTag
->bitCount 
== 8) { 
 504                                                         DecodeTag
->output
[DecodeTag
->len
] = DecodeTag
->shiftReg
; 
 506                                                         if (DecodeTag
->len 
> DecodeTag
->max_len
) { 
 507                                                                 // buffer overflow, give up 
 508                                                                 DecodeTag
->posCount 
= 0; 
 509                                                                 DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 512                                                         DecodeTag
->bitCount 
= 0; 
 513                                                         DecodeTag
->shiftReg 
= 0; 
 518                                         if (DecodeTag
->lastBit 
== SOF_PART1
) { // incomplete SOF 
 519                                                 DecodeTag
->posCount 
= 0; 
 520                                                 DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 523                                                 DecodeTag
->lastBit 
= LOGIC0
; 
 524                                                 DecodeTag
->shiftReg 
>>= 1; 
 525                                                 DecodeTag
->bitCount
++; 
 526                                                 if (DecodeTag
->bitCount 
== 8) { 
 527                                                         DecodeTag
->output
[DecodeTag
->len
] = DecodeTag
->shiftReg
; 
 529                                                         if (DecodeTag
->len 
> DecodeTag
->max_len
) { 
 530                                                                 // buffer overflow, give up 
 531                                                                 DecodeTag
->posCount 
= 0; 
 532                                                                 DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 535                                                         DecodeTag
->bitCount 
= 0; 
 536                                                         DecodeTag
->shiftReg 
= 0; 
 540                                 DecodeTag
->posCount 
= 0; 
 542                         DecodeTag
->posCount
++; 
 546                         if (DecodeTag
->posCount 
== 1) { 
 550                         if (DecodeTag
->posCount 
<= 4) { 
 551                                 DecodeTag
->sum1 
+= amplitude
; 
 553                                 DecodeTag
->sum2 
+= amplitude
; 
 555                         if (DecodeTag
->posCount 
== 8) { 
 556                                 int32_t corr_1 
= DecodeTag
->sum2 
- DecodeTag
->sum1
; 
 557                                 int32_t corr_0 
= -corr_1
; 
 558                                 int32_t corr_EOF 
= (DecodeTag
->sum1 
+ DecodeTag
->sum2
) / 2; 
 559                                 if (corr_EOF 
> corr_0 
|| corr_1 
> corr_0
) { 
 560                                         DecodeTag
->posCount 
= 0; 
 561                                         DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 568                         DecodeTag
->posCount
++; 
 577 static void DecodeTagInit(DecodeTag_t 
*DecodeTag
, uint8_t *data
, uint16_t max_len
) 
 579         DecodeTag
->posCount 
= 0; 
 580         DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 581         DecodeTag
->output 
= data
; 
 582         DecodeTag
->max_len 
= max_len
; 
 586 static void DecodeTagReset(DecodeTag_t 
*DecodeTag
) 
 588         DecodeTag
->posCount 
= 0; 
 589         DecodeTag
->state 
= STATE_TAG_SOF_LOW
; 
 594  *  Receive and decode the tag response, also log to tracebuffer 
 596 static int GetIso15693AnswerFromTag(uint8_t* response
, uint16_t max_len
, int timeout
) 
 599         bool gotFrame 
= false; 
 601         uint16_t *dmaBuf 
= (uint16_t*)BigBuf_malloc(ISO15693_DMA_BUFFER_SIZE
*sizeof(uint16_t)); 
 603         // the Decoder data structure 
 604         DecodeTag_t DecodeTag 
= { 0 }; 
 605         DecodeTagInit(&DecodeTag
, response
, max_len
); 
 607         // wait for last transfer to complete 
 608         while (!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXEMPTY
)); 
 610         // And put the FPGA in the appropriate mode 
 611         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_SUBCARRIER_424_KHZ 
| FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE
); 
 613         // Setup and start DMA. 
 614         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
 615         FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO15693_DMA_BUFFER_SIZE
); 
 616         uint16_t *upTo 
= dmaBuf
; 
 619                 uint16_t behindBy 
= ((uint16_t*)AT91C_BASE_PDC_SSC
->PDC_RPR 
- upTo
) & (ISO15693_DMA_BUFFER_SIZE
-1); 
 621                 if (behindBy 
== 0) continue; 
 623                 uint16_t tagdata 
= *upTo
++; 
 625                 if(upTo 
>= dmaBuf 
+ ISO15693_DMA_BUFFER_SIZE
) {                // we have read all of the DMA buffer content. 
 626                         upTo 
= dmaBuf
;                                             // start reading the circular buffer from the beginning 
 627                         if(behindBy 
> (9*ISO15693_DMA_BUFFER_SIZE
/10)) { 
 628                                 Dbprintf("About to blow circular buffer - aborted! behindBy=%d", behindBy
); 
 632                 if (AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_ENDRX
)) {              // DMA Counter Register had reached 0, already rotated. 
 633                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
;          // refresh the DMA Next Buffer and 
 634                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO15693_DMA_BUFFER_SIZE
;   // DMA Next Counter registers 
 639                 if (Handle15693SamplesFromTag(tagdata
, &DecodeTag
)) { 
 644                 if (samples 
> timeout 
&& DecodeTag
.state 
< STATE_TAG_RECEIVING_DATA
) { 
 654         if (DEBUG
) Dbprintf("samples = %d, gotFrame = %d, Decoder: state = %d, len = %d, bitCount = %d, posCount = %d", 
 655                                                 samples
, gotFrame
, DecodeTag
.state
, DecodeTag
.len
, DecodeTag
.bitCount
, DecodeTag
.posCount
); 
 657         if (DecodeTag
.len 
> 0) { 
 658                 LogTrace(DecodeTag
.output
, DecodeTag
.len
, 0, 0, NULL
, false); 
 661         return DecodeTag
.len
; 
 665 //============================================================================= 
 666 // An ISO15693 decoder for reader commands. 
 668 // This function is called 4 times per bit (every 2 subcarrier cycles). 
 669 // Subcarrier frequency fs is 848kHz, 1/fs = 1,18us, i.e. function is called every 2,36us 
 671 //    LED B -> ON once we have received the SOF and are expecting the rest. 
 672 //    LED B -> OFF once we have received EOF or are in error state or unsynced 
 674 // Returns: true  if we received a EOF 
 675 //          false if we are still waiting for some more 
 676 //============================================================================= 
 678 typedef struct DecodeReader 
{ 
 680                 STATE_READER_UNSYNCD
, 
 681                 STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
, 
 682                 STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF
, 
 683                 STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF
, 
 684                 STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF
, 
 685                 STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4
, 
 686                 STATE_READER_RECEIVE_DATA_1_OUT_OF_4
, 
 687                 STATE_READER_RECEIVE_DATA_1_OUT_OF_256
 
 703 static void DecodeReaderInit(DecodeReader_t
* DecodeReader
, uint8_t *data
, uint16_t max_len
) 
 705         DecodeReader
->output 
= data
; 
 706         DecodeReader
->byteCountMax 
= max_len
; 
 707         DecodeReader
->state 
= STATE_READER_UNSYNCD
; 
 708         DecodeReader
->byteCount 
= 0; 
 709         DecodeReader
->bitCount 
= 0; 
 710         DecodeReader
->posCount 
= 1; 
 711         DecodeReader
->shiftReg 
= 0; 
 715 static void DecodeReaderReset(DecodeReader_t
* DecodeReader
) 
 717         DecodeReader
->state 
= STATE_READER_UNSYNCD
; 
 721 static int inline __attribute__((always_inline
)) Handle15693SampleFromReader(uint8_t bit
, DecodeReader_t 
*restrict DecodeReader
) 
 723         switch (DecodeReader
->state
) { 
 724                 case STATE_READER_UNSYNCD
: 
 725                         // wait for unmodulated carrier 
 727                                 DecodeReader
->state 
= STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
; 
 731                 case STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
: 
 733                                 // we went low, so this could be the beginning of a SOF 
 734                                 DecodeReader
->posCount 
= 1; 
 735                                 DecodeReader
->state 
= STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF
; 
 739                 case STATE_READER_AWAIT_1ST_RISING_EDGE_OF_SOF
: 
 740                         DecodeReader
->posCount
++; 
 741                         if (bit
) { // detected rising edge 
 742                                 if (DecodeReader
->posCount 
< 4) { // rising edge too early (nominally expected at 5) 
 743                                         DecodeReader
->state 
= STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
; 
 745                                         DecodeReader
->state 
= STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF
; 
 748                                 if (DecodeReader
->posCount 
> 5) { // stayed low for too long 
 749                                         DecodeReaderReset(DecodeReader
); 
 751                                         // do nothing, keep waiting 
 756                 case STATE_READER_AWAIT_2ND_FALLING_EDGE_OF_SOF
: 
 757                         DecodeReader
->posCount
++; 
 758                         if (!bit
) { // detected a falling edge 
 759                                 if (DecodeReader
->posCount 
< 20) {         // falling edge too early (nominally expected at 21 earliest) 
 760                                         DecodeReaderReset(DecodeReader
); 
 761                                 } else if (DecodeReader
->posCount 
< 23) {  // SOF for 1 out of 4 coding 
 762                                         DecodeReader
->Coding 
= CODING_1_OUT_OF_4
; 
 763                                         DecodeReader
->state 
= STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF
; 
 764                                 } else if (DecodeReader
->posCount 
< 28) {  // falling edge too early (nominally expected at 29 latest) 
 765                                         DecodeReaderReset(DecodeReader
); 
 766                                 } else {                                   // SOF for 1 out of 256 coding 
 767                                         DecodeReader
->Coding 
= CODING_1_OUT_OF_256
; 
 768                                         DecodeReader
->state 
= STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF
; 
 771                                 if (DecodeReader
->posCount 
> 29) { // stayed high for too long 
 772                                         DecodeReader
->state 
= STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
; 
 774                                         // do nothing, keep waiting 
 779                 case STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF
: 
 780                         DecodeReader
->posCount
++; 
 781                         if (bit
) { // detected rising edge 
 782                                 if (DecodeReader
->Coding 
== CODING_1_OUT_OF_256
) { 
 783                                         if (DecodeReader
->posCount 
< 32) { // rising edge too early (nominally expected at 33) 
 784                                                 DecodeReader
->state 
= STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
; 
 786                                                 DecodeReader
->posCount 
= 1; 
 787                                                 DecodeReader
->bitCount 
= 0; 
 788                                                 DecodeReader
->byteCount 
= 0; 
 789                                                 DecodeReader
->sum1 
= 1; 
 790                                                 DecodeReader
->state 
= STATE_READER_RECEIVE_DATA_1_OUT_OF_256
; 
 793                                 } else { // CODING_1_OUT_OF_4 
 794                                         if (DecodeReader
->posCount 
< 24) { // rising edge too early (nominally expected at 25) 
 795                                                 DecodeReader
->state 
= STATE_READER_AWAIT_1ST_FALLING_EDGE_OF_SOF
; 
 797                                                 DecodeReader
->posCount 
= 1; 
 798                                                 DecodeReader
->state 
= STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4
; 
 802                                 if (DecodeReader
->Coding 
== CODING_1_OUT_OF_256
) { 
 803                                         if (DecodeReader
->posCount 
> 34) { // signal stayed low for too long 
 804                                                 DecodeReaderReset(DecodeReader
); 
 806                                                 // do nothing, keep waiting 
 808                                 } else { // CODING_1_OUT_OF_4 
 809                                         if (DecodeReader
->posCount 
> 26) { // signal stayed low for too long 
 810                                                 DecodeReaderReset(DecodeReader
); 
 812                                                 // do nothing, keep waiting 
 818                 case STATE_READER_AWAIT_END_OF_SOF_1_OUT_OF_4
: 
 819                         DecodeReader
->posCount
++; 
 821                                 if (DecodeReader
->posCount 
== 9) { 
 822                                         DecodeReader
->posCount 
= 1; 
 823                                         DecodeReader
->bitCount 
= 0; 
 824                                         DecodeReader
->byteCount 
= 0; 
 825                                         DecodeReader
->sum1 
= 1; 
 826                                         DecodeReader
->state 
= STATE_READER_RECEIVE_DATA_1_OUT_OF_4
; 
 829                                         // do nothing, keep waiting 
 831                         } else { // unexpected falling edge 
 832                                         DecodeReaderReset(DecodeReader
); 
 836                 case STATE_READER_RECEIVE_DATA_1_OUT_OF_4
: 
 838                         DecodeReader
->posCount
++; 
 839                         if (DecodeReader
->posCount 
== 1) { 
 840                                 DecodeReader
->sum1 
= bit
; 
 841                         } else if (DecodeReader
->posCount 
<= 4) { 
 842                                 DecodeReader
->sum1 
+= bit
; 
 843                         } else if (DecodeReader
->posCount 
== 5) { 
 844                                 DecodeReader
->sum2 
= bit
; 
 846                                 DecodeReader
->sum2 
+= bit
; 
 848                         if (DecodeReader
->posCount 
== 8) { 
 849                                 DecodeReader
->posCount 
= 0; 
 850                                 if (DecodeReader
->sum1 
<= 1 && DecodeReader
->sum2 
>= 3) { // EOF 
 851                                         LED_B_OFF(); // Finished receiving 
 852                                         DecodeReaderReset(DecodeReader
); 
 853                                         if (DecodeReader
->byteCount 
!= 0) { 
 857                                 if (DecodeReader
->sum1 
>= 3 && DecodeReader
->sum2 
<= 1) { // detected a 2bit position 
 858                                         DecodeReader
->shiftReg 
>>= 2; 
 859                                         DecodeReader
->shiftReg 
|= (DecodeReader
->bitCount 
<< 6); 
 861                                 if (DecodeReader
->bitCount 
== 15) { // we have a full byte 
 862                                         DecodeReader
->output
[DecodeReader
->byteCount
++] = DecodeReader
->shiftReg
; 
 863                                         if (DecodeReader
->byteCount 
> DecodeReader
->byteCountMax
) { 
 864                                                 // buffer overflow, give up 
 866                                                 DecodeReaderReset(DecodeReader
); 
 868                                         DecodeReader
->bitCount 
= 0; 
 869                                         DecodeReader
->shiftReg 
= 0; 
 871                                         DecodeReader
->bitCount
++; 
 876                 case STATE_READER_RECEIVE_DATA_1_OUT_OF_256
: 
 878                         DecodeReader
->posCount
++; 
 879                         if (DecodeReader
->posCount 
== 1) { 
 880                                 DecodeReader
->sum1 
= bit
; 
 881                         } else if (DecodeReader
->posCount 
<= 4) { 
 882                                 DecodeReader
->sum1 
+= bit
; 
 883                         } else if (DecodeReader
->posCount 
== 5) { 
 884                                 DecodeReader
->sum2 
= bit
; 
 886                                 DecodeReader
->sum2 
+= bit
; 
 888                         if (DecodeReader
->posCount 
== 8) { 
 889                                 DecodeReader
->posCount 
= 0; 
 890                                 if (DecodeReader
->sum1 
<= 1 && DecodeReader
->sum2 
>= 3) { // EOF 
 891                                         LED_B_OFF(); // Finished receiving 
 892                                         DecodeReaderReset(DecodeReader
); 
 893                                         if (DecodeReader
->byteCount 
!= 0) { 
 897                                 if (DecodeReader
->sum1 
>= 3 && DecodeReader
->sum2 
<= 1) { // detected the bit position 
 898                                         DecodeReader
->shiftReg 
= DecodeReader
->bitCount
; 
 900                                 if (DecodeReader
->bitCount 
== 255) { // we have a full byte 
 901                                         DecodeReader
->output
[DecodeReader
->byteCount
++] = DecodeReader
->shiftReg
; 
 902                                         if (DecodeReader
->byteCount 
> DecodeReader
->byteCountMax
) { 
 903                                                 // buffer overflow, give up 
 905                                                 DecodeReaderReset(DecodeReader
); 
 908                                 DecodeReader
->bitCount
++; 
 914                         DecodeReaderReset(DecodeReader
); 
 922 //----------------------------------------------------------------------------- 
 923 // Receive a command (from the reader to us, where we are the simulated tag), 
 924 // and store it in the given buffer, up to the given maximum length. Keeps 
 925 // spinning, waiting for a well-framed command, until either we get one 
 926 // (returns len) or someone presses the pushbutton on the board (returns -1). 
 928 // Assume that we're called with the SSC (to the FPGA) and ADC path set 
 930 //----------------------------------------------------------------------------- 
 932 int GetIso15693CommandFromReader(uint8_t *received
, size_t max_len
, uint32_t *eof_time
) { 
 934         bool gotFrame 
= false; 
 937         uint8_t dmaBuf
[ISO15693_DMA_BUFFER_SIZE
]; 
 939         // the decoder data structure 
 940         DecodeReader_t DecodeReader 
= {0}; 
 941         DecodeReaderInit(&DecodeReader
, received
, max_len
); 
 943         // wait for last transfer to complete 
 944         while (!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXEMPTY
)); 
 947         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_NO_MODULATION
); 
 949         // clear receive register and wait for next transfer 
 950         uint32_t temp 
= AT91C_BASE_SSC
->SSC_RHR
; 
 952         while (!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_RXRDY
)) ; 
 954         uint32_t dma_start_time 
= GetCountSspClk() & 0xfffffff8; 
 956         // Setup and start DMA. 
 957         FpgaSetupSscDma(dmaBuf
, ISO15693_DMA_BUFFER_SIZE
); 
 958         uint8_t *upTo 
= dmaBuf
; 
 961                 uint16_t behindBy 
= ((uint8_t*)AT91C_BASE_PDC_SSC
->PDC_RPR 
- upTo
) & (ISO15693_DMA_BUFFER_SIZE
-1); 
 963                 if (behindBy 
== 0) continue; 
 966                 if (upTo 
>= dmaBuf 
+ ISO15693_DMA_BUFFER_SIZE
) {               // we have read all of the DMA buffer content. 
 967                         upTo 
= dmaBuf
;                                             // start reading the circular buffer from the beginning 
 968                         if (behindBy 
> (9*ISO15693_DMA_BUFFER_SIZE
/10)) { 
 969                                 Dbprintf("About to blow circular buffer - aborted! behindBy=%d", behindBy
); 
 973                 if (AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_ENDRX
)) {              // DMA Counter Register had reached 0, already rotated. 
 974                         AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
;          // refresh the DMA Next Buffer and 
 975                         AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO15693_DMA_BUFFER_SIZE
;   // DMA Next Counter registers 
 978                 for (int i 
= 7; i 
>= 0; i
--) { 
 979                         if (Handle15693SampleFromReader((b 
>> i
) & 0x01, &DecodeReader
)) { 
 980                                 *eof_time 
= dma_start_time 
+ samples 
- DELAY_READER_TO_ARM_SIM
; // end of EOF 
 991                 if (BUTTON_PRESS()) { 
 992                         DecodeReader
.byteCount 
= -1; 
1001         if (DEBUG
) Dbprintf("samples = %d, gotFrame = %d, Decoder: state = %d, len = %d, bitCount = %d, posCount = %d", 
1002                                                 samples
, gotFrame
, DecodeReader
.state
, DecodeReader
.byteCount
, DecodeReader
.bitCount
, DecodeReader
.posCount
); 
1004         if (DecodeReader
.byteCount 
> 0) { 
1005                 uint32_t sof_time 
= *eof_time
 
1006                                                 - DecodeReader
.byteCount 
* (DecodeReader
.Coding
==CODING_1_OUT_OF_4
?128:2048) // time for byte transfers 
1007                                                 - 32  // time for SOF transfer 
1008                                                 - 16; // time for EOF transfer 
1009                 LogTrace(DecodeReader
.output
, DecodeReader
.byteCount
, sof_time
, *eof_time
, NULL
, true); 
1012         return DecodeReader
.byteCount
; 
1016 // Encode (into the ToSend buffers) an identify request, which is the first 
1017 // thing that you must send to a tag to get a response. 
1018 static void BuildIdentifyRequest(void) 
1023         // one sub-carrier, inventory, 1 slot, fast rate 
1024         // AFI is at bit 5 (1<<4) when doing an INVENTORY 
1025         cmd
[0] = (1 << 2) | (1 << 5) | (1 << 1); 
1026         // inventory command code 
1031         crc 
= Iso15693Crc(cmd
, 3); 
1032         cmd
[3] = crc 
& 0xff; 
1035         CodeIso15693AsReader(cmd
, sizeof(cmd
)); 
1039 //----------------------------------------------------------------------------- 
1040 // Start to read an ISO 15693 tag. We send an identify request, then wait 
1041 // for the response. The response is not demodulated, just left in the buffer 
1042 // so that it can be downloaded to a PC and processed there. 
1043 //----------------------------------------------------------------------------- 
1044 void AcquireRawAdcSamplesIso15693(void) 
1049         uint8_t *dest 
= BigBuf_get_addr(); 
1051         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1052         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER
); 
1053         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
1054         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1056         BuildIdentifyRequest(); 
1058         // Give the tags time to energize 
1062         // Now send the command 
1063         TransmitTo15693Tag(ToSend
, ToSendMax
, 0); 
1065         // wait for last transfer to complete 
1066         while (!(AT91C_BASE_SSC
->SSC_SR 
& AT91C_SSC_TXEMPTY
)) ; 
1068         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_SUBCARRIER_424_KHZ 
| FPGA_HF_READER_MODE_RECEIVE_AMPLITUDE
); 
1070         for(int c 
= 0; c 
< 4000; ) { 
1071                 if(AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_RXRDY
)) { 
1072                         uint16_t r 
= AT91C_BASE_SSC
->SSC_RHR
; 
1077         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1082 void SnoopIso15693(void) 
1085         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1091         // The DMA buffer, used to stream samples from the FPGA 
1092         uint16_t* dmaBuf 
= (uint16_t*)BigBuf_malloc(ISO15693_DMA_BUFFER_SIZE
*sizeof(uint16_t)); 
1095         // Count of samples received so far, so that we can include timing 
1096         // information in the trace buffer. 
1099         DecodeTag_t DecodeTag 
= {0}; 
1100         uint8_t response
[ISO15693_MAX_RESPONSE_LENGTH
]; 
1101         DecodeTagInit(&DecodeTag
, response
, sizeof(response
)); 
1103         DecodeReader_t DecodeReader 
= {0};; 
1104         uint8_t cmd
[ISO15693_MAX_COMMAND_LENGTH
]; 
1105         DecodeReaderInit(&DecodeReader
, cmd
, sizeof(cmd
)); 
1107         // Print some debug information about the buffer sizes 
1109                 Dbprintf("Snooping buffers initialized:"); 
1110                 Dbprintf("  Trace:         %i bytes", BigBuf_max_traceLen()); 
1111                 Dbprintf("  Reader -> tag: %i bytes", ISO15693_MAX_COMMAND_LENGTH
); 
1112                 Dbprintf("  tag -> Reader: %i bytes", ISO15693_MAX_RESPONSE_LENGTH
); 
1113                 Dbprintf("  DMA:           %i bytes", ISO15693_DMA_BUFFER_SIZE 
* sizeof(uint16_t)); 
1115         Dbprintf("Snoop started. Press PM3 Button to stop."); 
1117         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER 
| FPGA_HF_READER_MODE_SNOOP_AMPLITUDE
); 
1118         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1120         // Setup for the DMA. 
1121         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
1123         FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO15693_DMA_BUFFER_SIZE
); 
1125         bool TagIsActive 
= false; 
1126         bool ReaderIsActive 
= false; 
1127         bool ExpectTagAnswer 
= false; 
1129         // And now we loop, receiving samples. 
1131                 uint16_t behindBy 
= ((uint16_t*)AT91C_BASE_PDC_SSC
->PDC_RPR 
- upTo
) & (ISO15693_DMA_BUFFER_SIZE
-1); 
1133                 if (behindBy 
== 0) continue; 
1135                 uint16_t snoopdata 
= *upTo
++; 
1137                 if(upTo 
>= dmaBuf 
+ ISO15693_DMA_BUFFER_SIZE
) {                    // we have read all of the DMA buffer content. 
1138                         upTo 
= dmaBuf
;                                                 // start reading the circular buffer from the beginning 
1139                         if(behindBy 
> (9*ISO15693_DMA_BUFFER_SIZE
/10)) { 
1140                                 Dbprintf("About to blow circular buffer - aborted! behindBy=%d, samples=%d", behindBy
, samples
); 
1143                         if (AT91C_BASE_SSC
->SSC_SR 
& (AT91C_SSC_ENDRX
)) {              // DMA Counter Register had reached 0, already rotated. 
1144                                 AT91C_BASE_PDC_SSC
->PDC_RNPR 
= (uint32_t) dmaBuf
;          // refresh the DMA Next Buffer and 
1145                                 AT91C_BASE_PDC_SSC
->PDC_RNCR 
= ISO15693_DMA_BUFFER_SIZE
;   // DMA Next Counter registers 
1147                                 if(BUTTON_PRESS()) { 
1148                                         DbpString("Snoop stopped."); 
1155                 if (!TagIsActive
) {                                            // no need to try decoding reader data if the tag is sending 
1156                         if (Handle15693SampleFromReader(snoopdata 
& 0x02, &DecodeReader
)) { 
1157                                 FpgaDisableSscDma(); 
1158                                 ExpectTagAnswer 
= true; 
1159                                 LogTrace(DecodeReader
.output
, DecodeReader
.byteCount
, samples
, samples
, NULL
, true); 
1160                                 /* And ready to receive another command. */ 
1161                                 DecodeReaderReset(&DecodeReader
); 
1162                                 /* And also reset the demod code, which might have been */ 
1163                                 /* false-triggered by the commands from the reader. */ 
1164                                 DecodeTagReset(&DecodeTag
); 
1166                                 FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO15693_DMA_BUFFER_SIZE
); 
1168                         if (Handle15693SampleFromReader(snoopdata 
& 0x01, &DecodeReader
)) { 
1169                                 FpgaDisableSscDma(); 
1170                                 ExpectTagAnswer 
= true; 
1171                                 LogTrace(DecodeReader
.output
, DecodeReader
.byteCount
, samples
, samples
, NULL
, true); 
1172                                 /* And ready to receive another command. */ 
1173                                 DecodeReaderReset(&DecodeReader
); 
1174                                 /* And also reset the demod code, which might have been */ 
1175                                 /* false-triggered by the commands from the reader. */ 
1176                                 DecodeTagReset(&DecodeTag
); 
1178                                 FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO15693_DMA_BUFFER_SIZE
); 
1180                         ReaderIsActive 
= (DecodeReader
.state 
>= STATE_READER_AWAIT_2ND_RISING_EDGE_OF_SOF
); 
1183                 if (!ReaderIsActive 
&& ExpectTagAnswer
) {                       // no need to try decoding tag data if the reader is currently sending or no answer expected yet 
1184                         if (Handle15693SamplesFromTag(snoopdata 
>> 2, &DecodeTag
)) { 
1185                                 FpgaDisableSscDma(); 
1186                                 //Use samples as a time measurement 
1187                                 LogTrace(DecodeTag
.output
, DecodeTag
.len
, samples
, samples
, NULL
, false); 
1188                                 // And ready to receive another response. 
1189                                 DecodeTagReset(&DecodeTag
); 
1190                                 DecodeReaderReset(&DecodeReader
); 
1191                                 ExpectTagAnswer 
= false; 
1193                                 FpgaSetupSscDma((uint8_t*) dmaBuf
, ISO15693_DMA_BUFFER_SIZE
); 
1195                         TagIsActive 
= (DecodeTag
.state 
>= STATE_TAG_RECEIVING_DATA
); 
1200         FpgaDisableSscDma(); 
1205         DbpString("Snoop statistics:"); 
1206         Dbprintf("  ExpectTagAnswer: %d", ExpectTagAnswer
); 
1207         Dbprintf("  DecodeTag State: %d", DecodeTag
.state
); 
1208         Dbprintf("  DecodeTag byteCnt: %d", DecodeTag
.len
); 
1209         Dbprintf("  DecodeReader State: %d", DecodeReader
.state
); 
1210         Dbprintf("  DecodeReader byteCnt: %d", DecodeReader
.byteCount
); 
1211         Dbprintf("  Trace length: %d", BigBuf_get_traceLen()); 
1215 // Initialize the proxmark as iso15k reader 
1216 static void Iso15693InitReader() { 
1217         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1221         // Start from off (no field generated) 
1223         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1226         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1227         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
1229         // Give the tags time to energize 
1231         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER
); 
1235 /////////////////////////////////////////////////////////////////////// 
1236 // ISO 15693 Part 3 - Air Interface 
1237 // This section basically contains transmission and receiving of bits 
1238 /////////////////////////////////////////////////////////////////////// 
1241 // uid is in transmission order (which is reverse of display order) 
1242 static void BuildReadBlockRequest(uint8_t *uid
, uint8_t blockNumber 
) 
1247         // If we set the Option_Flag in this request, the VICC will respond with the security status of the block 
1248         // followed by the block data 
1249         cmd
[0] = ISO15693_REQ_OPTION 
| ISO15693_REQ_ADDRESS 
| ISO15693_REQ_DATARATE_HIGH
; 
1250         // READ BLOCK command code 
1251         cmd
[1] = ISO15693_READBLOCK
; 
1252         // UID may be optionally specified here 
1261         cmd
[9] = uid
[7]; // 0xe0; // always e0 (not exactly unique) 
1262         // Block number to read 
1263         cmd
[10] = blockNumber
; 
1265         crc 
= Iso15693Crc(cmd
, 11); // the crc needs to be calculated over 11 bytes 
1266         cmd
[11] = crc 
& 0xff; 
1269         CodeIso15693AsReader(cmd
, sizeof(cmd
)); 
1273 // Now the VICC>VCD responses when we are simulating a tag 
1274 static void BuildInventoryResponse(uint8_t *uid
) 
1280         cmd
[0] = 0; // No error, no protocol format extension 
1281         cmd
[1] = 0; // DSFID (data storage format identifier).  0x00 = not supported 
1283         cmd
[2] = uid
[7]; //0x32; 
1284         cmd
[3] = uid
[6]; //0x4b; 
1285         cmd
[4] = uid
[5]; //0x03; 
1286         cmd
[5] = uid
[4]; //0x01; 
1287         cmd
[6] = uid
[3]; //0x00; 
1288         cmd
[7] = uid
[2]; //0x10; 
1289         cmd
[8] = uid
[1]; //0x05; 
1290         cmd
[9] = uid
[0]; //0xe0; 
1292         crc 
= Iso15693Crc(cmd
, 10); 
1293         cmd
[10] = crc 
& 0xff; 
1296         CodeIso15693AsTag(cmd
, sizeof(cmd
)); 
1299 // Universal Method for sending to and recv bytes from a tag 
1300 //  init ... should we initialize the reader? 
1301 //  speed ... 0 low speed, 1 hi speed 
1302 //  *recv will contain the tag's answer 
1303 //  return: lenght of received data 
1304 int SendDataTag(uint8_t *send
, int sendlen
, bool init
, int speed
, uint8_t *recv
, uint16_t max_recv_len
, uint32_t start_time
) { 
1310         if (init
) Iso15693InitReader(); 
1315                 // low speed (1 out of 256) 
1316                 CodeIso15693AsReader256(send
, sendlen
); 
1318                 // high speed (1 out of 4) 
1319                 CodeIso15693AsReader(send
, sendlen
); 
1322         TransmitTo15693Tag(ToSend
, ToSendMax
, start_time
); 
1324         // Now wait for a response 
1326                 answerLen 
= GetIso15693AnswerFromTag(recv
, max_recv_len
, DELAY_ISO15693_VCD_TO_VICC_READER 
* 2); 
1335 // -------------------------------------------------------------------- 
1337 // -------------------------------------------------------------------- 
1339 // Decodes a message from a tag and displays its metadata and content 
1340 #define DBD15STATLEN 48 
1341 void DbdecodeIso15693Answer(int len
, uint8_t *d
) { 
1342         char status
[DBD15STATLEN
+1]={0}; 
1346                 if (d
[0] & ISO15693_RES_EXT
) 
1347                         strncat(status
,"ProtExt ", DBD15STATLEN
); 
1348                 if (d
[0] & ISO15693_RES_ERROR
) { 
1350                         strncat(status
,"Error ", DBD15STATLEN
); 
1353                                         strncat(status
,"01:notSupp", DBD15STATLEN
); 
1356                                         strncat(status
,"02:notRecog", DBD15STATLEN
); 
1359                                         strncat(status
,"03:optNotSupp", DBD15STATLEN
); 
1362                                         strncat(status
,"0f:noInfo", DBD15STATLEN
); 
1365                                         strncat(status
,"10:doesn'tExist", DBD15STATLEN
); 
1368                                         strncat(status
,"11:lockAgain", DBD15STATLEN
); 
1371                                         strncat(status
,"12:locked", DBD15STATLEN
); 
1374                                         strncat(status
,"13:progErr", DBD15STATLEN
); 
1377                                         strncat(status
,"14:lockErr", DBD15STATLEN
); 
1380                                         strncat(status
,"unknownErr", DBD15STATLEN
); 
1382                         strncat(status
," ", DBD15STATLEN
); 
1384                         strncat(status
,"NoErr ", DBD15STATLEN
); 
1387                 crc
=Iso15693Crc(d
,len
-2); 
1388                 if ( (( crc 
& 0xff ) == d
[len
-2]) && (( crc 
>> 8 ) == d
[len
-1]) ) 
1389                         strncat(status
,"CrcOK",DBD15STATLEN
); 
1391                         strncat(status
,"CrcFail!",DBD15STATLEN
); 
1393                 Dbprintf("%s",status
); 
1399 /////////////////////////////////////////////////////////////////////// 
1400 // Functions called via USB/Client 
1401 /////////////////////////////////////////////////////////////////////// 
1403 void SetDebugIso15693(uint32_t debug
) { 
1405         Dbprintf("Iso15693 Debug is now %s",DEBUG
?"on":"off"); 
1410 //--------------------------------------------------------------------------------------- 
1411 // Simulate an ISO15693 reader, perform anti-collision and then attempt to read a sector. 
1412 // all demodulation performed in arm rather than host. - greg 
1413 //--------------------------------------------------------------------------------------- 
1414 void ReaderIso15693(uint32_t parameter
) 
1422         uint8_t TagUID
[8] = {0x00}; 
1424         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1426         uint8_t answer
[ISO15693_MAX_RESPONSE_LENGTH
]; 
1428         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1430         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_READER
); 
1432         // Start from off (no field generated) 
1433         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1436         // Give the tags time to energize 
1438         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_READER
); 
1443         // FIRST WE RUN AN INVENTORY TO GET THE TAG UID 
1444         // THIS MEANS WE CAN PRE-BUILD REQUESTS TO SAVE CPU TIME 
1446         // Now send the IDENTIFY command 
1447         BuildIdentifyRequest(); 
1448         TransmitTo15693Tag(ToSend
, ToSendMax
, 0); 
1450         // Now wait for a response 
1451         answerLen 
= GetIso15693AnswerFromTag(answer
, sizeof(answer
), DELAY_ISO15693_VCD_TO_VICC_READER 
* 2) ; 
1452         uint32_t start_time 
= GetCountSspClk() + DELAY_ISO15693_VICC_TO_VCD_READER
; 
1454         if (answerLen 
>=12) // we should do a better check than this 
1456                 TagUID
[0] = answer
[2]; 
1457                 TagUID
[1] = answer
[3]; 
1458                 TagUID
[2] = answer
[4]; 
1459                 TagUID
[3] = answer
[5]; 
1460                 TagUID
[4] = answer
[6]; 
1461                 TagUID
[5] = answer
[7]; 
1462                 TagUID
[6] = answer
[8]; // IC Manufacturer code 
1463                 TagUID
[7] = answer
[9]; // always E0 
1467         Dbprintf("%d octets read from IDENTIFY request:", answerLen
); 
1468         DbdecodeIso15693Answer(answerLen
, answer
); 
1469         Dbhexdump(answerLen
, answer
, false); 
1472         if (answerLen 
>= 12) 
1473                 Dbprintf("UID = %02hX%02hX%02hX%02hX%02hX%02hX%02hX%02hX", 
1474                         TagUID
[7],TagUID
[6],TagUID
[5],TagUID
[4], 
1475                         TagUID
[3],TagUID
[2],TagUID
[1],TagUID
[0]); 
1478         // Dbprintf("%d octets read from SELECT request:", answerLen2); 
1479         // DbdecodeIso15693Answer(answerLen2,answer2); 
1480         // Dbhexdump(answerLen2,answer2,true); 
1482         // Dbprintf("%d octets read from XXX request:", answerLen3); 
1483         // DbdecodeIso15693Answer(answerLen3,answer3); 
1484         // Dbhexdump(answerLen3,answer3,true); 
1487         if (answerLen 
>= 12 && DEBUG
) { 
1488                 for (int i 
= 0; i 
< 32; i
++) {  // sanity check, assume max 32 pages 
1489                         BuildReadBlockRequest(TagUID
, i
); 
1490                         TransmitTo15693Tag(ToSend
, ToSendMax
, start_time
); 
1491                         int answerLen 
= GetIso15693AnswerFromTag(answer
, sizeof(answer
), DELAY_ISO15693_VCD_TO_VICC_READER 
* 2); 
1492                         start_time 
= GetCountSspClk() + DELAY_ISO15693_VICC_TO_VCD_READER
; 
1493                         if (answerLen 
> 0) { 
1494                                 Dbprintf("READ SINGLE BLOCK %d returned %d octets:", i
, answerLen
); 
1495                                 DbdecodeIso15693Answer(answerLen
, answer
); 
1496                                 Dbhexdump(answerLen
, answer
, false); 
1497                                 if ( *((uint32_t*) answer
) == 0x07160101 ) break; // exit on NoPageErr 
1502         // for the time being, switch field off to protect rdv4.0 
1503         // note: this prevents using hf 15 cmd with s option - which isn't implemented yet anyway 
1504         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1511 // Simulate an ISO15693 TAG. 
1512 // For Inventory command: print command and send Inventory Response with given UID 
1513 // TODO: interpret other reader commands and send appropriate response 
1514 void SimTagIso15693(uint32_t parameter
, uint8_t *uid
) 
1519         FpgaDownloadAndGo(FPGA_BITSTREAM_HF
); 
1520         SetAdcMuxFor(GPIO_MUXSEL_HIPKD
); 
1521         FpgaWriteConfWord(FPGA_MAJOR_MODE_HF_SIMULATOR 
| FPGA_HF_SIMULATOR_NO_MODULATION
); 
1522         FpgaSetupSsc(FPGA_MAJOR_MODE_HF_SIMULATOR
); 
1526         uint8_t cmd
[ISO15693_MAX_COMMAND_LENGTH
]; 
1528         // Build a suitable response to the reader INVENTORY command 
1529         BuildInventoryResponse(uid
); 
1532         while (!BUTTON_PRESS()) { 
1533                 uint32_t eof_time 
= 0, start_time 
= 0; 
1534                 int cmd_len 
= GetIso15693CommandFromReader(cmd
, sizeof(cmd
), &eof_time
); 
1536                 if ((cmd_len 
>= 5) && (cmd
[0] & ISO15693_REQ_INVENTORY
) && (cmd
[1] == ISO15693_INVENTORY
)) { // TODO: check more flags 
1537                         bool slow 
= !(cmd
[0] & ISO15693_REQ_DATARATE_HIGH
); 
1538                         start_time 
= eof_time 
+ DELAY_ISO15693_VCD_TO_VICC_SIM 
- DELAY_ARM_TO_READER_SIM
; 
1539                         TransmitTo15693Reader(ToSend
, ToSendMax
, &start_time
, 0, slow
); 
1542                 Dbprintf("%d bytes read from reader:", cmd_len
); 
1543                 Dbhexdump(cmd_len
, cmd
, false); 
1546         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1551 // Since there is no standardized way of reading the AFI out of a tag, we will brute force it 
1552 // (some manufactures offer a way to read the AFI, though) 
1553 void BruteforceIso15693Afi(uint32_t speed
) 
1559         uint8_t recv
[ISO15693_MAX_RESPONSE_LENGTH
]; 
1561         int datalen
=0, recvlen
=0; 
1563         Iso15693InitReader(); 
1566         // first without AFI 
1567         // Tags should respond without AFI and with AFI=0 even when AFI is active 
1569         data
[0] = ISO15693_REQ_DATARATE_HIGH 
| ISO15693_REQ_INVENTORY 
| ISO15693_REQINV_SLOT1
; 
1570         data
[1] = ISO15693_INVENTORY
; 
1571         data
[2] = 0; // mask length 
1572         datalen 
= Iso15693AddCrc(data
,3); 
1573         recvlen 
= SendDataTag(data
, datalen
, false, speed
, recv
, sizeof(recv
), 0); 
1574         uint32_t start_time 
= GetCountSspClk() + DELAY_ISO15693_VICC_TO_VCD_READER
; 
1577                 Dbprintf("NoAFI UID=%s", Iso15693sprintUID(NULL
, &recv
[2])); 
1582         data
[0] = ISO15693_REQ_DATARATE_HIGH 
| ISO15693_REQ_INVENTORY 
| ISO15693_REQINV_AFI 
| ISO15693_REQINV_SLOT1
; 
1583         data
[1] = ISO15693_INVENTORY
; 
1585         data
[3] = 0; // mask length 
1587         for (int i 
= 0; i 
< 256; i
++) { 
1589                 datalen 
= Iso15693AddCrc(data
,4); 
1590                 recvlen 
= SendDataTag(data
, datalen
, false, speed
, recv
, sizeof(recv
), start_time
); 
1591                 start_time 
= GetCountSspClk() + DELAY_ISO15693_VICC_TO_VCD_READER
; 
1593                 if (recvlen 
>= 12) { 
1594                         Dbprintf("AFI=%i UID=%s", i
, Iso15693sprintUID(NULL
, &recv
[2])); 
1597         Dbprintf("AFI Bruteforcing done."); 
1599         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1603 // Allows to directly send commands to the tag via the client 
1604 void DirectTag15693Command(uint32_t datalen
, uint32_t speed
, uint32_t recv
, uint8_t data
[]) { 
1607         uint8_t recvbuf
[ISO15693_MAX_RESPONSE_LENGTH
]; 
1613                 Dbhexdump(datalen
, data
, false); 
1616         recvlen 
= SendDataTag(data
, datalen
, true, speed
, (recv
?recvbuf
:NULL
), sizeof(recvbuf
), 0); 
1621                         Dbhexdump(recvlen
, recvbuf
, false); 
1622                         DbdecodeIso15693Answer(recvlen
, recvbuf
); 
1625                 cmd_send(CMD_ACK
, recvlen
>ISO15693_MAX_RESPONSE_LENGTH
?ISO15693_MAX_RESPONSE_LENGTH
:recvlen
, 0, 0, recvbuf
, ISO15693_MAX_RESPONSE_LENGTH
); 
1629         // for the time being, switch field off to protect rdv4.0 
1630         // note: this prevents using hf 15 cmd with s option - which isn't implemented yet anyway 
1631         FpgaWriteConfWord(FPGA_MAJOR_MODE_OFF
); 
1637 //----------------------------------------------------------------------------- 
1638 // Work with "magic Chinese" card. 
1640 //----------------------------------------------------------------------------- 
1642 // Set the UID to the tag (based on Iceman work). 
1643 void SetTag15693Uid(uint8_t *uid
) 
1645         uint8_t cmd
[4][9] = {0x00}; 
1650         uint8_t recvbuf
[ISO15693_MAX_RESPONSE_LENGTH
]; 
1654         // Command 1 : 02213E00000000 
1663         // Command 2 : 02213F69960000 
1672         // Command 3 : 022138u8u7u6u5 (where uX = uid byte X) 
1681         // Command 4 : 022139u4u3u2u1 (where uX = uid byte X) 
1690         for (int i
=0; i
<4; i
++) { 
1692                 crc 
= Iso15693Crc(cmd
[i
], 7); 
1693                 cmd
[i
][7] = crc 
& 0xff; 
1694                 cmd
[i
][8] = crc 
>> 8; 
1698                         Dbhexdump(sizeof(cmd
[i
]), cmd
[i
], false); 
1701                 recvlen 
= SendDataTag(cmd
[i
], sizeof(cmd
[i
]), true, 1, recvbuf
, sizeof(recvbuf
), 0); 
1705                         Dbhexdump(recvlen
, recvbuf
, false); 
1706                         DbdecodeIso15693Answer(recvlen
, recvbuf
); 
1709                 cmd_send(CMD_ACK
, recvlen
>ISO15693_MAX_RESPONSE_LENGTH
?ISO15693_MAX_RESPONSE_LENGTH
:recvlen
, 0, 0, recvbuf
, ISO15693_MAX_RESPONSE_LENGTH
); 
1719 // -------------------------------------------------------------------- 
1720 // -- Misc & deprecated functions 
1721 // -------------------------------------------------------------------- 
1725 // do not use; has a fix UID 
1726 static void __attribute__((unused)) BuildSysInfoRequest(uint8_t *uid) 
1731         // If we set the Option_Flag in this request, the VICC will respond with the security status of the block 
1732         // followed by the block data 
1733         // one sub-carrier, inventory, 1 slot, fast rate 
1734         cmd[0] =  (1 << 5) | (1 << 1); // no SELECT bit 
1735         // System Information command code 
1737         // UID may be optionally specified here 
1746         cmd[9]= 0xe0; // always e0 (not exactly unique) 
1748         crc = Iso15693Crc(cmd, 10); // the crc needs to be calculated over 2 bytes 
1749         cmd[10] = crc & 0xff; 
1752         CodeIso15693AsReader(cmd, sizeof(cmd)); 
1756 // do not use; has a fix UID 
1757 static void __attribute__((unused)) BuildReadMultiBlockRequest(uint8_t *uid) 
1762         // If we set the Option_Flag in this request, the VICC will respond with the security status of the block 
1763         // followed by the block data 
1764         // one sub-carrier, inventory, 1 slot, fast rate 
1765         cmd[0] =  (1 << 5) | (1 << 1); // no SELECT bit 
1766         // READ Multi BLOCK command code 
1768         // UID may be optionally specified here 
1777         cmd[9]= 0xe0; // always e0 (not exactly unique) 
1778         // First Block number to read 
1780         // Number of Blocks to read 
1781         cmd[11] = 0x2f; // read quite a few 
1783         crc = Iso15693Crc(cmd, 12); // the crc needs to be calculated over 2 bytes 
1784         cmd[12] = crc & 0xff; 
1787         CodeIso15693AsReader(cmd, sizeof(cmd)); 
1790 // do not use; has a fix UID 
1791 static void __attribute__((unused)) BuildArbitraryRequest(uint8_t *uid,uint8_t CmdCode) 
1796         // If we set the Option_Flag in this request, the VICC will respond with the security status of the block 
1797         // followed by the block data 
1798         // one sub-carrier, inventory, 1 slot, fast rate 
1799         cmd[0] =   (1 << 5) | (1 << 1); // no SELECT bit 
1800         // READ BLOCK command code 
1802         // UID may be optionally specified here 
1811         cmd[9]= 0xe0; // always e0 (not exactly unique) 
1817 //  cmd[13] = 0x00; //Now the CRC 
1818         crc = Iso15693Crc(cmd, 12); // the crc needs to be calculated over 2 bytes 
1819         cmd[12] = crc & 0xff; 
1822         CodeIso15693AsReader(cmd, sizeof(cmd)); 
1825 // do not use; has a fix UID 
1826 static void __attribute__((unused)) BuildArbitraryCustomRequest(uint8_t uid[], uint8_t CmdCode) 
1831         // If we set the Option_Flag in this request, the VICC will respond with the security status of the block 
1832         // followed by the block data 
1833         // one sub-carrier, inventory, 1 slot, fast rate 
1834         cmd[0] =   (1 << 5) | (1 << 1); // no SELECT bit 
1835         // READ BLOCK command code 
1837         // UID may be optionally specified here 
1846         cmd[9]= 0xe0; // always e0 (not exactly unique) 
1848         cmd[10] = 0x05; // for custom codes this must be manufacturer code 
1852 //  cmd[13] = 0x00; //Now the CRC 
1853         crc = Iso15693Crc(cmd, 12); // the crc needs to be calculated over 2 bytes 
1854         cmd[12] = crc & 0xff; 
1857         CodeIso15693AsReader(cmd, sizeof(cmd));