Exemplo n.º 1
0
// 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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}