/* Mifare Ultralight implementation, PCD side.
*
- * (C) 2005 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2005-2006 by Harald Welte <laforge@gnumonks.org>
*
*/
*
* 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>
tx[0] = MIFARE_UL_CMD_READ;
tx[1] = page & 0xff;
- ret = rfid_layer2_transcieve(ph->l2h, RFID_14443A_FRAME_REGULAR,
+ ret = rfid_layer2_transceive(ph->l2h, RFID_14443A_FRAME_REGULAR,
tx, sizeof(tx), rx_buf,
&real_rx_len, MIFARE_UL_READ_FWT, 0);
for (i = 0; i < 4; i++)
tx[2+i] = tx_data[i];
- ret = rfid_layer2_transcieve(ph->l2h, RFID_14443A_FRAME_REGULAR,
+ ret = rfid_layer2_transceive(ph->l2h, RFID_14443A_FRAME_REGULAR,
tx, sizeof(tx), rx, &rx_len,
MIFARE_UL_WRITE_FWT, 0);
return ret;
}
-static int
-mful_transcieve(struct rfid_protocol_handle *ph,
- const unsigned char *tx_data, unsigned int tx_len,
- unsigned char *rx_data, unsigned int *rx_len,
- unsigned int timeout, unsigned int flags)
+static int
+mful_getopt(struct rfid_protocol_handle *ph, int optname, void *optval,
+ unsigned int *optlen)
{
- return -EINVAL;
+ int ret = -EINVAL;
+ unsigned int *size = optval;
+
+ switch (optname) {
+ case RFID_OPT_PROTO_SIZE:
+ ret = 0;
+ /* we have to return the size in bytes, not bits */
+ *size = 512/8;
+ break;
+ }
+
+ return ret;
}
+
static struct rfid_protocol_handle *
mful_init(struct rfid_layer2_handle *l2h)
{
struct rfid_protocol_handle *ph;
- ph = malloc(sizeof(struct rfid_protocol_handle));
+ u_int8_t atqa[2];
+ unsigned int atqa_len = sizeof(atqa);
+
+ if (l2h->l2->id != RFID_LAYER2_ISO14443A)
+ return NULL;
+
+ /* According to "Type Identification Procedure Rev. 1.3" */
+ rfid_layer2_getopt(l2h, RFID_OPT_14443A_ATQA,
+ atqa, &atqa_len);
+ if (atqa[0] != 0x44 || atqa[1] != 0x00)
+ return NULL;
+
+ /* according to "Functional Specification Rev. 3.0 */
+ if (l2h->uid_len != 7)
+ return NULL;
+
+ ph = malloc_protocol_handle(sizeof(struct rfid_protocol_handle));
return ph;
}
static int mful_fini(struct rfid_protocol_handle *ph)
{
- free(ph);
+ free_protocol_handle(ph);
return 0;
}
-struct rfid_protocol rfid_protocol_mful = {
+const struct rfid_protocol rfid_protocol_mful = {
.id = RFID_PROTOCOL_MIFARE_UL,
.name = "Mifare Ultralight",
.fn = {
.read = &mful_read,
.write = &mful_write,
.fini = &mful_fini,
+ .getopt = &mful_getopt,
},
};