#include <sys/types.h>
/*
-07h = TagIt
-04h = I.CODE
-05h = Infineon
-02h = ST
-*/
+ * 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 */
-#if 0
-struct rfid_15693_handle;
-
-struct rfid_layer2_15693t {
- unsigned char *name;
-
- struct {
- int (*init)(struct iso15693_handle *handle);
- int (*fini)(struct iso15693_handle *handle);
-
-#if 0
- int (*transceive_sf)(struct iso14443a_handle *handle,
- unsigned char cmd,
- struct iso14443a_atqa *atqa);
- int (*transceive_acf)(struct iso14443a_handle *handle,
- struct iso14443a_anticol_cmd *acf,
- unsigned int *bit_of_col);
-#endif
- int (*transceive)(struct iso15693_handle *handle,
- const unsigned char *tx_buf,
- unsigned int tx_len,
- unsigned char *rx_buf,
- unsigned int *rx_len);
- } fn;
-
- union {
- } priv;
-};
-#endif
-
struct iso15693_handle {
unsigned int state;
- unsigned int ask100:1,
- out256:1;
+ 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_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 {
#define ISO15693_UID_LEN 8
#define ISO15693_CRC_LEN 2
-/* ISO 15693-3, Ch. 7.2 Table 3*/
+/* ISO 15693-3, Ch. 7.2 Table 3 */
enum iso15693_request_flags {
RFID_15693_F_SUBC_TWO = 0x01,
RFID_15693_F_RATE_HIGH = 0x02,
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_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 */
/* 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 <librfid/rfid_layer2.h>
extern const struct rfid_layer2 rfid_layer2_iso15693;