114 lines
2.3 KiB
C
114 lines
2.3 KiB
C
|
/*
|
||
|
* NFC PN531 routines for Wi-Fi Protected Setup
|
||
|
* Copyright (c) 2009, Masashi Honma <honma@ictec.co.jp>
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License version 2 as
|
||
|
* published by the Free Software Foundation.
|
||
|
*
|
||
|
* Alternatively, this software may be distributed under the terms of BSD
|
||
|
* license.
|
||
|
*
|
||
|
* See README and COPYING for more details.
|
||
|
*/
|
||
|
|
||
|
#include "includes.h"
|
||
|
#include "common.h"
|
||
|
|
||
|
#include "wps/wps.h"
|
||
|
#include "wps_i.h"
|
||
|
|
||
|
#include "WpsNfcType.h"
|
||
|
#include "WpsNfc.h"
|
||
|
|
||
|
|
||
|
static int init_nfc_pn531(char *path)
|
||
|
{
|
||
|
u32 ret;
|
||
|
|
||
|
ret = WpsNfcInit();
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS) {
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to initialize "
|
||
|
"NFC Library: 0x%08x", ret);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
ret = WpsNfcOpenDevice((int8 *) path);
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS) {
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to open "
|
||
|
"NFC Device(%s): 0x%08x", path, ret);
|
||
|
goto fail;
|
||
|
}
|
||
|
|
||
|
ret = WpsNfcTokenDiscovery();
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS) {
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to discover "
|
||
|
"token: 0x%08x", ret);
|
||
|
WpsNfcCloseDevice();
|
||
|
goto fail;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
|
||
|
fail:
|
||
|
WpsNfcDeinit();
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
|
||
|
static void * read_nfc_pn531(size_t *size)
|
||
|
{
|
||
|
uint32 len;
|
||
|
u32 ret;
|
||
|
int8 *data;
|
||
|
|
||
|
ret = WpsNfcRawReadToken(&data, &len);
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS) {
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to read: 0x%08x",
|
||
|
ret);
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
*size = len;
|
||
|
return data;
|
||
|
}
|
||
|
|
||
|
|
||
|
static int write_nfc_pn531(void *data, size_t len)
|
||
|
{
|
||
|
u32 ret;
|
||
|
|
||
|
ret = WpsNfcRawWriteToken(data, len);
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS) {
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to write: 0x%08x",
|
||
|
ret);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
static void deinit_nfc_pn531(void)
|
||
|
{
|
||
|
u32 ret;
|
||
|
|
||
|
ret = WpsNfcCloseDevice();
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS)
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to close "
|
||
|
"NFC Device: 0x%08x", ret);
|
||
|
|
||
|
ret = WpsNfcDeinit();
|
||
|
if (ret != WPS_NFCLIB_ERR_SUCCESS)
|
||
|
wpa_printf(MSG_ERROR, "WPS (PN531): Failed to deinitialize "
|
||
|
"NFC Library: 0x%08x", ret);
|
||
|
}
|
||
|
|
||
|
|
||
|
struct oob_nfc_device_data oob_nfc_pn531_device_data = {
|
||
|
.init_func = init_nfc_pn531,
|
||
|
.read_func = read_nfc_pn531,
|
||
|
.write_func = write_nfc_pn531,
|
||
|
.deinit_func = deinit_nfc_pn531,
|
||
|
};
|