summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlaforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede>2008-01-26 09:29:56 +0000
committerlaforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede>2008-01-26 09:29:56 +0000
commit5fed5fd6d775183e8416d5e5c9f3fae3742be038 (patch)
tree130240deaa156ccbc2683e258a3a657401dc0470
parenta1cdbe1316941b156fd6eafba477c242aa36e6fb (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.c64
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;
}
personal git repositories of Harald Welte. Your mileage may vary