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