X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=src%2Frfid_layer2_iso15693.c;h=f5da8c2d412dfd44249aadf4f472d60b0cc330be;hb=76035dde436231f1fd8fd1fe8d4ccf493a3021f6;hp=15ff18acca7cc83af39ac749f73a7f2f2681bf6c;hpb=05c7e304271bcf88901da3782fcd3f28a0c7c9cf;p=librfid diff --git a/src/rfid_layer2_iso15693.c b/src/rfid_layer2_iso15693.c index 15ff18a..f5da8c2 100644 --- a/src/rfid_layer2_iso15693.c +++ b/src/rfid_layer2_iso15693.c @@ -1,6 +1,6 @@ /* ISO 15693 anticollision implementation * - * (C) 2005 by Harald Welte + * (C) 2005-2006 by Harald Welte * */ @@ -22,258 +22,127 @@ #include #include #include +#include -#include -#include -#include -#include +#include +#include +#include +#include -#if 0 -/* Transcieve a 7-bit short frame */ -static int -iso14443a_transcieve_sf(struct rfid_layer2_handle *handle, - unsigned char cmd, - struct iso14443a_atqa *atqa) -{ - struct rfid_reader *rdr = handle->rh->reader; +struct iso15693_request_read { + struct iso15693_request req; + u_int64_t uid; + u_int8_t blocknum; +} __attribute__ ((packed)); - return rdr->iso14443a.transcieve_sf(handle->rh, cmd, atqa); -} +#define ISO15693_BLOCK_SIZE_MAX (256/8) +#define ISO15693_RESP_SIZE_MAX (4+ISO15693_BLOCK_SIZE_MAX) -/* Transmit an anticollission bit frame */ +#if 0 static int -iso14443a_transcieve_acf(struct rfid_layer2_handle *handle, - struct iso14443a_anticol_cmd *acf, - unsigned int *bit_of_col) -{ - struct rfid_reader *rdr = handle->rh->reader; - - return rdr->iso14443a.transcieve_acf(handle->rh, acf, bit_of_col); -} - -/* Transmit a regular frame */ -static int -iso14443a_transcieve(struct rfid_layer2_handle *handle, - const unsigned char *tx_buf, unsigned int tx_len, - unsigned char *rx_buf, unsigned int *rx_len, - u_int64_t, unsigned int flags) +iso15693_read_block(struct rfid_layer2_handle *handle, + u_int8_t blocknr, u_int32_t *data) { - return handle->rh->reader->transcieve(handle->rh, tx_buf, tx_len, - rx_buf, rx_len, timeout, flags); -} + int rc; + struct iso15693_request_read req; + u_int8_t resp[ISO15693_RESP_SIZE_MAX]; -static int -iso14443a_code_nvb_bits(unsigned char *nvb, unsigned int bits) -{ - unsigned int byte_count = bits / 8; - unsigned int bit_count = bits % 8; + req.req.flags = 0; + req.command = ISO15693_CMD_READ_BLOCK_SINGLE; + memcpy(&req.uid, handle->..., ISO15693_UID_LEN); + req.blocknum = blocknr; - if (byte_count < 2 || byte_count > 7) - return -1; + /* FIXME: fill CRC if required */ - *nvb = ((byte_count & 0xf) << 4) | bit_count; + rc = iso15693_transceive(... &req, ..., ); - return 0; -} + if (rc < 0) + return rc; -/* first bit is '1', second bit '2' */ -static void -set_bit_in_field(unsigned char *bitfield, unsigned int bit) -{ - unsigned int byte_count = bit / 8; - unsigned int bit_count = bit % 8; + memcpy(data, resp+1, rc-1); /* FIXME rc-3 in case of CRC */ - DEBUGP("bitfield=%p, byte_count=%u, bit_count=%u\n", - bitfield, byte_count, bit_count); - DEBUGP("%p = 0x%02x\n", (bitfield+byte_count), *(bitfield+byte_count)); - *(bitfield+byte_count) |= 1 << (bit_count-1); - DEBUGP("%p = 0x%02x\n", (bitfield+byte_count), *(bitfield+byte_count)); + return rc-1; } static int -iso14443a_anticol(struct rfid_layer2_handle *handle) +iso15693_write_block() { - int ret; - unsigned int uid_size; - struct iso14443a_atqa atqa; - struct iso14443a_anticol_cmd acf; - unsigned int bit_of_col; - unsigned char sak[3]; - unsigned char uid[10]; // triple size equals 10 bytes; - unsigned int rx_len = sizeof(sak); - char *aqptr = (char *) &atqa; - static int first = 0; - - memset(uid, 0, sizeof(uid)); - memset(sak, 0, sizeof(sak)); - memset(&atqa, 0, sizeof(atqa)); - memset(&acf, 0, sizeof(acf)); - - if (first == 0) { - DEBUGP("Sending REQA\n"); - ret = iso14443a_transcieve_sf(handle, ISO14443A_SF_CMD_REQA, &atqa); - first = 1; - } else { - DEBUGP("Sending WUPA\n"); - ret = iso14443a_transcieve_sf(handle, ISO14443A_SF_CMD_WUPA, &atqa); - } - - if (ret < 0) { - handle->priv.iso14443a.state = ISO14443A_STATE_REQA_SENT; - DEBUGP("error during transcieve_sf: %d\n", ret); - return ret; - } - handle->priv.iso14443a.state = ISO14443A_STATE_ATQA_RCVD; + struct iso16593_request_read *rreq; + u_int32_t buf[sizeof(req)+ISO15693_BLOCK_SIZE_MAX]; - DEBUGP("ATQA: 0x%02x 0x%02x\n", *aqptr, *(aqptr+1)); + rreq = (struct iso15693_request_read *) req; - if (!atqa.bf_anticol) { - handle->priv.iso14443a.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) - uid_size = 3; - else if (atqa.uid_size == 1) - uid_size = 2; - else - uid_size = 1; - - acf.sel_code = ISO14443A_AC_SEL_CODE_CL1; - - handle->priv.iso14443a.state = ISO14443A_STATE_ANTICOL_RUNNING; - handle->priv.iso14443a.level = ISO14443A_LEVEL_CL1; - -cascade: - iso14443a_code_nvb_bits(&acf.nvb, 16); - - ret = iso14443a_transcieve_acf(handle, &acf, &bit_of_col); - if (ret < 0) - return ret; - DEBUGP("bit_of_col = %u\n", bit_of_col); - - while (bit_of_col != ISO14443A_BITOFCOL_NONE) { - set_bit_in_field(&acf.uid_bits[0], bit_of_col-16); - iso14443a_code_nvb_bits(&acf.nvb, bit_of_col); - ret = iso14443a_transcieve_acf(handle, &acf, &bit_of_col); - DEBUGP("bit_of_col = %u\n", bit_of_col); - if (ret < 0) - return ret; - } + rreq->req.flags = ; + rreq->req.command = ISO15693_CMD_WRITE_BLOCK_SINGLE; + memcpy(rreq->uid, handle->, ISO15693_UID_LEN); + rreq->blocknum = blocknr; + memcpy(rreq->); - iso14443a_code_nvb_bits(&acf.nvb, 7*8); - ret = iso14443a_transcieve(handle, (unsigned char *)&acf, 7, - (unsigned char *) &sak, &rx_len, - TIMEOUT, 0); - if (ret < 0) - return ret; - - if (sak[0] & 0x04) { - /* Cascade bit set, UID not complete */ - switch (acf.sel_code) { - case ISO14443A_AC_SEL_CODE_CL1: - /* cascading from CL1 to CL2 */ - if (acf.uid_bits[0] != 0x88) { - DEBUGP("Cascade bit set, but UID0 != 0x88\n"); - return -1; - } - memcpy(&uid[0], &acf.uid_bits[1], 3); - acf.sel_code = ISO14443A_AC_SEL_CODE_CL2; - handle->priv.iso14443a.level = ISO14443A_LEVEL_CL2; - break; - case ISO14443A_AC_SEL_CODE_CL2: - /* cascading from CL2 to CL3 */ - memcpy(&uid[3], &acf.uid_bits[1], 3); - acf.sel_code = ISO14443A_AC_SEL_CODE_CL3; - handle->priv.iso14443a.level = ISO14443A_LEVEL_CL3; - break; - default: - DEBUGP("cannot cascade any further than CL3\n"); - handle->priv.iso14443a.state = ISO14443A_STATE_ERROR; - return -1; - break; - } - goto cascade; - - } else { - switch (acf.sel_code) { - case ISO14443A_AC_SEL_CODE_CL1: - /* single size UID (4 bytes) */ - memcpy(&uid[0], &acf.uid_bits[0], 4); - break; - case ISO14443A_AC_SEL_CODE_CL2: - /* double size UID (7 bytes) */ - memcpy(&uid[3], &acf.uid_bits[0], 4); - break; - case ISO14443A_AC_SEL_CODE_CL3: - /* triple size UID (10 bytes) */ - memcpy(&uid[6], &acf.uid_bits[0], 4); - break; - } - } +} - handle->priv.iso14443a.level = ISO14443A_LEVEL_NONE; - handle->priv.iso14443a.state = ISO14443A_STATE_SELECTED; +static int +iso15693_lock_block() +{ +} - { - int uid_len; - if (uid_size == 1) - uid_len = 4; - else if (uid_size == 2) - uid_len = 7; - else - uid_len = 10; +#endif - DEBUGP("UID %s\n", rfid_hexdump(uid, uid_len)); - } +static int +iso15693_anticol(struct rfid_layer2_handle *handle) +{ + return -1; +} - if (sak[0] & 0x20) { - DEBUGP("we have a T=CL compliant PICC\n"); - handle->priv.iso14443a.tcl_capable = 1; - } else { - DEBUGP("we have a T!=CL PICC\n"); - handle->priv.iso14443a.tcl_capable = 0; +static int +iso15693_getopt(struct rfid_layer2_handle *handle, + int optname, void *optval, unsigned int optlen) +{ + switch (optname) { + case RFID_OPT_15693_MOD_DEPTH: + case RFID_OPT_15693_VCD_CODING: + case RFID_OPT_15693_VICC_SUBC: + case RFID_OPT_15693_VICC_SPEED: + default: + return -EINVAL; + break; } - return 0; } static int -iso14443a_hlta(struct rfid_layer2_handle *handle) +iso15693_setopt(struct rfid_layer2_handle *handle, int optname, + const void *optval, unsigned int optlen) { - int ret; - unsigned char tx_buf[2] = { 0x50, 0x00 }; - unsigned char rx_buf[10]; - unsigned int rx_len = sizeof(rx_buf); - + switch (optname) { + case RFID_OPT_15693_MOD_DEPTH: + case RFID_OPT_15693_VCD_CODING: + case RFID_OPT_15693_VICC_SUBC: + case RFID_OPT_15693_VICC_SPEED: + default: + return -EINVAL; + break; + } return 0; +} - ret = iso14443a_transcieve(handle, tx_buf, sizeof(tx_buf), - rx_buf, &rx_len, 1000 /* 1ms */, 0); - if (ret < 0) { - /* "error" case: we don't get somethng back from the card */ - return 0; - } - return -1; +static int transceive_inventory(struct rfid_layer2_handle *l2h) +{ } -#endif static struct rfid_layer2_handle * iso15693_init(struct rfid_reader_handle *rh) { int ret; - struct rfid_layer2_handle *h = malloc(sizeof(*h)); + struct rfid_layer2_handle *h = malloc_layer2_handle(sizeof(*h)); if (!h) return NULL; h->l2 = &rfid_layer2_iso15693; h->rh = rh; h->priv.iso15693.state = ISO15693_STATE_NONE; - ret = h->rh->reader->iso15693.init(h->rh); if (ret < 0) { - free(h); + free_layer2_handle(h); return NULL; } @@ -283,20 +152,22 @@ iso15693_init(struct rfid_reader_handle *rh) static int iso15693_fini(struct rfid_layer2_handle *handle) { - free(handle); + free_layer2_handle(handle); return 0; } -struct rfid_layer2 rfid_layer2_iso15693 = { +const struct rfid_layer2 rfid_layer2_iso15693 = { .id = RFID_LAYER2_ISO15693, .name = "ISO 15693", .fn = { .init = &iso15693_init, - //.open = &iso15693_anticol, - //.transcieve = &iso15693_transcieve, + .open = &iso15693_anticol, + //.transceive = &iso15693_transceive, //.close = &iso14443a_hlta, .fini = &iso15693_fini, + .setopt = &iso15693_setopt, + .getopt = &iso15693_getopt, }, };