Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*!
     18  * \file phLibNfc_Ioctl.c
     19 
     20  * Project: NFC FRI 1.1
     21  *
     22  * $Date: Mon Mar  1 19:07:05 2010 $
     23  * $Author: ing07385 $
     24  * $Revision: 1.35 $
     25  * $Aliases: NFC_FRI1.1_WK1008_SDK,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1007_SDK,NFC_FRI1.1_WK1014_SDK,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1024_SDK $
     26  *
     27  */
     28 
     29 /*
     30 ************************* Header Files ****************************************
     31 */
     32 
     33 #include <phLibNfcStatus.h>
     34 #include <phLibNfc.h>
     35 #include <phHal4Nfc.h>
     36 #include <phOsalNfc.h>
     37 #include <phLibNfc_Internal.h>
     38 #include <phLibNfc_ndef_raw.h>
     39 #include <phLibNfc_initiator.h>
     40 #include <phLibNfc_discovery.h>
     41 #include <phLibNfc_ioctl.h>
     42 #include <phNfcStatus.h>
     43 
     44 /*
     45 *************************** Macro's  ****************************************
     46 */
     47 
     48 #ifndef STATIC_DISABLE
     49 #define STATIC static
     50 #else
     51 #define STATIC
     52 #endif
     53 
     54 /*
     55 *************************** Global Variables **********************************
     56 */
     57 
     58 STATIC phLibNfc_Ioctl_Cntx_t phLibNfc_Ioctl_Cntx;
     59 
     60 /*
     61 *************************** Static Function Declaration ***********************
     62 */
     63 
     64 
     65 /* Response callback for Ioctl management */
     66 STATIC  void phLibNfc_Ioctl_Mgmt_CB(void            *context,
     67                               phNfc_sData_t         *pOutData,
     68                               NFCSTATUS             status );
     69 
     70 
     71 /** Response callback for UICC switch mode*/
     72 STATIC void phLibNfc_Switch_Swp_Mode_CB(
     73                                 void  *context,
     74                                 NFCSTATUS status
     75                                 );
     76 
     77 /*
     78 *************************** Function Definitions ******************************
     79 */
     80 
     81 /**
     82 * The I/O Control function allows the caller to configure specific
     83 * functionality provided by the lower layer.Each feature is accessible
     84 * via a specific IOCTL Code.
     85 */
     86 NFCSTATUS phLibNfc_Mgt_IoCtl    (void*                      pDalHandle,
     87                                  uint16_t                   IoctlCode,
     88                                  phNfc_sData_t*             pInParam,
     89                                  phNfc_sData_t*             pOutParam,
     90                                  pphLibNfc_IoctlCallback_t  pIoCtl_Rsp_cb,
     91                                  void*                      pContext
     92                                  )
     93 {
     94     NFCSTATUS StatusCode=NFCSTATUS_INVALID_PARAMETER;
     95 
     96 
     97     if((IoctlCode==0)||(NULL==pIoCtl_Rsp_cb) ||
     98 		(NULL==pContext) ||(NULL==pInParam)  ||
     99 		(NULL==pDalHandle))
    100     {
    101         StatusCode=NFCSTATUS_INVALID_PARAMETER;
    102         return StatusCode;
    103     }
    104     if(IoctlCode!= NFC_FW_DOWNLOAD)
    105     {
    106         if(pOutParam == NULL)
    107         {
    108             StatusCode = NFCSTATUS_INVALID_PARAMETER;
    109             return StatusCode;
    110         }
    111         if(( gpphLibContext == NULL) ||
    112 			(gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown))
    113         {
    114             StatusCode = NFCSTATUS_NOT_INITIALISED;
    115             return StatusCode;
    116         }
    117         else
    118         {
    119             if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown)
    120             {
    121                 StatusCode = NFCSTATUS_SHUTDOWN;
    122                 return StatusCode;
    123             }
    124         }
    125     }
    126     phLibNfc_Ioctl_Cntx.CliRspCb =pIoCtl_Rsp_cb;
    127     phLibNfc_Ioctl_Cntx.pCliCntx = pContext;
    128     phLibNfc_Ioctl_Cntx.pOutParam = pOutParam;
    129     phLibNfc_Ioctl_Cntx.IoctlCode = IoctlCode;
    130     /* Process the IOCTL requests */
    131     switch(IoctlCode)
    132     {
    133         case NFC_FW_DOWNLOAD:
    134         {/* Set power status */
    135             phLibNfc_Ioctl_Cntx.psHwReference = phOsalNfc_GetMemory((uint32_t)sizeof(phHal_sHwReference_t));
    136             if(phLibNfc_Ioctl_Cntx.psHwReference == NULL)
    137                 return NFCSTATUS_FAILED;
    138             (void)memset(phLibNfc_Ioctl_Cntx.psHwReference,0,sizeof(phHal_sHwReference_t));
    139             phLibNfc_Ioctl_Cntx.psHwReference->p_board_driver = pDalHandle;
    140 
    141             StatusCode = phHal4Nfc_Ioctl( phLibNfc_Ioctl_Cntx.psHwReference,
    142                                           NFC_FW_DOWNLOAD,
    143                                           pInParam,
    144                                           pOutParam,
    145                                           phLibNfc_Ioctl_Mgmt_CB,
    146                                           &phLibNfc_Ioctl_Cntx );
    147         }break;
    148         case NFC_MEM_READ:
    149         {
    150            StatusCode = phHal4Nfc_Ioctl(gpphLibContext->psHwReference,
    151                                          NFC_MEM_READ,
    152                                          pInParam,
    153                                          pOutParam,
    154                                          phLibNfc_Ioctl_Mgmt_CB,
    155                                          &phLibNfc_Ioctl_Cntx );
    156 
    157         }break;
    158         case NFC_MEM_WRITE:
    159         {
    160 
    161            StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
    162 				                          NFC_MEM_WRITE,
    163                                           pInParam,
    164                                           pOutParam,
    165                                           phLibNfc_Ioctl_Mgmt_CB,
    166                                           &phLibNfc_Ioctl_Cntx );
    167 
    168         }break;
    169 		case PHLIBNFC_ANTENNA_TEST:
    170 		{
    171 
    172                 StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
    173                                           PHLIBNFC_ANTENNA_TEST,
    174                                           pInParam,
    175                                           pOutParam,
    176                                           phLibNfc_Ioctl_Mgmt_CB,
    177                                           &phLibNfc_Ioctl_Cntx );
    178 
    179 		}break;
    180 		case PHLIBNFC_SWP_TEST:
    181 		{
    182 
    183                 StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
    184                                           PHLIBNFC_SWP_TEST,
    185                                           pInParam,
    186                                           pOutParam,
    187                                           phLibNfc_Ioctl_Mgmt_CB,
    188                                           &phLibNfc_Ioctl_Cntx );
    189 
    190 		}break;
    191 
    192 		case PHLIBNFC_PRBS_TEST:
    193 		{
    194 		        StatusCode = phHal4Nfc_Ioctl( gpphLibContext->psHwReference,
    195                                           PHLIBNFC_PRBS_TEST,
    196                                           pInParam,
    197                                           pOutParam,
    198                                           phLibNfc_Ioctl_Mgmt_CB,
    199                                           &phLibNfc_Ioctl_Cntx );
    200 
    201 
    202 		}break;
    203         case PHLIBNFC_SWITCH_SWP_MODE:
    204 		{
    205             StatusCode = phHal4Nfc_Switch_Swp_Mode( gpphLibContext->psHwReference,
    206                                           (phHal_eSWP_Mode_t)pInParam->buffer[0],
    207                                           phLibNfc_Switch_Swp_Mode_CB,
    208                                           &phLibNfc_Ioctl_Cntx
    209                                           );
    210 
    211 
    212 		}break;
    213         default :
    214         {
    215           /* don't do any thing*/
    216         }break;
    217 
    218     } /* End of IOCTL  switch */
    219 	if(StatusCode!=NFCSTATUS_PENDING)
    220     {
    221 		StatusCode = NFCSTATUS_FAILED;
    222     }
    223 	else
    224 	{
    225 		if(IoctlCode!= NFC_FW_DOWNLOAD)
    226 		{
    227 			gpphLibContext->status.GenCb_pending_status=TRUE;
    228 		}
    229 	}
    230     return StatusCode;
    231 
    232 }   /* End of IOCTL handler function */
    233 
    234 
    235 
    236 STATIC  void phLibNfc_Ioctl_Mgmt_CB(void          *context,
    237                               phNfc_sData_t *pOutData,
    238                               NFCSTATUS      status )
    239 {
    240     phLibNfc_Ioctl_Cntx_t *pIoctlCntx=NULL;
    241     if(PHNFCSTATUS(status) == NFCSTATUS_FEATURE_NOT_SUPPORTED)
    242     {
    243         status = NFCSTATUS_FEATURE_NOT_SUPPORTED;
    244     }
    245     else if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
    246     {
    247         status = NFCSTATUS_FAILED;
    248     }
    249 	if(gpphLibContext!= NULL)
    250 	{
    251 		if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state)
    252 		{
    253 		    /*If shutdown called in between allow shutdown to happen*/
    254 			phLibNfc_Pending_Shutdown();
    255 			status = NFCSTATUS_SHUTDOWN;
    256 		}
    257 	}
    258     pIoctlCntx= (phLibNfc_Ioctl_Cntx_t*)context;
    259     if( pIoctlCntx !=NULL)
    260     {
    261         switch(pIoctlCntx->IoctlCode)
    262         {
    263             case NFC_FW_DOWNLOAD:
    264             {
    265                 /*Release the hardware reference memory*/
    266                 phOsalNfc_FreeMemory(pIoctlCntx->psHwReference);
    267             }break;
    268             case NFC_MEM_READ:
    269             {
    270 
    271             }break;
    272             case NFC_MEM_WRITE:
    273             {
    274 
    275             }break;
    276 
    277 			case PHLIBNFC_ANTENNA_TEST:
    278             {
    279 
    280             }break;
    281 			case PHLIBNFC_SWP_TEST:
    282             {
    283 
    284             }break;
    285 			case PHLIBNFC_PRBS_TEST:
    286             {
    287 
    288             }break;
    289             default:
    290             {
    291             }
    292         }
    293         pIoctlCntx->CliRspCb(pIoctlCntx->pCliCntx,pOutData,status);
    294 		if(gpphLibContext!= NULL)
    295 		{
    296 			gpphLibContext->status.GenCb_pending_status=FALSE;
    297 		}
    298     }
    299 }
    300 
    301 STATIC void phLibNfc_Switch_Swp_Mode_CB(
    302                                 void  *context,
    303                                 NFCSTATUS status
    304                                 )
    305 {
    306     if(PHNFCSTATUS(status)!=NFCSTATUS_SUCCESS)
    307     {
    308         status = NFCSTATUS_FAILED;
    309     }
    310     if(gpphLibContext!= NULL)
    311 	{
    312 		if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state)
    313 		{
    314 		    /*If shutdown called in between allow shutdown to happen*/
    315 			phLibNfc_Pending_Shutdown();
    316 			status = NFCSTATUS_SHUTDOWN;
    317 		}
    318 	}
    319     if((NULL != context)&&(context == (void *)&phLibNfc_Ioctl_Cntx))
    320     {
    321         if(NULL != phLibNfc_Ioctl_Cntx.CliRspCb)
    322         {
    323             (*phLibNfc_Ioctl_Cntx.CliRspCb)(
    324                 phLibNfc_Ioctl_Cntx.pCliCntx,
    325                 phLibNfc_Ioctl_Cntx.pOutParam,
    326                 status
    327                 );
    328         }
    329     }
    330     return;
    331 }
    332 
    333