• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  */
phLibNfc_Mgt_IoCtl(void * pDalHandle,uint16_t IoctlCode,phNfc_sData_t * pInParam,phNfc_sData_t * pOutParam,pphLibNfc_IoctlCallback_t pIoCtl_Rsp_cb,void * pContext)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  
phLibNfc_Ioctl_Mgmt_CB(void * context,phNfc_sData_t * pOutData,NFCSTATUS status)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  
phLibNfc_Switch_Swp_Mode_CB(void * context,NFCSTATUS status)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