* implement rfid_reader_{get,set}opt()
[librfid] / include / librfid / rfid_layer2_iso15693.h
index f84a6e1..495eebb 100644 (file)
@@ -4,49 +4,78 @@
 #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 */
 
-struct iso15693_handle;
-
-struct iso15693_transport {
-       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;
-};
-
 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 iso15693_state {
+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__
@@ -54,7 +83,7 @@ enum iso15693_state {
 #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,
@@ -83,7 +112,11 @@ struct iso15693_request {
        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 {
@@ -101,6 +134,7 @@ enum iso15693_response_errors {
        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 */
@@ -129,11 +163,51 @@ enum iso15693_commands {
        ISO15693_CMD_WRITE_DSFID        = 0x29,
        ISO15693_CMD_LOCK_DSFID         = 0x2a,
        ISO15693_CMD_GET_SYSINFO        = 0x2b,
-       ISO15693_CMD_GET_BLOCK_SECURITY = 0x2c
+       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 <librfid/rfid_layer2.h>
 extern const struct rfid_layer2 rfid_layer2_iso15693;