1 /*
2 * NFC PN531 routines for Wi-Fi Protected Setup
3 * Copyright (c) 2009, Masashi Honma <honma@ictec.co.jp>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * Alternatively, this software may be distributed under the terms of BSD
10 * license.
11 *
12 * See README and COPYING for more details.
13 */
14
15 #include "includes.h"
16 #include "common.h"
17
18 #include "wps/wps.h"
19 #include "wps_i.h"
20
21 #include "WpsNfcType.h"
22 #include "WpsNfc.h"
23
24
init_nfc_pn531(char * path)25 static int init_nfc_pn531(char *path)
26 {
27 u32 ret;
28
29 ret = WpsNfcInit();
30 if (ret != WPS_NFCLIB_ERR_SUCCESS) {
31 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to initialize "
32 "NFC Library: 0x%08x", ret);
33 return -1;
34 }
35
36 ret = WpsNfcOpenDevice((int8 *) path);
37 if (ret != WPS_NFCLIB_ERR_SUCCESS) {
38 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to open "
39 "NFC Device(%s): 0x%08x", path, ret);
40 goto fail;
41 }
42
43 ret = WpsNfcTokenDiscovery();
44 if (ret != WPS_NFCLIB_ERR_SUCCESS) {
45 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to discover "
46 "token: 0x%08x", ret);
47 WpsNfcCloseDevice();
48 goto fail;
49 }
50
51 return 0;
52
53 fail:
54 WpsNfcDeinit();
55 return -1;
56 }
57
58
read_nfc_pn531(size_t * size)59 static void * read_nfc_pn531(size_t *size)
60 {
61 uint32 len;
62 u32 ret;
63 int8 *data;
64
65 ret = WpsNfcRawReadToken(&data, &len);
66 if (ret != WPS_NFCLIB_ERR_SUCCESS) {
67 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to read: 0x%08x",
68 ret);
69 return NULL;
70 }
71
72 *size = len;
73 return data;
74 }
75
76
write_nfc_pn531(void * data,size_t len)77 static int write_nfc_pn531(void *data, size_t len)
78 {
79 u32 ret;
80
81 ret = WpsNfcRawWriteToken(data, len);
82 if (ret != WPS_NFCLIB_ERR_SUCCESS) {
83 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to write: 0x%08x",
84 ret);
85 return -1;
86 }
87
88 return 0;
89 }
90
91
deinit_nfc_pn531(void)92 static void deinit_nfc_pn531(void)
93 {
94 u32 ret;
95
96 ret = WpsNfcCloseDevice();
97 if (ret != WPS_NFCLIB_ERR_SUCCESS)
98 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to close "
99 "NFC Device: 0x%08x", ret);
100
101 ret = WpsNfcDeinit();
102 if (ret != WPS_NFCLIB_ERR_SUCCESS)
103 wpa_printf(MSG_ERROR, "WPS (PN531): Failed to deinitialize "
104 "NFC Library: 0x%08x", ret);
105 }
106
107
108 struct oob_nfc_device_data oob_nfc_pn531_device_data = {
109 .init_func = init_nfc_pn531,
110 .read_func = read_nfc_pn531,
111 .write_func = write_nfc_pn531,
112 .deinit_func = deinit_nfc_pn531,
113 };
114