42#define CHIP_NAME "NXP Ultralight"
43#define MANUFACTURER_NAME "NXP"
44#define SUPPLY_VOLTAGE_MIN 3.3f
45#define SUPPLY_VOLTAGE_MAX 4.0f
46#define MAX_CURRENT 30.0f
47#define TEMPERATURE_MIN -25.0f
48#define TEMPERATURE_MAX 70.0f
49#define DRIVER_VERSION 1000
54#define MIFARE_ULTRALIGHT_COMMAND_REQUEST 0x26
55#define MIFARE_ULTRALIGHT_COMMAND_WAKE_UP 0x52
56#define MIFARE_ULTRALIGHT_COMMAND_ANTICOLLISION_CL1 0x9320U
57#define MIFARE_ULTRALIGHT_COMMAND_SELECT_CL1 0x9370U
58#define MIFARE_ULTRALIGHT_COMMAND_ANTICOLLISION_CL2 0x9520U
59#define MIFARE_ULTRALIGHT_COMMAND_SELECT_CL2 0x9570U
60#define MIFARE_ULTRALIGHT_COMMAND_HALT 0x5000U
61#define MIFARE_ULTRALIGHT_COMMAND_GET_VERSION 0x60
62#define MIFARE_ULTRALIGHT_COMMAND_READ 0x30
63#define MIFARE_ULTRALIGHT_COMMAND_FAST_READ 0x3A
64#define MIFARE_ULTRALIGHT_COMMAND_WRITE 0xA2
65#define MIFARE_ULTRALIGHT_COMMAND_COMP_WRITE 0xA0
66#define MIFARE_ULTRALIGHT_COMMAND_READ_CNT 0x39
67#define MIFARE_ULTRALIGHT_COMMAND_INCR_CNT 0xA5
68#define MIFARE_ULTRALIGHT_COMMAND_PWD_AUTH 0x1B
69#define MIFARE_ULTRALIGHT_COMMAND_READ_SIG 0x3C
70#define MIFARE_ULTRALIGHT_COMMAND_CHECK_TEARING_EVENT 0x3E
71#define MIFARE_ULTRALIGHT_COMMAND_VCSL 0x4B
79static void a_mifare_ultralight_iso14443a_crc(uint8_t *p, uint8_t len, uint8_t output[2])
81 uint32_t w_crc = 0x6363;
88 bt = (bt ^ (uint8_t)(w_crc & 0x00FF));
89 bt = (bt ^ (bt << 4));
90 w_crc = (w_crc >> 8) ^ ((uint32_t) bt << 8) ^ ((uint32_t) bt << 3) ^ ((uint32_t) bt >> 4);
93 output[0] = (uint8_t)(w_crc & 0xFF);
94 output[1] = (uint8_t)((w_crc >> 8) & 0xFF);
111 uint8_t input_buf[5];
113 uint8_t output_buf[6];
120 a_mifare_ultralight_iso14443a_crc(input_buf , 3, input_buf + 3);
125 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
131 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
135 a_mifare_ultralight_iso14443a_crc(output_buf, 4, crc_buf);
136 if ((output_buf[4] == crc_buf[0]) && (output_buf[5] == crc_buf[1]))
138 memcpy(data, output_buf, 4);
144 handle->
debug_print(
"mifare_ultralight: crc error.\n");
164 uint8_t input_buf[8];
166 uint8_t output_buf[1];
171 input_buf[2] = data[0];
172 input_buf[3] = data[1];
173 input_buf[4] = data[2];
174 input_buf[5] = data[3];
175 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
180 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
186 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
190 if (output_buf[0] != 0xA)
192 handle->
debug_print(
"mifare_ultralight: ack error.\n");
221 handle->
end_page = (uint8_t)storage;
276 handle->
debug_print(
"mifare_ultralight: contactless_init is null.\n");
282 handle->
debug_print(
"mifare_ultralight: contactless_deinit is null.\n");
288 handle->
debug_print(
"mifare_ultralight: contactless_transceiver is null.\n");
294 handle->
debug_print(
"mifare_ultralight: delay_ms is null.\n");
302 handle->
debug_print(
"mifare_ultralight: contactless init failed.\n");
339 handle->
debug_print(
"mifare_ultralight: contactless deinit failed.\n");
365 uint8_t input_buf[1];
367 uint8_t output_buf[2];
384 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
390 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
394 if ((output_buf[0] == 0x44) && (output_buf[1] == 0x00))
397 handle->
type = *type;
404 handle->
type = *type;
405 handle->
debug_print(
"mifare_ultralight: type is invalid.\n");
428 uint8_t input_buf[1];
430 uint8_t output_buf[2];
448 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
454 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
458 if ((output_buf[0] == 0x44) && (output_buf[1] == 0x00))
461 handle->
type = *type;
468 handle->
type = *type;
469 handle->
debug_print(
"mifare_ultralight: type is invalid.\n");
488 uint8_t input_buf[4];
490 uint8_t output_buf[1];
504 a_mifare_ultralight_iso14443a_crc(input_buf, 2, input_buf + 2);
530 uint8_t input_buf[2];
532 uint8_t output_buf[5];
550 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
556 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
561 for (i = 0; i < 4; i++)
563 id[i] = output_buf[i];
564 check ^= output_buf[i];
566 if (check != output_buf[4])
568 handle->
debug_print(
"mifare_ultralight: check error.\n");
595 uint8_t input_buf[2];
597 uint8_t output_buf[5];
615 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
621 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
626 for (i = 0; i < 4; i++)
628 id[i] = output_buf[i];
629 check ^= output_buf[i];
631 if (check != output_buf[4])
633 handle->
debug_print(
"mifare_ultralight: check error.\n");
659 uint8_t input_buf[9];
661 uint8_t output_buf[1];
676 for (i = 0; i < 4; i++)
678 input_buf[2 + i] =
id[i];
679 input_buf[6] ^=
id[i];
681 a_mifare_ultralight_iso14443a_crc(input_buf, 7, input_buf + 7);
686 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
692 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
696 if (output_buf[0] == 0x04)
702 handle->
debug_print(
"mifare_ultralight: sak error.\n");
726 uint8_t input_buf[9];
728 uint8_t output_buf[1];
743 for (i = 0; i < 4; i++)
745 input_buf[2 + i] =
id[i];
746 input_buf[6] ^=
id[i];
748 a_mifare_ultralight_iso14443a_crc(input_buf, 7, input_buf + 7);
753 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
759 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
763 if (output_buf[0] == 0x00)
769 handle->
debug_print(
"mifare_ultralight: sak error.\n");
792 uint8_t input_buf[3];
794 uint8_t output_buf[10];
808 a_mifare_ultralight_iso14443a_crc(input_buf, 1, input_buf + 1);
813 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
817 if (output_len != 10)
819 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
823 a_mifare_ultralight_iso14443a_crc(output_buf, 8, crc_buf);
824 if ((output_buf[8] == crc_buf[0]) && (output_buf[9] == crc_buf[1]))
851 handle->
debug_print(
"mifare_ultralight: crc error.\n");
876 uint8_t input_buf[4];
878 uint8_t output_buf[5];
891 handle->
debug_print(
"mifare_ultralight: addr > 0x2.\n");
899 a_mifare_ultralight_iso14443a_crc(input_buf, 2, input_buf + 2);
904 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
910 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
914 a_mifare_ultralight_iso14443a_crc(output_buf, 3, crc_buf);
915 if ((output_buf[3] == crc_buf[0]) && (output_buf[4] == crc_buf[1]))
917 *cnt = ((uint32_t)output_buf[2] << 16) | ((uint32_t)output_buf[1] << 8) |
918 ((uint32_t)output_buf[0] << 0);
924 handle->
debug_print(
"mifare_ultralight: crc error.\n");
949 uint8_t input_buf[8];
951 uint8_t output_buf[1];
963 handle->
debug_print(
"mifare_ultralight: addr > 0x2.\n");
971 input_buf[2] = (cnt >> 0) & 0xFF;
972 input_buf[3] = (cnt >> 8) & 0xFF;
973 input_buf[4] = (cnt >> 16) & 0xFF;
975 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
980 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
986 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
990 if (output_buf[0] != 0xA)
992 handle->
debug_print(
"mifare_ultralight: ack error.\n");
1019 uint8_t input_buf[4];
1021 uint8_t output_buf[3];
1034 handle->
debug_print(
"mifare_ultralight: addr > 0x2.\n");
1041 input_buf[1] = addr;
1042 a_mifare_ultralight_iso14443a_crc(input_buf, 2, input_buf + 2);
1047 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1051 if (output_len != 3)
1053 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1057 a_mifare_ultralight_iso14443a_crc(output_buf, 1, crc_buf);
1058 if ((output_buf[1] == crc_buf[0]) && (output_buf[2] == crc_buf[1]))
1060 *flag = output_buf[0];
1066 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1088 uint8_t pcd_capabilities[4], uint8_t *identifier)
1092 uint8_t input_buf[23];
1094 uint8_t output_buf[3];
1108 memcpy(input_buf + 1, installation_identifier, 16);
1109 memcpy(input_buf + 17, pcd_capabilities, 4);
1110 a_mifare_ultralight_iso14443a_crc(input_buf, 21, input_buf + 21);
1115 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1119 if (output_len != 3)
1121 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1125 a_mifare_ultralight_iso14443a_crc(output_buf, 1, crc_buf);
1126 if ((output_buf[1] == crc_buf[0]) && (output_buf[2] == crc_buf[1]))
1128 *identifier = output_buf[0];
1134 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1157 uint8_t input_buf[4];
1159 uint8_t output_buf[34];
1173 input_buf[1] = 0x00;
1174 a_mifare_ultralight_iso14443a_crc(input_buf, 2, input_buf + 2);
1179 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1183 if (output_len != 34)
1185 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1189 a_mifare_ultralight_iso14443a_crc(output_buf, 32, crc_buf);
1190 if ((output_buf[32] == crc_buf[0]) && (output_buf[33] == crc_buf[1]))
1192 memcpy(signature, output_buf, 32);
1198 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1221 uint8_t input_buf[4];
1223 uint8_t output_buf[18];
1237 input_buf[1] = 0x00;
1238 a_mifare_ultralight_iso14443a_crc(input_buf , 2, input_buf + 2);
1243 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1247 if (output_len != 18)
1249 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1253 a_mifare_ultralight_iso14443a_crc(output_buf, 16, crc_buf);
1254 if ((output_buf[16] == crc_buf[0]) && (output_buf[17] == crc_buf[1]))
1256 number[0] = output_buf[0];
1257 number[1] = output_buf[1];
1258 number[2] = output_buf[2];
1259 number[3] = output_buf[4];
1260 number[4] = output_buf[5];
1261 number[5] = output_buf[6];
1262 number[6] = output_buf[7];
1268 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1292 uint8_t input_buf[4];
1294 uint8_t output_buf[18];
1308 input_buf[1] = start_page;
1309 a_mifare_ultralight_iso14443a_crc(input_buf , 2, input_buf + 2);
1314 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1318 if (output_len != 18)
1320 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1324 a_mifare_ultralight_iso14443a_crc(output_buf, 16, crc_buf);
1325 if ((output_buf[16] == crc_buf[0]) && (output_buf[17] == crc_buf[1]))
1327 memcpy(data, output_buf, 16);
1333 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1357 uint8_t input_buf[4];
1359 uint8_t output_buf[18];
1373 input_buf[1] = page;
1374 a_mifare_ultralight_iso14443a_crc(input_buf , 2, input_buf + 2);
1379 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1383 if (output_len != 18)
1385 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1389 a_mifare_ultralight_iso14443a_crc(output_buf, 16, crc_buf);
1390 if ((output_buf[16] == crc_buf[0]) && (output_buf[17] == crc_buf[1]))
1392 memcpy(data, output_buf, 4);
1398 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1428 uint8_t input_buf[5];
1431 uint8_t output_buf[64];
1442 if (stop_page < start_page)
1444 handle->
debug_print(
"mifare_ultralight: stop_page < start_page.\n");
1448 if (stop_page - start_page + 1 > 15)
1450 handle->
debug_print(
"mifare_ultralight: stop_page - start_page + 1 is over 15.\n");
1454 if ((*len) < (4 * (stop_page - start_page + 1)))
1456 handle->
debug_print(
"mifare_ultralight: len < %d.\n", 4 * (stop_page - start_page + 1));
1463 input_buf[1] = start_page;
1464 input_buf[2] = stop_page;
1465 a_mifare_ultralight_iso14443a_crc(input_buf , 3, input_buf + 3);
1466 cal_len = 4 * (stop_page - start_page + 1);
1467 output_len = (uint8_t)(cal_len + 2);
1471 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1475 if (output_len != (cal_len + 2))
1477 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1481 a_mifare_ultralight_iso14443a_crc(output_buf, (uint8_t)cal_len, crc_buf);
1482 if ((output_buf[cal_len] == crc_buf[0]) && (output_buf[cal_len + 1] == crc_buf[1]))
1484 memcpy(data, output_buf, cal_len);
1491 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1516 uint8_t input_buf[18];
1518 uint8_t output_buf[1];
1531 input_buf[1] = page;
1532 a_mifare_ultralight_iso14443a_crc(input_buf, 2, input_buf + 2);
1537 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1541 if (output_len != 1)
1543 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1547 if (output_buf[0] != 0xA)
1549 handle->
debug_print(
"mifare_ultralight: ack error.\n");
1554 for (i = 0; i < 4; i ++)
1556 input_buf[i] = data[i];
1558 for (i = 0; i < 12; i ++)
1560 input_buf[4 + i] = 0x00;
1562 a_mifare_ultralight_iso14443a_crc(input_buf, 16, input_buf + 16);
1568 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1572 if (output_buf[0] != 0xA)
1574 handle->
debug_print(
"mifare_ultralight: ack error.\n");
1600 uint8_t input_buf[8];
1602 uint8_t output_buf[1];
1615 input_buf[1] = page;
1616 input_buf[2] = data[0];
1617 input_buf[3] = data[1];
1618 input_buf[4] = data[2];
1619 input_buf[5] = data[3];
1620 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
1625 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1629 if (output_len != 1)
1631 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1635 if (output_buf[0] != 0xA)
1637 handle->
debug_print(
"mifare_ultralight: ack error.\n");
1664 uint8_t input_buf[7];
1666 uint8_t output_buf[4];
1680 input_buf[1] = pwd[0];
1681 input_buf[2] = pwd[1];
1682 input_buf[3] = pwd[2];
1683 input_buf[4] = pwd[3];
1684 a_mifare_ultralight_iso14443a_crc(input_buf, 5, input_buf + 5);
1689 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1693 if (output_len != 4)
1695 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1699 a_mifare_ultralight_iso14443a_crc(output_buf, 2, crc_buf);
1700 if ((output_buf[2] == crc_buf[0]) && (output_buf[3] == crc_buf[1]))
1702 if ((output_buf[0] != pack[0]) || (output_buf[1] != pack[1]))
1704 handle->
debug_print(
"mifare_ultralight: pack check failed.\n");
1713 handle->
debug_print(
"mifare_ultralight: crc error.\n");
1736 uint8_t input_buf[8];
1738 uint8_t output_buf[1];
1751 input_buf[1] = handle->
end_page - 1;
1752 input_buf[2] = pwd[0];
1753 input_buf[3] = pwd[1];
1754 input_buf[4] = pwd[2];
1755 input_buf[5] = pwd[3];
1756 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
1761 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1765 if (output_len != 1)
1767 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1771 if (output_buf[0] != 0xA)
1773 handle->
debug_print(
"mifare_ultralight: ack error.\n");
1798 uint8_t input_buf[8];
1800 uint8_t output_buf[1];
1814 input_buf[2] = pack[0];
1815 input_buf[3] = pack[1];
1816 input_buf[4] = 0x00;
1817 input_buf[5] = 0x00;
1818 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
1823 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
1827 if (output_len != 1)
1829 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
1833 if (output_buf[0] != 0xA)
1835 handle->
debug_print(
"mifare_ultralight: ack error.\n");
1868 memset(conf, 0,
sizeof(uint8_t) * 4);
1869 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 3, conf);
1872 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
1876 conf[0] &= ~(1 << 2);
1877 conf[0] |= mode << 2;
1878 res = a_mifare_ultralight_conf_write(handle, handle->
end_page - 3, conf);
1881 handle->
debug_print(
"mifare_ultralight: conf write failed.\n");
1914 memset(conf, 0,
sizeof(uint8_t) * 4);
1915 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 3, conf);
1918 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
1952 memset(conf, 0,
sizeof(uint8_t) * 4);
1953 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 3, conf);
1956 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
1961 res = a_mifare_ultralight_conf_write(handle, handle->
end_page - 3, conf);
1964 handle->
debug_print(
"mifare_ultralight: conf write failed.\n");
1997 memset(conf, 0,
sizeof(uint8_t) * 4);
1998 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 3, conf);
2001 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2036 memset(conf, 0,
sizeof(uint8_t) * 4);
2037 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 2, conf);
2040 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2044 conf[0] &= ~(1 << access);
2045 conf[0] |= enable << access;
2046 res = a_mifare_ultralight_conf_write(handle, handle->
end_page - 2, conf);
2049 handle->
debug_print(
"mifare_ultralight: conf write failed.\n");
2083 memset(conf, 0,
sizeof(uint8_t) * 4);
2084 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 2, conf);
2087 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2123 handle->
debug_print(
"mifare_ultralight: limit > 7.\n");
2128 memset(conf, 0,
sizeof(uint8_t) * 4);
2129 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 2, conf);
2132 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2136 conf[0] &= ~(7 << 0);
2137 conf[0] |= limit << 0;
2138 res = a_mifare_ultralight_conf_write(handle, handle->
end_page - 2, conf);
2141 handle->
debug_print(
"mifare_ultralight: conf write failed.\n");
2174 memset(conf, 0,
sizeof(uint8_t) * 4);
2175 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 2, conf);
2178 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2182 *limit = conf[0] & 0x7;
2212 memset(conf, 0,
sizeof(uint8_t) * 4);
2213 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 2, conf);
2216 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2220 conf[1] = identifier;
2221 res = a_mifare_ultralight_conf_write(handle, handle->
end_page - 2, conf);
2224 handle->
debug_print(
"mifare_ultralight: conf write failed.\n");
2257 memset(conf, 0,
sizeof(uint8_t) * 4);
2258 res = a_mifare_ultralight_conf_read(handle, handle->
end_page - 2, conf);
2261 handle->
debug_print(
"mifare_ultralight: conf read failed.\n");
2265 *identifier = conf[1];
2301 uint8_t input_buf[8];
2303 uint8_t output_buf[1];
2316 input_buf[1] = 0x02;
2317 input_buf[2] = 0x00;
2318 input_buf[3] = 0x00;
2319 input_buf[4] = lock[0];
2320 input_buf[5] = lock[1];
2321 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
2326 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
2330 if (output_len != 1)
2332 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
2336 if (output_buf[0] != 0xA)
2338 handle->
debug_print(
"mifare_ultralight: ack error.\n");
2345 input_buf[1] = handle->
end_page - 4;
2346 input_buf[2] = lock[2];
2347 input_buf[3] = lock[3];
2348 input_buf[4] = lock[4];
2349 input_buf[5] = 0x00;
2350 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
2355 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
2359 if (output_len != 1)
2361 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
2365 if (output_buf[0] != 0xA)
2367 handle->
debug_print(
"mifare_ultralight: ack error.\n");
2392 uint8_t input_buf[5];
2394 uint8_t output_buf[6];
2410 a_mifare_ultralight_iso14443a_crc(input_buf , 3, input_buf + 3);
2415 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
2419 if (output_len != 6)
2421 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
2425 a_mifare_ultralight_iso14443a_crc(output_buf, 4, crc_buf);
2426 if ((output_buf[4] == crc_buf[0]) && (output_buf[5] == crc_buf[1]))
2428 memcpy(lock, output_buf + 2, 2);
2432 handle->
debug_print(
"mifare_ultralight: crc error.\n");
2439 input_buf[1] = handle->
end_page - 4;
2440 input_buf[2] = handle->
end_page - 4;
2441 a_mifare_ultralight_iso14443a_crc(input_buf , 3, input_buf + 3);
2446 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
2450 if (output_len != 6)
2452 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
2456 a_mifare_ultralight_iso14443a_crc(output_buf, 4, crc_buf);
2457 if ((output_buf[4] == crc_buf[0]) && (output_buf[5] == crc_buf[1]))
2459 memcpy(lock + 2, output_buf, 3);
2465 handle->
debug_print(
"mifare_ultralight: crc error.\n");
2488 uint8_t input_buf[4];
2490 uint8_t output_buf[18];
2504 input_buf[1] = 0x03;
2505 a_mifare_ultralight_iso14443a_crc(input_buf , 2, input_buf + 2);
2510 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
2514 if (output_len != 18)
2516 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
2520 a_mifare_ultralight_iso14443a_crc(output_buf, 16, crc_buf);
2521 if ((output_buf[16] == crc_buf[0]) && (output_buf[17] == crc_buf[1]))
2523 memcpy(data, output_buf, 4);
2529 handle->
debug_print(
"mifare_ultralight: crc error.\n");
2552 uint8_t input_buf[8];
2554 uint8_t output_buf[1];
2567 input_buf[1] = 0x03;
2568 input_buf[2] = data[0];
2569 input_buf[3] = data[1];
2570 input_buf[4] = data[2];
2571 input_buf[5] = data[3];
2572 a_mifare_ultralight_iso14443a_crc(input_buf, 6, input_buf + 6);
2577 handle->
debug_print(
"mifare_ultralight: contactless transceiver failed.\n");
2581 if (output_len != 1)
2583 handle->
debug_print(
"mifare_ultralight: output_len is invalid.\n");
2587 if (output_buf[0] != 0xA)
2589 handle->
debug_print(
"mifare_ultralight: ack error.\n");
2621 out_buf, out_len) != 0)
#define MIFARE_ULTRALIGHT_COMMAND_READ_CNT
#define MIFARE_ULTRALIGHT_COMMAND_PWD_AUTH
#define MIFARE_ULTRALIGHT_COMMAND_INCR_CNT
#define MIFARE_ULTRALIGHT_COMMAND_READ
#define MIFARE_ULTRALIGHT_COMMAND_GET_VERSION
#define MIFARE_ULTRALIGHT_COMMAND_WRITE
#define MIFARE_ULTRALIGHT_COMMAND_CHECK_TEARING_EVENT
#define SUPPLY_VOLTAGE_MAX
#define MIFARE_ULTRALIGHT_COMMAND_ANTICOLLISION_CL1
#define MIFARE_ULTRALIGHT_COMMAND_SELECT_CL2
#define MIFARE_ULTRALIGHT_COMMAND_SELECT_CL1
#define MIFARE_ULTRALIGHT_COMMAND_READ_SIG
#define MIFARE_ULTRALIGHT_COMMAND_FAST_READ
#define MANUFACTURER_NAME
#define SUPPLY_VOLTAGE_MIN
#define MIFARE_ULTRALIGHT_COMMAND_HALT
#define MIFARE_ULTRALIGHT_COMMAND_REQUEST
chip command definition
#define MIFARE_ULTRALIGHT_COMMAND_WAKE_UP
#define CHIP_NAME
chip information definition
#define MIFARE_ULTRALIGHT_COMMAND_COMP_WRITE
#define MIFARE_ULTRALIGHT_COMMAND_ANTICOLLISION_CL2
driver mifare_ultralight header file
uint8_t mifare_ultralight_set_pack(mifare_ultralight_handle_t *handle, uint8_t pack[2])
mifare_ultralight set the pack
uint8_t mifare_ultralight_vcsl(mifare_ultralight_handle_t *handle, uint8_t installation_identifier[16], uint8_t pcd_capabilities[4], uint8_t *identifier)
mifare_ultralight vcsl command
uint8_t mifare_ultralight_get_lock(mifare_ultralight_handle_t *handle, uint8_t lock[5])
mifare_ultralight get the lock
uint8_t mifare_ultralight_set_storage(mifare_ultralight_handle_t *handle, mifare_ultralight_storage_t storage)
set the storage
struct mifare_ultralight_version_s mifare_ultralight_version_t
mifare ultralight version structure definition
mifare_ultralight_storage_t
mifare ultralight storage enumeration definition
uint8_t mifare_ultralight_get_virtual_card_type_identifier(mifare_ultralight_handle_t *handle, uint8_t *identifier)
mifare_ultralight get the virtual card type identifier
uint8_t mifare_ultralight_select_cl1(mifare_ultralight_handle_t *handle, uint8_t id[4])
mifare_ultralight select cl1
uint8_t mifare_ultralight_write_otp(mifare_ultralight_handle_t *handle, uint8_t data[4])
mifare_ultralight write otp page
uint8_t mifare_ultralight_halt(mifare_ultralight_handle_t *handle)
mifare_ultralight halt
struct mifare_ultralight_info_s mifare_ultralight_info_t
mifare ultralight information structure definition
uint8_t mifare_ultralight_get_serial_number(mifare_ultralight_handle_t *handle, uint8_t number[7])
mifare_ultralight get the serial number
uint8_t mifare_ultralight_set_access(mifare_ultralight_handle_t *handle, mifare_ultralight_access_t access, mifare_ultralight_bool_t enable)
mifare_ultralight enable or disable access
uint8_t mifare_ultralight_anticollision_cl1(mifare_ultralight_handle_t *handle, uint8_t id[4])
mifare_ultralight anti collision cl1
uint8_t mifare_ultralight_fast_read_page(mifare_ultralight_handle_t *handle, uint8_t start_page, uint8_t stop_page, uint8_t *data, uint16_t *len)
mifare_ultralight fast read page
mifare_ultralight_type_t
mifare ultralight type enumeration definition
uint8_t mifare_ultralight_set_modulation_mode(mifare_ultralight_handle_t *handle, mifare_ultralight_modulation_mode_t mode)
mifare_ultralight set the modulation mode
uint8_t mifare_ultralight_set_password(mifare_ultralight_handle_t *handle, uint8_t pwd[4])
mifare_ultralight set the password
uint8_t mifare_ultralight_init(mifare_ultralight_handle_t *handle)
initialize the chip
mifare_ultralight_access_t
mifare_ultralight access enumeration definition
uint8_t mifare_ultralight_get_storage(mifare_ultralight_handle_t *handle, mifare_ultralight_storage_t *storage)
get the storage
uint8_t mifare_ultralight_set_protect_start_page(mifare_ultralight_handle_t *handle, uint8_t page)
mifare_ultralight set the start page of protection
uint8_t mifare_ultralight_get_access(mifare_ultralight_handle_t *handle, mifare_ultralight_access_t access, mifare_ultralight_bool_t *enable)
mifare_ultralight get the access status
uint8_t mifare_ultralight_read_otp(mifare_ultralight_handle_t *handle, uint8_t data[4])
mifare_ultralight read otp page
uint8_t mifare_ultralight_read_signature(mifare_ultralight_handle_t *handle, uint8_t signature[32])
mifare_ultralight read the signature
mifare_ultralight_modulation_mode_t
mifare ultralight modulation mode enumeration definition
uint8_t mifare_ultralight_get_protect_start_page(mifare_ultralight_handle_t *handle, uint8_t *page)
mifare_ultralight get the start page of protection
uint8_t mifare_ultralight_request(mifare_ultralight_handle_t *handle, mifare_ultralight_type_t *type)
mifare_ultralight request
uint8_t mifare_ultralight_authenticate(mifare_ultralight_handle_t *handle, uint8_t pwd[4], uint8_t pack[2])
mifare_ultralight authenticate
uint8_t mifare_ultralight_set_authenticate_limitation(mifare_ultralight_handle_t *handle, uint8_t limit)
mifare_ultralight set the authenticate limitation
uint8_t mifare_ultralight_deinit(mifare_ultralight_handle_t *handle)
close the chip
uint8_t mifare_ultralight_increment_counter(mifare_ultralight_handle_t *handle, uint8_t addr, uint32_t cnt)
mifare_ultralight increment the counter
mifare_ultralight_bool_t
mifare ultralight bool enumeration definition
uint8_t mifare_ultralight_wake_up(mifare_ultralight_handle_t *handle, mifare_ultralight_type_t *type)
mifare_ultralight wake up
uint8_t mifare_ultralight_set_virtual_card_type_identifier(mifare_ultralight_handle_t *handle, uint8_t identifier)
mifare_ultralight set the virtual card type identifier
uint8_t mifare_ultralight_get_modulation_mode(mifare_ultralight_handle_t *handle, mifare_ultralight_modulation_mode_t *mode)
mifare_ultralight get the modulation mode
uint8_t mifare_ultralight_set_lock(mifare_ultralight_handle_t *handle, uint8_t lock[5])
mifare_ultralight set the lock
uint8_t mifare_ultralight_info(mifare_ultralight_info_t *info)
get chip information
uint8_t mifare_ultralight_read_page(mifare_ultralight_handle_t *handle, uint8_t page, uint8_t data[4])
mifare_ultralight read page
uint8_t mifare_ultralight_check_tearing_event(mifare_ultralight_handle_t *handle, uint8_t addr, uint8_t *flag)
mifare_ultralight check the tearing event
uint8_t mifare_ultralight_get_authenticate_limitation(mifare_ultralight_handle_t *handle, uint8_t *limit)
mifare_ultralight get the authenticate limitation
uint8_t mifare_ultralight_anticollision_cl2(mifare_ultralight_handle_t *handle, uint8_t id[4])
mifare_ultralight anti collision cl2
struct mifare_ultralight_handle_s mifare_ultralight_handle_t
mifare ultralight handle structure definition
uint8_t mifare_ultralight_select_cl2(mifare_ultralight_handle_t *handle, uint8_t id[4])
mifare_ultralight select cl2
uint8_t mifare_ultralight_read_counter(mifare_ultralight_handle_t *handle, uint8_t addr, uint32_t *cnt)
mifare_ultralight read the counter
uint8_t mifare_ultralight_read_four_pages(mifare_ultralight_handle_t *handle, uint8_t start_page, uint8_t data[16])
mifare_ultralight read four pages
uint8_t mifare_ultralight_compatibility_write_page(mifare_ultralight_handle_t *handle, uint8_t page, uint8_t data[4])
mifare_ultralight compatibility write page
uint8_t mifare_ultralight_write_page(mifare_ultralight_handle_t *handle, uint8_t page, uint8_t data[4])
mifare_ultralight write page
uint8_t mifare_ultralight_get_version(mifare_ultralight_handle_t *handle, mifare_ultralight_version_t *version)
mifare_ultralight get the version
@ MIFARE_ULTRALIGHT_STORAGE_MF0UL21
@ MIFARE_ULTRALIGHT_STORAGE_MF0UL11
@ MIFARE_ULTRALIGHT_TYPE_INVALID
@ MIFARE_ULTRALIGHT_TYPE_ULTRALIGHT
uint8_t mifare_ultralight_transceiver(mifare_ultralight_handle_t *handle, uint8_t *in_buf, uint8_t in_len, uint8_t *out_buf, uint8_t *out_len)
transceiver data
void(* delay_ms)(uint32_t ms)
void(* debug_print)(const char *const fmt,...)
uint8_t(* contactless_deinit)(void)
uint8_t(* contactless_transceiver)(uint8_t *in_buf, uint8_t in_len, uint8_t *out_buf, uint8_t *out_len)
uint8_t(* contactless_init)(void)
float supply_voltage_max_v
char manufacturer_name[32]
float supply_voltage_min_v
uint8_t minor_product_version
uint8_t major_product_version