#ifndef _RFID_ISO15693_H #define _RFID_ISO15693_H #include /* * ISO15693 tag manufacturer codes as found at * http://rfid-handbook.de/forum/read.php?5,437,580#msg-580 * * 01h = Motorola * 02h = ST Microelectronics * 03h = Hitachi * 04h = Philips/NXP I.CODE * 05h = Siemens/Infineon * 06h = Cylinc * 07h = Texas Instruments TagIt * 08h = Fujitsu Limited * 09h = Mashushita Electric Industrial * 0Ah = NEC * 0Bh = Oki Electric * 0Ch = Toshiba * 0Dh = Mishubishi Electric * 0Eh = Samsung Electronics * 0Fh = Hyundai Electronics * 10h = LG Semiconductors * 16h = EMarin Microelectronic * */ /* protocol definitions */ struct iso15693_handle { unsigned int state; unsigned int vcd_ask100:1, vicc_two_subc:1, vicc_fast:1, single_slot:1, use_afi:1, vcd_out256:1; u_int8_t afi; /* appplication family identifier */ u_int8_t dsfid; /* data storage format identifier */ }; enum rfid_15693_state { ISO15693_STATE_ERROR, ISO15693_STATE_NONE, ISO15693_STATE_ANTICOL_RUNNING, }; enum rfid_15693_opt { RFID_OPT_15693_MOD_DEPTH = 0x00010001, RFID_OPT_15693_VCD_CODING = 0x00010002, RFID_OPT_15693_VICC_SUBC = 0x00010003, RFID_OPT_15693_VICC_SPEED = 0x00010004, RFID_OPT_15693_VCD_SLOTS = 0x00010005, RFID_OPT_15693_USE_AFI = 0x00010006, RFID_OPT_15693_AFI = 0x00010007, RFID_OPT_15693_DSFID = 0x00010008, }; enum rfid_15693_opt_mod_depth { RFID_15693_MOD_10ASK = 0x01, RFID_15693_MOD_100ASK = 0x02, }; enum rfid_15693_opt_vcd_coding { RFID_15693_VCD_CODING_1OUT256 = 0x01, RFID_15693_VCD_CODING_1OUT4 = 0x02, }; enum rfid_15693_opt_vicc_subc { RFID_15693_VICC_SUBC_SINGLE = 0x01, RFID_15693_VICC_SUBC_DUAL = 0x02, }; enum rfid_15693_opt_vicc_speed { RFID_15693_VICC_SPEED_SLOW = 0x01, RFID_15693_VICC_SPEED_FAST = 0x02, }; #ifdef __LIBRFID__ #define ISO15693_UID_LEN 8 #define ISO15693_CRC_LEN 2 /* ISO 15693-3, Ch. 7.2 Table 3 */ enum iso15693_request_flags { RFID_15693_F_SUBC_TWO = 0x01, RFID_15693_F_RATE_HIGH = 0x02, RFID_15693_F_INV_TABLE_5 = 0x04, RFID_15693_F_PROT_OEXT = 0x08, }; /* ISO 15693-3, Ch. 7.2 Table 4 */ enum iso15693_request_flags_table4 { RFID_15693_F4_SELECTED = 0x10, /* only VICC in 'select' state */ RFID_15693_F4_ADDRESS = 0x20, /* request is addressed */ RFID_15693_F4_CUSTOM = 0x40, }; /* ISO 15693-3, Ch. 7.2 Table 5 */ enum iso15693_request_flags_table5 { RFID_15693_F5_AFI_PRES = 0x10, /* AFI is present */ RFID_15693_F5_NSLOTS_1 = 0x20, /* only 1 slot (instead of 16) */ RFID_15693_F5_CUSTOM = 0x40, }; /* ISO 15963-3, Ch. 7.2 Figure 4 */ struct iso15693_request { u_int8_t flags; u_int8_t command; u_int8_t data[0]; } __attribute__ ((packed)); /* ISO 15963-3, Ch. 7.2 Figure 5 */ struct iso15693_response { u_int8_t flags; u_int8_t data[0]; } __attribute__ ((packed)); /* ISO 15693, Ch. 7.3 Table 6 */ enum iso15693_response_flags { RFID_15693_RF_ERROR = 0x01, RFID_15693_RF_EXTENDED = 0x08, }; /* ISO 15693, Ch. 7.3.2 Table 7 */ enum iso15693_response_errors { RFID_15693_ERR_NOTSUPP = 0x01, RFID_15693_ERR_INVALID = 0x02, /* command not recognized */ RFID_15693_ERR_UNKNOWN = 0x0f, /* unknown error */ RFID_15693_ERR_BLOCK_NA = 0x10, /* block not available */ RFID_15693_ERR_BLOCK_LOCKED = 0x11, RFID_15693_ERR_BLOCK_LOCKED_CH = 0x12, RFID_15693_ERR_BLOCK_NOTPROG = 0x13, RFID_15693_ERR_BLOCK_NOTLOCK = 0x14, /* 0xA0 .. 0xDF Custom Command error Codes */ }; /* ISO 15693, Ch. 7.4 */ enum iso15693_vicc_states { RFID_15693_STATE_POWER_OFF, RFID_15693_STATE_READY, RFID_15693_STATE_QUIET, RFID_15693_STATE_SELECTED, }; /* ISO 15693, Ch. 9.1 Table 10*/ enum iso15693_commands { /* Mandatory 0x01 .. 0x1f */ ISO15693_CMD_INVENTORY = 0x01, ISO15693_CMD_STAY_QUIET = 0x02, /* Optional 0x20 .. 0x9f */ ISO15693_CMD_READ_BLOCK_SINGLE = 0x20, ISO15693_CMD_WRITE_BLOCK_SINGLE = 0x21, ISO15693_CMD_LOCK_BLOCK = 0x22, ISO15693_CMD_READ_BLOCK_MULTI = 0x23, ISO15693_CMD_WRITE_BLOCK_MULTI = 0x24, ISO15693_CMD_SELECT = 0x25, ISO15693_CMD_RESET_TO_READY = 0x26, ISO15693_CMD_WRITE_AFI = 0x27, ISO15693_CMD_LOCK_AFI = 0x28, ISO15693_CMD_WRITE_DSFID = 0x29, ISO15693_CMD_LOCK_DSFID = 0x2a, ISO15693_CMD_GET_SYSINFO = 0x2b, ISO15693_CMD_GET_BLOCK_SECURITY = 0x2c, /* Custom 0xa0 .. 0xdf */ ICODE_CMD_INVENTORY_READ = 0xa0, ICODE_CMD_FAST_INVENTORY_READ = 0xa1, ICODE_CMD_EAS_SET = 0xa2, ICODE_CMD_EAS_RESET = 0xa3, ICODE_CMD_EAS_LOCK = 0xa4, ICODE_CMD_EAS_ALARM = 0xa5, /* Proprietary 0xe0 .. 0xff */ }; struct iso15693_anticol_cmd { struct iso15693_request req; unsigned char mask_len; unsigned char mask_bits[ISO15693_UID_LEN]; unsigned char current_slot; } __attribute__((packed)); struct iso15693_anticol_cmd_afi { struct iso15693_request req; unsigned char afi; unsigned char mask_len; unsigned char mask_bits[ISO15693_UID_LEN]; } __attribute__((packed)); /* Figure 11, Chapter 9.2.1 */ struct iso15693_anticol_resp { struct iso15693_response resp; u_int8_t dsfid; u_int8_t uuid[ISO15693_UID_LEN]; } __attribute__((packed)); #define ISO15693_T_SLOW 0 #define ISO15693_T_FAST 1 enum iso15693_t { ISO15693_T1, ISO15693_T2, ISO15693_T3, ISO15693_T4, ISO15693_T4_WRITE, }; /* in microseconds as per Chapter 8.4 table 8 */ extern const unsigned int iso15693_timing[2][5]; #include extern const struct rfid_layer2 rfid_layer2_iso15693; #endif /* __LIBRFID__ */ #endif /* _ISO15693_H */