/*
 * 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,
};