// read page - 32 bits // pages 2 - 15 are probably not readable! BOOL hitag1_read_page(BYTE *response, BYTE block) { BYTE tmp[HITAG1_BLOCKSIZE + 6]; // 32 bits plus 6 sync bits 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); // create 12 bit command block: HITAG1_RDPPAGE + 8 bits address strcpy(tmp, HITAG1_RDPPAGE); inttobinstring(tmp + 4, (unsigned int) block, 8); tmp[12]= '\0'; // ??? docs say 6 sync bits! if(!hitag1_send_command(tmp, tmp, NO_RESET, NO_SYNC, HITAG1_BLOCKSIZE + 1, NO_ACK)) return FALSE; // check sync if(tmp[0] != 0x01) return FALSE; binarraytohex(response, tmp + 1, HITAG1_BLOCKSIZE); return TRUE; }
BOOL get_tag_uid(BYTE *response) { switch(RFIDlerConfig.TagType) { case TAG_TYPE_ASK_RAW: return ask_raw_get_uid(response); case TAG_TYPE_AWID_26: return awid26_get_uid(response); case TAG_TYPE_EM4X02: return em4x02_get_uid(response); case TAG_TYPE_FDXB: return fdxb_get_uid(response); case TAG_TYPE_FSK1_RAW: case TAG_TYPE_FSK2_RAW: return fsk_raw_get_uid(response); case TAG_TYPE_HID_26: return hid26_get_uid(response); case TAG_TYPE_HITAG1: return hitag1_get_uid(response); case TAG_TYPE_HITAG2: return hitag2_get_uid(response); case TAG_TYPE_INDALA_64: return indala64_get_uid(response); case TAG_TYPE_INDALA_224: return indala224_get_uid(response); case TAG_TYPE_PSK1_RAW: return psk1_raw_get_uid(response); case TAG_TYPE_Q5: //case TAG_TYPE_T55X7: return q5_get_uid(response); case TAG_TYPE_UNIQUE: return unique_get_uid(response); default: break; } return FALSE; }
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; }