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