+#if 0
+
+static int
+iso15693_lock_block()
+{
+}
+
+#endif
+
+/* Helper function to build an ISO 15693 anti collision frame */
+static int
+iso15693_build_acf(u_int8_t *target, u_int8_t flags, u_int8_t afi,
+ u_int8_t mask_len, u_int8_t *mask)
+{
+ struct iso15693_request *req = (struct iso15693_request *) target;
+ int i = 0, j, mask_bytes;
+ u_int8_t byte=0;
+ void* mask_p;
+
+ req->flags = flags;
+ req->command = ISO15693_CMD_INVENTORY;
+ if (flags & RFID_15693_F5_AFI_PRES)
+ req->data[i++] = afi;
+ req->data[i++] = mask_len;
+
+ mask_bytes = mask_len/8 + (mask_len%8)?1:0;
+ mask_p = &req->data[i];
+
+ for (j = 0; j < mask_bytes; j++)
+ req->data[i++] = mask[j];
+
+ byte = 0xFF >> (8-mask_len%8);
+ req->data[i-1] &= byte;
+
+ DEBUGP("mask_len: %d mask_bytes: %d i: %d return: %d mask:%s\n",
+ mask_len,mask_bytes,i,i + sizeof(*req),rfid_hexdump(mask_p,mask_bytes));
+ return i + sizeof(*req);
+}
+
+static int
+iso15693_anticol(struct rfid_layer2_handle *handle)
+{
+ int i, ret, mask_len;
+ int tx_len, rx_len;
+ int num_valid = 0;
+ union {
+ struct iso15693_anticol_cmd_afi w_afi;
+ struct iso15693_anticol_cmd no_afi;
+ } acf;
+
+ struct iso15693_anticol_resp resp;
+
+ u_int8_t boc;
+#define MAX_SLOTS 16
+ int num_slots = MAX_SLOTS;
+
+ u_int8_t uuid_list[MAX_SLOTS][ISO15693_UID_LEN];
+ int uuid_list_valid[MAX_SLOTS];
+
+ u_int8_t flags;
+
+#define MY_NONE 0
+#define MY_COLL 1
+#define MY_UUID 2
+
+ memset(uuid_list_valid, MY_NONE, sizeof(uuid_list_valid));
+ memset(uuid_list, 0, sizeof(uuid_list));
+
+ //memset(&acf, 0, sizeof(acf));
+
+ /* FIXME: we can't use multiple slots at this point, since the RC632
+ * with librfid on the host PC has too much latency between 'EOF pulse
+ * to mark start of next slot' and 'receive data' commands :( */
+
+ flags = RFID_15693_F_INV_TABLE_5;
+ if (handle->priv.iso15693.vicc_fast)
+ flags |= RFID_15693_F_RATE_HIGH;
+ if (handle->priv.iso15693.vicc_two_subc)
+ flags |= RFID_15693_F_SUBC_TWO;
+ if (handle->priv.iso15693.single_slot) {
+ flags |= RFID_15693_F5_NSLOTS_1;
+ num_slots = 1;
+ }
+ if (handle->priv.iso15693.use_afi)
+ flags |= RFID_15693_F5_AFI_PRES;
+#if 1
+ tx_len = iso15693_build_acf((u_int8_t *)&acf, flags,
+ handle->priv.iso15693.afi, 0, NULL);
+#else
+ /*FIXME: testcode*/
+ u_int8_t uid[8]={0x1f, 0x1e, 0x95, 0x01, 0x00, 0x01, 0x04, 0xe0};
+ //u_int8_t uid[8]={0xe3, 0xe8, 0xf1, 0x01, 0x00, 0x00, 0x07, 0xe0};
+ tx_len = iso15693_build_acf((u_int8_t *)&acf, flags,
+ handle->priv.iso15693.afi, 2, uid);
+#endif
+start_of_ac_loop:
+ for (i = 0; i < num_slots; i++) {
+ rx_len = sizeof(resp);
+ memset(&resp, 0, rx_len);
+ ret = iso15693_transceive_acf(handle,
+ (struct iso15693_anticol_cmd *) &acf,
+ tx_len, &resp, &rx_len, &boc);
+
+ if (ret == -ETIMEDOUT) {
+ //DEBUGP("no answer from vicc in slot %d\n", i);
+ DEBUGP("slot[%d]: timeout\n",i);
+ uuid_list_valid[i] = MY_NONE;
+ } else if (ret < 0) {
+ DEBUGP("slot[%d]: ERROR ret: %d\n", i, ret);
+ uuid_list_valid[i] = MY_NONE;
+ } else {
+ if (ret)
+ DEBUGP("iso15693_transceive_acf() ret: %d\n",ret);
+ if (boc) {
+ DEBUGP("slot[%d]: Collision! bit:%d byte:%d,%d (UID bit:%d byte:%d,%d)\n",
+ i, boc,boc/8,boc%8,
+ boc-16,(boc-16)/8,(boc-16)%8);
+ DEBUGP("Slot[%d]: ret: %d DSFID: %02x UUID: %s\n", i, ret,
+ resp.dsfid, rfid_hexdump(resp.uuid, ISO15693_UID_LEN));
+
+ uuid_list_valid[i]=-boc;
+ memcpy(uuid_list[i], resp.uuid, ISO15693_UID_LEN);
+ } else {
+ DEBUGP("Slot[%d]: ret: %d DSFID: %02x UUID: %s\n", i, ret,
+ resp.dsfid, rfid_hexdump(resp.uuid, ISO15693_UID_LEN));
+ uuid_list_valid[i] = MY_UUID;
+ memcpy(&uuid_list[i][0], resp.uuid, ISO15693_UID_LEN);
+
+ memcpy(handle->uid,resp.uuid, ISO15693_UID_LEN);
+ /* FIXME: move to init_iso15693 */
+ handle->uid_len = ISO15693_UID_LEN;
+ return 1;
+ }