Home | History | Annotate | Download | only in wps
      1 /*
      2  * NFC PN531 routines for Wi-Fi Protected Setup
      3  * Copyright (c) 2009-2012, Masashi Honma <masashi.honma (at) gmail.com>
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #include "includes.h"
     10 #include "common.h"
     11 
     12 #include "wps/wps.h"
     13 #include "wps_i.h"
     14 
     15 #include "WpsNfcType.h"
     16 #include "WpsNfc.h"
     17 
     18 
     19 static int init_nfc_pn531(char *path)
     20 {
     21 	u32 ret;
     22 
     23 	ret = WpsNfcInit();
     24 	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
     25 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to initialize "
     26 			   "NFC Library: 0x%08x", ret);
     27 		return -1;
     28 	}
     29 
     30 	ret = WpsNfcOpenDevice((int8 *) path);
     31 	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
     32 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to open "
     33 			   "NFC Device(%s): 0x%08x", path, ret);
     34 		goto fail;
     35 	}
     36 
     37 	ret = WpsNfcTokenDiscovery();
     38 	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
     39 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to discover "
     40 			   "token: 0x%08x", ret);
     41 		WpsNfcCloseDevice();
     42 		goto fail;
     43 	}
     44 
     45 	return 0;
     46 
     47 fail:
     48 	WpsNfcDeinit();
     49 	return -1;
     50 }
     51 
     52 
     53 static void * read_nfc_pn531(size_t *size)
     54 {
     55 	uint32 len;
     56 	u32 ret;
     57 	int8 *data;
     58 
     59 	ret = WpsNfcRawReadToken(&data, &len);
     60 	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
     61 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to read: 0x%08x",
     62 			   ret);
     63 		return NULL;
     64 	}
     65 
     66 	*size = len;
     67 	return data;
     68 }
     69 
     70 
     71 static int write_nfc_pn531(void *data, size_t len)
     72 {
     73 	u32 ret;
     74 
     75 	ret = WpsNfcRawWriteToken(data, len);
     76 	if (ret != WPS_NFCLIB_ERR_SUCCESS) {
     77 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to write: 0x%08x",
     78 			   ret);
     79 		return -1;
     80 	}
     81 
     82 	return 0;
     83 }
     84 
     85 
     86 static void deinit_nfc_pn531(void)
     87 {
     88 	u32 ret;
     89 
     90 	ret = WpsNfcCloseDevice();
     91 	if (ret != WPS_NFCLIB_ERR_SUCCESS)
     92 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to close "
     93 			   "NFC Device: 0x%08x", ret);
     94 
     95 	ret = WpsNfcDeinit();
     96 	if (ret != WPS_NFCLIB_ERR_SUCCESS)
     97 		wpa_printf(MSG_ERROR, "WPS (PN531): Failed to deinitialize "
     98 			   "NFC Library: 0x%08x", ret);
     99 }
    100 
    101 
    102 struct oob_nfc_device_data oob_nfc_pn531_device_data = {
    103 	.init_func	= init_nfc_pn531,
    104 	.read_func	= read_nfc_pn531,
    105 	.write_func	= write_nfc_pn531,
    106 	.deinit_func	= deinit_nfc_pn531,
    107 };
    108