diff options
author | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2008-01-26 09:29:56 +0000 |
---|---|---|
committer | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2008-01-26 09:29:56 +0000 |
commit | 5fed5fd6d775183e8416d5e5c9f3fae3742be038 (patch) | |
tree | 130240deaa156ccbc2683e258a3a657401dc0470 | |
parent | a1cdbe1316941b156fd6eafba477c242aa36e6fb (diff) |
mifare classic:
* Use the officially specified FWT values
* READ4 is only ultralight, not classic. So remove from classic codepath
(Frederic RODO)
git-svn-id: https://svn.gnumonks.org/trunk/librfid@2046 e0336214-984f-0b4b-a45f-81c69e1f0ede
-rw-r--r-- | src/rfid_proto_mifare_classic.c | 64 |
1 files changed, 17 insertions, 47 deletions
diff --git a/src/rfid_proto_mifare_classic.c b/src/rfid_proto_mifare_classic.c index e981e51..fa9b4e2 100644 --- a/src/rfid_proto_mifare_classic.c +++ b/src/rfid_proto_mifare_classic.c @@ -38,9 +38,8 @@ #define MIFARE_UL_CMD_WRITE 0xA2 #define MIFARE_UL_CMD_READ 0x30 -/* FIXME */ -#define MIFARE_CL_READ_FWT 100 -#define MIFARE_CL_WRITE_FWT 100 +#define MIFARE_CL_READ_FWT 250 +#define MIFARE_CL_WRITE_FWT 600 static int mfcl_read(struct rfid_protocol_handle *ph, unsigned int page, @@ -79,7 +78,7 @@ static int mfcl_write(struct rfid_protocol_handle *ph, unsigned int page, unsigned char *tx_data, unsigned int tx_len) { - unsigned char tx[18]; + unsigned char tx[2]; unsigned char rx[1]; unsigned int rx_len = sizeof(rx); int ret; @@ -87,54 +86,25 @@ mfcl_write(struct rfid_protocol_handle *ph, unsigned int page, if (page > MIFARE_CL_PAGE_MAX) return -EINVAL; - if (tx_len != 16 && tx_len != 4) + if (tx_len != 16) return -EINVAL; - if (tx_len == 16) { - tx[0] = MIFARE_CL_CMD_WRITE16; - tx[1] = page & 0xff; - - ret = rfid_layer2_transceive(ph->l2h, RFID_MIFARE_FRAME, tx, - 2, rx, &rx_len, - MIFARE_CL_WRITE_FWT, 0); - if (ret < 0) - return ret; - - ret = rfid_layer2_transceive(ph->l2h, RFID_MIFARE_FRAME, tx_data, - tx_len, rx, &rx_len, - MIFARE_CL_WRITE_FWT, 0); - if (ret < 0) - return ret; - - if (rx[0] != MIFARE_UL_RESP_ACK) - return -EIO; - - ret = rfid_layer2_transceive(ph->l2h, RFID_MIFARE_FRAME, tx, - sizeof(tx), rx, &rx_len, - MIFARE_CL_WRITE_FWT, 0); - if (ret < 0) - return ret; - - if (rx[0] != MIFARE_UL_RESP_ACK) - return -EIO; - - } else if (tx_len == 4) { - - tx[0] = MIFARE_CL_CMD_WRITE4; - tx[1] = page & 0xff; - - memcpy(tx+2, tx_data, 4); + tx[0] = MIFARE_CL_CMD_WRITE16; + tx[1] = page & 0xff; - ret = rfid_layer2_transceive(ph->l2h, RFID_MIFARE_FRAME, tx, - 2+4, rx, &rx_len, - MIFARE_CL_WRITE_FWT, 0); - if (ret < 0) - return ret; + ret = rfid_layer2_transceive(ph->l2h, RFID_MIFARE_FRAME, tx, 2, rx, + &rx_len, MIFARE_CL_WRITE_FWT, 0); + if (ret < 0) + return ret; - if (rx[0] != MIFARE_UL_RESP_ACK) - return -EIO; + ret = rfid_layer2_transceive(ph->l2h, RFID_MIFARE_FRAME, tx_data, + tx_len, rx, &rx_len, + MIFARE_CL_WRITE_FWT, 0); + if (ret < 0) + return ret; - } + if (rx[0] != MIFARE_UL_RESP_ACK) + return -EIO; return ret; } |