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