merge with master
[adaptation/devices/nfc-plugin-nxp.git] / src / phHciNfc_DevMgmt.c
1 /*\r
2  * Copyright (C) 2010 NXP Semiconductors\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 \r
17 \r
18 /*!\r
19 * =========================================================================== *\r
20 *                                                                             *\r
21 *                                                                             *\r
22 * \file  phHciNfc_DevMgmt.c                                                   *\r
23 * \brief HCI PN544 Device Management Gate Routines.                           *\r
24 *                                                                             *\r
25 *                                                                             *\r
26 * Project: NFC-FRI-1.1                                                        *\r
27 *                                                                             *\r
28 * $Date: Fri Mar 12 10:21:54 2010 $                                           *\r
29 * $Author: ing04880 $                                                         *\r
30 * $Revision: 1.29 $                                                            *\r
31 * $Aliases: NFC_FRI1.1_WK1007_R33_3,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $                                                                *\r
32 *                                                                             *\r
33 * =========================================================================== *\r
34 */\r
35 \r
36 /*\r
37 ***************************** Header File Inclusion ****************************\r
38 */\r
39 #include <phNfcConfig.h>\r
40 #include <phNfcCompId.h>\r
41 #include <phHciNfc_Pipe.h>\r
42 #include <phHciNfc_DevMgmt.h>\r
43 #include <phHciNfc_Emulation.h>\r
44 #include <phOsalNfc.h>\r
45 \r
46 /*\r
47 ****************************** Macro Definitions *******************************\r
48 */\r
49 \r
50 /*  Commands for System Management module */\r
51 #define NXP_RF_CHECK_SETTINGS   0x10U\r
52 #define NXP_RF_UPDATE_SETTINGS  0x11U\r
53 \r
54 /* Self Test Commands */\r
55 #define NXP_SELF_TEST_ANTENNA   0x20U\r
56 #define NXP_SELF_TEST_SWP       0x21U\r
57 #define NXP_SELF_TEST_NFCWI     0x22U\r
58 #define NXP_SELF_TEST_PRBS      0x25U\r
59 \r
60 /* System Management propreitary control */\r
61 #define NXP_DBG_READ            0x3EU\r
62 #define NXP_DBG_WRITE           0x3FU\r
63 \r
64 /* System Management Events */\r
65 #define NXP_EVT_SET_AUTONOMOUS   0x01U\r
66 #define NXP_EVT_CLF_WAKEUP       0x02U\r
67 \r
68 /* System Management Information Events */\r
69 #define NXP_EVT_INFO_TXLDO_OVERCUR   0x10U\r
70 #define NXP_EVT_INFO_PMUVCC          0x11U\r
71 #define NXP_EVT_INFO_EXT_RF_FIELD    0x12U\r
72 #define NXP_EVT_INFO_MEM_VIOLATION   0x13U\r
73 #define NXP_EVT_INFO_TEMP_OVERHEAT   0x14U\r
74 #define NXP_EVT_INFO_LLC_ERROR       0x15U\r
75 \r
76 #define NFC_DEV_TXLDO_MASK           0x03U\r
77 \r
78 \r
79 /*\r
80 *************************** Structure and Enumeration ***************************\r
81 */\r
82 \r
83 \r
84 /** \defgroup grp_hci_nfc HCI PN544 Device Management Component\r
85  *\r
86  *\r
87  */\r
88 \r
89 typedef enum phHciNfc_DevMgmt_Seq{\r
90     DEV_MGMT_PIPE_OPEN      = 0x00U,\r
91     DEV_MGMT_SET_PWR_STATUS,\r
92     DEV_MGMT_SET_INFO_EVT,\r
93     DEV_MGMT_GET_EEPROM_INFO,\r
94     DEV_MGMT_GPIO_PDIR,\r
95     DEV_MGMT_GPIO_PEN,\r
96     DEV_MGMT_TX_LDO,\r
97     DEV_MGMT_IFC_TO_RX_H,\r
98     DEV_MGMT_IFC_TO_RX_L,\r
99     DEV_MGMT_IFC_TO_TX_H,\r
100     DEV_MGMT_IFC_TO_TX_L,\r
101     DEV_MGMT_ANAIRQ_CONF,\r
102     DEV_MGMT_PMOS_MOD,\r
103     DEV_MGMT_CLK_REQ,\r
104     DEV_MGMT_INPUT_CLK,\r
105     DEV_MGMT_UICC_PWR_REQUEST,\r
106     DEV_MGMT_ACTIVE_GUARD_TO,\r
107     DEV_MGMT_MAX_ACT_TO_LOW,\r
108     DEV_MGMT_MAX_ACT_TO_HIGH,\r
109     DEV_MGMT_UICC_CE_A_ACCESS,\r
110     DEV_MGMT_UICC_CE_B_ACCESS,\r
111     DEV_MGMT_UICC_CE_BP_ACCESS,\r
112     DEV_MGMT_UICC_CE_F_ACCESS,\r
113     DEV_MGMT_UICC_RD_A_ACCESS,\r
114     DEV_MGMT_UICC_RD_B_ACCESS,\r
115     DEV_MGMT_UICC_BIT_RATE,\r
116     DEV_MGMT_UICC_RX_ERR_CNT,\r
117     DEV_MGMT_UICC_TX_ERR_CNT,\r
118     DEV_MGMT_LLC_GRD_TO_H,\r
119     DEV_MGMT_LLC_GRD_TO_L,\r
120     DEV_MGMT_LLC_ACK_TO_H,\r
121     DEV_MGMT_LLC_ACK_TO_L,\r
122     DEV_MGMT_FELICA_RC,\r
123     DEV_MGMT_EVT_AUTONOMOUS,\r
124     DEV_MGMT_PIPE_CLOSE\r
125 } phHciNfc_DevMgmt_Seq_t;\r
126 \r
127 \r
128 typedef struct phHciNfc_DevMgmt_Info{\r
129     phHciNfc_DevMgmt_Seq_t  current_seq;\r
130     phHciNfc_DevMgmt_Seq_t  next_seq;\r
131     phHciNfc_Pipe_Info_t    *p_pipe_info;\r
132     uint8_t                 test_status;\r
133     uint8_t                 value;\r
134     uint8_t                 rf_status;\r
135     uint8_t                 pmuvcc_status;\r
136     uint8_t                 overheat_status;\r
137     uint8_t                 *p_val;\r
138     uint8_t                 eeprom_crc;\r
139     phNfc_sData_t           test_result;\r
140 \r
141 } phHciNfc_DevMgmt_Info_t;\r
142 \r
143 \r
144 /*\r
145 *************************** Static Function Declaration **************************\r
146 */\r
147 \r
148 static\r
149 NFCSTATUS\r
150 phHciNfc_DevMgmt_InfoUpdate(\r
151                                 phHciNfc_sContext_t     *psHciContext,\r
152                                 phHal_sHwReference_t    *pHwRef,\r
153                                 uint8_t                 index,\r
154                                 uint8_t                 *reg_value,\r
155                                 uint8_t                 reg_length\r
156                          );\r
157 \r
158 static\r
159 NFCSTATUS\r
160 phHciNfc_Recv_DevMgmt_Response(\r
161                         void                *psHciContext,\r
162                         void                *pHwRef,\r
163                         uint8_t             *pResponse,\r
164 #ifdef ONE_BYTE_LEN\r
165                         uint8_t             length\r
166 #else\r
167                         uint16_t            length\r
168 #endif\r
169                        );\r
170 \r
171 static\r
172 NFCSTATUS\r
173 phHciNfc_Recv_DevMgmt_Event(\r
174                         void                *psContext,\r
175                         void                *pHwRef,\r
176                         uint8_t             *pEvent,\r
177 #ifdef ONE_BYTE_LEN\r
178                         uint8_t             length\r
179 #else\r
180                         uint16_t            length\r
181 #endif\r
182                     );\r
183 \r
184 \r
185 static\r
186 NFCSTATUS\r
187 phHciNfc_Send_DevMgmt_Command (\r
188                             phHciNfc_sContext_t *psHciContext,\r
189                             void                *pHwRef,\r
190                             uint8_t             pipe_id,\r
191                             uint8_t             cmd\r
192                 );\r
193 \r
194 static\r
195  NFCSTATUS\r
196  phHciNfc_Send_DevMgmt_Event (\r
197                                 phHciNfc_sContext_t *psHciContext,\r
198                                 void                *pHwRef,\r
199                                 uint8_t             pipe_id,\r
200                                 uint8_t             event\r
201                     );\r
202 \r
203 /*\r
204 *************************** Function Definitions ***************************\r
205 */\r
206 \r
207 \r
208 NFCSTATUS\r
209 phHciNfc_DevMgmt_Init_Resources(\r
210                            phHciNfc_sContext_t  *psHciContext\r
211                           )\r
212 {\r
213     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
214     phHciNfc_DevMgmt_Info_t          *p_device_mgmt_info=NULL;\r
215    \r
216     if( NULL == psHciContext )\r
217     {\r
218         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
219     }\r
220     else\r
221     {\r
222         if(( NULL == psHciContext->p_device_mgmt_info ) &&\r
223              (phHciNfc_Allocate_Resource((void **)(&p_device_mgmt_info),\r
224             sizeof(phHciNfc_DevMgmt_Info_t))== NFCSTATUS_SUCCESS))\r
225         {\r
226             psHciContext->p_device_mgmt_info = p_device_mgmt_info;\r
227             p_device_mgmt_info->current_seq = DEV_MGMT_PIPE_OPEN;\r
228             p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN;\r
229             p_device_mgmt_info->p_pipe_info = NULL;\r
230         }\r
231         else\r
232         {\r
233             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);\r
234         }\r
235     }\r
236     return status;\r
237 }\r
238 \r
239 \r
240 NFCSTATUS\r
241 phHciNfc_DevMgmt_Get_PipeID(\r
242                             phHciNfc_sContext_t        *psHciContext,\r
243                             uint8_t                    *ppipe_id\r
244                             )\r
245 {\r
246     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
247 \r
248     if( (NULL != psHciContext)\r
249         && ( NULL != ppipe_id )\r
250         && ( NULL != psHciContext->p_device_mgmt_info ) \r
251         )\r
252     {\r
253         phHciNfc_Pipe_Info_t     *p_pipe_info = NULL;\r
254         p_pipe_info = ((phHciNfc_DevMgmt_Info_t *)\r
255             psHciContext->p_device_mgmt_info)->p_pipe_info ;\r
256         if (NULL != p_pipe_info)\r
257         {\r
258             *ppipe_id = p_pipe_info->pipe.pipe_id ;\r
259         }\r
260         else\r
261         {\r
262             *ppipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
263         }\r
264 \r
265     }\r
266     else \r
267     {\r
268         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
269     }\r
270     return status;\r
271 }\r
272 \r
273 \r
274 NFCSTATUS\r
275 phHciNfc_DevMgmt_Get_Test_Result(\r
276                                 phHciNfc_sContext_t        *psHciContext,\r
277                                 phNfc_sData_t              *p_test_result\r
278                             )\r
279 {\r
280     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
281 \r
282     if( (NULL != psHciContext)\r
283         && ( NULL != p_test_result )\r
284         && ( NULL != psHciContext->p_device_mgmt_info ) \r
285         )\r
286     {\r
287         phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL;\r
288         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
289                                 psHciContext->p_device_mgmt_info ;\r
290         p_test_result->buffer = p_device_mgmt_info->test_result.buffer;\r
291         p_test_result->length = p_device_mgmt_info->test_result.length;\r
292 \r
293     }\r
294     else \r
295     {\r
296         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
297     }\r
298 \r
299     return status;\r
300 }\r
301 \r
302 \r
303 NFCSTATUS\r
304 phHciNfc_DevMgmt_Set_Test_Result(\r
305                                 phHciNfc_sContext_t        *psHciContext,\r
306                                 uint8_t                    test_status\r
307                             )\r
308 {\r
309     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
310 \r
311     if( (NULL != psHciContext)\r
312         && ( NULL != psHciContext->p_device_mgmt_info ) \r
313         )\r
314     {\r
315         phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL;\r
316         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
317                                 psHciContext->p_device_mgmt_info ;\r
318         p_device_mgmt_info->test_status = test_status;\r
319         \r
320     }\r
321     else \r
322     {\r
323         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
324     }\r
325 \r
326     return status;\r
327 }\r
328 \r
329 \r
330 \r
331 NFCSTATUS\r
332 phHciNfc_DevMgmt_Update_PipeInfo(\r
333                                   phHciNfc_sContext_t     *psHciContext,\r
334                                   uint8_t                 pipeID,\r
335                                   phHciNfc_Pipe_Info_t    *pPipeInfo\r
336                            )\r
337 {\r
338     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
339 \r
340     if( NULL == psHciContext )\r
341     {\r
342         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
343     }\r
344     else if(NULL == psHciContext->p_device_mgmt_info)\r
345     {\r
346         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
347     }\r
348     else\r
349     {\r
350         phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL;\r
351         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
352                                 psHciContext->p_device_mgmt_info ;\r
353         /* Update the pipe_info of the Device Management Gate obtained \r
354          * from HCI Response */\r
355         p_device_mgmt_info->p_pipe_info = pPipeInfo;\r
356         if (( NULL != pPipeInfo)\r
357             && ((uint8_t)HCI_UNKNOWN_PIPE_ID != pipeID)\r
358             )\r
359         {\r
360             /* Update the Response Receive routine of the Device \r
361              * Managment Gate */\r
362             pPipeInfo->recv_resp = &phHciNfc_Recv_DevMgmt_Response;\r
363             pPipeInfo->recv_event = &phHciNfc_Recv_DevMgmt_Event;\r
364         }\r
365     }\r
366 \r
367     return status;\r
368 }\r
369 \r
370 \r
371  NFCSTATUS\r
372  phHciNfc_DevMgmt_Configure (\r
373                                 phHciNfc_sContext_t *psHciContext,\r
374                                 void                *pHwRef,\r
375                                 uint16_t            address,\r
376                                 uint8_t             value\r
377                     )\r
378 {\r
379     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
380     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;\r
381     uint8_t                     pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
382     uint8_t                     i=0;\r
383     uint8_t                     params[5];\r
384 \r
385     if( (NULL == psHciContext) || (NULL == pHwRef) )\r
386     {\r
387       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
388     }\r
389     else if(  NULL == psHciContext->p_device_mgmt_info )\r
390     {\r
391         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
392     }\r
393     else\r
394     {\r
395         p_pipe_info = ((phHciNfc_DevMgmt_Info_t *)\r
396                        psHciContext->p_device_mgmt_info)->p_pipe_info ;\r
397 \r
398         if(NULL == p_pipe_info )\r
399         {\r
400             status = PHNFCSTVAL(CID_NFC_HCI, \r
401                             NFCSTATUS_INVALID_HCI_SEQUENCE);\r
402         }\r
403         else\r
404         {\r
405             pipe_id = p_pipe_info->pipe.pipe_id ;\r
406             params[i++] = 0x00;\r
407             params[i++] = (uint8_t)(address >> BYTE_SIZE);\r
408             params[i++] = (uint8_t)address;\r
409             params[i++] = value;\r
410             p_pipe_info->param_info = &params;\r
411             p_pipe_info->param_length = i ;\r
412             status = phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, \r
413                                                 pipe_id, (uint8_t)NXP_DBG_WRITE );\r
414         }\r
415     }\r
416     return status;\r
417 }\r
418 \r
419 \r
420  NFCSTATUS\r
421  phHciNfc_DevMgmt_Get_Info (\r
422                                 phHciNfc_sContext_t *psHciContext,\r
423                                 void                *pHwRef,\r
424                                 uint16_t            address,\r
425                                 uint8_t             *p_val\r
426                     )\r
427 {\r
428     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
429     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;\r
430     uint8_t                     pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
431     uint8_t                     i=0;\r
432     uint8_t                     params[5];\r
433 \r
434     if( (NULL == psHciContext) || (NULL == pHwRef) )\r
435     {\r
436       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
437     }\r
438     else if(  NULL == psHciContext->p_device_mgmt_info )\r
439     {\r
440         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
441     }\r
442     else\r
443     {\r
444         p_pipe_info = ((phHciNfc_DevMgmt_Info_t *)\r
445                        psHciContext->p_device_mgmt_info)->p_pipe_info ;\r
446 \r
447         if(NULL == p_pipe_info )\r
448         {\r
449             status = PHNFCSTVAL(CID_NFC_HCI, \r
450                             NFCSTATUS_INVALID_HCI_SEQUENCE);\r
451         }\r
452         else\r
453         {\r
454             ((phHciNfc_DevMgmt_Info_t *)\r
455                     psHciContext->p_device_mgmt_info)->p_val = p_val;\r
456             pipe_id = p_pipe_info->pipe.pipe_id ;\r
457             params[i++] = 0x00;\r
458             params[i++] = (uint8_t)(address >> BYTE_SIZE);\r
459             params[i++] = (uint8_t) address;\r
460             p_pipe_info->param_info = &params;\r
461             p_pipe_info->param_length = i ;\r
462             status = phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, \r
463                                             pipe_id, (uint8_t)NXP_DBG_READ );\r
464         }\r
465     }\r
466     return status;\r
467 \r
468 }\r
469 \r
470 /*!\r
471  * \brief Initialisation of PN544 Device Managment Gate.\r
472  *\r
473  * This function initialses the PN544 Device Management gate and \r
474  * populates the PN544 Device Management Information Structure\r
475  * \r
476  */\r
477 \r
478 NFCSTATUS\r
479 phHciNfc_DevMgmt_Initialise(\r
480                                 phHciNfc_sContext_t     *psHciContext,\r
481                                 void                    *pHwRef\r
482                          )\r
483 {\r
484     NFCSTATUS                       status = NFCSTATUS_SUCCESS;\r
485     phHciNfc_Pipe_Info_t            *p_pipe_info = NULL;\r
486     phHciNfc_DevMgmt_Info_t         *p_device_mgmt_info=NULL;\r
487     static uint8_t                   config = 0x10;\r
488 \r
489     if( ( NULL == psHciContext )\r
490         || (NULL == pHwRef )\r
491         )\r
492     {\r
493         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
494     }\r
495     else if (NULL == psHciContext->p_device_mgmt_info)\r
496     {\r
497         status = PHNFCSTVAL(CID_NFC_HCI,\r
498                     NFCSTATUS_INVALID_HCI_INFORMATION);\r
499     }/* End of the PN544 Device Info Memory Check */\r
500     else\r
501     {\r
502         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
503                                 psHciContext->p_device_mgmt_info ;\r
504         p_pipe_info = p_device_mgmt_info->p_pipe_info;\r
505 \r
506         if (NULL == p_pipe_info)\r
507         {\r
508             status = PHNFCSTVAL(CID_NFC_HCI, \r
509                             NFCSTATUS_INVALID_HCI_SEQUENCE);\r
510         }\r
511         else\r
512         {\r
513             switch(p_device_mgmt_info->current_seq )\r
514             {\r
515                 /* PN544 Device Mgmt pipe open sequence */\r
516                 case DEV_MGMT_PIPE_OPEN:\r
517                 {\r
518                     status = phHciNfc_Open_Pipe( psHciContext,\r
519                                                     pHwRef, p_pipe_info );\r
520                     if(status == NFCSTATUS_SUCCESS)\r
521                     {\r
522                         p_device_mgmt_info->next_seq =\r
523                                     DEV_MGMT_FELICA_RC;\r
524                         status = NFCSTATUS_PENDING;\r
525                     }\r
526                     break;\r
527                 }\r
528                 case DEV_MGMT_GET_EEPROM_INFO:\r
529                 {\r
530                     p_pipe_info->reg_index = DEVICE_INFO_EEPROM_INDEX;\r
531                     status = phHciNfc_Send_Generic_Cmd( psHciContext, \r
532                             pHwRef, (uint8_t)p_pipe_info->pipe.pipe_id,\r
533                                 (uint8_t)ANY_GET_PARAMETER);\r
534                     if(NFCSTATUS_PENDING == status )\r
535                     {\r
536 #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 )\r
537                         p_device_mgmt_info->next_seq =\r
538                                                 DEV_MGMT_IFC_TO_TX_H;\r
539 #else\r
540                         p_device_mgmt_info->next_seq =\r
541                                         DEV_MGMT_TX_LDO;\r
542 #endif /* #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */\r
543                     }\r
544                     break;\r
545                 }\r
546                 case DEV_MGMT_GPIO_PDIR:\r
547                 {\r
548                     config = 0x00;\r
549                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
550                             NFC_ADDRESS_GPIO_PDIR , config );\r
551                     if(NFCSTATUS_PENDING == status )\r
552                     {\r
553                         p_device_mgmt_info->next_seq =\r
554                                                 DEV_MGMT_GPIO_PEN;\r
555                     }\r
556                     break;\r
557                 }\r
558                 case DEV_MGMT_GPIO_PEN:\r
559                 {\r
560                     config = NXP_NFC_GPIO_MASK(NXP_DOWNLOAD_GPIO)| 0x03 ;\r
561                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
562                             NFC_ADDRESS_GPIO_PEN , config );\r
563                     if(NFCSTATUS_PENDING == status )\r
564                     {\r
565 #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 )\r
566                         p_device_mgmt_info->next_seq =\r
567                                                 DEV_MGMT_IFC_TO_TX_H;\r
568 #else\r
569                         p_device_mgmt_info->next_seq =\r
570                                                 DEV_MGMT_TX_LDO;\r
571 #endif /* #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */\r
572                     }\r
573                     break;\r
574                 }\r
575                 case DEV_MGMT_FELICA_RC:\r
576                 {\r
577                     config = 0x00;\r
578                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
579                                  NFC_FELICA_RC_ADDR , config );\r
580                     if(NFCSTATUS_PENDING == status )\r
581                     {\r
582 \r
583                         if ((HCI_SELF_TEST == psHciContext->init_mode )\r
584                             || (HCI_NFC_DEVICE_TEST == psHciContext->init_mode ))\r
585                         {\r
586                             p_device_mgmt_info->next_seq =\r
587                                    DEV_MGMT_GPIO_PDIR;\r
588                         }\r
589                         else\r
590                         {\r
591                             p_device_mgmt_info->next_seq =\r
592                                    DEV_MGMT_GET_EEPROM_INFO;\r
593                         }\r
594                     }\r
595                     break;\r
596                 }\r
597                 \r
598 #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 )\r
599 \r
600                 case DEV_MGMT_IFC_TO_TX_H:\r
601                 {\r
602                     config =  (uint8_t)\r
603                         ( NXP_NFC_IFC_CONFIG_DEFAULT >> BYTE_SIZE ) /* 0x03 */;\r
604                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
605                         NFC_ADDRESS_IFC_TO_TX_H , config );\r
606                     if(NFCSTATUS_PENDING == status )\r
607                     {\r
608                         p_device_mgmt_info->next_seq =\r
609                                                 DEV_MGMT_IFC_TO_TX_L;\r
610                     }\r
611                     break;\r
612                 }\r
613                 case DEV_MGMT_IFC_TO_TX_L:\r
614                 {\r
615                     config = (uint8_t)\r
616                         ( NXP_NFC_IFC_CONFIG_DEFAULT & BYTE_MASK ) /* 0xE8 */;\r
617                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
618                             NFC_ADDRESS_IFC_TO_TX_L , config );\r
619                     if(NFCSTATUS_PENDING == status )\r
620                     {\r
621 #if  ( NXP_NFC_IFC_TIMEOUT & 0x02 )\r
622                         p_device_mgmt_info->next_seq =\r
623                                                 DEV_MGMT_IFC_TO_RX_H;\r
624 #else\r
625                         p_device_mgmt_info->next_seq =\r
626                                                 DEV_MGMT_TX_LDO;\r
627 #endif /* #if  ( NXP_NFC_IFC_TIMEOUT & 0x02 ) */\r
628                     }\r
629                     break;\r
630                 }\r
631                 case DEV_MGMT_IFC_TO_RX_H:\r
632                 {\r
633                     config = 0x10;\r
634                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
635                             NFC_ADDRESS_IFC_TO_RX_H , config );\r
636                     if(NFCSTATUS_PENDING == status )\r
637                     {\r
638                         p_device_mgmt_info->next_seq =\r
639                                                 DEV_MGMT_IFC_TO_RX_L;\r
640                     }\r
641                     break;\r
642                 }\r
643                 case DEV_MGMT_IFC_TO_RX_L:\r
644                 {\r
645                     config = 0x1E;\r
646                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
647                             NFC_ADDRESS_IFC_TO_RX_L , config );\r
648                     if(NFCSTATUS_PENDING == status )\r
649                     {\r
650                         p_device_mgmt_info->next_seq =\r
651                                                 DEV_MGMT_TX_LDO;\r
652                     }\r
653                     break;\r
654                 }\r
655 \r
656 #endif /* #if  ( NXP_NFC_IFC_TIMEOUT & 0x01 ) */\r
657                 case DEV_MGMT_TX_LDO:\r
658                 {\r
659 #if ( NXP_HAL_VERIFY_EEPROM_CRC & 0x01U )\r
660                     if (0 != p_device_mgmt_info->eeprom_crc)\r
661                     {\r
662                         status = NFCSTATUS_FAILED;\r
663                     }\r
664                     else\r
665 #endif\r
666                     {\r
667                        config = (NFC_DEV_HWCONF_DEFAULT |\r
668                                     (NXP_DEFAULT_TX_LDO & NFC_DEV_TXLDO_MASK));\r
669                        status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
670                             NFC_ADDRESS_HW_CONF , config );\r
671                        if(NFCSTATUS_PENDING == status )\r
672                        {\r
673 #if ( SW_TYPE_RF_TUNING_BF & 0x01)\r
674                            p_device_mgmt_info->next_seq = DEV_MGMT_ANAIRQ_CONF;\r
675 #else\r
676                            p_device_mgmt_info->next_seq = DEV_MGMT_CLK_REQ;\r
677 #endif\r
678                            /* status = NFCSTATUS_SUCCESS; */\r
679                        }\r
680                     }\r
681                     break;\r
682                 }\r
683 #if ( SW_TYPE_RF_TUNING_BF & 0x01)\r
684                 /* The Analogue IRQ Configuartion */\r
685                 case DEV_MGMT_ANAIRQ_CONF:\r
686                 {\r
687                     config = 0x04;\r
688                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
689                             NFC_ADDRESS_ANAIRQ_CONF , config );\r
690                     if(NFCSTATUS_PENDING == status )\r
691                     {\r
692                         p_device_mgmt_info->next_seq =\r
693                                                 DEV_MGMT_PMOS_MOD;\r
694                         /* status = NFCSTATUS_SUCCESS; */\r
695                     }\r
696                     break;\r
697                 }\r
698                 /* The PMOS Modulation Index */\r
699                 case DEV_MGMT_PMOS_MOD:\r
700                 {\r
701                     config = NFC_DEV_PMOS_MOD_DEFAULT;\r
702                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
703                             NFC_ADDRESS_PMOS_MOD , config );\r
704                     if(NFCSTATUS_PENDING == status )\r
705                     {\r
706                         p_device_mgmt_info->next_seq =\r
707                                                 DEV_MGMT_CLK_REQ;\r
708                         /* status = NFCSTATUS_SUCCESS; */\r
709                     }\r
710                     break;\r
711                 }\r
712 #endif /* #if ( SW_TYPE_RF_TUNING_BF & 0x01) */\r
713                 case DEV_MGMT_CLK_REQ:\r
714                 {\r
715                     config = ((phHal_sHwConfig_t *)\r
716                                     psHciContext->p_config_params)->clk_req ;\r
717                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
718                             NFC_ADDRESS_CLK_REQ , config );\r
719                     if(NFCSTATUS_PENDING == status )\r
720                     {\r
721                         p_device_mgmt_info->next_seq =\r
722                                                 DEV_MGMT_INPUT_CLK;\r
723                         /* status = NFCSTATUS_SUCCESS; */\r
724                     }\r
725                     break;\r
726                 }\r
727                 case DEV_MGMT_INPUT_CLK:\r
728                 {\r
729                     config = ((phHal_sHwConfig_t *)\r
730                                     psHciContext->p_config_params)->input_clk;\r
731                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
732                             NFC_ADDRESS_CLK_INPUT , config );\r
733                     if(NFCSTATUS_PENDING == status )\r
734                     {\r
735                         p_device_mgmt_info->next_seq =\r
736                                                 DEV_MGMT_UICC_PWR_REQUEST;\r
737                     }\r
738                     break;\r
739                 }\r
740                 case DEV_MGMT_UICC_PWR_REQUEST:\r
741                 {\r
742                     config = NXP_UICC_PWR_REQUEST;\r
743                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
744                             NFC_ADDRESS_SWP_PWR_REQ , config );\r
745                     if(NFCSTATUS_PENDING == status )\r
746                     {\r
747                         p_device_mgmt_info->next_seq =\r
748                                                 DEV_MGMT_UICC_RD_A_ACCESS;\r
749                     }\r
750                     break;\r
751                 }\r
752                 case DEV_MGMT_UICC_RD_A_ACCESS:\r
753                 {\r
754 #if ( NXP_UICC_RD_RIGHTS & 0x01 )\r
755                     config = (uint8_t) phHciNfc_RFReaderAGate;\r
756 #else\r
757                     config = 0xFFU;\r
758 #endif /* #if ( NXP_UICC_RD_RIGHTS & 0x01 ) */\r
759                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
760                             NFC_ADDRESS_UICC_RD_A_ACCESS , config );\r
761                     if(NFCSTATUS_PENDING == status )\r
762                     {\r
763                         p_device_mgmt_info->next_seq =\r
764                                                 DEV_MGMT_UICC_RD_B_ACCESS;\r
765                     }\r
766                     break;\r
767                 }\r
768                 case DEV_MGMT_UICC_RD_B_ACCESS:\r
769                 {\r
770 #if ( NXP_UICC_RD_RIGHTS & 0x02 )\r
771                     config = (uint8_t) phHciNfc_RFReaderBGate;\r
772 #else\r
773                     config = 0xFFU;\r
774 #endif /* #if ( NXP_UICC_RD_RIGHTS & 0x02 ) */\r
775                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
776                             NFC_ADDRESS_UICC_RD_B_ACCESS , config );\r
777                     if(NFCSTATUS_PENDING == status )\r
778                     {\r
779                         p_device_mgmt_info->next_seq =\r
780                                                 DEV_MGMT_UICC_CE_A_ACCESS;\r
781                     }\r
782                     break;\r
783                 }\r
784                 case DEV_MGMT_UICC_CE_A_ACCESS:\r
785                 {\r
786 #if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x01 )\r
787                     config = (uint8_t) phHciNfc_CETypeAGate;\r
788 #else\r
789                     config = 0xFFU;\r
790 #endif /* #if ( NXP_UICC_CE_RIGHTS & 0x01 ) */\r
791                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
792                             NFC_ADDRESS_UICC_CE_A_ACCESS , config );\r
793                     if(NFCSTATUS_PENDING == status )\r
794                     {\r
795                         p_device_mgmt_info->next_seq =\r
796                                                 DEV_MGMT_UICC_CE_B_ACCESS;\r
797                     }\r
798                     break;\r
799                 }\r
800                 case DEV_MGMT_UICC_CE_B_ACCESS:\r
801                 {\r
802 #if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x02 )\r
803                     config = (uint8_t) phHciNfc_CETypeBGate;\r
804 #else\r
805                     config = 0xFFU;\r
806 #endif /* #if ( NXP_UICC_CE_RIGHTS & 0x02 ) */\r
807                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
808                             NFC_ADDRESS_UICC_CE_B_ACCESS , config );\r
809                     if(NFCSTATUS_PENDING == status )\r
810                     {\r
811                         p_device_mgmt_info->next_seq =\r
812                                                 DEV_MGMT_UICC_CE_BP_ACCESS;\r
813                     }\r
814                     break;\r
815                 }\r
816                 case DEV_MGMT_UICC_CE_BP_ACCESS:\r
817                 {\r
818 #if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x04 )\r
819                     config = (uint8_t) phHciNfc_CETypeBPrimeGate;\r
820 #else\r
821                     config = 0xFFU;\r
822 #endif /* #if ( NXP_UICC_CE_RIGHTS & 0x04 ) */\r
823                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
824                             NFC_ADDRESS_UICC_CE_BP_ACCESS , config );\r
825                     if(NFCSTATUS_PENDING == status )\r
826                     {\r
827                         p_device_mgmt_info->next_seq =\r
828                                                 DEV_MGMT_UICC_CE_F_ACCESS;\r
829                     }\r
830                     break;\r
831                 }\r
832                 case DEV_MGMT_UICC_CE_F_ACCESS:\r
833                 {\r
834 #if defined(HOST_EMULATION) || ( NXP_UICC_CE_RIGHTS & 0x08 )\r
835                     config = (uint8_t) phHciNfc_CETypeFGate;\r
836 #else\r
837                     config = 0xFFU;\r
838 #endif /* #if ( NXP_UICC_CE_RIGHTS & 0x08 ) */\r
839                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
840                             NFC_ADDRESS_UICC_CE_F_ACCESS , config );\r
841                     if(NFCSTATUS_PENDING == status )\r
842                     {\r
843                         p_device_mgmt_info->next_seq =\r
844                                                 DEV_MGMT_UICC_BIT_RATE;\r
845                     }\r
846                     break;\r
847                 }\r
848                 case DEV_MGMT_UICC_BIT_RATE:\r
849                 {\r
850                     config = NXP_UICC_BIT_RATE;\r
851                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
852                             NFC_ADDRESS_SWP_BITRATE , config );\r
853                     if(NFCSTATUS_PENDING == status )\r
854                     {\r
855 #if defined (CFG_PWR_STATUS) \r
856                         p_device_mgmt_info->next_seq =\r
857                                                 DEV_MGMT_SET_PWR_STATUS;\r
858 #else\r
859                         p_device_mgmt_info->next_seq =\r
860                                                 DEV_MGMT_SET_INFO_EVT;\r
861 #endif\r
862                     }\r
863                     break;\r
864                 }\r
865 #ifdef CFG_PWR_STATUS\r
866                 case DEV_MGMT_SET_PWR_STATUS:\r
867                 {\r
868                     config = NXP_SYSTEM_PWR_STATUS;\r
869                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
870                             NFC_ADDRESS_PWR_STATUS , config );\r
871                     if(NFCSTATUS_PENDING == status )\r
872                     {\r
873                         p_device_mgmt_info->next_seq =\r
874                                                 DEV_MGMT_SET_INFO_EVT;\r
875                     }\r
876                     break;\r
877                 }\r
878 #endif\r
879                 case DEV_MGMT_SET_INFO_EVT:\r
880                 {\r
881                     config = NXP_SYSTEM_EVT_INFO;\r
882                     status = phHciNfc_Set_Param(psHciContext, pHwRef,\r
883                                     p_pipe_info, DEVICE_INFO_EVT_INDEX, \r
884                                     (uint8_t *)&config, sizeof(config) );\r
885                     if(NFCSTATUS_PENDING == status )\r
886                     {\r
887 #if  ( HOST_LINK_TIMEOUT & 0x01 )\r
888                         p_device_mgmt_info->next_seq =\r
889                                                 DEV_MGMT_LLC_GRD_TO_H;\r
890 #else\r
891                         p_device_mgmt_info->next_seq =\r
892                                                 DEV_MGMT_EVT_AUTONOMOUS;\r
893                         status = NFCSTATUS_SUCCESS;\r
894 #endif /* #if ( HOST_LINK_TIMEOUT & 0x01 ) */\r
895                     }\r
896                     break;\r
897                 }\r
898 #if  ( HOST_LINK_TIMEOUT & 0x01 )\r
899 \r
900                 case DEV_MGMT_LLC_GRD_TO_H:\r
901                 {\r
902                     config =(uint8_t)\r
903                         ( NXP_NFC_LINK_GRD_CFG_DEFAULT >> BYTE_SIZE ) /* 0x00 */;\r
904                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
905                             NFC_ADDRESS_LLC_GRD_TO_H , config );\r
906                     if(NFCSTATUS_PENDING == status )\r
907                     {\r
908                         p_device_mgmt_info->next_seq =\r
909                                                 DEV_MGMT_LLC_GRD_TO_L;\r
910                     }\r
911                     break;\r
912                 }\r
913                 case DEV_MGMT_LLC_GRD_TO_L:\r
914                 {\r
915                     config = (uint8_t)\r
916                         ( NXP_NFC_LINK_GRD_CFG_DEFAULT & BYTE_MASK ) /* 0x32 */;\r
917                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
918                             NFC_ADDRESS_LLC_GRD_TO_L , config );\r
919                     if(NFCSTATUS_PENDING == status )\r
920                     {\r
921 #if  ( HOST_LINK_TIMEOUT & 0x02 )\r
922                         p_device_mgmt_info->next_seq =\r
923                                                 DEV_MGMT_LLC_ACK_TO_H;\r
924 #else\r
925                         p_device_mgmt_info->next_seq =\r
926                                                 DEV_MGMT_EVT_AUTONOMOUS;\r
927                         status = NFCSTATUS_SUCCESS;\r
928 #endif /* #if ( HOST_LINK_TIMEOUT & 0x02 ) */\r
929                     }\r
930                     break;\r
931                 }\r
932                 case DEV_MGMT_LLC_ACK_TO_H:\r
933                 {\r
934                     config = (uint8_t)\r
935                         ( NXP_NFC_LINK_ACK_CFG_DEFAULT >> BYTE_SIZE )/* 0x00 */;\r
936                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
937                             NFC_ADDRESS_LLC_ACK_TO_H , config );\r
938                     if(NFCSTATUS_PENDING == status )\r
939                     {\r
940                         p_device_mgmt_info->next_seq =\r
941                                                 DEV_MGMT_LLC_ACK_TO_L;\r
942                     }\r
943                     break;\r
944                 }\r
945                 case DEV_MGMT_LLC_ACK_TO_L:\r
946                 {\r
947                     config = (uint8_t)\r
948                         ( NXP_NFC_LINK_ACK_CFG_DEFAULT & BYTE_MASK ) /* 0x00 */;;\r
949                     status = phHciNfc_DevMgmt_Configure( psHciContext, pHwRef,\r
950                             NFC_ADDRESS_LLC_ACK_TO_L , config );\r
951                     if(NFCSTATUS_PENDING == status )\r
952                     {\r
953                         p_device_mgmt_info->next_seq =\r
954                                                 DEV_MGMT_EVT_AUTONOMOUS;\r
955                         status = NFCSTATUS_SUCCESS;\r
956                     }\r
957                     break;\r
958                 }\r
959 \r
960 #endif /* #if ( HOST_LINK_TIMEOUT & 0x01 ) */\r
961                 default:\r
962                 {\r
963                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);\r
964                     break;\r
965                 }\r
966 \r
967             }/* End of the Sequence Switch */\r
968         }\r
969 \r
970     } /* End of Null Context Check */\r
971 \r
972     return status;\r
973 }\r
974 \r
975 /*!\r
976  * \brief Releases the resources allocated the PN544 Device Management.\r
977  *\r
978  * This function Releases the resources allocated the PN544 Device Management\r
979  * and resets the hardware to the reset state.\r
980  */\r
981 \r
982 NFCSTATUS\r
983 phHciNfc_DevMgmt_Release(\r
984                                 phHciNfc_sContext_t     *psHciContext,\r
985                                 void                    *pHwRef\r
986                              )\r
987 {\r
988     NFCSTATUS                           status = NFCSTATUS_SUCCESS;\r
989     phHciNfc_Pipe_Info_t                *p_pipe_info = NULL;\r
990     phHciNfc_DevMgmt_Info_t         *p_device_mgmt_info=NULL;\r
991 \r
992     if( (NULL == psHciContext) || (NULL == pHwRef) )\r
993     {\r
994       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
995     }\r
996     else\r
997     {\r
998         if( NULL != psHciContext->p_device_mgmt_info )\r
999         {\r
1000             p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
1001                                 psHciContext->p_device_mgmt_info ;\r
1002             switch(p_device_mgmt_info->current_seq)\r
1003             {\r
1004                 \r
1005                 /* PN544 Device pipe close sequence */\r
1006                 case DEV_MGMT_EVT_AUTONOMOUS:\r
1007                 {\r
1008                     p_pipe_info = p_device_mgmt_info->p_pipe_info;\r
1009 \r
1010                     p_pipe_info->param_info = NULL;\r
1011                     p_pipe_info->param_length = HCP_ZERO_LEN;\r
1012 \r
1013                     status = phHciNfc_Send_DevMgmt_Event(psHciContext, pHwRef, \r
1014                                 p_pipe_info->pipe.pipe_id, NXP_EVT_SET_AUTONOMOUS);\r
1015                     if(status == NFCSTATUS_PENDING)\r
1016                     {\r
1017                         p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN;\r
1018                         status = NFCSTATUS_SUCCESS;\r
1019                     }\r
1020                     break;\r
1021                 }\r
1022                 /* PN544 Device pipe close sequence */\r
1023                 case DEV_MGMT_PIPE_CLOSE:\r
1024                 {\r
1025                     p_pipe_info = p_device_mgmt_info->p_pipe_info;\r
1026 \r
1027                     status = phHciNfc_Close_Pipe( psHciContext,\r
1028                                                         pHwRef, p_pipe_info );\r
1029                     if(status == NFCSTATUS_SUCCESS)\r
1030                     {\r
1031                         p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN;\r
1032                         /* status = NFCSTATUS_PENDING; */\r
1033                     }\r
1034                     break;\r
1035                 }\r
1036                 default:\r
1037                 {\r
1038                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);\r
1039                     break;\r
1040                 }\r
1041 \r
1042             }/* End of the Sequence Switch */\r
1043 \r
1044         }/* End of the PN544 Device Info Memory Check */\r
1045 \r
1046     } /* End of Null Context Check */\r
1047 \r
1048     return status;\r
1049 }\r
1050 \r
1051 NFCSTATUS\r
1052 phHciNfc_DevMgmt_Update_Sequence(\r
1053                                 phHciNfc_sContext_t     *psHciContext,\r
1054                                 phHciNfc_eSeqType_t     DevMgmt_seq\r
1055                              )\r
1056 {\r
1057     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
1058     phHciNfc_DevMgmt_Info_t          *p_device_mgmt_info=NULL;\r
1059     if( NULL == psHciContext )\r
1060     {\r
1061         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1062     }\r
1063     else if ( NULL == psHciContext->p_device_mgmt_info )\r
1064     {\r
1065         status = PHNFCSTVAL(CID_NFC_HCI, \r
1066                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
1067     }\r
1068     else\r
1069     {\r
1070         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
1071                             psHciContext->p_device_mgmt_info ;\r
1072         switch(DevMgmt_seq)\r
1073         {\r
1074             case RESET_SEQ:\r
1075             case INIT_SEQ:\r
1076             {\r
1077                 p_device_mgmt_info->current_seq = DEV_MGMT_PIPE_OPEN;\r
1078                 p_device_mgmt_info->next_seq = DEV_MGMT_PIPE_OPEN ;\r
1079                 break;\r
1080             }\r
1081             case UPDATE_SEQ:\r
1082             {\r
1083                 p_device_mgmt_info->current_seq = p_device_mgmt_info->next_seq;\r
1084             \r
1085                 break;\r
1086             }\r
1087             case REL_SEQ:\r
1088             {\r
1089                 p_device_mgmt_info->current_seq = DEV_MGMT_EVT_AUTONOMOUS;\r
1090                 p_device_mgmt_info->next_seq = DEV_MGMT_EVT_AUTONOMOUS ;\r
1091                 break;\r
1092             }\r
1093             default:\r
1094             {\r
1095                 break;\r
1096             }\r
1097         }/* End of Update Sequence Switch */\r
1098     }\r
1099     return status;\r
1100 \r
1101 }\r
1102 \r
1103 \r
1104 \r
1105 /*!\r
1106  * \brief Perform the System Management Tests  \r
1107  * provided by the corresponding peripheral device.\r
1108  *\r
1109  * This function performs the System Management Tests provided by the NFC\r
1110  * Peripheral device.\r
1111  */\r
1112 \r
1113 NFCSTATUS\r
1114 phHciNfc_DevMgmt_Test(\r
1115                     void                            *psContext,\r
1116                     void                            *pHwRef,\r
1117                     uint8_t                         test_type,\r
1118                     phNfc_sData_t                   *test_param\r
1119                  )\r
1120 {\r
1121     phHciNfc_sContext_t         *psHciContext = \r
1122                                     (phHciNfc_sContext_t *)psContext ;\r
1123     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
1124     phHciNfc_Pipe_Info_t        *p_pipe_info = NULL;\r
1125     uint8_t                     pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;\r
1126 \r
1127     if( (NULL == psHciContext) || (NULL == pHwRef) )\r
1128     {\r
1129       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1130     }\r
1131     else if(  NULL == psHciContext->p_device_mgmt_info )\r
1132     {\r
1133         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
1134     }\r
1135     else\r
1136     {\r
1137         phHciNfc_DevMgmt_Info_t *p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
1138                                         psHciContext->p_device_mgmt_info ;\r
1139         p_pipe_info = ((phHciNfc_DevMgmt_Info_t *)\r
1140                        psHciContext->p_device_mgmt_info)->p_pipe_info ;\r
1141         switch(test_type)\r
1142         {\r
1143             case NXP_SELF_TEST_ANTENNA:\r
1144             case NXP_SELF_TEST_SWP:\r
1145             case NXP_SELF_TEST_PRBS:\r
1146             /* case NXP_SELF_TEST_NFCWI: */\r
1147             {\r
1148                 if (NULL != p_pipe_info)\r
1149                 {\r
1150                     pipe_id = p_pipe_info->pipe.pipe_id ;\r
1151                     if ( NULL != test_param )\r
1152                     {\r
1153                         p_pipe_info->param_info = test_param->buffer;\r
1154                         p_pipe_info->param_length = (uint8_t)test_param->length;\r
1155                     }\r
1156                     p_device_mgmt_info->test_result.buffer = NULL;\r
1157                     p_device_mgmt_info->test_result.length = 0;\r
1158                     status = \r
1159                         phHciNfc_Send_DevMgmt_Command( psHciContext, pHwRef, \r
1160                             pipe_id, (uint8_t)test_type );\r
1161                 }\r
1162                 else\r
1163                 {\r
1164                     status = PHNFCSTVAL(CID_NFC_HCI, \r
1165                                         NFCSTATUS_INVALID_HCI_INFORMATION);\r
1166                 }\r
1167                 break;\r
1168             }\r
1169             default:\r
1170             {\r
1171                 status = PHNFCSTVAL(CID_NFC_HCI,\r
1172                             NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
1173                 break;\r
1174             }\r
1175         }\r
1176 \r
1177     }\r
1178     return status;\r
1179 }\r
1180 \r
1181 \r
1182 /*!\r
1183  * \brief Receives the HCI Response from the corresponding peripheral device.\r
1184  *\r
1185  * This function receives the HCI Command Response from the connected NFC\r
1186  * Peripheral device.\r
1187  */\r
1188 static\r
1189 NFCSTATUS\r
1190 phHciNfc_Recv_DevMgmt_Response(\r
1191                         void                *psContext,\r
1192                         void                *pHwRef,\r
1193                         uint8_t             *pResponse,\r
1194 #ifdef ONE_BYTE_LEN\r
1195                         uint8_t             length\r
1196 #else\r
1197                         uint16_t            length\r
1198 #endif\r
1199                     )\r
1200 {\r
1201     phHciNfc_sContext_t         *psHciContext = \r
1202                                     (phHciNfc_sContext_t *)psContext ;\r
1203     phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL;\r
1204     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
1205     uint8_t                     prev_cmd = ANY_GET_PARAMETER;\r
1206 \r
1207     if( (NULL == psHciContext) || (NULL == pHwRef) )\r
1208     {\r
1209       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1210     }\r
1211     else if(  NULL == psHciContext->p_device_mgmt_info )\r
1212     {\r
1213         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
1214     }\r
1215     else\r
1216     {\r
1217         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
1218                             psHciContext->p_device_mgmt_info ;\r
1219         prev_cmd = p_device_mgmt_info->p_pipe_info->prev_msg ;\r
1220         switch(prev_cmd)\r
1221         {\r
1222             case ANY_GET_PARAMETER:\r
1223             {\r
1224                 status = phHciNfc_DevMgmt_InfoUpdate(psHciContext,\r
1225                             (phHal_sHwReference_t *)pHwRef,\r
1226                             p_device_mgmt_info->p_pipe_info->reg_index, \r
1227                             &pResponse[HCP_HEADER_LEN],\r
1228                                 (uint8_t)(length - HCP_HEADER_LEN));\r
1229                 break;\r
1230             }\r
1231             case ANY_SET_PARAMETER:\r
1232             {\r
1233                 break;\r
1234             }\r
1235             case ANY_OPEN_PIPE:\r
1236             {\r
1237                 break;\r
1238             }\r
1239             case ANY_CLOSE_PIPE:\r
1240             {\r
1241                 phOsalNfc_FreeMemory(p_device_mgmt_info->p_pipe_info);\r
1242                 p_device_mgmt_info->p_pipe_info = NULL;\r
1243                 psHciContext->p_pipe_list[PIPETYPE_STATIC_LINK] = NULL;\r
1244                 break;\r
1245             }\r
1246             case NXP_DBG_READ:\r
1247             /* fall through */\r
1248             case NXP_DBG_WRITE:\r
1249             {\r
1250                 if( NULL != p_device_mgmt_info->p_val )\r
1251                 {\r
1252                     *p_device_mgmt_info->p_val = (uint8_t)( length > HCP_HEADER_LEN ) ?\r
1253                                         pResponse[HCP_HEADER_LEN]: 0;\r
1254                     p_device_mgmt_info->p_val = NULL;\r
1255                 }\r
1256                 break;\r
1257             }\r
1258             /* Self Test Commands */\r
1259             case NXP_SELF_TEST_ANTENNA:\r
1260             case NXP_SELF_TEST_SWP:\r
1261             case NXP_SELF_TEST_NFCWI:\r
1262             case NXP_SELF_TEST_PRBS:\r
1263             {\r
1264                 p_device_mgmt_info->test_status = (uint8_t) ( length > HCP_HEADER_LEN ) ?\r
1265                                     pResponse[HCP_HEADER_LEN]: 0;\r
1266                 p_device_mgmt_info->test_result.buffer = (uint8_t)( length > HCP_HEADER_LEN ) ?\r
1267                                     &pResponse[HCP_HEADER_LEN]: NULL;\r
1268                 p_device_mgmt_info->test_result.length = ( length - HCP_HEADER_LEN );\r
1269                 break;\r
1270             }\r
1271             default:\r
1272             {\r
1273                 status = PHNFCSTVAL(CID_NFC_HCI,\r
1274                                         NFCSTATUS_INVALID_HCI_RESPONSE);\r
1275                 break;\r
1276             }\r
1277         }\r
1278         if( NFCSTATUS_SUCCESS == status )\r
1279         {\r
1280             if( NULL != p_device_mgmt_info->p_pipe_info)\r
1281             {\r
1282                 p_device_mgmt_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;\r
1283             }\r
1284             p_device_mgmt_info->current_seq = p_device_mgmt_info->next_seq;\r
1285         }\r
1286 \r
1287     }\r
1288     return status;\r
1289 }\r
1290 \r
1291 /*!\r
1292  * \brief Receives the HCI Event from the corresponding peripheral device.\r
1293  *\r
1294  * This function receives the HCI Event from the connected NFC\r
1295  * Peripheral device.\r
1296  */\r
1297 \r
1298 static\r
1299 NFCSTATUS\r
1300 phHciNfc_Recv_DevMgmt_Event(\r
1301                         void                *psContext,\r
1302                         void                *pHwRef,\r
1303                         uint8_t             *pEvent,\r
1304 #ifdef ONE_BYTE_LEN\r
1305                         uint8_t             length\r
1306 #else\r
1307                         uint16_t            length\r
1308 #endif\r
1309                     )\r
1310 {\r
1311     phHciNfc_sContext_t         *psHciContext = \r
1312                                     (phHciNfc_sContext_t *)psContext ;\r
1313     phHciNfc_DevMgmt_Info_t     *p_device_mgmt_info=NULL;\r
1314     phHciNfc_HCP_Packet_t       *hcp_packet = NULL;\r
1315     phHciNfc_HCP_Message_t      *hcp_message = NULL;\r
1316     NFCSTATUS                   status = NFCSTATUS_SUCCESS;\r
1317     phHal_sEventInfo_t          event_info;\r
1318     uint8_t                     event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;\r
1319 \r
1320     if( (NULL == psHciContext) || (NULL == pHwRef) )\r
1321     {\r
1322       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1323     }\r
1324     else if(  NULL == psHciContext->p_device_mgmt_info )\r
1325     {\r
1326         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);\r
1327     }\r
1328     else\r
1329     {\r
1330         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
1331                             psHciContext->p_device_mgmt_info ;\r
1332         hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent;\r
1333         hcp_message = &hcp_packet->msg.message;\r
1334 \r
1335         /* Get the Event instruction bits from the Message Header */\r
1336         event = (uint8_t) GET_BITS8( hcp_message->msg_header,\r
1337             HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);\r
1338         event_info.eventHost = phHal_eHostController ;\r
1339         event_info.eventSource = phHal_ePCD_DevType;\r
1340 \r
1341         switch(event)\r
1342         {\r
1343             /* Information Events */\r
1344             case NXP_EVT_INFO_TXLDO_OVERCUR:\r
1345             {\r
1346                 event_info.eventType = NFC_INFO_TXLDO_OVERCUR;\r
1347                 break;\r
1348             }\r
1349             case NXP_EVT_INFO_PMUVCC:\r
1350             {\r
1351                 p_device_mgmt_info->pmuvcc_status = (uint8_t) ( length > HCP_HEADER_LEN ) ?\r
1352                                     pEvent[HCP_HEADER_LEN]: 0;\r
1353                 break;\r
1354             }\r
1355             case NXP_EVT_INFO_EXT_RF_FIELD:\r
1356             {\r
1357                 event_info.eventSource = phHal_ePICC_DevType ;\r
1358                 p_device_mgmt_info->rf_status = (uint8_t) ( length > HCP_HEADER_LEN ) ?\r
1359                                     pEvent[HCP_HEADER_LEN]: 0;\r
1360 #ifdef EVT_INFO_EXT_EVT_DIRECT\r
1361                 event_info.eventType = ( CE_EVT_NFC_FIELD_ON == \r
1362                                 (p_device_mgmt_info->rf_status & 0x1FU))?\r
1363                                     NFC_EVT_FIELD_ON : NFC_EVT_FIELD_OFF;\r
1364 #else\r
1365                 event_info.eventType = (TRUE == p_device_mgmt_info->rf_status)?\r
1366                                     NFC_EVT_FIELD_ON : NFC_EVT_FIELD_OFF;\r
1367 #endif\r
1368                 break;\r
1369             }\r
1370             case NXP_EVT_INFO_MEM_VIOLATION:\r
1371             {\r
1372                 event_info.eventType = NFC_INFO_MEM_VIOLATION;\r
1373                 LOGW("Your NFC controller is kinda hosed, take it to npelly@ to fix");\r
1374                 break;\r
1375             }\r
1376             case NXP_EVT_INFO_TEMP_OVERHEAT:\r
1377             {\r
1378                 p_device_mgmt_info->overheat_status = (uint8_t)( length > HCP_HEADER_LEN ) ?\r
1379                                     pEvent[HCP_HEADER_LEN]: 0;\r
1380                 event_info.eventType = NFC_INFO_TEMP_OVERHEAT;\r
1381                 event_info.eventInfo.overheat_status = \r
1382                                     p_device_mgmt_info->overheat_status;\r
1383                 break;\r
1384             }\r
1385             case NXP_EVT_INFO_LLC_ERROR:\r
1386             {\r
1387                 event_info.eventType = NFC_INFO_LLC_ERROR;\r
1388                 break;\r
1389             }\r
1390             default:\r
1391             {\r
1392                 status = PHNFCSTVAL(CID_NFC_HCI,\r
1393                                         NFCSTATUS_INVALID_HCI_RESPONSE);\r
1394                 break;\r
1395             }\r
1396         }\r
1397         if( NFCSTATUS_SUCCESS == status )\r
1398         {\r
1399             if( NULL != p_device_mgmt_info->p_pipe_info)\r
1400             {\r
1401                 p_device_mgmt_info->p_pipe_info->prev_status = \r
1402                                                     NFCSTATUS_SUCCESS;\r
1403             }\r
1404             p_device_mgmt_info->current_seq = \r
1405                                         p_device_mgmt_info->next_seq;\r
1406             phHciNfc_Notify_Event(psHciContext, pHwRef, \r
1407                                         NFC_NOTIFY_EVENT, &event_info);\r
1408         }\r
1409     }\r
1410     return status;\r
1411 }\r
1412 \r
1413 \r
1414 static\r
1415 NFCSTATUS\r
1416 phHciNfc_DevMgmt_InfoUpdate(\r
1417                                 phHciNfc_sContext_t     *psHciContext,\r
1418                                 phHal_sHwReference_t    *pHwRef,\r
1419                                 uint8_t                 index,\r
1420                                 uint8_t                 *reg_value,\r
1421                                 uint8_t                 reg_length\r
1422                           )\r
1423 {\r
1424     phHciNfc_DevMgmt_Info_t *p_device_mgmt_info=NULL;\r
1425     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
1426     uint8_t                 i=0;\r
1427 \r
1428     PHNFC_UNUSED_VARIABLE(pHwRef);\r
1429     if( (NULL == psHciContext)\r
1430         || (NULL == reg_value)\r
1431         || (reg_length == 0)\r
1432       )\r
1433     {\r
1434         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1435     }\r
1436     else if ( NULL == psHciContext->p_device_mgmt_info )\r
1437     {\r
1438         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);\r
1439     }\r
1440     else\r
1441     {\r
1442         p_device_mgmt_info = (phHciNfc_DevMgmt_Info_t *)\r
1443                                 psHciContext->p_device_mgmt_info ;\r
1444 \r
1445         switch(index)\r
1446         {\r
1447             case DEVICE_INFO_EEPROM_INDEX:\r
1448             {\r
1449                 p_device_mgmt_info->eeprom_crc = reg_value[i];\r
1450                 break;\r
1451             }\r
1452             default:\r
1453             {\r
1454                 break;\r
1455             }\r
1456         }\r
1457 \r
1458     } /* End of Context and the PN544 Device information validity check */\r
1459 \r
1460     return status;\r
1461 }\r
1462 \r
1463 \r
1464 \r
1465 /*!\r
1466  * \brief Sends the RF Settings HCI Additonal Commands to the connected \r
1467  * reader device.\r
1468  *\r
1469  * This function Sends the RF Settings HCI Command frames in the HCP packet \r
1470  * format to the connected reader device.\r
1471  */\r
1472 static\r
1473  NFCSTATUS\r
1474  phHciNfc_Send_DevMgmt_Command (\r
1475                                 phHciNfc_sContext_t *psHciContext,\r
1476                                 void                *pHwRef,\r
1477                                 uint8_t             pipe_id,\r
1478                                 uint8_t             cmd\r
1479                     )\r
1480  {\r
1481     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;\r
1482     phHciNfc_HCP_Message_t  *hcp_message = NULL;\r
1483     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;\r
1484     uint8_t                 length=0;\r
1485     uint8_t                 i = 0;\r
1486     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
1487 \r
1488     if( (NULL == psHciContext)\r
1489         || ( pipe_id > PHHCINFC_MAX_PIPE)\r
1490         ||(NULL == psHciContext->p_pipe_list[pipe_id])\r
1491       )\r
1492     {\r
1493         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1494         HCI_DEBUG("%s: Invalid Arguments passed \n",\r
1495                                                 "phHciNfc_Send_DevMgmt_Command");\r
1496     }\r
1497     else\r
1498     {\r
1499         p_pipe_info = (phHciNfc_Pipe_Info_t *) \r
1500                                 psHciContext->p_pipe_list[pipe_id];\r
1501         psHciContext->tx_total = 0 ;\r
1502         length +=  HCP_HEADER_LEN ;\r
1503         switch( cmd )\r
1504         {\r
1505             /* Self Test Commands */\r
1506             case NXP_SELF_TEST_ANTENNA:\r
1507             case NXP_SELF_TEST_SWP:\r
1508             case NXP_SELF_TEST_NFCWI:\r
1509             case NXP_SELF_TEST_PRBS:\r
1510             /* Internal Properietary Commands */\r
1511             case NXP_DBG_READ:\r
1512             case NXP_DBG_WRITE:\r
1513             {\r
1514                 \r
1515                 hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;\r
1516                 /* Construct the HCP Frame */\r
1517                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,\r
1518                                         (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);\r
1519                 hcp_message = &(hcp_packet->msg.message);\r
1520                 /* Append the RF Setting Parameter also the optional Value */\r
1521                 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,\r
1522                                             i, p_pipe_info->param_info,\r
1523                                             p_pipe_info->param_length);\r
1524                 length =(uint8_t)(length + i + p_pipe_info->param_length);\r
1525                 break;\r
1526             }\r
1527             default:\r
1528             {\r
1529                 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );\r
1530                 HCI_DEBUG("%s: Statement Should Not Occur \n",\r
1531                                                 "phHciNfc_Send_DevMgmt_Command");\r
1532                 break;\r
1533             }\r
1534         }\r
1535         if( NFCSTATUS_SUCCESS == status )\r
1536         {\r
1537             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND;\r
1538             p_pipe_info->prev_msg = cmd;\r
1539             psHciContext->tx_total = length;\r
1540             psHciContext->response_pending = TRUE ;\r
1541 \r
1542             /* Send the Constructed HCP packet to the lower layer */\r
1543             status = phHciNfc_Send_HCP( psHciContext, pHwRef );\r
1544             p_pipe_info->prev_status = NFCSTATUS_PENDING;\r
1545         }\r
1546     }\r
1547 \r
1548     return status;\r
1549 }\r
1550 \r
1551 \r
1552 \r
1553 /*!\r
1554  * \brief Sends the RF Settings HCI Additonal Events to the connected \r
1555  * reader device.\r
1556  *\r
1557  * This function Sends the RF Settings HCI Events frames in the HCP packet \r
1558  * format to the connected reader device.\r
1559  */\r
1560 \r
1561 static\r
1562  NFCSTATUS\r
1563  phHciNfc_Send_DevMgmt_Event (\r
1564                                 phHciNfc_sContext_t *psHciContext,\r
1565                                 void                *pHwRef,\r
1566                                 uint8_t             pipe_id,\r
1567                                 uint8_t             event\r
1568                     )\r
1569  {\r
1570     phHciNfc_HCP_Packet_t   *hcp_packet = NULL;\r
1571     phHciNfc_HCP_Message_t  *hcp_message = NULL;\r
1572     phHciNfc_Pipe_Info_t    *p_pipe_info = NULL;\r
1573     uint8_t                 length=0;\r
1574     uint8_t                 i = 0;\r
1575     NFCSTATUS               status = NFCSTATUS_SUCCESS;\r
1576 \r
1577     if( (NULL == psHciContext)\r
1578         || ( pipe_id > PHHCINFC_MAX_PIPE)\r
1579         ||(NULL == psHciContext->p_pipe_list[pipe_id])\r
1580       )\r
1581     {\r
1582         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);\r
1583         HCI_DEBUG("%s: Invalid Arguments passed \n",\r
1584                                                 "phHciNfc_Send_DevMgmt_Event");\r
1585     }\r
1586     else\r
1587     {\r
1588         p_pipe_info = (phHciNfc_Pipe_Info_t *) \r
1589                                 psHciContext->p_pipe_list[pipe_id];\r
1590         psHciContext->tx_total = 0 ;\r
1591         length +=  HCP_HEADER_LEN ;\r
1592         if( NXP_EVT_SET_AUTONOMOUS == event )\r
1593         {\r
1594             \r
1595             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;\r
1596             /* Construct the HCP Frame */\r
1597             phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,\r
1598                                     (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event);\r
1599             hcp_message = &(hcp_packet->msg.message);\r
1600             /* Append the RF Setting Parameter also the optional Value */\r
1601             phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,\r
1602                                         i, p_pipe_info->param_info,\r
1603                                         p_pipe_info->param_length);\r
1604             length =(uint8_t)(length + i + p_pipe_info->param_length);\r
1605         }\r
1606         else\r
1607         {\r
1608             status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );\r
1609             HCI_DEBUG("%s: Statement Should Not Occur \n",\r
1610                                             "phHciNfc_Send_DevMgmt_Event");\r
1611         }\r
1612         if( NFCSTATUS_SUCCESS == status )\r
1613         {\r
1614             p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT;\r
1615             p_pipe_info->prev_msg = event;\r
1616             psHciContext->tx_total = length;\r
1617 \r
1618             /* Send the Constructed HCP packet to the lower layer */\r
1619             status = phHciNfc_Send_HCP( psHciContext, pHwRef );\r
1620             p_pipe_info->prev_status = NFCSTATUS_PENDING;\r
1621         }\r
1622     }\r
1623 \r
1624     return status;\r
1625 }\r
1626 \r
1627 \r
1628 \r
1629 \r
1630 \r