Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*!
     18 * =========================================================================== *
     19 *                                                                             *
     20 *                                                                             *
     21 * \file  phHciNfc_Emulation.c                                                 *
     22 * \brief HCI Emulation management routines.                              *
     23 *                                                                             *
     24 *                                                                             *
     25 * Project: NFC-FRI-1.1                                                        *
     26 *                                                                             *
     27 * $Date: Tue Jun  8 09:30:37 2010 $                                           *
     28 * $Author: ing04880 $                                                         *
     29 * $Revision: 1.52 $                                                           *
     30 * $Aliases: NFC_FRI1.1_WK1023_R35_1 $
     31 *                                                                             *
     32 * =========================================================================== *
     33 */
     34 
     35 /*
     36 ***************************** Header File Inclusion ****************************
     37 */
     38 #include <phNfcConfig.h>
     39 #include <phNfcCompId.h>
     40 #include <phNfcHalTypes.h>
     41 #include <phHciNfc_Pipe.h>
     42 #include <phHciNfc_Emulation.h>
     43 #include <phHciNfc_WI.h>
     44 #include <phHciNfc_SWP.h>
     45 #ifdef ENABLE_P2P
     46 #include <phHciNfc_NfcIPMgmt.h>
     47 #endif
     48 #ifdef HOST_EMULATION
     49 #include <phHciNfc_CE_A.h>
     50 #include <phHciNfc_CE_B.h>
     51 #endif
     52 #include <phOsalNfc.h>
     53 /*
     54 ****************************** Macro Definitions *******************************
     55 */
     56 
     57 
     58 
     59 /*
     60 *************************** Structure and Enumeration ***************************
     61 */
     62 
     63 /** \defgroup grp_hci_nfc HCI Emulation Management Component
     64 *
     65 *
     66 */
     67 
     68 typedef enum phHciNfc_EmulationMgmt_Seq{
     69     NFCIP_TARGET_PIPE_OPEN  = 0x00U,
     70     NFCIP_TARGET_MODE_CONFIG,
     71     NFCIP_TARGET_MERGE_SAK,
     72     NFCIP_TARGET_PIPE_CLOSE,
     73 
     74     HOST_CE_A_INIT,
     75     HOST_CE_A_RELEASE,
     76 
     77     HOST_CE_B_INIT,
     78     HOST_CE_B_RELEASE,
     79 
     80     WI_PIPE_OPEN,
     81     WI_ENABLE_EMULATION,
     82     WI_DEFAULT_EMULATION,
     83     WI_DISABLE_EMULATION,
     84 
     85     WI_ENABLE_NOTIFICATION,
     86     WI_DISABLE_NOTIFICATION,
     87 
     88     WI_SWITCH_WIRED_MODE,
     89     WI_SWITCH_DEFAULT_MODE,
     90 
     91     WI_PIPE_CLOSE,
     92 
     93     SWP_PIPE_OPEN,
     94     SWP_ENABLE_EMULATION,
     95     SWP_DEFAULT_EMULATION,
     96     SWP_DETECTION,
     97     SWP_DISABLE_EMULATION,
     98     SWP_GET_BIT_RATE,
     99     SWP_PIPE_CLOSE,
    100 
    101     CONFIG_DEFAULT_EMULATION,
    102 
    103     END_EMULATION_SEQ
    104 } phHciNfc_EmulationMgmt_Seq_t;
    105 
    106 typedef struct phHciNfc_EmulationMgmt_Info{
    107     phHal_eEmulationType_t          se_default;
    108     uint8_t                         smx_powerless;
    109     uint8_t                         uicc_enable;
    110     uint8_t                         uicc_powerless;
    111     uint8_t                         uicc_id;
    112     /* Application ID of the UICC Transaction performed */
    113     uint8_t                         uicc_aid[MAX_AID_LEN];
    114     uint8_t                         uicc_param[MAX_UICC_PARAM_LEN];
    115     uint8_t                         uicc_param_len;
    116     phHciNfc_Pipe_Info_t            *p_uicc_pipe_info;
    117     phHciNfc_EmulationMgmt_Seq_t    emulation_cur_seq;
    118     phHciNfc_EmulationMgmt_Seq_t    emulation_next_seq;
    119 
    120 
    121 } phHciNfc_EmulationMgmt_Info_t;
    122 
    123 
    124 /*
    125 *************************** Static Function Declaration **************************
    126 */
    127 
    128 static
    129 NFCSTATUS
    130 phHciNfc_Recv_Uicc_Cmd (
    131                         void                *psContext,
    132                         void                *pHwRef,
    133                         uint8_t             *pCmd,
    134 #ifdef ONE_BYTE_LEN
    135                         uint8_t             length
    136 #else
    137                         uint16_t            length
    138 #endif
    139                      );
    140 
    141 static
    142 NFCSTATUS
    143 phHciNfc_Recv_Uicc_Event (
    144                         void                *psContext,
    145                         void                *pHwRef,
    146                         uint8_t             *pEvent,
    147 #ifdef ONE_BYTE_LEN
    148                         uint8_t             length
    149 #else
    150                         uint16_t            length
    151 #endif
    152                      );
    153 
    154 
    155 /*
    156 *************************** Function Definitions ***************************
    157 */
    158 
    159 void
    160 phHciNfc_Uicc_Connectivity(
    161                             phHciNfc_sContext_t     *psHciContext,
    162                             void                    *pHwRef
    163                         )
    164 {
    165     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    166     phHciNfc_Pipe_Info_t            *pPipeInfo = NULL;
    167     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info = NULL;
    168 
    169     if( NULL != psHciContext->p_emulation_mgmt_info )
    170     {
    171         p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
    172                             psHciContext->p_emulation_mgmt_info ;
    173         pPipeInfo = psHciContext->p_pipe_list[NXP_PIPE_CONNECTIVITY];
    174         if( (TRUE == ((phHal_sHwReference_t *)pHwRef)->uicc_connected)
    175             && (NULL == pPipeInfo))
    176         {
    177             status = phHciNfc_Allocate_Resource((void **)&pPipeInfo,
    178                                                 sizeof(phHciNfc_Pipe_Info_t));
    179             if((NULL != pPipeInfo)
    180                 && (NFCSTATUS_SUCCESS == status))
    181             {
    182                 /* The Source Host is the UICC Host */
    183                 pPipeInfo->pipe.source.host_id =
    184                                     (uint8_t) phHciNfc_UICCHostID;
    185                 /* The Source Gate is same as the Destination Gate */
    186                 pPipeInfo->pipe.source.gate_id  =
    187                                     (uint8_t)   phHciNfc_ConnectivityGate;
    188                 /* The Destination Host is the Terminal Host */
    189                 pPipeInfo->pipe.dest.host_id =
    190                                     (uint8_t) phHciNfc_TerminalHostID;
    191                 /* The Source Gate is same as the Destination Gate */
    192                 pPipeInfo->pipe.dest.gate_id    =
    193                                     (uint8_t) phHciNfc_ConnectivityGate;
    194                 /* The Pipe ID is Hardcoded to Connectivity */
    195                 pPipeInfo->pipe.pipe_id = (uint8_t) NXP_PIPE_CONNECTIVITY;
    196 
    197 
    198                 status = phHciNfc_Uicc_Update_PipeInfo(psHciContext,
    199                                         NXP_PIPE_CONNECTIVITY, pPipeInfo);
    200                 if (NFCSTATUS_SUCCESS == status)
    201                 {
    202                     psHciContext->p_pipe_list[NXP_PIPE_CONNECTIVITY] = pPipeInfo;
    203                     p_emulation_mgmt_info->uicc_enable = TRUE;
    204                 }
    205                 else
    206                 {
    207                     (void)phOsalNfc_FreeMemory(pPipeInfo);
    208                 }
    209             }
    210         }
    211     }
    212   return;
    213 }
    214 
    215 /*!
    216  * \brief Get the pipe_id of Connectivity Managment Gate.
    217  *
    218  * This function Get the pipe_id of Connectivity Managment Gate.
    219  *
    220  */
    221 
    222 
    223 NFCSTATUS
    224 phHciNfc_Uicc_Get_PipeID(
    225                             phHciNfc_sContext_t     *psHciContext,
    226                             uint8_t                 *ppipe_id
    227                         )
    228 {
    229     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
    230     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info = NULL;
    231     if( (NULL != psHciContext)
    232         && ( NULL != ppipe_id )
    233         && ( NULL != psHciContext->p_emulation_mgmt_info )
    234       )
    235     {
    236         p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
    237                             psHciContext->p_emulation_mgmt_info ;
    238         *ppipe_id =  p_emulation_mgmt_info->uicc_id  ;
    239     }
    240     else
    241     {
    242         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    243     }
    244     return status;
    245 }
    246 
    247 
    248 /* Function to Update the  Pipe Information */
    249 NFCSTATUS
    250 phHciNfc_Uicc_Update_PipeInfo(
    251                                 phHciNfc_sContext_t     *psHciContext,
    252                                 uint8_t                 pipe_id,
    253                                 phHciNfc_Pipe_Info_t    *pPipeInfo
    254                         )
    255 {
    256     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info=NULL;
    257     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    258 
    259     if( NULL == psHciContext )
    260     {
    261         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    262     }
    263     else if ( NULL == psHciContext->p_emulation_mgmt_info )
    264     {
    265         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
    266     }
    267     else
    268     {
    269         p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
    270                                 psHciContext->p_emulation_mgmt_info ;
    271         /* Update the pipe_id of the Connectivity Gate
    272          * obtained from the HCI Response */
    273         p_emulation_mgmt_info->uicc_id = pipe_id;
    274         p_emulation_mgmt_info->p_uicc_pipe_info = pPipeInfo;
    275         if ( NULL != pPipeInfo)
    276         {
    277             /* Update the Response Receive routine of the Connectivity Gate */
    278             /* pPipeInfo->recv_resp = phHciNfc_Recv_Uicc_Response; */
    279             pPipeInfo->recv_cmd = &phHciNfc_Recv_Uicc_Cmd;
    280             pPipeInfo->recv_event = &phHciNfc_Recv_Uicc_Event;
    281         }
    282     }
    283 
    284     return status;
    285 }
    286 
    287 
    288 /*!
    289 * \brief Updates the Sequence of Emulation Managment Gate.
    290 *
    291 * This function Resets/Updates the sequence of the Emulation Management
    292 * gate.
    293 *
    294 */
    295 
    296 
    297 NFCSTATUS
    298 phHciNfc_EmuMgmt_Update_Seq(
    299                                 phHciNfc_sContext_t     *psHciContext,
    300                                 phHciNfc_eSeqType_t     seq_type
    301                         )
    302 {
    303     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info=NULL;
    304     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    305     if( NULL == psHciContext )
    306     {
    307         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    308     }
    309     else
    310     {
    311         if( NULL == psHciContext->p_emulation_mgmt_info )
    312         {
    313             status = PHNFCSTVAL(CID_NFC_HCI,
    314                 NFCSTATUS_INVALID_HCI_INFORMATION);
    315         }
    316         else
    317         {
    318             p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
    319                 psHciContext->p_emulation_mgmt_info ;
    320             switch(seq_type)
    321             {
    322                 case RESET_SEQ:
    323                 case INIT_SEQ:
    324                 {
    325 #ifdef ENABLE_P2P
    326                     p_emulation_mgmt_info->emulation_cur_seq = NFCIP_TARGET_PIPE_OPEN;
    327 #else
    328                     p_emulation_mgmt_info->emulation_cur_seq = WI_PIPE_OPEN;
    329 #endif
    330                     p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ;
    331                     break;
    332                 }
    333                 case UPDATE_SEQ:
    334                 {
    335                     p_emulation_mgmt_info->emulation_cur_seq =
    336                         p_emulation_mgmt_info->emulation_next_seq;
    337                     break;
    338                 }
    339                 case INFO_SEQ:
    340                 {
    341                     p_emulation_mgmt_info->emulation_cur_seq = SWP_ENABLE_EMULATION;
    342                     p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ;
    343                     break;
    344                 }
    345                 case REL_SEQ:
    346                 {
    347                     p_emulation_mgmt_info->emulation_cur_seq = WI_DISABLE_EMULATION;
    348                     p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ ;
    349                     break;
    350                 }
    351                 default:
    352                 {
    353                     break;
    354                 }
    355             }
    356         }
    357     }
    358 
    359     return status;
    360 }
    361 
    362 
    363 /*!
    364 * \brief Initialisation of RF Emulation Gates.
    365 *
    366 * This function initialses the RF Emulation Management and
    367 * populates the Reader Management Information Structure
    368 *
    369 */
    370 
    371 
    372 NFCSTATUS
    373 phHciNfc_EmuMgmt_Initialise(
    374                                phHciNfc_sContext_t      *psHciContext,
    375                                void                 *pHwRef
    376                            )
    377 {
    378     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    379     phHciNfc_Pipe_Info_t            *p_pipe_info = NULL;
    380     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info=NULL;
    381 
    382     if( NULL == psHciContext )
    383     {
    384         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    385     }
    386     else
    387     {
    388 
    389         if( ( NULL == psHciContext->p_emulation_mgmt_info )
    390             && (phHciNfc_Allocate_Resource((void **)(&p_emulation_mgmt_info),
    391             sizeof(phHciNfc_EmulationMgmt_Info_t))== NFCSTATUS_SUCCESS)
    392             )
    393         {
    394             psHciContext->p_emulation_mgmt_info = p_emulation_mgmt_info;
    395 #ifdef ENABLE_P2P
    396             p_emulation_mgmt_info->emulation_cur_seq = NFCIP_TARGET_PIPE_OPEN;
    397 #else
    398             p_emulation_mgmt_info->emulation_cur_seq = WI_PIPE_OPEN;
    399 #endif
    400             p_emulation_mgmt_info->emulation_next_seq = END_EMULATION_SEQ;
    401             p_emulation_mgmt_info->uicc_id  = (uint8_t)HCI_UNKNOWN_PIPE_ID;
    402         }
    403         else
    404         {
    405             p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
    406                 psHciContext->p_emulation_mgmt_info ;
    407         }
    408 
    409         if( NULL == psHciContext->p_emulation_mgmt_info )
    410         {
    411             status = PHNFCSTVAL(CID_NFC_HCI,
    412                 NFCSTATUS_INSUFFICIENT_RESOURCES);
    413         }
    414 #ifdef ESTABLISH_SESSION
    415         else if(( hciMode_Session == psHciContext->hci_mode )
    416             && (NFCIP_TARGET_PIPE_OPEN == p_emulation_mgmt_info->emulation_cur_seq )
    417             )
    418         {
    419             status = NFCSTATUS_SUCCESS;
    420         }
    421 #endif
    422         else
    423         {
    424             switch(p_emulation_mgmt_info->emulation_cur_seq )
    425             {
    426 #ifdef ENABLE_P2P
    427                 /* NFCIP Target Open sequence */
    428                 case NFCIP_TARGET_PIPE_OPEN:
    429                 {
    430                     p_pipe_info = ((phHciNfc_NfcIP_Info_t *)
    431                         psHciContext->p_nfcip_info)->p_tgt_pipe_info;
    432                     if(NULL == p_pipe_info )
    433                     {
    434                         status = PHNFCSTVAL(CID_NFC_HCI,
    435                                     NFCSTATUS_INVALID_HCI_INFORMATION);
    436                     }
    437                     else
    438                     {
    439                         status = phHciNfc_Open_Pipe( psHciContext,
    440                             pHwRef, p_pipe_info );
    441                         if(status == NFCSTATUS_SUCCESS)
    442                         {
    443                             p_emulation_mgmt_info->emulation_next_seq =
    444                                                     NFCIP_TARGET_MODE_CONFIG;
    445                             status = NFCSTATUS_PENDING;
    446                         }
    447                     }
    448                     break;
    449                 }
    450                 /* NFCIP Target Mode Config sequence */
    451                 case NFCIP_TARGET_MODE_CONFIG:
    452                 {
    453 #define NFCIP_ACTIVE_SHIFT	0x03U
    454 #define NFCIP_PASSIVE_MASK	0x07U
    455                     uint8_t mode = ( NXP_NFCIP_ACTIVE_DEFAULT << NFCIP_ACTIVE_SHIFT ) |
    456 									( DEFAULT_NFCIP_TARGET_MODE_SUPPORT & NFCIP_PASSIVE_MASK );
    457                     status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef,
    458                                                 NFCIP_TARGET, mode);
    459                     if(status == NFCSTATUS_PENDING )
    460                     {
    461 #ifdef TGT_MERGE_SAK
    462                         p_emulation_mgmt_info->emulation_next_seq =
    463                                             NFCIP_TARGET_MERGE_SAK;
    464 #else
    465                         p_emulation_mgmt_info->emulation_next_seq =
    466                                             WI_PIPE_OPEN;
    467 #endif /* #ifdef TGT_MERGE_SAK */
    468                         /* status = NFCSTATUS_SUCCESS; */
    469                     }
    470                     break;
    471                 }
    472 #ifdef TGT_MERGE_SAK
    473                 /* NFCIP Target SAK Merge sequence */
    474                 case NFCIP_TARGET_MERGE_SAK:
    475                 {
    476                     status = phHciNfc_NfcIP_SetMergeSak( psHciContext, pHwRef,
    477                                                 TRUE );
    478                     if(status == NFCSTATUS_PENDING )
    479                     {
    480                         p_emulation_mgmt_info->emulation_next_seq =
    481                                             WI_PIPE_OPEN;
    482                         /* status = NFCSTATUS_SUCCESS; */
    483                     }
    484                     break;
    485                 }
    486 #endif /* #ifdef TGT_MERGE_SAK */
    487 #endif /* #ifdef ENABLE_P2P */
    488                 /* Secure Element WI pipe open sequence */
    489                 case WI_PIPE_OPEN:
    490                 {
    491                     p_pipe_info = ((phHciNfc_WI_Info_t *)
    492                         psHciContext->p_wi_info)->p_pipe_info;
    493                     if(NULL == p_pipe_info )
    494                     {
    495                         status = PHNFCSTVAL(CID_NFC_HCI,
    496                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    497                     }
    498                     else
    499                     {
    500                         status = phHciNfc_Open_Pipe( psHciContext,
    501                                             pHwRef, p_pipe_info );
    502                         if(status == NFCSTATUS_SUCCESS)
    503                         {
    504 #ifdef DISABLE_WI_NOTIFICATION
    505                             p_emulation_mgmt_info->emulation_next_seq =
    506                                                             SWP_PIPE_OPEN;
    507 #else
    508                             p_emulation_mgmt_info->emulation_next_seq =
    509                                                             WI_ENABLE_NOTIFICATION;
    510 #endif
    511                             status = NFCSTATUS_PENDING;
    512                         }
    513                     }
    514                     break;
    515                 }
    516                 /* Enable the SmartMx Notifications through WI */
    517                 case WI_ENABLE_NOTIFICATION:
    518                 {
    519                     p_pipe_info = ((phHciNfc_WI_Info_t *)
    520                                 psHciContext->p_wi_info)->p_pipe_info;
    521                     if(NULL == p_pipe_info )
    522                     {
    523                         status = PHNFCSTVAL(CID_NFC_HCI,
    524                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    525                     }
    526                     else
    527                     {
    528                         status = phHciNfc_WI_Configure_Notifications(
    529                                     psHciContext, pHwRef, eEnableEvents );
    530                         if(status == NFCSTATUS_PENDING)
    531                         {
    532                             p_emulation_mgmt_info->emulation_next_seq =
    533                                                                 SWP_PIPE_OPEN;
    534                         }
    535                     }
    536                     break;
    537                 }
    538                 /* Enable the SmartMx Emulation by Default through WI */
    539                 case WI_ENABLE_EMULATION:
    540                 {
    541                     p_pipe_info = ((phHciNfc_WI_Info_t *)
    542                                 psHciContext->p_wi_info)->p_pipe_info;
    543                     if(NULL == p_pipe_info )
    544                     {
    545                         status = PHNFCSTVAL(CID_NFC_HCI,
    546                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    547                     }
    548                     else
    549                     {
    550                         status = phHciNfc_WI_Configure_Default( psHciContext,
    551                             pHwRef, TRUE );
    552                         if(status == NFCSTATUS_PENDING)
    553                         {
    554                             p_emulation_mgmt_info->emulation_next_seq =
    555                                                     SWP_PIPE_OPEN;
    556                         }
    557                     }
    558                     break;
    559                 }
    560                 /* SWP pipe open sequence */
    561                 case SWP_PIPE_OPEN:
    562                 {
    563                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    564                         psHciContext->p_swp_info)->p_pipe_info;
    565                     if(NULL == p_pipe_info )
    566                     {
    567                         status = PHNFCSTVAL(CID_NFC_HCI,
    568                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    569                     }
    570                     else
    571                     {
    572                         status = phHciNfc_Open_Pipe( psHciContext,
    573                             pHwRef, p_pipe_info );
    574                         if(status == NFCSTATUS_SUCCESS)
    575                         {
    576                             p_emulation_mgmt_info->emulation_next_seq =
    577                                                             SWP_ENABLE_EMULATION;
    578 #ifndef ESTABLISH_SESSION
    579                             status = NFCSTATUS_PENDING;
    580 #endif
    581                         }
    582                     }
    583                     break;
    584                 }
    585                 /* Enable the UICC Emulation through SWP */
    586                 case SWP_ENABLE_EMULATION:
    587                 {
    588                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    589                         psHciContext->p_swp_info)->p_pipe_info;
    590                     if(NULL == p_pipe_info )
    591                     {
    592                         status = PHNFCSTVAL(CID_NFC_HCI,
    593                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    594                     }
    595                     else
    596                     {
    597 #ifdef SWP_EVENT_USAGE
    598                     status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef,
    599                         UICC_SWITCH_MODE_ON );
    600                        /* UICC_SWITCH_MODE_DEFAULT */
    601 #else
    602                         status = phHciNfc_SWP_Configure_Default( psHciContext,
    603                             pHwRef,   TRUE );
    604 #endif
    605                         if(status == NFCSTATUS_PENDING)
    606                         {
    607                             p_emulation_mgmt_info->emulation_next_seq =
    608                                                     SWP_DETECTION;
    609                             /* status = NFCSTATUS_SUCCESS; */
    610                         }
    611                     }
    612                     break;
    613                 }
    614                 /* Disable the UICC Emulation through SWP */
    615                 case SWP_DETECTION:
    616                 {
    617                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    618                         psHciContext->p_swp_info)->p_pipe_info;
    619                     if(NULL == p_pipe_info )
    620                     {
    621                         status = PHNFCSTVAL(CID_NFC_HCI,
    622                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    623                         break;
    624                     }
    625                     else
    626                     {
    627                         status = phHciNfc_Uicc_Connect_Status(
    628                                                     psHciContext, pHwRef );
    629                         if(status == NFCSTATUS_SUCCESS)
    630                         {
    631                             uint8_t uicc_connect = ((phHciNfc_SWP_Info_t *)
    632                                             psHciContext->p_swp_info)->uicc_status;
    633                             if(UICC_CONNECTED == uicc_connect)
    634                             {
    635 #ifdef SWP_EVENT_USAGE
    636                                 p_emulation_mgmt_info->emulation_next_seq =
    637                                                     SWP_DISABLE_EMULATION;
    638 #else
    639                                 p_emulation_mgmt_info->emulation_next_seq =
    640                                                     WI_DISABLE_EMULATION;
    641 #endif
    642                                 ((phHal_sHwReference_t  *)
    643                                         pHwRef)->uicc_connected = TRUE;
    644                                 status = NFCSTATUS_PENDING;
    645                             }
    646                             else
    647                             {
    648                                 status = phHciNfc_SWP_Configure_Mode( psHciContext,
    649                                                 pHwRef,   UICC_SWITCH_MODE_DEFAULT );
    650                                 (NFCSTATUS_PENDING == status)?
    651                                     (p_emulation_mgmt_info->emulation_next_seq =
    652                                     WI_DISABLE_EMULATION):
    653                                     (p_emulation_mgmt_info->emulation_next_seq =
    654                                         SWP_DETECTION);
    655                                 break;
    656                             }
    657                         }
    658                         else
    659                         {
    660                             break;
    661                         }
    662                     }
    663                 }
    664                 /* fall through */
    665                 /* Disable the SmartMx Emulation through WI */
    666                 case WI_DISABLE_EMULATION:
    667                 {
    668                     p_pipe_info = ((phHciNfc_WI_Info_t *)
    669                                 psHciContext->p_wi_info)->p_pipe_info;
    670                     if(NULL == p_pipe_info )
    671                     {
    672                         status = PHNFCSTVAL(CID_NFC_HCI,
    673                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    674                     }
    675                     else
    676                     {
    677                         status = phHciNfc_WI_Configure_Mode( psHciContext,
    678                             pHwRef, eSmartMx_Default );
    679                         if(status == NFCSTATUS_PENDING)
    680                         {
    681                             p_emulation_mgmt_info->emulation_next_seq =
    682                                                     SWP_DISABLE_EMULATION;
    683                             status = NFCSTATUS_SUCCESS;
    684                         }
    685                     }
    686                     break;
    687                 }
    688 #ifndef SWP_EVENT_USAGE
    689                 /* fall through */
    690                 /* Get the UICC Baud Rate Status */
    691                 case SWP_GET_BIT_RATE:
    692                 {
    693                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    694                         psHciContext->p_swp_info)->p_pipe_info;
    695                     if(NULL == p_pipe_info )
    696                     {
    697                         status = PHNFCSTVAL(CID_NFC_HCI,
    698                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    699                     }
    700                     else
    701                     {
    702                         status = phHciNfc_SWP_Get_Bitrate(
    703                                                     psHciContext, pHwRef );
    704                         if(status == NFCSTATUS_PENDING)
    705                         {
    706                             p_emulation_mgmt_info->emulation_next_seq =
    707                                                     SWP_DISABLE_EMULATION;
    708                             status = NFCSTATUS_SUCCESS;
    709                         }
    710                     }
    711                     break;
    712                 }
    713 #endif
    714                 /* fall through */
    715                 /* Disable the UICC Emulation through SWP */
    716                 case SWP_DISABLE_EMULATION:
    717                 {
    718                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    719                         psHciContext->p_swp_info)->p_pipe_info;
    720                     if(NULL == p_pipe_info )
    721                     {
    722                         status = PHNFCSTVAL(CID_NFC_HCI,
    723                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    724                     }
    725                     else
    726                     {
    727                         status = phHciNfc_SWP_Configure_Mode( psHciContext,
    728                             pHwRef,   UICC_SWITCH_MODE_DEFAULT );
    729                         if(status == NFCSTATUS_PENDING)
    730                         {
    731                             p_emulation_mgmt_info->emulation_next_seq =
    732                                                     WI_DISABLE_EMULATION;
    733                             /* Disable WI Emulation for Previous Wired
    734                              * Mode Set */
    735                             /* status = NFCSTATUS_SUCCESS; */
    736                         }
    737                     }
    738                     break;
    739                 }
    740                 default:
    741                 {
    742                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
    743                     break;
    744                 }
    745 
    746             }/* End of the Sequence Switch */
    747 
    748         }/* End of the Reader Info Memory Check */
    749 
    750     } /* End of Null Context Check */
    751 
    752     return status;
    753 }
    754 
    755 /*!
    756 * \brief Connection Routine for the Uicc.
    757 *
    758 * This function tries to enable and initialise the UICC connected
    759 * through SWP.
    760 *
    761 */
    762 
    763 
    764 NFCSTATUS
    765 phHciNfc_Uicc_Connect_Status(
    766                                phHciNfc_sContext_t  *psHciContext,
    767                                void                 *pHwRef
    768                       )
    769 {
    770     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    771     /* phHciNfc_Pipe_Info_t         *p_pipe_info = NULL; */
    772     /* phHciNfc_EmulationMgmt_Info_t    *p_emulation_mgmt_info=NULL; */
    773     static uint32_t                  uicc_connection_retry = 0;
    774 
    775     if( NULL == psHciContext )
    776     {
    777         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    778     }
    779     else
    780     {
    781         phHciNfc_SWP_Status_t uicc_status =
    782             ((phHciNfc_SWP_Info_t *)
    783             psHciContext->p_swp_info)->uicc_status;
    784         if(uicc_connection_retry == 0)
    785         {
    786 #ifdef UICC_STATUS_DELAY
    787             for( ;uicc_connection_retry < UICC_STATUS_DELAY_COUNT;
    788                             uicc_connection_retry ++ );
    789             uicc_connection_retry = 0;
    790 #endif
    791             status = phHciNfc_SWP_Get_Status(
    792                                 psHciContext, pHwRef );
    793             if (NFCSTATUS_PENDING == status)
    794             {
    795                 uicc_connection_retry++;
    796             }
    797         }
    798         else
    799         {
    800             switch(uicc_status)
    801             {
    802                 case UICC_CONNECTION_ONGOING:
    803                 case UICC_DISCONNECTION_ONGOING:
    804                 case UICC_NOT_CONNECTED:
    805                 {
    806                     if(uicc_connection_retry <
    807                                     UICC_MAX_CONNECT_RETRY)
    808                     {
    809                         status = phHciNfc_SWP_Get_Status(
    810                                             psHciContext, pHwRef );
    811                         if (NFCSTATUS_PENDING == status)
    812                         {
    813                             uicc_connection_retry++;
    814                         }
    815                     }
    816                     break;
    817                 }
    818                 case UICC_CONNECTED:
    819                 {
    820                     break;
    821                 }
    822                 case UICC_CONNECTION_LOST:
    823                 case UICC_CONNECTION_FAILED:
    824                 default:
    825                 {
    826                     uicc_connection_retry = 0;
    827                     break;
    828                 }
    829             } /* End of the Status Switch */
    830         }
    831 
    832         if( NFCSTATUS_PENDING != status )
    833         {
    834             uicc_connection_retry = 0;
    835             /* Error Scenario due to SWP Disable Config */
    836         }
    837 
    838     } /* End of Null Context Check */
    839 
    840     return status;
    841 }
    842 
    843 /*!
    844 * \brief Release of RF Emulation Gate Configuration.
    845 *
    846 * This function initialses the RF Emulation Management and
    847 * populates the Reader Management Information Structure
    848 *
    849 */
    850 
    851 
    852 NFCSTATUS
    853 phHciNfc_EmuMgmt_Release(
    854                                phHciNfc_sContext_t      *psHciContext,
    855                                void                 *pHwRef
    856                            )
    857 {
    858     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
    859     phHciNfc_Pipe_Info_t            *p_pipe_info = NULL;
    860     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info=NULL;
    861 
    862     if( NULL == psHciContext )
    863     {
    864         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
    865     }
    866     else
    867     {
    868 
    869         p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
    870             psHciContext->p_emulation_mgmt_info ;
    871 
    872         if( NULL == psHciContext->p_emulation_mgmt_info )
    873         {
    874             status = PHNFCSTVAL(CID_NFC_HCI,
    875                 NFCSTATUS_INSUFFICIENT_RESOURCES);
    876         }
    877         else
    878         {
    879             switch(p_emulation_mgmt_info->emulation_cur_seq )
    880             {
    881                 /* Enable/Disable the SmartMx Emulation through WI
    882                  * After the power down
    883                  */
    884                 /* Enable the SmartMx Emulation by Default through WI */
    885                 case WI_DEFAULT_EMULATION:
    886                 {
    887                     p_pipe_info = ((phHciNfc_WI_Info_t *)
    888                                 psHciContext->p_wi_info)->p_pipe_info;
    889                     if(NULL == p_pipe_info )
    890                     {
    891                         status = PHNFCSTVAL(CID_NFC_HCI,
    892                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    893                     }
    894                     else
    895                     {
    896                         status = phHciNfc_WI_Configure_Default( psHciContext,
    897                             pHwRef, p_emulation_mgmt_info->smx_powerless );
    898                         if(status == NFCSTATUS_PENDING)
    899                         {
    900                             p_emulation_mgmt_info->emulation_next_seq =
    901                                                     WI_DISABLE_EMULATION;
    902                         }
    903                     }
    904                     break;
    905                 }
    906                 /* SmartMx In Default Mode */
    907                 case WI_DISABLE_EMULATION:
    908                 {
    909                     p_pipe_info = ((phHciNfc_WI_Info_t *)
    910                                 psHciContext->p_wi_info)->p_pipe_info;
    911                     if(NULL == p_pipe_info )
    912                     {
    913                         status = PHNFCSTVAL(CID_NFC_HCI,
    914                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    915                     }
    916                     else
    917                     {
    918                         status = phHciNfc_WI_Configure_Mode( psHciContext,
    919                             pHwRef, eSmartMx_Default );
    920                         if(status == NFCSTATUS_SUCCESS )
    921                         {
    922                             p_emulation_mgmt_info->emulation_next_seq =
    923                                                         SWP_DISABLE_EMULATION;
    924                             status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
    925                                                                 UPDATE_SEQ);
    926                             /* status = NFCSTATUS_PENDING; */
    927                         }
    928                     }
    929                     break;
    930                 }
    931                 /* Enable/Disable the UICC Emulation through SWP
    932                  * After the power down
    933                  */
    934                 /* Enable the UICC Emulation by Default through SWP */
    935                 case SWP_DEFAULT_EMULATION:
    936                 {
    937                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    938                         psHciContext->p_swp_info)->p_pipe_info;
    939                     if(NULL == p_pipe_info )
    940                     {
    941                         status = PHNFCSTVAL(CID_NFC_HCI,
    942                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    943                     }
    944                     else
    945                     {
    946                         status = phHciNfc_SWP_Configure_Default( psHciContext,
    947                             pHwRef, p_emulation_mgmt_info->uicc_powerless );
    948                         if(status == NFCSTATUS_PENDING)
    949                         {
    950                             p_emulation_mgmt_info->emulation_next_seq =
    951                                                             SWP_DISABLE_EMULATION;
    952                             /* status = NFCSTATUS_SUCCESS; */
    953                         }
    954                     }
    955                     break;
    956                 }
    957                 /* Disable the UICC Emulation through SWP */
    958                 case SWP_DISABLE_EMULATION:
    959                 {
    960                     p_pipe_info = ((phHciNfc_SWP_Info_t *)
    961                         psHciContext->p_swp_info)->p_pipe_info;
    962                     if(NULL == p_pipe_info )
    963                     {
    964                         status = PHNFCSTVAL(CID_NFC_HCI,
    965                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    966                     }
    967                     else
    968                     {
    969                         status = phHciNfc_SWP_Configure_Mode( psHciContext,
    970                             pHwRef, UICC_SWITCH_MODE_DEFAULT );
    971                         if(status == NFCSTATUS_PENDING)
    972                         {
    973                             p_emulation_mgmt_info->emulation_next_seq =
    974                                                 CONFIG_DEFAULT_EMULATION;
    975                             status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
    976                                                                 UPDATE_SEQ);
    977                             status = NFCSTATUS_SUCCESS;
    978                         }
    979                     }
    980                     break;
    981                 }
    982                 /* Configure the Default Secure Element Emulation */
    983                 case CONFIG_DEFAULT_EMULATION:
    984                 {
    985 #if 0
    986                     if(NULL == p_pipe_info )
    987                     {
    988                         status = PHNFCSTVAL(CID_NFC_HCI,
    989                                 NFCSTATUS_INVALID_HCI_INFORMATION);
    990                     }
    991                     else
    992                     {
    993                         /* status = phHciNfc_DevMgmt_Configure( psHciContext,
    994                             pHwRef, , ); */
    995                         if(status == NFCSTATUS_PENDING)
    996                         {
    997                             p_emulation_mgmt_info->emulation_next_seq =
    998                                                             END_EMULATION_SEQ;
    999                             status = phHciNfc_EmuMgmt_Update_Seq(psHciContext,
   1000                                                                 UPDATE_SEQ);
   1001                             status = NFCSTATUS_SUCCESS;
   1002                         }
   1003                     }
   1004 #endif
   1005                     break;
   1006                 }
   1007                 default:
   1008                 {
   1009                     status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
   1010                     break;
   1011                 }
   1012 
   1013             }/* End of the Sequence Switch */
   1014 
   1015         }/* End of the Reader Info Memory Check */
   1016 
   1017     } /* End of Null Context Check */
   1018 
   1019     return status;
   1020 }
   1021 
   1022 #if 0
   1023 NFCSTATUS
   1024 phHciNfc_Emulation_Start (
   1025                         phHciNfc_sContext_t     *psHciContext,
   1026                         void                    *pHwRef
   1027                         )
   1028 {
   1029     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
   1030 
   1031     return status;
   1032 }
   1033 #endif
   1034 
   1035 NFCSTATUS
   1036 phHciNfc_Emulation_Cfg (
   1037                         phHciNfc_sContext_t     *psHciContext,
   1038                         void                    *pHwRef,
   1039                         phHciNfc_eConfigType_t  cfg_type
   1040                        )
   1041 {
   1042     NFCSTATUS                       status = NFCSTATUS_SUCCESS;
   1043     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info=NULL;
   1044     phHal_sEmulationCfg_t           *p_emulation_cfg = NULL;
   1045 
   1046     if( (NULL == psHciContext) || (NULL == pHwRef) )
   1047     {
   1048         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1049     }
   1050     else if ( ( NULL == psHciContext->p_emulation_mgmt_info )
   1051              || ( NULL == psHciContext->p_config_params ) )
   1052     {
   1053         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
   1054     }
   1055     else
   1056     {
   1057         p_emulation_mgmt_info = (phHciNfc_EmulationMgmt_Info_t *)
   1058             psHciContext->p_emulation_mgmt_info ;
   1059         p_emulation_cfg = psHciContext->p_config_params;
   1060         switch(cfg_type)
   1061         {
   1062             case SMX_WI_CFG:
   1063             {
   1064                 phHal_sSmartMX_Cfg_t   *smx_config =
   1065                                         &p_emulation_cfg->config.smartMxCfg;
   1066                 p_emulation_mgmt_info->smx_powerless =
   1067                                         (uint8_t)(FALSE != smx_config->lowPowerMode );
   1068                 status = phHciNfc_WI_Configure_Default( psHciContext, pHwRef,
   1069                                                 smx_config->enableEmulation );
   1070                 break;
   1071             }
   1072             case UICC_SWP_CFG:
   1073             {
   1074 #ifdef SWP_CFG_SEQ
   1075                 phHal_sUiccEmuCfg_t   *uicc_config =
   1076                                     &p_emulation_cfg->config.uiccEmuCfg;
   1077                 p_emulation_mgmt_info->uicc_powerless =
   1078                                         (uint8_t)(FALSE != uicc_config->lowPowerMode );
   1079                 {
   1080 #ifdef SWP_EVENT_USAGE
   1081                     status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef,
   1082                         ((TRUE == uicc_config->enableUicc)? /* UICC_SWITCH_MODE_DEFAULT */
   1083                         UICC_SWITCH_MODE_ON :UICC_SWITCH_MODE_OFF));
   1084 #else
   1085                     status = phHciNfc_SWP_Configure_Default( psHciContext, pHwRef,
   1086                                                 uicc_config->enableUicc );
   1087 #endif
   1088                 }
   1089 #else
   1090                 status = phHciNfc_SWP_Config_Sequence( psHciContext,
   1091                                                         pHwRef, p_emulation_cfg);
   1092 #endif
   1093                 break;
   1094             }
   1095             case SWP_EVT_CFG:
   1096             {
   1097                 phHal_sUiccEmuCfg_t   *uicc_config =
   1098                                     &p_emulation_cfg->config.uiccEmuCfg;
   1099                 p_emulation_mgmt_info->uicc_powerless =
   1100                                         (uint8_t)(FALSE != uicc_config->lowPowerMode );
   1101                 {
   1102                     status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef,
   1103                         ((TRUE == uicc_config->enableUicc)? /* UICC_SWITCH_MODE_DEFAULT */
   1104                         UICC_SWITCH_MODE_ON :UICC_SWITCH_MODE_DEFAULT));
   1105                 }
   1106                 break;
   1107             }
   1108 #ifdef HOST_EMULATION
   1109             case NFC_CE_A_CFG:
   1110             {
   1111                 phHal_sHostEmuCfg_A_t *host_ce_a_cfg =
   1112                         &p_emulation_cfg->config.hostEmuCfg_A;
   1113                 if(host_ce_a_cfg->enableEmulation == TRUE )
   1114                 {
   1115                     status = phHciNfc_CE_A_Initialise( psHciContext, pHwRef);
   1116                 }
   1117                 else
   1118                 {
   1119                     status = phHciNfc_CE_A_Release( psHciContext, pHwRef);
   1120                 }
   1121                 break;
   1122             }
   1123             case NFC_CE_B_CFG:
   1124             {
   1125                 phHal_sHostEmuCfg_B_t *host_ce_b_cfg =
   1126                         &p_emulation_cfg->config.hostEmuCfg_B;
   1127                 if(host_ce_b_cfg->enableEmulation == TRUE )
   1128                 {
   1129                     status = phHciNfc_CE_B_Initialise( psHciContext, pHwRef);
   1130                 }
   1131                 else
   1132                 {
   1133                     status = phHciNfc_CE_B_Release( psHciContext, pHwRef);
   1134                 }
   1135                 break;
   1136             }
   1137 #endif
   1138             /* case INVALID_CFG:
   1139             case POLL_LOOP_CFG: */
   1140             default:
   1141             {
   1142                 status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION);
   1143                 break;
   1144             }
   1145 
   1146         } /* End of the Configuration Switch */
   1147     }
   1148 
   1149     return status;
   1150 }
   1151 
   1152 
   1153 static
   1154 NFCSTATUS
   1155 phHciNfc_Recv_Uicc_Cmd (
   1156                         void                *psContext,
   1157                         void                *pHwRef,
   1158                         uint8_t             *pCmd,
   1159 #ifdef ONE_BYTE_LEN
   1160                         uint8_t             length
   1161 #else
   1162                         uint16_t            length
   1163 #endif
   1164                      )
   1165 {
   1166     uint8_t                     pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
   1167     uint8_t                     cmd = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;
   1168     uint8_t                     response = (uint8_t) ANY_OK;
   1169     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1170     phHciNfc_sContext_t         *psHciContext =
   1171                                     (phHciNfc_sContext_t *)psContext ;
   1172     phHciNfc_HCP_Packet_t       *hcp_packet = NULL;
   1173     phHciNfc_HCP_Message_t      *hcp_message = NULL;
   1174     phHciNfc_Pipe_Info_t            *p_pipe_info = NULL;
   1175     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info=NULL;
   1176 
   1177     if( (NULL == psHciContext)
   1178         || (NULL == pHwRef)
   1179         || (HCP_HEADER_LEN > length )
   1180       )
   1181     {
   1182       status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
   1183     }
   1184     else
   1185     {
   1186         hcp_packet = (phHciNfc_HCP_Packet_t *)pCmd;
   1187         hcp_message = &hcp_packet->msg.message;
   1188         p_emulation_mgmt_info = psHciContext->p_emulation_mgmt_info;
   1189 
   1190         /* Get the Command instruction bits from the Message Header */
   1191         cmd = (uint8_t) GET_BITS8( hcp_message->msg_header,
   1192             HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
   1193         pipe_id = p_emulation_mgmt_info->uicc_id;
   1194         p_pipe_info = psHciContext->p_pipe_list[pipe_id];
   1195 
   1196         switch( cmd )
   1197         {
   1198             /* These are Commands are sent from the UICC Controller */
   1199             case ANY_OPEN_PIPE:
   1200             {
   1201                 p_emulation_mgmt_info->uicc_enable = TRUE ;
   1202                 break;
   1203             }
   1204             case ANY_CLOSE_PIPE:
   1205             {
   1206                 if(TRUE != p_emulation_mgmt_info->uicc_enable)
   1207                 {
   1208                     response = ANY_E_PIPE_NOT_OPENED;
   1209                     /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FAILED); */
   1210                 }
   1211                 else
   1212                 {
   1213                     p_emulation_mgmt_info->uicc_enable = FALSE;
   1214                 }
   1215                 break;
   1216             }
   1217             case ANY_SET_PARAMETER:
   1218             case ANY_GET_PARAMETER:
   1219             case PRO_HOST_REQUEST:
   1220             {
   1221                 response = ANY_E_CMD_NOT_SUPPORTED;
   1222                 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_COMMAND_NOT_SUPPORTED);*/
   1223                 break;
   1224             }
   1225             default:
   1226             {
   1227                 response = ANY_E_NOK;
   1228                 /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_COMMAND); */
   1229                 break;
   1230             }
   1231         }
   1232         hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer;
   1233         phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT,
   1234                                 pipe_id, HCP_MSG_TYPE_RESPONSE, response );
   1235         psHciContext->tx_total = HCP_HEADER_LEN;
   1236         status = phHciNfc_Send_HCP( (void *)psHciContext, (void *)pHwRef );
   1237 
   1238         p_pipe_info->recv_msg_type = HCP_MSG_TYPE_COMMAND;
   1239         p_pipe_info->sent_msg_type = HCP_MSG_TYPE_RESPONSE;
   1240         p_pipe_info->prev_msg = response ;
   1241         p_pipe_info->prev_status = status;
   1242         status = NFCSTATUS_SUCCESS;
   1243 
   1244     }
   1245     return status;
   1246 }
   1247 
   1248 static
   1249 NFCSTATUS
   1250 phHciNfc_Recv_Uicc_Event (
   1251                         void                *psContext,
   1252                         void                *pHwRef,
   1253                         uint8_t             *pEvent,
   1254 #ifdef ONE_BYTE_LEN
   1255                         uint8_t             length
   1256 #else
   1257                         uint16_t            length
   1258 #endif
   1259                      )
   1260 {
   1261     uint8_t                     event = (uint8_t) HCP_MSG_INSTRUCTION_INVALID;
   1262     uint32_t                     i = 0;
   1263     NFCSTATUS                   status = NFCSTATUS_SUCCESS;
   1264     phHciNfc_sContext_t         *psHciContext =
   1265                                     (phHciNfc_sContext_t *)psContext ;
   1266     phHciNfc_HCP_Packet_t           *hcp_packet = NULL;
   1267     phHciNfc_HCP_Message_t          *hcp_message = NULL;
   1268     phHal_sEventInfo_t              event_info;
   1269     phHciNfc_EmulationMgmt_Info_t   *p_emulation_mgmt_info =
   1270                                         psHciContext->p_emulation_mgmt_info ;
   1271 
   1272 
   1273     if( (NULL == p_emulation_mgmt_info)
   1274          || ( TRUE !=  p_emulation_mgmt_info->uicc_enable)
   1275        )
   1276     {
   1277         status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
   1278     }
   1279     else
   1280     {
   1281         hcp_packet = (phHciNfc_HCP_Packet_t *)pEvent;
   1282         hcp_message = &hcp_packet->msg.message;
   1283 
   1284         /* Get the Event instruction bits from the Message Header */
   1285         event = (uint8_t) GET_BITS8( hcp_message->msg_header,
   1286             HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
   1287         event_info.eventHost = phHal_eUICCHost ;
   1288         event_info.eventSource = phHal_ePICC_DevType ;
   1289 
   1290         switch( event )
   1291         {
   1292             case EVT_END_OF_TRANSACTION:
   1293             {
   1294                 event_info.eventType = NFC_EVT_END_OF_TRANSACTION;
   1295                 break;
   1296             }
   1297             case EVT_TRANSACTION:
   1298             {
   1299                if(length > HCP_HEADER_LEN + TRANSACTION_MIN_LEN)
   1300                {
   1301                     event_info.eventType = NFC_EVT_TRANSACTION;
   1302 
   1303                     for(;i<(length-HCP_HEADER_LEN);)
   1304                     {
   1305                         switch (hcp_message->payload[i])
   1306                         {
   1307                             case TRANSACTION_AID:
   1308                             {
   1309                                 /* AID LENGTH INDEX */
   1310                                 i++;
   1311                                 /* Fill the event_info.eventInfo.aid
   1312                                 * Structure with the Received Transaction AID.
   1313                                 */
   1314                                 event_info.eventInfo.aid.length =
   1315                                                             hcp_message->payload[i++];
   1316                                 (void) memcpy((void *)p_emulation_mgmt_info->uicc_aid,
   1317                                         &(hcp_message->payload[i]),
   1318                                                 event_info.eventInfo.aid.length );
   1319                                 event_info.eventInfo.aid.buffer = (uint8_t *)
   1320                                                 p_emulation_mgmt_info->uicc_aid;
   1321                                 i = i + event_info.eventInfo.aid.length;
   1322                                 break;
   1323                             }
   1324                             case TRANSACTION_PARAM:
   1325                             {
   1326                                 /* Parameter Length Index */
   1327                                 i++;
   1328                                 /* Fill the event_info.eventInfo.param
   1329                                 * Structure with the Received Parameter.
   1330                                 */
   1331                                 p_emulation_mgmt_info->uicc_param_len =
   1332                                                             hcp_message->payload[i++];
   1333                                 (void) memcpy((void *)p_emulation_mgmt_info->uicc_param,
   1334                                         &(hcp_message->payload[i]),
   1335                                                 p_emulation_mgmt_info->uicc_param_len );
   1336                                 event_info.eventInfo.uicc_info.param.length =
   1337                                                 p_emulation_mgmt_info->uicc_param_len;
   1338                                 event_info.eventInfo.uicc_info.param.buffer = (uint8_t *)
   1339                                                 p_emulation_mgmt_info->uicc_param;
   1340                                 i = i + event_info.eventInfo.uicc_info.param.length;
   1341                                 break;
   1342                             }
   1343                             default:
   1344                             {
   1345 
   1346                                 status = PHNFCSTVAL( CID_NFC_HCI,
   1347                                                     NFCSTATUS_FEATURE_NOT_SUPPORTED );
   1348                                 i = length;
   1349                                 HCI_DEBUG("%s: Statement Should Not Occur \n",
   1350                                                         "phHciNfc_Recv_Uicc_Event");
   1351                                 break;
   1352                             }
   1353                         } /* End of Transaction Switch */
   1354                     }
   1355                }
   1356                break;
   1357             }
   1358             case EVT_CONNECTIVITY:
   1359             {
   1360                 event_info.eventType = NFC_EVT_CONNECTIVITY;
   1361                 break;
   1362             }
   1363             case EVT_OPERATION_ENDED:
   1364             {
   1365                 event_info.eventType = NFC_EVT_OPERATION_ENDED;
   1366                 break;
   1367             }
   1368             default:
   1369             {
   1370                 status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED );
   1371                 HCI_DEBUG("%s: Statement Should Not Occur \n","phHciNfc_Recv_Uicc_Event");
   1372                 break;
   1373             }
   1374         }
   1375         if ( NFCSTATUS_SUCCESS == status )
   1376         {
   1377             phHciNfc_Notify_Event( psHciContext, pHwRef,
   1378                     NFC_NOTIFY_EVENT, (void *)&event_info );
   1379         }
   1380     }
   1381     return status;
   1382 }
   1383 
   1384 
   1385