#define TIMEOUT 1236
/* Transceive a 7-bit short frame */
-static int
+int
iso14443a_transceive_sf(struct rfid_layer2_handle *handle,
unsigned char cmd,
struct iso14443a_atqa *atqa)
int ret;
unsigned int uid_size;
struct iso14443a_handle *h = &handle->priv.iso14443a;
- struct iso14443a_atqa atqa;
+ struct iso14443a_atqa *atqa = &h->atqa;
struct iso14443a_anticol_cmd acf;
unsigned int bit_of_col;
unsigned char sak[3];
unsigned int rx_len = sizeof(sak);
- char *aqptr = (char *) &atqa;
+ char *aqptr = (char *) atqa;
memset(handle->uid, 0, sizeof(handle->uid));
memset(sak, 0, sizeof(sak));
- memset(&atqa, 0, sizeof(atqa));
+ memset(atqa, 0, sizeof(&atqa));
memset(&acf, 0, sizeof(acf));
- ret = iso14443a_transceive_sf(handle, ISO14443A_SF_CMD_REQA, &atqa);
+ if (handle->flags & RFID_OPT_LAYER2_WUP)
+ ret = iso14443a_transceive_sf(handle, ISO14443A_SF_CMD_WUPA, atqa);
+ else
+ ret = iso14443a_transceive_sf(handle, ISO14443A_SF_CMD_REQA, atqa);
if (ret < 0) {
h->state = ISO14443A_STATE_REQA_SENT;
DEBUGP("error during transceive_sf: %d\n", ret);
DEBUGP("ATQA: 0x%02x 0x%02x\n", *aqptr, *(aqptr+1));
- if (!atqa.bf_anticol) {
+ if (!atqa->bf_anticol) {
h->state = ISO14443A_STATE_NO_BITFRAME_ANTICOL;
DEBUGP("no bitframe anticollission bits set, aborting\n");
return -1;
}
- if (atqa.uid_size == 2 || atqa.uid_size == 3)
+ if (atqa->uid_size == 2 || atqa->uid_size == 3)
uid_size = 3;
- else if (atqa.uid_size == 1)
+ else if (atqa->uid_size == 1)
uid_size = 2;
else
uid_size = 1;
return ret;
}
+static int
+iso14443a_getopt(struct rfid_layer2_handle *handle, int optname,
+ void *optval, unsigned int optlen)
+{
+ int ret = -EINVAL;
+ struct iso14443a_handle *h = &handle->priv.iso14443a;
+ struct iso14443a_atqa *atqa = optval;
+
+ switch (optname) {
+ case RFID_OPT_14443A_ATQA:
+ *atqa = h->atqa;
+ ret = 0;
+ break;
+ };
+
+ return ret;
+}
+
static struct rfid_layer2_handle *
iso14443a_init(struct rfid_reader_handle *rh)
if (!h)
return NULL;
+ memset(h, 0, sizeof(*h));
+
h->l2 = &rfid_layer2_iso14443a;
h->rh = rh;
h->priv.iso14443a.state = ISO14443A_STATE_NONE;
.close = &iso14443a_hlta,
.fini = &iso14443a_fini,
.setopt = &iso14443a_setopt,
+ .getopt = &iso14443a_getopt,
},
};