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