3 * neard - Near Field Communication manager
5 * Copyright (C) 2011 Intel Corporation. All rights reserved.
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 #include <sys/socket.h>
31 #include <linux/socket.h>
32 #include <linux/nfc.h>
34 #include <near/plugin.h>
36 #include <near/types.h>
37 #include <near/adapter.h>
39 #include <near/ndef.h>
43 #define RESP_POLL 0x01
45 #define CMD_REQUEST_SERVICE 0x02
46 #define RESP_REQUEST_SERVICE 0x03
48 #define CMD_REQUEST_RESPONSE 0x04
49 #define RESP_REQUEST_RESPONSE 0x05
51 #define CMD_READ_WO_ENCRYPT 0x06
52 #define RESP_READ_WO_ENCRYPT 0x07
54 #define CMD_WRITE_WO_ENCRYPT 0x08
55 #define RESP_WRITE_WO_ENCRYPT 0x09
57 #define CMD_REQUEST_SYS_CODE 0x0C
58 #define RESP_REQUEST_SYS_CODE 0x0D
60 #define CMD_AUTHENTICATION_1 0x10
61 #define RESP_AUTHENTICATION_1 0x11
63 #define CMD_AUTHENTICATION_2 0x12
64 #define RESP_AUTHENTICATION_2 0x13
67 #define RESP_READ 0x15
69 #define CMD_WRITE 0x16
70 #define RESP_WRITE 0x17
72 #define NFC_SERVICE_CODE 0x000B
74 #define META_BLOCK_START 0
75 #define DATA_BLOCK_START 1
79 #define LEN_REPLY_CMD 0x02
80 #define LEN_CMD_LEN 0x01
83 #define OFS_NFC_STATUS 0
85 #define OFS_CMD_RESP 2
87 #define OFS_CMD_DATA (LEN_CMD_LEN + LEN_CMD + LEN_ID)
88 #define OFS_READ_FLAG 12
89 #define OFS_READ_DATA 14
91 #define CHECKSUM_LEN 2
93 #define MAX_DATA_SIZE 254
95 #define NDEF_MAPPING_VERSION 0x10
96 #define MAX_READ_BLOCKS_PER_CHECK 0x04
97 #define MAX_WRITE_BLOCKS_PER_UPDATE 0x01
98 #define MAX_BLOCKS_FOR_NDEF_DATA 0x000D
99 #define ATTR_BLOCK_WRITE_FLAG 0x00
100 #define ATTR_BLOCK_RW_FLAG 0x01
102 #define IC_TYPE_OFFSET 12
103 #define SYSTEM_OPTION_OFFSET 17
104 #define FELICA_LITE_MC_BLOCK 0x88
105 #define FELICA_LITE_IC_TYPE 0xF0
106 #define FELICA_LITE_S_IC_TYPE 0xF1
107 #define FELICA_PLUG_IC_TYPE 0xE0
109 #define FELICA_LITE_AND_LITE_S_SYS_CODE 0x88B4
114 uint8_t data[MAX_DATA_SIZE];
115 } __attribute__((packed));
118 uint32_t adapter_idx;
119 uint16_t current_block;
123 struct near_tag *tag;
127 uint32_t adapter_idx;
131 uint8_t current_block;
132 uint8_t attr[BLOCK_SIZE];
133 struct near_ndef_message *ndef;
135 uint8_t mc_block[BLOCK_SIZE];
138 static int t3_cookie_release(int err, void *data)
140 struct t3_cookie *cookie = data;
147 if (cookie->ndef != NULL)
148 g_free(cookie->ndef->data);
150 g_free(cookie->ndef);
157 /* common: Initialize structure to write block */
158 static void prepare_write_block(uint8_t *UID, struct type3_cmd *cmd,
159 uint8_t block, uint8_t *data)
161 cmd->cmd = CMD_WRITE_WO_ENCRYPT; /* command */
162 memcpy(cmd->data, UID, LEN_ID); /* IDm */
164 cmd->data[LEN_ID] = 1; /* number of services */
165 cmd->data[LEN_ID + 1] = 0x09; /* service 0x0009 */
166 cmd->data[LEN_ID + 2] = 0x00;
168 cmd->data[LEN_ID + 3] = 0x01; /* number of blocks */
169 cmd->data[LEN_ID + 4] = 0x80; /* 2 byte block number format */
170 cmd->data[LEN_ID + 5] = block; /* block number */
171 memcpy(cmd->data + LEN_ID + 6, data, BLOCK_SIZE); /* data to write */
173 cmd->len = LEN_ID + LEN_CMD + LEN_CMD_LEN + 6 + BLOCK_SIZE;
176 /* common: Initialize structure to read block */
177 static void prepare_read_block(uint8_t cur_block,
179 struct type3_cmd *cmd)
181 cmd->cmd = CMD_READ_WO_ENCRYPT; /* command */
182 memcpy(cmd->data, UID, LEN_ID); /* IDm */
184 cmd->data[LEN_ID] = 1; /* number of service */
185 cmd->data[LEN_ID + 1] = 0x0B; /* service x000B */
186 cmd->data[LEN_ID + 2] = 0x00;
188 cmd->data[LEN_ID + 3] = 0x01; /* number of block */
189 cmd->data[LEN_ID + 4] = 0x80; /* 2 bytes block id*/
190 cmd->data[LEN_ID + 5] = cur_block; /* block number */
192 cmd->len = LEN_ID + LEN_CMD + LEN_CMD_LEN + 6;
195 /* common: Simple checks on received frame */
196 static int check_recv_frame(uint8_t *resp, uint8_t reply_code)
200 if (resp[OFS_NFC_STATUS] != 0) {
201 DBG("NFC Command failed: 0x%x", resp[OFS_NFC_STATUS]);
205 if (resp[OFS_CMD_RESP] != reply_code) {
206 DBG("Felica cmd failed: 0x%x", resp[OFS_CMD_RESP]);
213 static int data_recv(uint8_t *resp, int length, void *data)
215 struct type3_tag *tag = data;
216 struct type3_cmd cmd;
218 size_t current_length, length_read, data_length;
219 uint32_t adapter_idx;
226 adapter_idx = near_tag_get_adapter_idx(tag->tag);
227 target_idx = near_tag_get_target_idx(tag->tag);
234 nfc_data = near_tag_get_data(tag->tag, &data_length);
235 length_read = length - OFS_READ_DATA;
236 current_length = tag->current_block * BLOCK_SIZE;
237 if (current_length + (length - OFS_READ_DATA) > data_length)
238 length_read = data_length - current_length;
240 memcpy(nfc_data + current_length, resp + OFS_READ_DATA, length_read);
242 if (current_length + length_read >= data_length) {
245 tag->current_block = 0;
247 DBG("Done reading %zd bytes at %p", data_length, nfc_data);
248 records = near_ndef_parse(nfc_data, data_length);
249 near_tag_add_records(tag->tag, records, tag->cb, 0);
256 /* Read the next block */
257 read_blocks = length / BLOCK_SIZE;
258 tag->current_block += read_blocks;
260 prepare_read_block(DATA_BLOCK_START + tag->current_block,
263 err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len,
272 if (err < 0 && tag->cb)
273 tag->cb(adapter_idx, target_idx, err);
280 static int data_read(struct type3_tag *tag)
282 struct type3_cmd cmd;
283 uint32_t adapter_idx;
287 tag->current_block = 0;
289 prepare_read_block(DATA_BLOCK_START + tag->current_block,
292 adapter_idx = near_tag_get_adapter_idx(tag->tag);
294 return near_adapter_send(adapter_idx,
295 (uint8_t *) &cmd, cmd.len,
299 /* Read block 0 to retrieve the data length */
300 static int nfctype3_recv_block_0(uint8_t *resp, int length, void *data)
302 struct t3_cookie *cookie = data;
304 struct near_tag *tag;
305 struct type3_tag *t3_tag = NULL;
306 uint32_t ndef_data_length;
315 err = check_recv_frame(resp, RESP_READ_WO_ENCRYPT);
319 if (resp[OFS_READ_FLAG] != 0) {
320 DBG("Status 0x%x", resp[OFS_READ_FLAG]);
325 /* Block 0:[11 - 13]: length is a 3 bytes value */
326 ndef_data_length = resp[OFS_READ_DATA + 11] * 0x100;
327 ndef_data_length += resp[OFS_READ_DATA + 12];
328 ndef_data_length *= 0x100;
329 ndef_data_length += resp[OFS_READ_DATA + 13];
331 /* Add data to the tag */
332 err = near_tag_add_data(cookie->adapter_idx, cookie->target_idx,
333 NULL, ndef_data_length);
337 tag = near_tag_get_tag(cookie->adapter_idx, cookie->target_idx);
343 /* Block 0:[10]: RW Flag. 1 for RW */
344 if (resp[OFS_READ_DATA + 10] == 0)
345 near_tag_set_ro(tag, TRUE);
347 near_tag_set_ro(tag, FALSE);
349 t3_tag = g_try_malloc0(sizeof(struct type3_tag));
350 if (t3_tag == NULL) {
355 memcpy(t3_tag->IDm, cookie->IDm, LEN_ID);
357 near_tag_set_idm(tag, cookie->IDm, LEN_ID);
358 near_tag_set_attr_block(tag, resp + OFS_READ_DATA, BLOCK_SIZE);
359 near_tag_set_blank(tag, FALSE);
360 near_tag_set_ic_type(tag, cookie->ic_type);
362 t3_tag->adapter_idx = cookie->adapter_idx;
363 t3_tag->cb = cookie->cb;
366 err = data_read(t3_tag);
371 cookie->cb(cookie->adapter_idx, cookie->target_idx,
377 return t3_cookie_release(err, cookie);
380 static int poll_ndef_system_code(uint8_t *resp, int length, void *data)
382 struct t3_cookie *cookie = data;
384 struct type3_cmd cmd;
386 DBG("length: %d", length);
393 err = check_recv_frame(resp, RESP_POLL);
397 prepare_read_block(META_BLOCK_START, cookie->IDm, &cmd);
399 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
400 cmd.len, nfctype3_recv_block_0, cookie);
407 if (err < 0 && cookie->cb)
408 cookie->cb(cookie->adapter_idx,
409 cookie->target_idx, err);
411 return t3_cookie_release(err, cookie);
414 static int check_sys_op_in_mc_block(uint8_t *resp, int length, void *data)
416 struct type3_cmd cmd;
417 struct near_tag *tag;
418 struct t3_cookie *cookie = data;
421 DBG("length %d", length);
428 err = check_recv_frame(resp, RESP_READ_WO_ENCRYPT);
432 if (resp[SYSTEM_OPTION_OFFSET] == 0x00) {
433 DBG("Blank tag detected");
435 err = near_tag_add_data(cookie->adapter_idx,
437 NULL, 1 /* dummy length */);
441 tag = near_tag_get_tag(cookie->adapter_idx,
448 near_tag_set_idm(tag, cookie->IDm, LEN_ID);
449 near_tag_set_ic_type(tag, cookie->ic_type);
450 near_tag_set_blank(tag, TRUE);
453 cookie->cb(cookie->adapter_idx,
454 cookie->target_idx, 0);
456 return t3_cookie_release(0, cookie);
459 cmd.cmd = CMD_POLL; /* POLL command */
460 cmd.data[0] = 0x12; /* System code (NFC SC) */
462 cmd.data[2] = 01; /* request code */
463 cmd.data[3] = 0x00; /* time slot */
464 /* data len + 2 bytes */
465 cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ;
467 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
468 cmd.len , poll_ndef_system_code, cookie);
477 if (err < 0 && cookie->cb)
478 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
480 return t3_cookie_release(err, cookie);
483 static int receive_system_code(uint8_t *resp, int length, void *data)
485 struct t3_cookie *cookie = data;
487 struct type3_cmd cmd;
488 uint16_t system_code;
490 DBG("length: %d", length);
497 err = check_recv_frame(resp, RESP_POLL);
501 cookie->ic_type = resp[IC_TYPE_OFFSET];
502 memcpy(cookie->IDm, resp + OFS_IDM, LEN_ID);
503 system_code = ((uint16_t) (resp[length - 2])) << 8;
504 system_code |= resp[length - 1];
506 switch (resp[IC_TYPE_OFFSET]) {
507 case FELICA_LITE_IC_TYPE:
508 prepare_read_block(FELICA_LITE_MC_BLOCK, cookie->IDm, &cmd);
509 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
510 cmd.len, check_sys_op_in_mc_block,
514 case FELICA_LITE_S_IC_TYPE:
515 case FELICA_PLUG_IC_TYPE:
517 cmd.cmd = CMD_POLL; /* POLL command */
518 cmd.data[0] = 0x12; /* System code (NFC SC) */
520 cmd.data[2] = 01; /* request code */
521 cmd.data[3] = 0x00; /* time slot */
522 /* data len + 2 bytes */
523 cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ;
525 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
526 cmd.len, poll_ndef_system_code, cookie);
535 if (err < 0 && cookie->cb)
536 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
538 return t3_cookie_release(err, cookie);
541 static int nfctype3_read(uint32_t adapter_idx,
542 uint32_t target_idx, near_tag_io_cb cb)
544 struct type3_cmd cmd;
545 struct t3_cookie *cookie;
551 cmd.cmd = CMD_POLL; /* POLL command */
552 cmd.data[0] = 0xFF; /* System code */
554 cmd.data[2] = 01; /* request code */
555 cmd.data[3] = 0x00; /* time slot */
557 /* data len + 2 bytes */
558 cmd.len = LEN_CMD + LEN_CMD_LEN + 4;
560 cookie = g_try_malloc0(sizeof(struct t3_cookie));
564 cookie->adapter_idx = adapter_idx;
565 cookie->target_idx = target_idx;
568 err = near_adapter_send(adapter_idx, (uint8_t *) &cmd,
569 cmd.len, receive_system_code, cookie);
576 static int update_attr_block_cb(uint8_t *resp, int length, void *data)
578 struct t3_cookie *cookie = data;
588 err = check_recv_frame(resp, RESP_WRITE_WO_ENCRYPT);
596 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
598 return t3_cookie_release(err, cookie);
601 static int update_attr_block(struct t3_cookie *cookie)
603 struct type3_cmd cmd;
609 cookie->attr[9] = 0x00; /* writing data completed */
610 cookie->attr[11] = (uint8_t) (cookie->ndef->length >> 16);
611 cookie->attr[12] = (uint8_t) (cookie->ndef->length >> 8);
612 cookie->attr[13] = (uint8_t) cookie->ndef->length;
615 for (i = 0; i < (BLOCK_SIZE - CHECKSUM_LEN); i++)
616 checksum += cookie->attr[i];
618 cookie->attr[14] = (uint8_t) (checksum >> 8);
619 cookie->attr[15] = (uint8_t) checksum;
621 prepare_write_block(cookie->IDm, &cmd, 0, cookie->attr);
623 return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len,
624 update_attr_block_cb, cookie);
627 static int data_write_resp(uint8_t *resp, int length, void *data)
629 struct t3_cookie *cookie = data;
630 struct type3_cmd cmd;
631 uint8_t padding[BLOCK_SIZE] = {0};
641 err = check_recv_frame(resp, RESP_WRITE_WO_ENCRYPT);
645 if (cookie->ndef->offset >= cookie->ndef->length) {
646 err = update_attr_block(cookie);
653 if ((cookie->ndef->length - cookie->ndef->offset) <
655 memcpy(padding, cookie->ndef->data + cookie->ndef->offset,
656 cookie->ndef->length - cookie->ndef->offset);
657 prepare_write_block(cookie->IDm, &cmd,
658 cookie->current_block, padding);
660 prepare_write_block(cookie->IDm, &cmd, cookie->current_block,
661 cookie->ndef->data + cookie->ndef->offset);
664 cookie->current_block++;
665 cookie->ndef->offset += BLOCK_SIZE;
667 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len,
668 data_write_resp, cookie);
675 if (err < 0 && cookie->cb)
676 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
678 return t3_cookie_release(err, cookie);
681 static int data_write(uint32_t adapter_idx, uint32_t target_idx,
682 struct near_ndef_message *ndef,
683 struct near_tag *tag,
686 struct t3_cookie *cookie;
687 struct type3_cmd cmd;
688 uint16_t checksum, nmaxb;
695 cookie = g_try_malloc0(sizeof(struct t3_cookie));
696 if (cookie == NULL) {
701 cookie->adapter_idx = adapter_idx;
702 cookie->target_idx = target_idx;
705 cookie->current_block = 0;
707 idm = near_tag_get_idm(tag, &len);
713 memcpy(cookie->IDm, idm, len);
715 attr = near_tag_get_attr_block(tag, &len);
721 memcpy(cookie->attr, attr, len);
722 nmaxb = (((uint16_t) (cookie->attr[3])) << 8) | cookie->attr[4];
724 if (cookie->ndef->length > (nmaxb * BLOCK_SIZE)) {
725 near_error("not enough space on tag");
730 cookie->attr[9] = 0x0F; /* writing data in progress */
733 for (i = 0; i < 14; i++)
734 checksum += cookie->attr[i];
736 cookie->attr[14] = (uint8_t) (checksum >> 8);
737 cookie->attr[15] = (uint8_t) checksum;
739 prepare_write_block(cookie->IDm, &cmd, cookie->current_block,
741 cookie->current_block++;
743 err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len,
744 data_write_resp, cookie);
751 return t3_cookie_release(err, cookie);
754 static int nfctype3_write(uint32_t adapter_idx, uint32_t target_idx,
755 struct near_ndef_message *ndef,
758 struct near_tag *tag;
762 if (ndef == NULL || cb == NULL)
765 tag = near_tag_get_tag(adapter_idx, target_idx);
769 return data_write(adapter_idx, target_idx, ndef, tag, cb);
772 static int check_presence(uint8_t *resp, int length, void *data)
774 struct t3_cookie *cookie = data;
777 DBG("length %d", length);
783 cookie->cb(cookie->adapter_idx,
784 cookie->target_idx, err);
786 return t3_cookie_release(err, cookie);
789 static int nfctype3_check_presence(uint32_t adapter_idx,
790 uint32_t target_idx, near_tag_io_cb cb)
792 struct type3_cmd cmd;
793 struct t3_cookie *cookie;
799 cmd.cmd = CMD_POLL; /* POLL command */
800 cmd.data[0] = 0xFF; /* System code */
802 cmd.data[2] = 01; /* request code */
803 cmd.data[3] = 0x00; /* time slot */
805 /* data len + 2 bytes */
806 cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ;
808 cookie = g_try_malloc0(sizeof(struct t3_cookie));
812 cookie->adapter_idx = adapter_idx;
813 cookie->target_idx = target_idx;
816 err = near_adapter_send(adapter_idx, (uint8_t *) &cmd,
817 cmd.len, check_presence, cookie);
825 return t3_cookie_release(err, cookie);
828 static int format_resp(uint8_t *resp, int length, void *data)
830 struct near_tag *tag;
831 struct t3_cookie *cookie = data;
841 err = check_recv_frame(resp, RESP_WRITE_WO_ENCRYPT);
845 tag = near_tag_get_tag(cookie->adapter_idx, cookie->target_idx);
851 near_tag_set_ro(tag, FALSE);
852 near_tag_set_idm(tag, cookie->IDm, LEN_ID);
853 near_tag_set_attr_block(tag, cookie->attr, BLOCK_SIZE);
854 near_tag_set_blank(tag, FALSE);
856 DBG("Formatting is done");
860 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
862 return t3_cookie_release(err, cookie);
865 static int write_attr_block(uint8_t *resp, int length , void *data)
867 struct type3_cmd cmd;
868 struct t3_cookie *cookie = data;
870 uint16_t checksum = 0;
872 DBG("length %d", length);
879 err = check_recv_frame(resp, RESP_WRITE_WO_ENCRYPT);
883 cookie->attr[0] = NDEF_MAPPING_VERSION;
884 cookie->attr[1] = MAX_READ_BLOCKS_PER_CHECK;
885 cookie->attr[2] = MAX_WRITE_BLOCKS_PER_UPDATE;
886 cookie->attr[3] = (uint8_t) (MAX_BLOCKS_FOR_NDEF_DATA >> 8);
887 cookie->attr[4] = (uint8_t) (MAX_BLOCKS_FOR_NDEF_DATA);
892 cookie->attr[9] = ATTR_BLOCK_WRITE_FLAG;
893 cookie->attr[10] = ATTR_BLOCK_RW_FLAG;
894 cookie->attr[11] = 0;
895 cookie->attr[12] = 0;
896 cookie->attr[13] = 0;
898 for (i = 0; i < (BLOCK_SIZE - CHECKSUM_LEN); i++)
899 checksum += cookie->attr[i];
901 cookie->attr[14] = (uint8_t) (checksum >> 8);
902 cookie->attr[15] = (uint8_t) checksum;
904 prepare_write_block(cookie->IDm, &cmd, META_BLOCK_START,
907 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
908 cmd.len, format_resp, cookie);
915 if (err < 0 && cookie->cb)
916 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
918 return t3_cookie_release(err, cookie);
921 static int write_mc_block(uint8_t *resp, int length, void *data)
923 struct type3_cmd cmd;
924 struct t3_cookie *cookie = data;
927 DBG("length %d", length);
934 err = check_recv_frame(resp, RESP_READ_WO_ENCRYPT);
938 if (resp[OFS_READ_FLAG] != 0) {
939 DBG("Status 0x%x", resp[OFS_READ_FLAG]);
944 memcpy(cookie->mc_block, resp + 14, BLOCK_SIZE);
946 * By updating Byte3 to 01h means making Felica Lite
947 * compatible with NDEF.
949 cookie->mc_block[3] = 1;
950 prepare_write_block(cookie->IDm, &cmd, FELICA_LITE_MC_BLOCK,
952 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
953 cmd.len, write_attr_block, cookie);
960 if (err < 0 && cookie->cb)
961 cookie->cb(cookie->adapter_idx, cookie->target_idx, err);
963 return t3_cookie_release(err, cookie);
966 static int nfctype3_format(uint32_t adapter_idx,
967 uint32_t target_idx, near_tag_io_cb cb)
969 struct type3_cmd cmd;
970 struct near_tag *tag;
971 struct t3_cookie *cookie;
978 tag = near_tag_get_tag(adapter_idx, target_idx);
982 ic_type = near_tag_get_ic_type(tag);
983 if (ic_type != FELICA_LITE_IC_TYPE)
986 cookie = g_try_malloc0(sizeof(struct t3_cookie));
990 cookie->adapter_idx = adapter_idx;
991 cookie->target_idx = target_idx;
993 cookie->ic_type = ic_type;
995 idm = near_tag_get_idm(tag, &len);
1001 memcpy(cookie->IDm, idm, len);
1003 prepare_read_block(FELICA_LITE_MC_BLOCK, cookie->IDm, &cmd);
1004 err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd,
1005 cmd.len, write_mc_block, cookie);
1012 return t3_cookie_release(err, cookie);
1015 static struct near_tag_driver type1_driver = {
1016 .type = NFC_PROTO_FELICA,
1017 .priority = NEAR_TAG_PRIORITY_DEFAULT,
1018 .read = nfctype3_read,
1019 .write = nfctype3_write,
1020 .format = nfctype3_format,
1021 .check_presence = nfctype3_check_presence,
1024 static int nfctype3_init(void)
1028 return near_tag_driver_register(&type1_driver);
1031 static void nfctype3_exit(void)
1035 near_tag_driver_unregister(&type1_driver);
1038 NEAR_PLUGIN_DEFINE(nfctype3, "NFC Forum Type 3 tags support", VERSION,
1039 NEAR_PLUGIN_PRIORITY_HIGH, nfctype3_init, nfctype3_exit)