• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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