// read from start to end blocks. data will need to be large enough // to hold all blocks. BOOL read_tag(BYTE *data, unsigned int startblock, unsigned int endblock) { unsigned int i, p= 0; for(i= startblock; i <= endblock ; ++i, ++p) { switch(RFIDlerConfig.TagType) { case TAG_TYPE_Q5: case TAG_TYPE_T55X7: if(!q5_read_block(data + p * HEXDIGITS(RFIDlerConfig.BlockSize), (BYTE) i)) return FALSE; break; case TAG_TYPE_HITAG1: if (!hitag1_read_page(data + p * HEXDIGITS(RFIDlerConfig.BlockSize), (BYTE) i)) return FALSE; break; case TAG_TYPE_HITAG2: if (!hitag2_read_page(data + p * HEXDIGITS(RFIDlerConfig.BlockSize), (BYTE) i)) return FALSE; break; default: return FALSE; } } return TRUE; }
BOOL hitag1_write_page(BYTE block, BYTE *data) { BYTE crc, command[21], tmp[33], tmp1[4]; if(block > HITAG1_DATABLOCKS - 1) return FALSE; // get tag's UID for select command if(!hitag1_get_uid(tmp)) return FALSE; // select for read/write hitag1_select(tmp, tmp); // convert data to binstring for send if(hextobinstring(tmp, data) != 32) return FALSE; // create and send 12 bit command block: HITAG1_WRPPAGE (4 bits) + 8 bit address memcpy(command, HITAG1_WRPPAGE, 4); inttobinstring(command + 4, (unsigned int) block, 8); command[12]= '\0'; if(!hitag1_send_command(tmp1, command, NO_RESET, NO_SYNC, 0, ACK)) return FALSE; // delay to switch back to write mode Delay_us((RFIDlerConfig.RWD_Wait_Switch_RX_TX * RFIDlerConfig.FrameClock) / 100); // now send data if(!hitag1_send_command(tmp1, tmp, NO_RESET, NO_SYNC, 0, ACK)) return FALSE; // read back and verify // delay for long enough to allow write plus RX->TX period Delay_us((HITAG1_WRITE_DELAY * RFIDlerConfig.FrameClock + RFIDlerConfig.RWD_Wait_Switch_RX_TX * RFIDlerConfig.FrameClock) / 100); if(!hitag1_read_page(tmp, block)) return FALSE; if(memcmp(tmp, data, 8) != 0) return FALSE; return TRUE; }