wps_nfc_pn531.c revision 214501
156746Sroberto/*
256746Sroberto * NFC PN531 routines for Wi-Fi Protected Setup
356746Sroberto * Copyright (c) 2009, Masashi Honma <honma@ictec.co.jp>
456746Sroberto *
5132451Sroberto * This program is free software; you can redistribute it and/or modify
656746Sroberto * it under the terms of the GNU General Public License version 2 as
756746Sroberto * published by the Free Software Foundation.
8132451Sroberto *
9132451Sroberto * Alternatively, this software may be distributed under the terms of BSD
1082498Sroberto * license.
1156746Sroberto *
1282498Sroberto * See README and COPYING for more details.
1382498Sroberto */
1482498Sroberto
1582498Sroberto#include "includes.h"
1682498Sroberto#include "common.h"
1756746Sroberto
1882498Sroberto#include "wps/wps.h"
1956746Sroberto#include "wps_i.h"
2056746Sroberto
21132451Sroberto#include "WpsNfcType.h"
2256746Sroberto#include "WpsNfc.h"
2382498Sroberto
2456746Sroberto
25132451Srobertostatic int init_nfc_pn531(char *path)
26132451Sroberto{
2756746Sroberto	u32 ret;
2882498Sroberto
2956746Sroberto	ret = WpsNfcInit();
30132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
3156746Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to initialize "
3256746Sroberto			   "NFC Library: 0x%08x", ret);
3356746Sroberto		return -1;
3456746Sroberto	}
35132451Sroberto
36132451Sroberto	ret = WpsNfcOpenDevice((int8 *) path);
37132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
38132451Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to open "
39132451Sroberto			   "NFC Device(%s): 0x%08x", path, ret);
40132451Sroberto		goto fail;
41132451Sroberto	}
42132451Sroberto
43132451Sroberto	ret = WpsNfcTokenDiscovery();
44132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
45132451Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to discover "
46132451Sroberto			   "token: 0x%08x", ret);
47132451Sroberto		WpsNfcCloseDevice();
48132451Sroberto		goto fail;
4956746Sroberto	}
5056746Sroberto
5156746Sroberto	return 0;
5256746Sroberto
5356746Srobertofail:
5482498Sroberto	WpsNfcDeinit();
55132451Sroberto	return -1;
56132451Sroberto}
57132451Sroberto
58310419Sdelphij
59132451Srobertostatic void * read_nfc_pn531(size_t *size)
60132451Sroberto{
61132451Sroberto	uint32 len;
62132451Sroberto	u32 ret;
63132451Sroberto	int8 *data;
64132451Sroberto
6556746Sroberto	ret = WpsNfcRawReadToken(&data, &len);
66132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
6756746Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to read: 0x%08x",
6856746Sroberto			   ret);
69132451Sroberto		return NULL;
70290001Sglebius	}
71290001Sglebius
7256746Sroberto	*size = len;
73132451Sroberto	return data;
74132451Sroberto}
75132451Sroberto
76132451Sroberto
77132451Srobertostatic int write_nfc_pn531(void *data, size_t len)
78132451Sroberto{
79132451Sroberto	u32 ret;
80132451Sroberto
81132451Sroberto	ret = WpsNfcRawWriteToken(data, len);
82132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
83132451Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to write: 0x%08x",
84132451Sroberto			   ret);
85132451Sroberto		return -1;
86132451Sroberto	}
87132451Sroberto
88132451Sroberto	return 0;
89132451Sroberto}
90132451Sroberto
91132451Sroberto
92132451Srobertostatic void deinit_nfc_pn531(void)
93132451Sroberto{
9456746Sroberto	u32 ret;
95132451Sroberto
96132451Sroberto	ret = WpsNfcCloseDevice();
97132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS)
98132451Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to close "
99132451Sroberto			   "NFC Device: 0x%08x", ret);
100132451Sroberto
101132451Sroberto	ret = WpsNfcDeinit();
102132451Sroberto	if (ret != WPS_NFCLIB_ERR_SUCCESS)
103132451Sroberto		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to deinitialize "
104132451Sroberto			   "NFC Library: 0x%08x", ret);
105132451Sroberto}
106132451Sroberto
107132451Sroberto
108132451Srobertostruct oob_nfc_device_data oob_nfc_pn531_device_data = {
109132451Sroberto	.init_func	= init_nfc_pn531,
110132451Sroberto	.read_func	= read_nfc_pn531,
111132451Sroberto	.write_func	= write_nfc_pn531,
112132451Sroberto	.deinit_func	= deinit_nfc_pn531,
113132451Sroberto};
114132451Sroberto