Home | History | Annotate | Download | only in hal
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  Vendor-specific handler for DM events
     22  *
     23  ******************************************************************************/
     24 #include "nfc_hal_int.h"
     25 #include "nfc_hal_post_reset.h"
     26 #include "userial.h"
     27 #include "upio.h"
     28 
     29 /*****************************************************************************
     30 ** Constants and types
     31 *****************************************************************************/
     32 
     33 #define NFC_HAL_I93_RW_CFG_LEN              (5)
     34 #define NFC_HAL_I93_RW_CFG_PARAM_LEN        (3)
     35 #define NFC_HAL_I93_AFI                     (0)
     36 #define NFC_HAL_I93_ENABLE_SMART_POLL       (1)
     37 
     38 static UINT8 nfc_hal_dm_i93_rw_cfg[NFC_HAL_I93_RW_CFG_LEN] =
     39 {
     40     NCI_PARAM_ID_I93_DATARATE,
     41     NFC_HAL_I93_RW_CFG_PARAM_LEN,
     42     NFC_HAL_I93_FLAG_DATA_RATE,    /* Bit0:Sub carrier, Bit1:Data rate, Bit4:Enable/Disable AFI */
     43     NFC_HAL_I93_AFI,               /* AFI if Bit 4 is set in the flag byte */
     44     NFC_HAL_I93_ENABLE_SMART_POLL  /* Bit0:Enable/Disable smart poll */
     45 };
     46 
     47 static UINT8 nfc_hal_dm_set_fw_fsm_cmd[NCI_MSG_HDR_SIZE + 1] =
     48 {
     49     NCI_MTS_CMD|NCI_GID_PROP,
     50     NCI_MSG_SET_FWFSM,
     51     0x01,
     52     0x00,
     53 };
     54 #define NCI_SET_FWFSM_OFFSET_ENABLE      3
     55 
     56 const UINT8 nfc_hal_dm_core_reset_cmd[NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET] =
     57 {
     58     NCI_MTS_CMD|NCI_GID_CORE,
     59     NCI_MSG_CORE_RESET,
     60     NCI_CORE_PARAM_SIZE_RESET,
     61     NCI_RESET_TYPE_RESET_CFG
     62 };
     63 
     64 #define NCI_PROP_PARAM_SIZE_XTAL_INDEX      3       /* length of parameters in XTAL_INDEX CMD */
     65 
     66 const UINT8 nfc_hal_dm_get_build_info_cmd[NCI_MSG_HDR_SIZE] =
     67 {
     68     NCI_MTS_CMD|NCI_GID_PROP,
     69     NCI_MSG_GET_BUILD_INFO,
     70     0x00
     71 };
     72 #define NCI_BUILD_INFO_OFFSET_HWID  25  /* HW ID offset in build info RSP */
     73 
     74 const UINT8 nfc_hal_dm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] =
     75 {
     76     NCI_MTS_CMD|NCI_GID_PROP,
     77     NCI_MSG_GET_PATCH_VERSION,
     78     0x00
     79 };
     80 #define NCI_PATCH_INFO_OFFSET_NVMTYPE  35  /* NVM Type offset in patch info RSP */
     81 
     82 /*****************************************************************************
     83 ** Extern function prototypes
     84 *****************************************************************************/
     85 extern UINT8 *p_nfc_hal_dm_lptd_cfg;
     86 extern UINT8 *p_nfc_hal_dm_pll_325_cfg;
     87 extern UINT8 *p_nfc_hal_dm_start_up_cfg;
     88 extern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg;
     89 
     90 /*****************************************************************************
     91 ** Local function prototypes
     92 *****************************************************************************/
     93 
     94 /*******************************************************************************
     95 **
     96 ** Function         nfc_hal_dm_set_config
     97 **
     98 ** Description      Send NCI config items to NFCC
     99 **
    100 ** Returns          tHAL_NFC_STATUS
    101 **
    102 *******************************************************************************/
    103 tHAL_NFC_STATUS nfc_hal_dm_set_config (UINT8 tlv_size,
    104                                        UINT8 *p_param_tlvs,
    105                                        tNFC_HAL_NCI_CBACK *p_cback)
    106 {
    107     UINT8  *p_buff, *p;
    108     UINT8  num_param = 0, param_len, rem_len, *p_tlv;
    109     UINT16 cmd_len = NCI_MSG_HDR_SIZE + tlv_size + 1;
    110     tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED;
    111 
    112     if ((tlv_size == 0)||(p_param_tlvs == NULL))
    113     {
    114         return status;
    115     }
    116 
    117     if ((p_buff = (UINT8 *) GKI_getbuf ((UINT16)(NCI_MSG_HDR_SIZE + tlv_size))) != NULL)
    118     {
    119         p = p_buff;
    120 
    121         NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_CORE);
    122         NCI_MSG_BLD_HDR1 (p, NCI_MSG_CORE_SET_CONFIG);
    123         UINT8_TO_STREAM  (p, (UINT8) (tlv_size + 1));
    124 
    125         rem_len = tlv_size;
    126         p_tlv   = p_param_tlvs;
    127         while (rem_len > 1)
    128         {
    129             num_param++;                /* number of params */
    130 
    131             p_tlv ++;                   /* param type   */
    132             param_len = *p_tlv++;       /* param length */
    133 
    134             rem_len -= 2;               /* param type and length */
    135             if (rem_len >= param_len)
    136             {
    137                 rem_len -= param_len;
    138                 p_tlv   += param_len;   /* next param_type */
    139 
    140                 if (rem_len == 0)
    141                 {
    142                     status = HAL_NFC_STATUS_OK;
    143                     break;
    144                 }
    145             }
    146             else
    147             {
    148                 /* error found */
    149                 break;
    150             }
    151         }
    152 
    153         if (status == HAL_NFC_STATUS_OK)
    154         {
    155             UINT8_TO_STREAM (p, num_param);
    156             ARRAY_TO_STREAM (p, p_param_tlvs, tlv_size);
    157 
    158             nfc_hal_dm_send_nci_cmd (p_buff, cmd_len, p_cback);
    159         }
    160         else
    161         {
    162             NCI_TRACE_ERROR0 ("nfc_hal_dm_set_config ():Bad TLV");
    163         }
    164 
    165         GKI_freebuf (p_buff);
    166     }
    167 
    168     return status;
    169 }
    170 
    171 /*******************************************************************************
    172 **
    173 ** Function         nfc_hal_dm_get_xtal_index
    174 **
    175 ** Description      Convert xtal frequency to index
    176 **
    177 ** Returns          xtal index
    178 **
    179 *******************************************************************************/
    180 static tNFC_HAL_XTAL_INDEX nfc_hal_dm_get_xtal_index (UINT16 xtal_freq)
    181 {
    182     tNFC_HAL_XTAL_INDEX xtal_index;
    183 
    184     switch (xtal_freq)
    185     {
    186     case  9600: xtal_index = NFC_HAL_XTAL_INDEX_9600;  break;
    187     case 13000: xtal_index = NFC_HAL_XTAL_INDEX_13000; break;
    188     case 16200: xtal_index = NFC_HAL_XTAL_INDEX_16200; break;
    189     case 19200: xtal_index = NFC_HAL_XTAL_INDEX_19200; break;
    190     case 24000: xtal_index = NFC_HAL_XTAL_INDEX_24000; break;
    191     case 26000: xtal_index = NFC_HAL_XTAL_INDEX_26000; break;
    192     case 38400: xtal_index = NFC_HAL_XTAL_INDEX_38400; break;
    193     case 52000: xtal_index = NFC_HAL_XTAL_INDEX_52000; break;
    194     case 37400: xtal_index = NFC_HAL_XTAL_INDEX_37400; break;
    195     default :   xtal_index = NFC_HAL_XTAL_INDEX_MAX;
    196                 NCI_TRACE_DEBUG1 ("nfc_hal_dm_get_xtal_index ():No matched index for %d", xtal_freq);
    197                 break;
    198     }
    199 
    200     return xtal_index;
    201 }
    202 
    203 /*******************************************************************************
    204 **
    205 ** Function         nfc_hal_dm_set_fw_fsm
    206 **
    207 ** Description      Enable or disable FW FSM
    208 **
    209 ** Returns          void
    210 **
    211 *******************************************************************************/
    212 void nfc_hal_dm_set_fw_fsm (BOOLEAN enable, tNFC_HAL_NCI_CBACK *p_cback)
    213 {
    214     if (enable)
    215         nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x01; /* Enable, default is disabled */
    216     else
    217         nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x00; /* Disable */
    218 
    219     nfc_hal_dm_send_nci_cmd (nfc_hal_dm_set_fw_fsm_cmd, NCI_MSG_HDR_SIZE + 1, p_cback);
    220 }
    221 
    222 /*******************************************************************************
    223 **
    224 ** Function         nfc_hal_dm_config_nfcc_cback
    225 **
    226 ** Description      Callback for NCI vendor specific command complete
    227 **
    228 ** Returns          void
    229 **
    230 *******************************************************************************/
    231 void nfc_hal_dm_config_nfcc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data)
    232 {
    233     if (nfc_hal_cb.dev_cb.next_dm_config == NFC_HAL_DM_CONFIG_NONE)
    234     {
    235         nfc_hal_hci_enable ();
    236     }
    237     else
    238     {
    239         nfc_hal_dm_config_nfcc ();
    240     }
    241 }
    242 
    243 /*******************************************************************************
    244 **
    245 ** Function         nfc_hal_dm_send_startup_vsc
    246 **
    247 ** Description      Send VS command before NFA start-up
    248 **
    249 ** Returns          None
    250 **
    251 *******************************************************************************/
    252 void nfc_hal_dm_send_startup_vsc (void)
    253 {
    254     UINT8  *p, *p_end;
    255     UINT16 len;
    256 
    257     NCI_TRACE_DEBUG0 ("nfc_hal_dm_send_startup_vsc ()");
    258 
    259     /* VSC must have NCI header at least */
    260     if (nfc_hal_cb.dev_cb.next_startup_vsc + NCI_MSG_HDR_SIZE - 1 <= *p_nfc_hal_dm_start_up_vsc_cfg)
    261     {
    262         p     = p_nfc_hal_dm_start_up_vsc_cfg + nfc_hal_cb.dev_cb.next_startup_vsc;
    263         len   = *(p + 2);
    264         p_end = p + NCI_MSG_HDR_SIZE - 1 + len;
    265 
    266         if (p_end <= p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg)
    267         {
    268             /* move to next VSC */
    269             nfc_hal_cb.dev_cb.next_startup_vsc += NCI_MSG_HDR_SIZE + len;
    270 
    271             /* if this is last VSC */
    272             if (p_end == p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg)
    273                 nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE;
    274 
    275             nfc_hal_dm_send_nci_cmd (p, (UINT16)(NCI_MSG_HDR_SIZE + len), nfc_hal_dm_config_nfcc_cback);
    276             return;
    277         }
    278     }
    279 
    280     NCI_TRACE_ERROR0 ("nfc_hal_dm_send_startup_vsc (): Bad start-up VSC");
    281 
    282     NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
    283     nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
    284 }
    285 
    286 /*******************************************************************************
    287 **
    288 ** Function         nfc_hal_dm_config_nfcc
    289 **
    290 ** Description      Send VS config before NFA start-up
    291 **
    292 ** Returns          void
    293 **
    294 *******************************************************************************/
    295 void nfc_hal_dm_config_nfcc (void)
    296 {
    297     UINT8   *p;
    298     UINT8   xtal_index;
    299 
    300     NCI_TRACE_DEBUG1 ("nfc_hal_dm_config_nfcc (): next_dm_config = %d", nfc_hal_cb.dev_cb.next_dm_config);
    301 
    302     if ((p_nfc_hal_dm_lptd_cfg[0]) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_LPTD))
    303     {
    304         nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_PLL_325;
    305 
    306         if (nfc_hal_dm_set_config (p_nfc_hal_dm_lptd_cfg[0],
    307                                    &p_nfc_hal_dm_lptd_cfg[1],
    308                                    nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
    309         {
    310             return;
    311         }
    312         else
    313         {
    314             NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
    315             nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
    316             return;
    317         }
    318     }
    319 
    320     if ((p_nfc_hal_dm_pll_325_cfg) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_PLL_325))
    321     {
    322         xtal_index = nfc_hal_dm_get_xtal_index (nfc_post_reset_cb.dev_init_config.xtal_freq);
    323         if (xtal_index < NFC_HAL_XTAL_INDEX_MAX)
    324         {
    325             nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP;
    326             p = p_nfc_hal_dm_pll_325_cfg + (xtal_index * NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN);
    327             if (nfc_hal_dm_set_config (NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN,
    328                                        p,
    329                                        nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
    330             {
    331                 return;
    332             }
    333             else
    334             {
    335                 NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
    336                 nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
    337                 return;
    338             }
    339         }
    340     }
    341 
    342     if ((p_nfc_hal_dm_start_up_cfg[0]) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP))
    343     {
    344         nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_I93_DATA_RATE;
    345         if (nfc_hal_dm_set_config (p_nfc_hal_dm_start_up_cfg[0],
    346                                    &p_nfc_hal_dm_start_up_cfg[1],
    347                                    nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
    348         {
    349             return;
    350         }
    351         else
    352         {
    353             NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
    354             nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
    355             return;
    356         }
    357     }
    358 
    359 #if (NFC_HAL_I93_FLAG_DATA_RATE == NFC_HAL_I93_FLAG_DATA_RATE_HIGH)
    360     if (nfc_hal_cb.dev_cb.next_dm_config  <= NFC_HAL_DM_CONFIG_I93_DATA_RATE)
    361     {
    362         nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_FW_FSM;
    363         if (nfc_hal_dm_set_config (NFC_HAL_I93_RW_CFG_LEN,
    364                                    nfc_hal_dm_i93_rw_cfg,
    365                                    nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK)
    366         {
    367             return;
    368         }
    369         else
    370         {
    371             NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
    372             nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED);
    373             return;
    374         }
    375     }
    376 #endif
    377 
    378     /* FW FSM is disabled as default in NFCC */
    379     if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_FW_FSM)
    380     {
    381         nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP_VSC;
    382         nfc_hal_dm_set_fw_fsm (NFC_HAL_DM_MULTI_TECH_RESP, nfc_hal_dm_config_nfcc_cback);
    383         return;
    384     }
    385 
    386     if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP_VSC)
    387     {
    388         if (p_nfc_hal_dm_start_up_vsc_cfg && *p_nfc_hal_dm_start_up_vsc_cfg)
    389         {
    390             nfc_hal_dm_send_startup_vsc ();
    391             return;
    392         }
    393     }
    394 
    395     /* nothing to config */
    396     nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE;
    397     nfc_hal_dm_config_nfcc_cback (0, 0, NULL);
    398 }
    399 
    400 /*******************************************************************************
    401 **
    402 ** Function         nfc_hal_dm_set_xtal_freq_index
    403 **
    404 ** Description      Set crystal frequency index
    405 **
    406 ** Returns          void
    407 **
    408 *******************************************************************************/
    409 void nfc_hal_dm_set_xtal_freq_index (void)
    410 {
    411     UINT8 nci_brcm_xtal_index_cmd[NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_SIZE_XTAL_INDEX];
    412     UINT8 *p;
    413     tNFC_HAL_XTAL_INDEX xtal_index;
    414 
    415     NCI_TRACE_DEBUG1 ("nfc_hal_dm_set_xtal_freq_index (): xtal_freq = %d", nfc_post_reset_cb.dev_init_config.xtal_freq);
    416 
    417     xtal_index = nfc_hal_dm_get_xtal_index (nfc_post_reset_cb.dev_init_config.xtal_freq);
    418 
    419     switch (xtal_index)
    420     {
    421     case NFC_HAL_XTAL_INDEX_9600:
    422     case NFC_HAL_XTAL_INDEX_13000:
    423     case NFC_HAL_XTAL_INDEX_19200:
    424     case NFC_HAL_XTAL_INDEX_26000:
    425     case NFC_HAL_XTAL_INDEX_38400:
    426     case NFC_HAL_XTAL_INDEX_52000:
    427 
    428         {
    429             /* no need to set xtal index for these frequency */
    430             NCI_TRACE_DEBUG0 ("nfc_hal_dm_set_xtal_freq_index (): no need to set xtal index");
    431 
    432             nfc_post_reset_cb.dev_init_config.flags &= ~NFC_HAL_DEV_INIT_FLAGS_SET_XTAL_FREQ;
    433             nfc_hal_dm_send_reset_cmd ();
    434             return;
    435         }
    436         break;
    437     }
    438 
    439     p = nci_brcm_xtal_index_cmd;
    440     UINT8_TO_STREAM  (p, (NCI_MTS_CMD|NCI_GID_PROP));
    441     UINT8_TO_STREAM  (p, NCI_MSG_GET_XTAL_INDEX_FROM_DH);
    442     UINT8_TO_STREAM  (p, NCI_PROP_PARAM_SIZE_XTAL_INDEX);
    443     UINT8_TO_STREAM  (p, xtal_index);
    444     UINT16_TO_STREAM (p, nfc_post_reset_cb.dev_init_config.xtal_freq);
    445 
    446     NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_XTAL_SET);
    447 
    448     nfc_hal_dm_send_nci_cmd (nci_brcm_xtal_index_cmd, NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_SIZE_XTAL_INDEX, NULL);
    449 }
    450 
    451 /*******************************************************************************
    452 **
    453 ** Function         nfc_hal_dm_send_reset_cmd
    454 **
    455 ** Description      Send CORE RESET CMD
    456 **
    457 ** Returns          void
    458 **
    459 *******************************************************************************/
    460 void nfc_hal_dm_send_reset_cmd (void)
    461 {
    462     /* Proceed with start up sequence: send CORE_RESET_CMD */
    463     NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_RESET);
    464 
    465     nfc_hal_dm_send_nci_cmd (nfc_hal_dm_core_reset_cmd, NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET, NULL);
    466 }
    467 
    468 /*******************************************************************************
    469 **
    470 ** Function         nfc_hal_dm_proc_msg_during_init
    471 **
    472 ** Description      Process NCI message while initializing NFCC
    473 **
    474 ** Returns          void
    475 **
    476 *******************************************************************************/
    477 void nfc_hal_dm_proc_msg_during_init (NFC_HDR *p_msg)
    478 {
    479     UINT8 *p;
    480     UINT8 reset_reason, reset_type;
    481     UINT8 mt, pbf, gid, op_code;
    482     UINT8 *p_old, old_gid, old_oid, old_mt;
    483     tNFC_HAL_NCI_CBACK *p_cback = NULL;
    484 
    485     NCI_TRACE_DEBUG1 ("nfc_hal_dm_proc_msg_during_init(): init state:%d", nfc_hal_cb.dev_cb.initializing_state);
    486 
    487     p = (UINT8 *) (p_msg + 1) + p_msg->offset;
    488 
    489     NCI_MSG_PRS_HDR0 (p, mt, pbf, gid);
    490     NCI_MSG_PRS_HDR1 (p, op_code);
    491 
    492     /* check if waiting for this response */
    493     if (  (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_CMD)
    494         ||(nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_VSC)  )
    495     {
    496         if (mt == NCI_MT_RSP)
    497         {
    498             p_old = nfc_hal_cb.ncit_cb.last_hdr;
    499             NCI_MSG_PRS_HDR0 (p_old, old_mt, pbf, old_gid);
    500             old_oid = ((*p_old) & NCI_OID_MASK);
    501             /* make sure this is the RSP we are waiting for before updating the command window */
    502             if ((old_gid == gid) && (old_oid == op_code))
    503             {
    504                 nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
    505                 p_cback = (tNFC_HAL_NCI_CBACK *)nfc_hal_cb.ncit_cb.p_vsc_cback;
    506                 nfc_hal_cb.ncit_cb.p_vsc_cback  = NULL;
    507                 nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
    508             }
    509         }
    510     }
    511 
    512     if (gid == NCI_GID_CORE)
    513     {
    514         if (op_code == NCI_MSG_CORE_RESET)
    515         {
    516             if (mt == NCI_MT_RSP)
    517             {
    518                 if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_RE_INIT)
    519                 {
    520                     NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_APP_COMPLETE);
    521                     nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, nfc_hal_cb.p_reinit_cback);
    522                 }
    523                 else
    524                 {
    525                     NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_BUILD_INFO);
    526 
    527                     /* get build information to find out HW */
    528                     nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_build_info_cmd, NCI_MSG_HDR_SIZE, NULL);
    529                 }
    530             }
    531             else
    532             {
    533                 /* Call reset notification callback */
    534                 p++;                                /* Skip over param len */
    535                 STREAM_TO_UINT8 (reset_reason, p);
    536                 STREAM_TO_UINT8 (reset_type, p);
    537                 nfc_hal_prm_spd_reset_ntf (reset_reason, reset_type);
    538             }
    539         }
    540         else if (p_cback)
    541         {
    542             (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code),
    543                         p_msg->len,
    544                         (UINT8 *) (p_msg + 1) + p_msg->offset);
    545         }
    546     }
    547     else if (gid == NCI_GID_PROP) /* this is for download patch */
    548     {
    549         if (mt == NCI_MT_NTF)
    550             op_code |= NCI_NTF_BIT;
    551         else
    552             op_code |= NCI_RSP_BIT;
    553 
    554         if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_XTAL_SET)
    555         {
    556             if (op_code == (NCI_RSP_BIT|NCI_MSG_GET_XTAL_INDEX_FROM_DH))
    557             {
    558                 /* wait for crystal setting in NFCC */
    559                 GKI_delay (100);
    560 
    561                 /* Crytal frequency configured. Proceed with start up sequence: send CORE_RESET_CMD */
    562                 nfc_hal_dm_send_reset_cmd ();
    563             }
    564         }
    565         else if (  (op_code == NFC_VS_GET_BUILD_INFO_EVT)
    566                  &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_BUILD_INFO)  )
    567         {
    568             p += NCI_BUILD_INFO_OFFSET_HWID;
    569 
    570             STREAM_TO_UINT32 (nfc_hal_cb.dev_cb.brcm_hw_id, p);
    571 
    572             NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_PATCH_INFO);
    573 
    574             nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, NULL);
    575         }
    576         else if (  (op_code == NFC_VS_GET_PATCH_VERSION_EVT)
    577                  &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_PATCH_INFO)  )
    578         {
    579             p += NCI_PATCH_INFO_OFFSET_NVMTYPE;
    580 
    581             NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_APP_COMPLETE);
    582 
    583             /* let platform update baudrate or download patch */
    584             nfc_hal_post_reset_init (nfc_hal_cb.dev_cb.brcm_hw_id, *p);
    585         }
    586         else if (p_cback)
    587         {
    588             (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code),
    589                         p_msg->len,
    590                         (UINT8 *) (p_msg + 1) + p_msg->offset);
    591         }
    592         else if (op_code == NFC_VS_SEC_PATCH_AUTH_EVT)
    593         {
    594             NCI_TRACE_DEBUG0 ("signature!!");
    595             nfc_hal_prm_nci_command_complete_cback ((tNFC_HAL_NCI_EVT) (op_code),
    596                                                     p_msg->len,
    597                                                     (UINT8 *) (p_msg + 1) + p_msg->offset);
    598         }
    599     }
    600 }
    601 
    602 /*******************************************************************************
    603 **
    604 ** Function         nfc_hal_dm_send_nci_cmd
    605 **
    606 ** Description      Send NCI command to NFCC while initializing BRCM NFCC
    607 **
    608 ** Returns          void
    609 **
    610 *******************************************************************************/
    611 void nfc_hal_dm_send_nci_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_NCI_CBACK *p_cback)
    612 {
    613     NFC_HDR *p_buf;
    614     UINT8  *ps;
    615 
    616     NCI_TRACE_DEBUG1 ("nfc_hal_dm_send_nci_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp);
    617 
    618     if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE)
    619     {
    620         NCI_TRACE_ERROR0 ("nfc_hal_dm_send_nci_cmd(): no command window");
    621         return;
    622     }
    623 
    624     if ((p_buf = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
    625     {
    626         nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_VSC;
    627 
    628         p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
    629         p_buf->event  = NFC_HAL_EVT_TO_NFC_NCI;
    630         p_buf->len    = len;
    631 
    632         memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len);
    633 
    634         /* Keep a copy of the command and send to NCI transport */
    635 
    636         /* save the message header to double check the response */
    637         ps   = (UINT8 *)(p_buf + 1) + p_buf->offset;
    638         memcpy(nfc_hal_cb.ncit_cb.last_hdr, ps, NFC_HAL_SAVED_HDR_SIZE);
    639         memcpy(nfc_hal_cb.ncit_cb.last_cmd, ps + NCI_MSG_HDR_SIZE, NFC_HAL_SAVED_CMD_SIZE);
    640 
    641         /* save the callback for NCI VSCs */
    642         nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback;
    643 
    644         nfc_hal_nci_send_cmd (p_buf);
    645 
    646         /* start NFC command-timeout timer */
    647         nfc_hal_main_start_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer, (UINT16)(NFC_HAL_TTYPE_NCI_WAIT_RSP),
    648                                         ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
    649     }
    650 }
    651 
    652 /*******************************************************************************
    653 **
    654 ** Function         nfc_hal_dm_send_pend_cmd
    655 **
    656 ** Description      Send a command to NFCC
    657 **
    658 ** Returns          void
    659 **
    660 *******************************************************************************/
    661 void nfc_hal_dm_send_pend_cmd (void)
    662 {
    663     NFC_HDR *p_buf = nfc_hal_cb.ncit_cb.p_pend_cmd;
    664     UINT8  *p;
    665 
    666     if (p_buf == NULL)
    667         return;
    668 
    669     /* check low power mode state */
    670     if (!nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT))
    671     {
    672         return;
    673     }
    674 
    675     if (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_PROP)
    676     {
    677 #if (NFC_HAL_TRACE_PROTOCOL == TRUE)
    678         DispHciCmd (p_buf);
    679 #endif
    680 
    681         /* save the message header to double check the response */
    682         p = (UINT8 *)(p_buf + 1) + p_buf->offset;
    683         memcpy(nfc_hal_cb.ncit_cb.last_hdr, p, NFC_HAL_SAVED_HDR_SIZE);
    684 
    685         /* add packet type for BT message */
    686         p_buf->offset--;
    687         p_buf->len++;
    688 
    689         p  = (UINT8 *) (p_buf + 1) + p_buf->offset;
    690         *p = HCIT_TYPE_COMMAND;
    691 
    692         USERIAL_Write (USERIAL_NFC_PORT, p, p_buf->len);
    693 
    694         GKI_freebuf (p_buf);
    695         nfc_hal_cb.ncit_cb.p_pend_cmd = NULL;
    696 
    697         /* start NFC command-timeout timer */
    698         nfc_hal_main_start_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer, (UINT16)(NFC_HAL_TTYPE_NCI_WAIT_RSP),
    699                                         ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
    700 
    701     }
    702 }
    703 
    704 /*******************************************************************************
    705 **
    706 ** Function         nfc_hal_dm_send_bt_cmd
    707 **
    708 ** Description      Send BT message to NFCC while initializing BRCM NFCC
    709 **
    710 ** Returns          void
    711 **
    712 *******************************************************************************/
    713 void nfc_hal_dm_send_bt_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_BTVSC_CPLT_CBACK *p_cback)
    714 {
    715     NFC_HDR *p_buf;
    716 
    717     NCI_TRACE_DEBUG1 ("nfc_hal_dm_send_bt_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp);
    718 
    719     if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE)
    720     {
    721         NCI_TRACE_ERROR0 ("nfc_hal_dm_send_bt_cmd(): no command window");
    722         return;
    723     }
    724 
    725     if ((p_buf = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
    726     {
    727         nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_PROP;
    728 
    729         p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE;
    730         p_buf->len    = len;
    731 
    732         memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len);
    733 
    734         /* save the callback for NCI VSCs)  */
    735         nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback;
    736 
    737         nfc_hal_cb.ncit_cb.p_pend_cmd = p_buf;
    738         if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_IDLE)
    739         {
    740             NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_CONTROL_DONE);
    741             nfc_hal_cb.p_stack_cback (HAL_NFC_REQUEST_CONTROL_EVT, HAL_NFC_STATUS_OK);
    742             return;
    743         }
    744 
    745         nfc_hal_dm_send_pend_cmd();
    746     }
    747 }
    748 
    749 /*******************************************************************************
    750 **
    751 ** Function         nfc_hal_dm_set_nfc_wake
    752 **
    753 ** Description      Set NFC_WAKE line
    754 **
    755 ** Returns          void
    756 **
    757 *******************************************************************************/
    758 void nfc_hal_dm_set_nfc_wake (UINT8 cmd)
    759 {
    760     NCI_TRACE_DEBUG1 ("nfc_hal_dm_set_nfc_wake () %s",
    761                       (cmd == NFC_HAL_ASSERT_NFC_WAKE ? "ASSERT" : "DEASSERT"));
    762 
    763     /*
    764     **  nfc_wake_active_mode             cmd              result of voltage on NFC_WAKE
    765     **
    766     **  NFC_HAL_LP_ACTIVE_LOW (0)    NFC_HAL_ASSERT_NFC_WAKE (0)    pull down NFC_WAKE (GND)
    767     **  NFC_HAL_LP_ACTIVE_LOW (0)    NFC_HAL_DEASSERT_NFC_WAKE (1)  pull up NFC_WAKE (VCC)
    768     **  NFC_HAL_LP_ACTIVE_HIGH (1)   NFC_HAL_ASSERT_NFC_WAKE (0)    pull up NFC_WAKE (VCC)
    769     **  NFC_HAL_LP_ACTIVE_HIGH (1)   NFC_HAL_DEASSERT_NFC_WAKE (1)  pull down NFC_WAKE (GND)
    770     */
    771 
    772     if (cmd == nfc_hal_cb.dev_cb.nfc_wake_active_mode)
    773         UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_OFF); /* pull down NFC_WAKE */
    774     else
    775         UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_ON);  /* pull up NFC_WAKE */
    776 }
    777 
    778 /*******************************************************************************
    779 **
    780 ** Function         nfc_hal_dm_power_mode_execute
    781 **
    782 ** Description      If snooze mode is enabled in full power mode,
    783 **                     Assert NFC_WAKE before sending data
    784 **                     Deassert NFC_WAKE when idle timer expires
    785 **
    786 ** Returns          TRUE if DH can send data to NFCC
    787 **
    788 *******************************************************************************/
    789 BOOLEAN nfc_hal_dm_power_mode_execute (tNFC_HAL_LP_EVT event)
    790 {
    791     BOOLEAN send_to_nfcc = FALSE;
    792 
    793     NCI_TRACE_DEBUG1 ("nfc_hal_dm_power_mode_execute () event = %d", event);
    794 
    795     if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL)
    796     {
    797         if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)
    798         {
    799             /* if any transport activity */
    800             if (  (event == NFC_HAL_LP_TX_DATA_EVT)
    801                 ||(event == NFC_HAL_LP_RX_DATA_EVT)  )
    802             {
    803                 /* if idle timer is not running */
    804                 if (nfc_hal_cb.dev_cb.lp_timer.in_use == FALSE)
    805                 {
    806                     nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE);
    807                 }
    808 
    809                 /* start or extend idle timer */
    810                 nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00,
    811                                                 ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
    812             }
    813             else if (event == NFC_HAL_LP_TIMEOUT_EVT)
    814             {
    815                 /* let NFCC go to snooze mode */
    816                 nfc_hal_dm_set_nfc_wake (NFC_HAL_DEASSERT_NFC_WAKE);
    817             }
    818         }
    819 
    820         send_to_nfcc = TRUE;
    821     }
    822 
    823     return (send_to_nfcc);
    824 }
    825 
    826 /*******************************************************************************
    827 **
    828 ** Function         nci_brcm_lp_timeout_cback
    829 **
    830 ** Description      callback function for low power timeout
    831 **
    832 ** Returns          void
    833 **
    834 *******************************************************************************/
    835 static void nci_brcm_lp_timeout_cback (void *p_tle)
    836 {
    837     NCI_TRACE_DEBUG0 ("nci_brcm_lp_timeout_cback ()");
    838 
    839     nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TIMEOUT_EVT);
    840 }
    841 
    842 /*******************************************************************************
    843 **
    844 ** Function         nfc_hal_dm_pre_init_nfcc
    845 **
    846 ** Description      This function initializes Broadcom specific control blocks for
    847 **                  NCI transport
    848 **
    849 ** Returns          void
    850 **
    851 *******************************************************************************/
    852 void nfc_hal_dm_pre_init_nfcc (void)
    853 {
    854     NCI_TRACE_DEBUG0 ("nfc_hal_dm_pre_init_nfcc ()");
    855 
    856     if (nfc_post_reset_cb.dev_init_config.flags & NFC_HAL_DEV_INIT_FLAGS_SET_XTAL_FREQ)
    857     {
    858         nfc_hal_dm_set_xtal_freq_index ();
    859     }
    860     else
    861     {
    862         /* Send RESET CMD if application registered callback for device initialization */
    863         nfc_hal_dm_send_reset_cmd ();
    864     }
    865 }
    866 
    867 /*******************************************************************************
    868 **
    869 ** Function         nfc_hal_dm_shutting_down_nfcc
    870 **
    871 ** Description      This function initializes Broadcom specific control blocks for
    872 **                  NCI transport
    873 **
    874 ** Returns          void
    875 **
    876 *******************************************************************************/
    877 void nfc_hal_dm_shutting_down_nfcc (void)
    878 {
    879     NCI_TRACE_DEBUG0 ("nfc_hal_dm_shutting_down_nfcc ()");
    880 
    881     nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_CLOSING;
    882 
    883     /* reset low power mode variables */
    884     if (  (nfc_hal_cb.dev_cb.power_mode  == NFC_HAL_POWER_MODE_FULL)
    885         &&(nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)  )
    886     {
    887         nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE);
    888     }
    889 
    890     nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE;
    891     nfc_hal_cb.hci_cb.b_check_clear_all_pipe_cmd = FALSE;
    892 
    893     nfc_hal_cb.dev_cb.power_mode  = NFC_HAL_POWER_MODE_FULL;
    894     nfc_hal_cb.dev_cb.snooze_mode = NFC_HAL_LP_SNOOZE_MODE_NONE;
    895 
    896     /* Stop all timers */
    897     nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
    898     nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer);
    899     nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer);
    900     nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer);
    901 }
    902 
    903 /*******************************************************************************
    904 **
    905 ** Function         nfc_hal_dm_init
    906 **
    907 ** Description      This function initializes Broadcom specific control blocks for
    908 **                  NCI transport
    909 **
    910 ** Returns          void
    911 **
    912 *******************************************************************************/
    913 void nfc_hal_dm_init (void)
    914 {
    915     NCI_TRACE_DEBUG0 ("nfc_hal_dm_init ()");
    916 
    917     nfc_hal_cb.dev_cb.lp_timer.p_cback = nci_brcm_lp_timeout_cback;
    918 
    919     nfc_hal_cb.ncit_cb.nci_wait_rsp_timer.p_cback = nfc_hal_nci_cmd_timeout_cback;
    920 
    921     nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback;
    922 
    923 }
    924 
    925 /*******************************************************************************
    926 **
    927 ** Function         HAL_NfcDevInitDone
    928 **
    929 ** Description      Notify that pre-initialization of NFCC is complete
    930 **
    931 ** Returns          void
    932 **
    933 *******************************************************************************/
    934 void HAL_NfcPreInitDone (tHAL_NFC_STATUS status)
    935 {
    936     NCI_TRACE_DEBUG1 ("HAL_NfcPreInitDone () status=%d", status);
    937 
    938     if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE)
    939     {
    940         NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE);
    941 
    942         nfc_hal_main_pre_init_done (status);
    943     }
    944 }
    945 
    946 /*******************************************************************************
    947 **
    948 ** Function         HAL_NfcReInit
    949 **
    950 ** Description      This function is called to send an RESET and GET_PATCH_VERSION
    951 **                  command to NFCC.
    952 **
    953 **                  p_cback         - The callback function to receive the command
    954 **                                    status
    955 **
    956 ** Note             This function should be called only during the HAL init process
    957 **
    958 ** Returns          HAL_NFC_STATUS_OK if successfully initiated
    959 **                  HAL_NFC_STATUS_FAILED otherwise
    960 **
    961 *******************************************************************************/
    962 tHAL_NFC_STATUS HAL_NfcReInit (tNFC_HAL_NCI_CBACK *p_cback)
    963 {
    964     tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED;
    965     NCI_TRACE_DEBUG1 ("HAL_NfcReInit () init st=0x%x", nfc_hal_cb.dev_cb.initializing_state);
    966     if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE)
    967     {
    968         /* Proceed with start up sequence: send CORE_RESET_CMD */
    969         NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_RE_INIT);
    970         nfc_hal_cb.p_reinit_cback = p_cback;
    971 
    972         nfc_hal_dm_send_nci_cmd (nfc_hal_dm_core_reset_cmd, NCI_MSG_HDR_SIZE + NCI_CORE_PARAM_SIZE_RESET, NULL);
    973         status = HAL_NFC_STATUS_OK;
    974     }
    975     return status;
    976 }
    977 
    978 /*******************************************************************************
    979 **
    980 ** Function         nfc_hal_dm_set_snooze_mode_cback
    981 **
    982 ** Description      This is baud rate update complete callback.
    983 **
    984 ** Returns          void
    985 **
    986 *******************************************************************************/
    987 static void nfc_hal_dm_set_snooze_mode_cback (tNFC_HAL_BTVSC_CPLT *pData)
    988 {
    989     UINT8             status = pData->p_param_buf[0];
    990     tHAL_NFC_STATUS   hal_status;
    991     tHAL_NFC_STATUS_CBACK *p_cback;
    992 
    993     /* if it is completed */
    994     if (status == HCI_SUCCESS)
    995     {
    996         /* update snooze mode */
    997         nfc_hal_cb.dev_cb.snooze_mode = nfc_hal_cb.dev_cb.new_snooze_mode;
    998 
    999         nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE);
   1000 
   1001         if ( nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE)
   1002         {
   1003             /* start idle timer */
   1004             nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00,
   1005                                             ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000);
   1006         }
   1007         else
   1008         {
   1009             nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer);
   1010         }
   1011         hal_status = HAL_NFC_STATUS_OK;
   1012     }
   1013     else
   1014     {
   1015         hal_status = HAL_NFC_STATUS_FAILED;
   1016     }
   1017 
   1018     if (nfc_hal_cb.dev_cb.p_prop_cback)
   1019     {
   1020         p_cback = nfc_hal_cb.dev_cb.p_prop_cback;
   1021         nfc_hal_cb.dev_cb.p_prop_cback = NULL;
   1022         (*p_cback) (hal_status);
   1023     }
   1024 }
   1025 
   1026 /*******************************************************************************
   1027 **
   1028 ** Function         HAL_NfcSetSnoozeMode
   1029 **
   1030 ** Description      Set snooze mode
   1031 **                  snooze_mode
   1032 **                      NFC_HAL_LP_SNOOZE_MODE_NONE - Snooze mode disabled
   1033 **                      NFC_HAL_LP_SNOOZE_MODE_UART - Snooze mode for UART
   1034 **                      NFC_HAL_LP_SNOOZE_MODE_SPI_I2C - Snooze mode for SPI/I2C
   1035 **
   1036 **                  idle_threshold_dh/idle_threshold_nfcc
   1037 **                      Idle Threshold Host in 100ms unit
   1038 **
   1039 **                  nfc_wake_active_mode/dh_wake_active_mode
   1040 **                      NFC_HAL_LP_ACTIVE_LOW - high to low voltage is asserting
   1041 **                      NFC_HAL_LP_ACTIVE_HIGH - low to high voltage is asserting
   1042 **
   1043 **                  p_snooze_cback
   1044 **                      Notify status of operation
   1045 **
   1046 ** Returns          tHAL_NFC_STATUS
   1047 **
   1048 *******************************************************************************/
   1049 tHAL_NFC_STATUS HAL_NfcSetSnoozeMode (UINT8 snooze_mode,
   1050                                       UINT8 idle_threshold_dh,
   1051                                       UINT8 idle_threshold_nfcc,
   1052                                       UINT8 nfc_wake_active_mode,
   1053                                       UINT8 dh_wake_active_mode,
   1054                                       tHAL_NFC_STATUS_CBACK *p_snooze_cback)
   1055 {
   1056     UINT8 cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH];
   1057     UINT8 *p;
   1058 
   1059     NCI_TRACE_API1 ("HAL_NfcSetSnoozeMode (): snooze_mode = %d", snooze_mode);
   1060 
   1061     nfc_hal_cb.dev_cb.new_snooze_mode      = snooze_mode;
   1062     nfc_hal_cb.dev_cb.nfc_wake_active_mode = nfc_wake_active_mode;
   1063     nfc_hal_cb.dev_cb.p_prop_cback         = p_snooze_cback;
   1064 
   1065     p = cmd;
   1066 
   1067     /* Add the HCI command */
   1068     UINT16_TO_STREAM (p, HCI_BRCM_WRITE_SLEEP_MODE);
   1069     UINT8_TO_STREAM  (p, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH);
   1070 
   1071     memset (p, 0x00, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH);
   1072 
   1073     UINT8_TO_STREAM  (p, snooze_mode);          /* Sleep Mode               */
   1074 
   1075     UINT8_TO_STREAM  (p, idle_threshold_dh);    /* Idle Threshold Host      */
   1076     UINT8_TO_STREAM  (p, idle_threshold_nfcc);  /* Idle Threshold HC        */
   1077     UINT8_TO_STREAM  (p, nfc_wake_active_mode); /* BT Wake Active Mode      */
   1078     UINT8_TO_STREAM  (p, dh_wake_active_mode);  /* Host Wake Active Mode    */
   1079 
   1080     nfc_hal_dm_send_bt_cmd (cmd,
   1081                             NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH,
   1082                             nfc_hal_dm_set_snooze_mode_cback);
   1083     return (NCI_STATUS_OK);
   1084 }
   1085 
   1086 
   1087 
   1088 
   1089 
   1090 
   1091 
   1092 
   1093