*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include <stdio.h>
#include <stdlib.h>
#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,
mfcl_write(struct rfid_protocol_handle *ph, unsigned int page,
unsigned char *tx_data, unsigned int tx_len)
{
- unsigned int i;
- unsigned char tx[18];
+ unsigned char tx[2];
unsigned char rx[1];
- unsigned int rx_len;
+ unsigned int rx_len = sizeof(rx);
int ret;
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_WRITE16;
+ tx[1] = page & 0xff;
- tx[0] = MIFARE_CL_CMD_WRITE4;
- 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;
- memcpy(tx+2, tx_data, 4);
+ 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;
- 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;
+ if (rx[0] != MIFARE_UL_RESP_ACK)
+ return -EIO;
- if (rx[0] != MIFARE_UL_RESP_ACK)
- return -EIO;
+ return ret;
+}
+static int
+mfcl_getopt(struct rfid_protocol_handle *ph, int optname, void *optval,
+ unsigned int *optlen)
+{
+ int ret = -EINVAL;
+ u_int8_t atqa[2];
+ unsigned int atqa_size = sizeof(atqa);
+ unsigned int *size = optval;
+
+ switch (optname) {
+ case RFID_OPT_PROTO_SIZE:
+ if (*optlen < sizeof(*size))
+ return -EINVAL;
+ *optlen = sizeof(*size);
+ ret = 0;
+ rfid_layer2_getopt(ph->l2h, RFID_OPT_14443A_ATQA,
+ atqa, &atqa_size);
+ if (atqa[0] == 0x04 && atqa[1] == 0x00)
+ *size = 1024;
+ else if (atqa[0] == 0x02 && atqa[1] == 0x00)
+ *size = 4096;
+ else
+ ret = -EIO;
+ break;
}
return ret;
.read = &mfcl_read,
.write = &mfcl_write,
.fini = &mfcl_fini,
+ .getopt = &mfcl_getopt,
},
};