Initialize Tizen 2.3
[adaptation/devices/nfc-plugin-nxp.git] / src / phHciNfc_ISO15693.c
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 * =========================================================================== *
19 *                                                                             *
20 *                                                                             *
21 * \file  phHciNfc_ISO15693.c                                                 *
22 * \brief HCI ISO-15693 management routines.                                     *
23 *                                                                             *
24 *                                                                             *
25 * Project: NFC-FRI-1.1                                                        *
26 *                                                                             *
27 * $Date: Thu Feb 11 18:54:47 2010 $                                           *
28 * $Author: ing04880 $                                                         *
29 * $Revision: 1.7 $                                                           *
30 * $Aliases:  $
31 *                                                                             *
32 * =========================================================================== *
33 */
34
35 /*
36 ***************************** Header File Inclusion ****************************
37 */
38 #include <phNfcCompId.h>
39 #include <phHciNfc_Pipe.h>
40 #include <phHciNfc_RFReader.h>
41 #include <phOsalNfc.h>
42
43 #if defined (TYPE_ISO15693)
44 #include <phHciNfc_ISO15693.h>
45
46 /*
47 ****************************** Macro Definitions *******************************
48 */
49 #define ISO_15693_INVENTORY_INDEX               0x01U
50 #define ISO_15693_AFI_INDEX                     0x02U
51
52 #define ISO_15693_INVENTORY_LENGTH              0x0AU
53 #define ISO_15693_AFI_LENGTH                    0x01U
54
55 #define ISO_15693_SINGLE_TAG_FOUND              0x00U
56 #define ISO_15693_MULTIPLE_TAGS_FOUND           0x03U
57
58 /*
59 *************************** Structure and Enumeration ***************************
60 */
61
62 /*
63 *************************** Static Function Declaration **************************
64 */
65
66 static
67 NFCSTATUS
68 phHciNfc_ISO15693_InfoUpdate(
69                                 phHciNfc_sContext_t     *psHciContext,
70                                 uint8_t                 index,
71                                 uint8_t                 *reg_value,
72                                 uint8_t                 reg_length
73                          );
74
75 static 
76 NFCSTATUS
77 phHciNfc_Recv_ISO15693_Response(
78                         void                *psContext,
79                         void                *pHwRef,
80                         uint8_t             *pResponse,
81 #ifdef ONE_BYTE_LEN
82                         uint8_t             length
83 #else
84                         uint16_t            length
85 #endif
86                        );
87
88 static
89 NFCSTATUS
90 phHciNfc_Recv_ISO15693_Event(
91                              void               *psContext,
92                              void               *pHwRef,
93                              uint8_t            *pEvent,
94 #ifdef ONE_BYTE_LEN
95                              uint8_t            length
96 #else
97                              uint16_t           length
98 #endif
99                        );
100
101 /*
102 *************************** Function Definitions ***************************
103 */
104
105 NFCSTATUS
106 phHciNfc_ISO15693_Init_Resources(
107                                   phHciNfc_sContext_t     *psHciContext
108                                   )
109 {    
110     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
111     phHciNfc_ISO15693_Info_t    *ps_15693_info=NULL;
112     if( NULL == psHciContext )
113     {
114         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
115     }
116     else
117     {
118         if (NULL != psHciContext->p_iso_15693_info)
119         {
120             status = NFCSTATUS_SUCCESS;
121         } 
122         else if(( NULL == psHciContext->p_iso_15693_info ) &&
123             (phHciNfc_Allocate_Resource((void **)(&ps_15693_info),
124             sizeof(phHciNfc_ISO15693_Info_t))== NFCSTATUS_SUCCESS)
125             )
126         {
127             psHciContext->p_iso_15693_info = ps_15693_info;
128             ps_15693_info->current_seq = ISO15693_INVENTORY;
129             ps_15693_info->next_seq = ISO15693_INVENTORY;
130             ps_15693_info->ps_15693_pipe_info = NULL;
131         }
132         else
133         {
134             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
135         }
136
137     }
138     return status;
139 }
140
141
142 NFCSTATUS
143 phHciNfc_ISO15693_Get_PipeID(
144                               phHciNfc_sContext_t     *psHciContext,
145                               uint8_t                 *ppipe_id
146                               )
147 {
148     NFCSTATUS       status = NFCSTATUS_SUCCESS;
149     if( (NULL != psHciContext)
150         && ( NULL != ppipe_id )
151         && ( NULL != psHciContext->p_iso_15693_info ) 
152         )
153     {
154         phHciNfc_ISO15693_Info_t     *ps_15693_info = NULL;
155         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
156                             psHciContext->p_iso_15693_info ;
157         *ppipe_id =  ps_15693_info->ps_15693_pipe_info->pipe.pipe_id;
158     }
159     else 
160     {
161         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
162     }
163     return status;
164 }
165
166
167 NFCSTATUS
168 phHciNfc_ISO15693_Update_PipeInfo(
169                                    phHciNfc_sContext_t     *psHciContext,
170                                    uint8_t                 pipeID,
171                                    phHciNfc_Pipe_Info_t    *pPipeInfo
172                                    )
173 {
174     NFCSTATUS       status = NFCSTATUS_SUCCESS;
175     if((NULL == psHciContext) || (NULL == pPipeInfo))
176     {
177         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
178     }
179     else if(NULL == psHciContext->p_iso_15693_info)
180     {
181         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
182     }
183     else
184     {
185         phHciNfc_ISO15693_Info_t       *ps_15693_info = NULL;
186         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
187                         psHciContext->p_iso_15693_info ;
188
189         /* Update the pipe_id of the ISO15693 Gate obtained from 
190         the HCI Response */
191         ps_15693_info->ps_15693_pipe_info = pPipeInfo;
192         ps_15693_info->pipe_id = pipeID;
193         ps_15693_info->ps_15693_pipe_info->pipe.pipe_id = pipeID;        
194         /* Update the Response Receive routine of the ISO15693 Gate */
195         pPipeInfo->recv_resp = &phHciNfc_Recv_ISO15693_Response;
196         /* Update the event Receive routine of the ISO15693 Gate */
197         pPipeInfo->recv_event = &phHciNfc_Recv_ISO15693_Event;
198     }
199     return status;
200 }
201
202
203 NFCSTATUS
204 phHciNfc_ISO15693_Update_Info(
205                              phHciNfc_sContext_t        *psHciContext,
206                              uint8_t                    infotype,
207                              void                       *iso_15693_info
208                              )
209 {
210     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
211     
212     if (NULL == psHciContext)
213     {
214         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
215     }
216     else if(NULL == psHciContext->p_iso_15693_info)
217     {
218         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
219     }
220     else
221     {
222         phHciNfc_ISO15693_Info_t     *ps_15693_info = NULL;
223         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
224                         psHciContext->p_iso_15693_info;
225
226         switch(infotype)
227         {
228             case HCI_ISO_15693_ENABLE:
229             {
230                 if (NULL != iso_15693_info)
231                 {
232                     ps_15693_info->enable_iso_15693_gate = 
233                                     *((uint8_t *)iso_15693_info);
234                 }
235                 break;
236             }
237             case HCI_ISO_15693_INFO_SEQ:
238             {
239                 ps_15693_info->current_seq = ISO15693_INVENTORY;
240                 ps_15693_info->next_seq = ISO15693_INVENTORY;
241                 break;
242             }           
243             default:
244             {
245                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
246                 break;
247             }
248         }
249     }
250     return status;
251 }
252
253
254 NFCSTATUS
255 phHciNfc_ISO15693_Info_Sequence (
256                        void             *psHciHandle,
257                        void             *pHwRef
258                        )
259 {
260     NFCSTATUS               status = NFCSTATUS_SUCCESS;
261     phHciNfc_sContext_t     *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
262     if( (NULL == psHciContext) 
263         || (NULL == pHwRef)
264       )
265     {
266       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
267     }
268     else if((NULL == psHciContext->p_iso_15693_info) || 
269         (HCI_ISO_15693_ENABLE != 
270         ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))->
271         enable_iso_15693_gate))
272     {
273         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
274     }   
275     else
276     {
277         phHciNfc_ISO15693_Info_t    *ps_15693_info = NULL;
278         phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
279         uint8_t                     pipeid = 0;
280         
281         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
282                                 psHciContext->p_iso_15693_info;
283         ps_pipe_info = ps_15693_info->ps_15693_pipe_info;
284
285         if(NULL == ps_pipe_info )
286         {
287             status = PHNFCSTVAL(CID_NFC_HCI, 
288                                 NFCSTATUS_INVALID_HCI_SEQUENCE);
289         }
290         else
291         {
292             switch(ps_15693_info->current_seq)
293             {
294                 case ISO15693_INVENTORY:
295                 {
296                     ps_pipe_info->reg_index = ISO_15693_INVENTORY_INDEX;
297                     pipeid = ps_pipe_info->pipe.pipe_id ;
298                     /* Fill the data buffer and send the command to the 
299                             device */
300                     status = 
301                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 
302                                 pipeid, (uint8_t)ANY_GET_PARAMETER);
303                     if(NFCSTATUS_PENDING == status )
304                     {
305                         ps_15693_info->next_seq = ISO15693_AFI;
306                     }
307                     break;
308                 }
309                 case ISO15693_AFI:
310                 {
311                     ps_pipe_info->reg_index = ISO_15693_AFI_INDEX;
312                     pipeid = ps_pipe_info->pipe.pipe_id ;
313                     /* Fill the data buffer and send the command to the 
314                             device */
315                     status = 
316                         phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 
317                                 pipeid, (uint8_t)ANY_GET_PARAMETER);
318                     if(NFCSTATUS_PENDING == status )
319                     {
320                         ps_15693_info->next_seq = ISO15693_END_SEQUENCE;
321                     }
322                     break;
323                 }
324                 case ISO15693_END_SEQUENCE:
325                 {
326                     phNfc_sCompletionInfo_t     CompInfo;
327                     if (ISO_15693_MULTIPLE_TAGS_FOUND == 
328                         ps_15693_info->multiple_tgts_found)
329                     {
330                         CompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
331                     }
332                     else
333                     {
334                         CompInfo.status = NFCSTATUS_SUCCESS;
335                     }
336
337                     CompInfo.info = &(ps_15693_info->iso15693_info);
338                     
339                     ps_15693_info->iso15693_info.RemDevType = 
340                                     phHal_eISO15693_PICC;
341                     ps_15693_info->current_seq = ISO15693_INVENTORY;
342                     ps_15693_info->next_seq = ISO15693_INVENTORY;
343                     status = NFCSTATUS_SUCCESS;
344                     /* Notify to the upper layer */
345                     phHciNfc_Tag_Notify(psHciContext, pHwRef, 
346                                     NFC_NOTIFY_TARGET_DISCOVERED, 
347                                     &CompInfo);
348                     break;
349                 }
350                 default:
351                 {
352                     status = PHNFCSTVAL(CID_NFC_HCI, 
353                                         NFCSTATUS_INVALID_HCI_RESPONSE);
354                     break;
355                 }
356             }
357         }
358     }
359     return status;
360 }
361
362 static
363 NFCSTATUS
364 phHciNfc_ISO15693_InfoUpdate(
365                                 phHciNfc_sContext_t     *psHciContext,
366                                 uint8_t                 index,
367                                 uint8_t                 *reg_value,
368                                 uint8_t                 reg_length
369                          )
370 {
371     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
372     phHciNfc_ISO15693_Info_t    *ps_15693_info = NULL;
373     uint8_t                     i = 0;
374                                 
375     ps_15693_info = (phHciNfc_ISO15693_Info_t *)
376                     (psHciContext->p_iso_15693_info);
377
378
379     switch(index)
380     {
381         case ISO_15693_INVENTORY_INDEX:
382         {
383             if (ISO_15693_INVENTORY_LENGTH == reg_length)
384             {
385                 ps_15693_info->iso15693_info.RemoteDevInfo
386                     .Iso15693_Info.Flags = *(reg_value + i );
387                 i++;
388                 ps_15693_info->iso15693_info.RemoteDevInfo
389                     .Iso15693_Info.Dsfid = *(reg_value + i );
390                 i++;
391                 (void)memcpy(ps_15693_info->iso15693_info.
392                      RemoteDevInfo.Iso15693_Info.Uid,
393                        (reg_value+i), (reg_length - i ));
394                 ps_15693_info->iso15693_info.RemoteDevInfo
395                                     .Iso15693_Info.UidLength = ( reg_length - i ); 
396                 HCI_PRINT_BUFFER("\tISO 15693 inventory", reg_value, reg_length);
397             }
398             else
399             {
400                 status = PHNFCSTVAL(CID_NFC_HCI, 
401                                     NFCSTATUS_INVALID_HCI_RESPONSE);
402             }
403             break;
404         }
405         case ISO_15693_AFI_INDEX:
406         {
407             if (ISO_15693_AFI_LENGTH == reg_length)
408             {
409                 ps_15693_info->iso15693_info.RemoteDevInfo
410                                     .Iso15693_Info.Afi = *(reg_value + i );
411                 HCI_PRINT_BUFFER("\tISO 15693 AFI", reg_value, reg_length);
412             }
413             else
414             {
415                 status = PHNFCSTVAL(CID_NFC_HCI, 
416                                     NFCSTATUS_INVALID_HCI_RESPONSE);
417             }            
418             break;
419         }
420         default:
421         {
422             status = PHNFCSTVAL(CID_NFC_HCI, 
423                                 NFCSTATUS_INVALID_HCI_RESPONSE);
424             break;
425         }
426     }
427     return status;
428 }
429
430
431 static 
432 NFCSTATUS
433 phHciNfc_Recv_ISO15693_Response(
434                         void                *psContext,
435                         void                *pHwRef,
436                         uint8_t             *pResponse,
437 #ifdef ONE_BYTE_LEN
438                         uint8_t             length
439 #else
440                         uint16_t            length
441 #endif
442                        )
443 {
444     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
445     phHciNfc_sContext_t         *psHciContext = 
446                                 (phHciNfc_sContext_t *)psContext ;
447     
448
449     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
450         || (0 == length))
451     {
452       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
453     }
454     else if(NULL == psHciContext->p_iso_15693_info)
455     {
456         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
457     }
458     else
459     {
460         phHciNfc_ISO15693_Info_t    *ps_15693_info = NULL;
461         phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
462         uint8_t                     prev_cmd = ANY_GET_PARAMETER;
463
464         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
465                             psHciContext->p_iso_15693_info;
466
467         ps_pipe_info = ps_15693_info->ps_15693_pipe_info;
468         if( NULL == ps_pipe_info)
469         {
470             status = PHNFCSTVAL(CID_NFC_HCI, 
471                                 NFCSTATUS_INVALID_HCI_SEQUENCE);
472         }
473         else
474         {
475             prev_cmd = ps_pipe_info->prev_msg ;
476             switch(prev_cmd)
477             {
478                 case ANY_GET_PARAMETER:
479                 {
480                     status = phHciNfc_ISO15693_InfoUpdate(psHciContext,
481                                     ps_pipe_info->reg_index, 
482                                     &pResponse[HCP_HEADER_LEN],
483                                     (uint8_t)(length - HCP_HEADER_LEN));
484 #if 0
485                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 
486                                                                 UPDATE_SEQ);
487 #endif /* #if 0 */
488                     break;
489                 }
490                 case ANY_SET_PARAMETER:
491                 {
492                     HCI_PRINT("ISO 15693 Parameter Set \n");
493                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 
494                                                     UPDATE_SEQ);
495                     ps_15693_info->next_seq = ISO15693_INVENTORY;
496                     break;
497                 }
498                 case ANY_OPEN_PIPE:
499                 {
500                     HCI_PRINT("ISO 15693 open pipe complete\n");
501                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 
502                                                     UPDATE_SEQ);
503                     ps_15693_info->next_seq = ISO15693_INVENTORY;
504                     break;
505                 }
506                 case ANY_CLOSE_PIPE:
507                 {
508                     HCI_PRINT("ISO 15693 close pipe complete\n");
509                     status = phHciNfc_ReaderMgmt_Update_Sequence(psHciContext, 
510                                                     UPDATE_SEQ);
511                     break;
512                 }
513
514                 case NXP_ISO15693_CMD:
515                 {
516                     if (length >= HCP_HEADER_LEN)
517                     {
518                         HCI_PRINT("ISO 15693 packet received \n");
519                         /* Copy buffer to the receive buffer */
520                         phHciNfc_Append_HCPFrame(psHciContext->recv_buffer, 
521                             0, pResponse, length);
522                         psHciContext->rx_total = length;
523                         psHciContext->rx_index = HCP_HEADER_LEN;
524                         HCI_PRINT_BUFFER("ISO 15693 Bytes received", 
525                                                         pResponse, length);
526                     } 
527                     else
528                     {
529                         status = PHNFCSTVAL(CID_NFC_HCI, 
530                                         NFCSTATUS_INVALID_HCI_RESPONSE);
531                     }
532                     break;
533                 }
534                 default:
535                 {
536                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
537                     break;
538                 }
539             }/* End of switch(prev_cmd) */
540
541             if( NFCSTATUS_SUCCESS == status )
542             {
543                 ps_pipe_info->prev_status = NFCSTATUS_SUCCESS;
544                 ps_15693_info->current_seq = ps_15693_info->next_seq;
545             }
546         }
547     }
548     return status;
549 }
550
551 static
552 NFCSTATUS
553 phHciNfc_Recv_ISO15693_Event(
554                              void               *psContext,
555                              void               *pHwRef,
556                              uint8_t            *pEvent,
557 #ifdef ONE_BYTE_LEN
558                              uint8_t            length
559 #else
560                              uint16_t           length
561 #endif
562                        )
563 {
564     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
565     phHciNfc_sContext_t         *psHciContext = 
566                                 (phHciNfc_sContext_t *)psContext ;
567     if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
568         || (length == 0))
569     {
570         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
571     }
572     else if((NULL == psHciContext->p_iso_15693_info) || 
573         (HCI_ISO_15693_ENABLE != 
574         ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))->
575         enable_iso_15693_gate))
576     {
577         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
578     }
579     else
580     {
581         phHciNfc_HCP_Packet_t       *p_packet = NULL;
582         phHciNfc_ISO15693_Info_t    *ps_15693_info=NULL;
583         phHciNfc_HCP_Message_t      *message = NULL;
584         uint8_t                     instruction=0, 
585                                     i = 0;
586
587         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
588                         psHciContext->p_iso_15693_info;
589         p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
590         message = &p_packet->msg.message;
591         /* Get the instruction bits from the Message Header */
592         instruction = (uint8_t) GET_BITS8( message->msg_header,
593                 HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
594
595         if ((EVT_TARGET_DISCOVERED == instruction) 
596             && ((ISO_15693_MULTIPLE_TAGS_FOUND == message->payload[i]) 
597                 || (ISO_15693_SINGLE_TAG_FOUND == message->payload[i])) 
598           )
599         {
600             phNfc_sCompletionInfo_t pCompInfo;
601
602 /* #define NFC_ISO_15693_MULTIPLE_TAGS_SUPPORT 0x00 */
603 #if (NFC_ISO_15693_MULTIPLE_TAGS_SUPPORT >= 0x01)
604
605             if (ISO_15693_MULTIPLE_TAGS_FOUND == message->payload[i])
606             {
607                 ps_15693_info->multiple_tgts_found = ISO_15693_MULTIPLE_TAGS_FOUND;
608                 pCompInfo.status = NFCSTATUS_MULTIPLE_TAGS;
609             }
610             else
611 #endif /* #if (NFC_ISO_15693_MULTIPLE_TAGS_SUPPORT <= 0x01) */
612             {
613                 ps_15693_info->multiple_tgts_found = FALSE;
614                 pCompInfo.status = NFCSTATUS_SUCCESS;
615             }
616             /* CompInfo.info = &(ps_15693_info->iso15693_info); */
617
618             psHciContext->host_rf_type = phHal_eISO15693_PCD;
619             ps_15693_info->iso15693_info.RemDevType = phHal_eISO15693_PICC;
620             ps_15693_info->current_seq = ISO15693_INVENTORY;
621             /* Notify to the HCI Generic layer To Update the FSM */
622             phHciNfc_Notify_Event(psHciContext, pHwRef, 
623                                     NFC_NOTIFY_TARGET_DISCOVERED, 
624                                     &pCompInfo);
625
626         }
627         else
628         {
629             status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
630         }
631     }
632     return status;
633 }
634
635 NFCSTATUS
636 phHciNfc_Send_ISO15693_Command(
637                               phHciNfc_sContext_t   *psHciContext,
638                               void                  *pHwRef,
639                               uint8_t               pipe_id,
640                               uint8_t               cmd
641                               )
642 {
643     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
644     
645     if( (NULL == psHciContext) || (NULL == pHwRef) )
646     {
647         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
648     }
649     else if((NULL == psHciContext->p_iso_15693_info) || 
650         (HCI_ISO_15693_ENABLE != 
651         ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))->
652         enable_iso_15693_gate) || 
653         (HCI_UNKNOWN_PIPE_ID == 
654         ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))->
655         pipe_id) || 
656         (pipe_id != 
657         ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))->
658         pipe_id))
659     {
660         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
661     }
662     else
663     {
664         phHciNfc_ISO15693_Info_t    *ps_15693_info=NULL;
665         phHciNfc_Pipe_Info_t        *ps_pipe_info=NULL;
666         phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
667         phHciNfc_HCP_Message_t      *hcp_message = NULL;
668         uint8_t                     i = 0;
669         uint16_t                    length = HCP_HEADER_LEN;
670         
671         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
672                             psHciContext->p_iso_15693_info ;
673         ps_pipe_info = ps_15693_info->ps_15693_pipe_info;
674         if(NULL == ps_pipe_info )
675         {
676             status = PHNFCSTVAL(CID_NFC_HCI, 
677                         NFCSTATUS_INVALID_HCI_SEQUENCE);
678         }
679         else
680         {
681             psHciContext->tx_total = 0 ;
682             hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
683             /* Construct the HCP Frame */
684             if (NXP_ISO15693_CMD == cmd)
685             {
686                 phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
687                                 (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd);
688                 hcp_message = &(hcp_packet->msg.message);
689
690 #if 0
691                 /* Command */
692                 hcp_message->payload[i++] = 
693                                 psHciContext->p_xchg_info->params.tag_info.cmd_type ;
694                     /* Address */
695                 hcp_message->payload[i++] = 
696                                 psHciContext->p_xchg_info->params.tag_info.addr ;
697 #endif /* #if 0 */
698                 phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload,
699                     i, (uint8_t *)ps_pipe_info->param_info,
700                     ps_pipe_info->param_length);
701                 length =(uint16_t)(length + i + ps_pipe_info->param_length);
702             
703                 ps_pipe_info->sent_msg_type = (uint8_t)HCP_MSG_TYPE_COMMAND;
704                 ps_pipe_info->prev_msg = cmd;
705                 psHciContext->tx_total = length;
706                 psHciContext->response_pending = TRUE;
707
708                 /* Send the Constructed HCP packet to the lower layer */
709                 status = phHciNfc_Send_HCP( psHciContext, pHwRef);
710                 ps_pipe_info->prev_status = status;
711             }
712         }
713     }
714     return status;
715 }
716
717 NFCSTATUS
718 phHciNfc_ISO15693_Set_AFI(
719                                void         *psContext,
720                                void         *pHwRef,
721                                uint8_t      afi_value
722                                )
723 {
724     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
725     phHciNfc_sContext_t         *psHciContext = 
726                                 (phHciNfc_sContext_t *)psContext ;
727
728     if( (NULL == psHciContext) || (NULL == pHwRef))
729     {
730         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
731     }
732     else if((NULL == psHciContext->p_iso_15693_info) || 
733         (HCI_ISO_15693_ENABLE != 
734         ((phHciNfc_ISO15693_Info_t *)(psHciContext->p_iso_15693_info))->
735         enable_iso_15693_gate))
736     {
737         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
738     }
739     else
740     {
741         phHciNfc_ISO15693_Info_t    *ps_15693_info = NULL;
742         phHciNfc_Pipe_Info_t        *ps_pipe_info = NULL;
743         uint8_t                     pipeid = 0;
744
745         ps_15693_info = (phHciNfc_ISO15693_Info_t *)
746                             psHciContext->p_iso_15693_info ;
747         ps_pipe_info = ps_15693_info->ps_15693_pipe_info;
748
749         if( NULL == ps_pipe_info)
750         {
751             status = PHNFCSTVAL(CID_NFC_HCI, 
752                                 NFCSTATUS_INVALID_HCI_SEQUENCE);
753         }
754         else
755         {
756             ps_pipe_info->reg_index = ISO_15693_AFI_INDEX;
757             ps_pipe_info->param_info = &afi_value;
758             ps_pipe_info->param_length = sizeof(afi_value);
759             pipeid = ps_pipe_info->pipe.pipe_id ;
760             status = phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef, 
761                                         pipeid, (uint8_t)ANY_SET_PARAMETER);
762         }
763     }
764     return status;
765 }
766
767 #endif /* #if defined (TYPE_ISO15693) */
768
769