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