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