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