nfc_hal_dm.c revision df5080d7feca9827fd0306471c54f52ecf185c22
1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 35c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen * Copyright (C) 2012-2013 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Vendor-specific handler for DM events 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include <string.h> 26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h" 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_post_reset.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "userial.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "upio.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Constants and types 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_I93_RW_CFG_LEN (5) 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_I93_RW_CFG_PARAM_LEN (3) 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_I93_AFI (0) 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_I93_ENABLE_SMART_POLL (1) 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 nfc_hal_dm_i93_rw_cfg[NFC_HAL_I93_RW_CFG_LEN] = 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_PARAM_ID_I93_DATARATE, 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_I93_RW_CFG_PARAM_LEN, 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_I93_FLAG_DATA_RATE, /* Bit0:Sub carrier, Bit1:Data rate, Bit4:Enable/Disable AFI */ 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_I93_AFI, /* AFI if Bit 4 is set in the flag byte */ 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_I93_ENABLE_SMART_POLL /* Bit0:Enable/Disable smart poll */ 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic UINT8 nfc_hal_dm_set_fw_fsm_cmd[NCI_MSG_HDR_SIZE + 1] = 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MTS_CMD|NCI_GID_PROP, 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_SET_FWFSM, 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0x01, 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0x00, 55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NCI_SET_FWFSM_OFFSET_ENABLE 3 57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NCI_PROP_PARAM_SIZE_XTAL_INDEX 3 /* length of parameters in XTAL_INDEX CMD */ 59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 nfc_hal_dm_get_build_info_cmd[NCI_MSG_HDR_SIZE] = 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MTS_CMD|NCI_GID_PROP, 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_GET_BUILD_INFO, 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0x00 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NCI_BUILD_INFO_OFFSET_HWID 25 /* HW ID offset in build info RSP */ 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 nfc_hal_dm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] = 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MTS_CMD|NCI_GID_PROP, 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_GET_PATCH_VERSION, 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0x00 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NCI_PATCH_INFO_VERSION_LEN 16 /* Length of patch version string in PATCH_INFO */ 755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Version string for BCM20791B3 */ 775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenconst UINT8 NFC_HAL_DM_BCM20791B3_STR[] = "20791B3"; 785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_DM_BCM20791B3_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B3_STR)-1) 795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Version string for BCM20791B4 */ 815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenconst UINT8 NFC_HAL_DM_BCM20791B4_STR[] = "20791B4"; 825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_DM_BCM20791B4_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B4_STR)-1) 835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/* Version string for BCM43341B0 */ 855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenconst UINT8 NFC_HAL_DM_BCM43341B0_STR[] = "43341B0"; 865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_DM_BCM43341B0_STR_LEN (sizeof (NFC_HAL_DM_BCM43341B0_STR)-1) 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Extern function prototypes 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_lptd_cfg; 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_pll_325_cfg; 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_start_up_cfg; 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg; 955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFC_HAL_CFG *p_nfc_hal_cfg; 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Local function prototypes 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_config 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send NCI config items to NFCC 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tHAL_NFC_STATUS 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_STATUS nfc_hal_dm_set_config (UINT8 tlv_size, 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_param_tlvs, 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_HAL_NCI_CBACK *p_cback) 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_buff, *p; 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_param = 0, param_len, rem_len, *p_tlv; 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 cmd_len = NCI_MSG_HDR_SIZE + tlv_size + 1; 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED; 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((tlv_size == 0)||(p_param_tlvs == NULL)) 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_buff = (UINT8 *) GKI_getbuf ((UINT16)(NCI_MSG_HDR_SIZE + tlv_size))) != NULL) 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_buff; 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_CORE); 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_BLD_HDR1 (p, NCI_MSG_CORE_SET_CONFIG); 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (UINT8) (tlv_size + 1)); 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rem_len = tlv_size; 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_tlv = p_param_tlvs; 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (rem_len > 1) 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_param++; /* number of params */ 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_tlv ++; /* param type */ 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project param_len = *p_tlv++; /* param length */ 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rem_len -= 2; /* param type and length */ 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rem_len >= param_len) 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rem_len -= param_len; 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_tlv += param_len; /* next param_type */ 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rem_len == 0) 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = HAL_NFC_STATUS_OK; 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* error found */ 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == HAL_NFC_STATUS_OK) 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, num_param); 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_param_tlvs, tlv_size); 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (p_buff, cmd_len, p_cback); 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_set_config ():Bad TLV"); 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_buff); 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_fw_fsm 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Enable or disable FW FSM 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_set_fw_fsm (BOOLEAN enable, tNFC_HAL_NCI_CBACK *p_cback) 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (enable) 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x01; /* Enable, default is disabled */ 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x00; /* Disable */ 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (nfc_hal_dm_set_fw_fsm_cmd, NCI_MSG_HDR_SIZE + 1, p_cback); 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_config_nfcc_cback 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Callback for NCI vendor specific command complete 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_config_nfcc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data) 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config == NFC_HAL_DM_CONFIG_NONE) 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_enable (); 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc (); 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_startup_vsc 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send VS command before NFA start-up 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_startup_vsc (void) 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_end; 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 len; 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_send_startup_vsc ()"); 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* VSC must have NCI header at least */ 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_startup_vsc + NCI_MSG_HDR_SIZE - 1 <= *p_nfc_hal_dm_start_up_vsc_cfg) 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_nfc_hal_dm_start_up_vsc_cfg + nfc_hal_cb.dev_cb.next_startup_vsc; 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project len = *(p + 2); 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_end = p + NCI_MSG_HDR_SIZE - 1 + len; 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_end <= p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg) 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* move to next VSC */ 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_startup_vsc += NCI_MSG_HDR_SIZE + len; 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is last VSC */ 247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_end == p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg) 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE; 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (p, (UINT16)(NCI_MSG_HDR_SIZE + len), nfc_hal_dm_config_nfcc_cback); 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_send_startup_vsc (): Bad start-up VSC"); 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_config_nfcc 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send VS config before NFA start-up 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_config_nfcc (void) 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_config_nfcc (): next_dm_config = %d", nfc_hal_cb.dev_cb.next_dm_config); 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_nfc_hal_dm_lptd_cfg[0]) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_LPTD)) 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_PLL_325; 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_dm_set_config (p_nfc_hal_dm_lptd_cfg[0], 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &p_nfc_hal_dm_lptd_cfg[1], 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_nfc_hal_dm_pll_325_cfg) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_PLL_325)) 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP; 2955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_dm_set_config (NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN, 2975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_nfc_hal_dm_pll_325_cfg, 2985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 3005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 3015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 3035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 3055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 3065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_nfc_hal_dm_start_up_cfg[0]) && (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP)) 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_I93_DATA_RATE; 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_dm_set_config (p_nfc_hal_dm_start_up_cfg[0], 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &p_nfc_hal_dm_start_up_cfg[1], 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_HAL_I93_FLAG_DATA_RATE == NFC_HAL_I93_FLAG_DATA_RATE_HIGH) 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_I93_DATA_RATE) 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_FW_FSM; 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_dm_set_config (NFC_HAL_I93_RW_CFG_LEN, 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_i93_rw_cfg, 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* FW FSM is disabled as default in NFCC */ 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_FW_FSM) 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP_VSC; 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_fw_fsm (NFC_HAL_DM_MULTI_TECH_RESP, nfc_hal_dm_config_nfcc_cback); 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP_VSC) 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_nfc_hal_dm_start_up_vsc_cfg && *p_nfc_hal_dm_start_up_vsc_cfg) 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_startup_vsc (); 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* nothing to config */ 364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE; 365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback (0, 0, NULL); 366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function: nfc_hal_dm_get_xtal_index 3715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description: Return Xtal index and frequency 3735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns: tNFC_HAL_XTAL_INDEX 3755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 3775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_HAL_XTAL_INDEX nfc_hal_dm_get_xtal_index (UINT32 brcm_hw_id, UINT16 *p_xtal_freq) 3785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 3795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 xx; 3805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1("nfc_hal_dm_get_xtal_index() brcm_hw_id:0x%x", brcm_hw_id); 3825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen for (xx = 0; xx < nfc_post_reset_cb.dev_init_config.num_xtal_cfg; xx++) 3845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 385df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu if ((brcm_hw_id & BRCM_NFC_GEN_MASK) 386df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu == nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].brcm_hw_id) 3875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p_xtal_freq = nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].xtal_freq; 3895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].xtal_index); 3905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if not found */ 3945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p_xtal_freq = 0; 3955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (NFC_HAL_XTAL_INDEX_MAX); 3965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 3975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 3995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_xtal_freq_index 401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set crystal frequency index 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_set_xtal_freq_index (void) 408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 nci_brcm_xtal_index_cmd[NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_SIZE_XTAL_INDEX]; 410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_HAL_XTAL_INDEX xtal_index; 4125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16 xtal_freq; 413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_set_xtal_freq_index (): brcm_hw_id = 0x%x", nfc_hal_cb.dev_cb.brcm_hw_id); 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen xtal_index = nfc_hal_dm_get_xtal_index (nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq); 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = nci_brcm_xtal_index_cmd; 419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (NCI_MTS_CMD|NCI_GID_PROP)); 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, NCI_MSG_GET_XTAL_INDEX_FROM_DH); 421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, NCI_PROP_PARAM_SIZE_XTAL_INDEX); 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, xtal_index); 4235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_STREAM (p, xtal_freq); 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_XTAL_SET); 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (nci_brcm_xtal_index_cmd, NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_SIZE_XTAL_INDEX, NULL); 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function nfc_hal_dm_send_get_build_info_cmd 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send NCI_MSG_GET_BUILD_INFO CMD 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_dm_send_get_build_info_cmd (void) 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 4415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_BUILD_INFO); 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* get build information to find out HW */ 4445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_build_info_cmd, NCI_MSG_HDR_SIZE, NULL); 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_proc_msg_during_init 450e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 451e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI message while initializing NFCC 452e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_proc_msg_during_init (NFC_HDR *p_msg) 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 459e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 reset_reason, reset_type; 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 mt, pbf, gid, op_code; 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_old, old_gid, old_oid, old_mt; 4625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 u8; 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_HAL_NCI_CBACK *p_cback = NULL; 4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 chipverlen; 4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 chipverstr[NCI_SPD_HEADER_CHIPVER_LEN]; 4665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16 xtal_freq; 467e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_proc_msg_during_init(): init state:%d", nfc_hal_cb.dev_cb.initializing_state); 469e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 470e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_msg + 1) + p_msg->offset; 471e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 472e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_PRS_HDR0 (p, mt, pbf, gid); 473e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_PRS_HDR1 (p, op_code); 474e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 475e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check if waiting for this response */ 476e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_CMD) 477e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_VSC) ) 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (mt == NCI_MT_RSP) 480e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 481e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_old = nfc_hal_cb.ncit_cb.last_hdr; 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_PRS_HDR0 (p_old, old_mt, pbf, old_gid); 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project old_oid = ((*p_old) & NCI_OID_MASK); 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* make sure this is the RSP we are waiting for before updating the command window */ 485e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((old_gid == gid) && (old_oid == op_code)) 486e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 487e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE; 488e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cback = (tNFC_HAL_NCI_CBACK *)nfc_hal_cb.ncit_cb.p_vsc_cback; 489e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_vsc_cback = NULL; 490e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer); 491e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 492e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 493e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 494e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 495e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (gid == NCI_GID_CORE) 496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (op_code == NCI_MSG_CORE_RESET) 498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 4995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (mt == NCI_MT_NTF) 500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_NFCC_ENABLE) 5025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_POST_XTAL_SET) ) 503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* 5055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** Core reset ntf in the following cases; 5065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** 1) after power up (raising REG_PU) 5075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** 2) after setting xtal index 5085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** Start pre-initializing NFCC 5095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen */ 5105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_stop_quick_timer (&nfc_hal_cb.timer); 5115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_pre_init_nfcc (); 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Core reset ntf after post-patch download, Call reset notification callback */ 5165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p++; /* Skip over param len */ 5175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (reset_reason, p); 5185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (reset_type, p); 5195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_prm_spd_reset_ntf (reset_reason, reset_type); 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cback) 524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code), 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len, 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT8 *) (p_msg + 1) + p_msg->offset); 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (gid == NCI_GID_PROP) /* this is for download patch */ 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (mt == NCI_MT_NTF) 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project op_code |= NCI_NTF_BIT; 534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project op_code |= NCI_RSP_BIT; 536e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_XTAL_SET) 538e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (op_code == (NCI_RSP_BIT|NCI_MSG_GET_XTAL_INDEX_FROM_DH)) 540e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* start timer in case that NFCC doesn't send RESET NTF after loading patch from NVM */ 5425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_POST_XTAL_SET); 543e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE, 5455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ((p_nfc_hal_cfg->nfc_hal_post_xtal_timeout)*QUICK_TIMER_TICKS_PER_SEC)/1000); 546e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (op_code == NFC_VS_GET_BUILD_INFO_EVT) 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_BUILD_INFO) ) 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += NCI_BUILD_INFO_OFFSET_HWID; 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT32 (nfc_hal_cb.dev_cb.brcm_hw_id, p); 554e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (chipverlen, p); 5565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memset (chipverstr, 0, NCI_SPD_HEADER_CHIPVER_LEN); 5575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 5585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_ARRAY (chipverstr, p, chipverlen); 5595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 5605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((chipverlen == NFC_HAL_DM_BCM20791B3_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B3_STR, chipverstr, NFC_HAL_DM_BCM20791B3_STR_LEN) == 0)) 5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* BCM2079B3 FW - eSE restarted for patch download */ 5635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; 5645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = TRUE; 5655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if ( ((chipverlen == NFC_HAL_DM_BCM20791B4_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B4_STR, chipverstr, NFC_HAL_DM_BCM20791B4_STR_LEN) == 0)) 5675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||((chipverlen == NFC_HAL_DM_BCM43341B0_STR_LEN) && (memcmp (NFC_HAL_DM_BCM43341B0_STR, chipverstr, NFC_HAL_DM_BCM43341B0_STR_LEN) == 0)) ) 5685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* BCM43341B0/BCM2079B4 FW - eSE restarted for patch download */ 5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; 5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; 5725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 5745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* BCM2079B5 FW - eSE not be restarted for patch download from UICC */ 5765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_fw_workaround = FALSE; 5775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; 5785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 5805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if NFCC needs to set Xtal frequency before getting patch version */ 5815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_dm_get_xtal_index (nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq) < NFC_HAL_XTAL_INDEX_MAX) 5825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* set Xtal index before getting patch version */ 5855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_set_xtal_freq_index (); 5865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 5875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_PATCH_INFO); 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, NULL); 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (op_code == NFC_VS_GET_PATCH_VERSION_EVT) 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_PATCH_INFO) ) 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Store NVM info to control block */ 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Skip over rsp len */ 6005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p++; 6015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get project id */ 6035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.project_id, p); 6045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* RFU */ 6065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p++; 6075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get chip version string */ 6095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (u8, p); 6105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p += NCI_PATCH_INFO_VERSION_LEN; 6115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get major/minor version */ 6135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.ver_major, p); 6145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.ver_minor, p); 6155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Skip over max_size and patch_max_size */ 6175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p += 4; 6185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get current lpm patch size */ 6205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.lpm_size, p); 6215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.fpm_size, p); 6225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* clear all flags which may be set during previous initialization */ 6245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags = 0; 6255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Set patch present flag */ 6275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((nfc_hal_cb.nvm_cb.fpm_size) || (nfc_hal_cb.nvm_cb.lpm_size)) 6285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_PATCH_PRESENT; 6295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* LPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */ 6315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (u8, p); 6325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (u8) 6335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 6345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* LPM patch in NVM fails CRC check */ 6355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_LPM_BAD; 6365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 6375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* FPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */ 6405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (u8, p); 6415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (u8) 6425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 6435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* FPM patch in NVM fails CRC check */ 6445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_FPM_BAD; 6455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 6465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Check if downloading patch to RAM only (no NVM) */ 6485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (nfc_hal_cb.nvm_cb.nvm_type, p); 6495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_NONE) 6505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 6515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_NO_NVM; 6525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* let platform update baudrate or download patch */ 6555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_APP_COMPLETE); 6565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_post_reset_init (nfc_hal_cb.dev_cb.brcm_hw_id, nfc_hal_cb.nvm_cb.nvm_type); 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cback) 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code), 661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len, 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT8 *) (p_msg + 1) + p_msg->offset); 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (op_code == NFC_VS_SEC_PATCH_AUTH_EVT) 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("signature!!"); 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_prm_nci_command_complete_cback ((tNFC_HAL_NCI_EVT) (op_code), 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len, 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT8 *) (p_msg + 1) + p_msg->offset); 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_nci_cmd 677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send NCI command to NFCC while initializing BRCM NFCC 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_nci_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_NCI_CBACK *p_cback) 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_buf; 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *ps; 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_send_nci_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp); 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_send_nci_cmd(): no command window"); 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_buf = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_VSC; 699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE; 701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->event = NFC_HAL_EVT_TO_NFC_NCI; 702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->len = len; 703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len); 705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Keep a copy of the command and send to NCI transport */ 707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the message header to double check the response */ 709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ps = (UINT8 *)(p_buf + 1) + p_buf->offset; 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(nfc_hal_cb.ncit_cb.last_hdr, ps, NFC_HAL_SAVED_HDR_SIZE); 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(nfc_hal_cb.ncit_cb.last_cmd, ps + NCI_MSG_HDR_SIZE, NFC_HAL_SAVED_CMD_SIZE); 712e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 713e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the callback for NCI VSCs */ 714e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback; 715e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_nci_send_cmd (p_buf); 717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start NFC command-timeout timer */ 719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer, (UINT16)(NFC_HAL_TTYPE_NCI_WAIT_RSP), 720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_pend_cmd 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send a command to NFCC 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_pend_cmd (void) 734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_buf = nfc_hal_cb.ncit_cb.p_pend_cmd; 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_buf == NULL) 739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check low power mode state */ 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT)) 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_PROP) 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_HAL_TRACE_PROTOCOL == TRUE) 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispHciCmd (p_buf); 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the message header to double check the response */ 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *)(p_buf + 1) + p_buf->offset; 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(nfc_hal_cb.ncit_cb.last_hdr, p, NFC_HAL_SAVED_HDR_SIZE); 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add packet type for BT message */ 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->offset--; 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->len++; 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_buf + 1) + p_buf->offset; 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p = HCIT_TYPE_COMMAND; 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project USERIAL_Write (USERIAL_NFC_PORT, p, p_buf->len); 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_buf); 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_pend_cmd = NULL; 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start NFC command-timeout timer */ 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer, (UINT16)(NFC_HAL_TTYPE_NCI_WAIT_RSP), 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_bt_cmd 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send BT message to NFCC while initializing BRCM NFCC 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 784e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_bt_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_BTVSC_CPLT_CBACK *p_cback) 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_buf; 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_send_bt_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp); 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 7935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_send_bt_cmd(): no command window"); 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_buf = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_PROP; 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE; 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->len = len; 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len); 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the callback for NCI VSCs) */ 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback; 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_pend_cmd = p_buf; 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_IDLE) 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_CONTROL_DONE); 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_REQUEST_CONTROL_EVT, HAL_NFC_STATUS_OK); 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_pend_cmd(); 818e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 819e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 820e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 821e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 822e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_nfc_wake 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set NFC_WAKE line 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_set_nfc_wake (UINT8 cmd) 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 8325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_set_nfc_wake () %s", 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (cmd == NFC_HAL_ASSERT_NFC_WAKE ? "ASSERT" : "DEASSERT")); 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** nfc_wake_active_mode cmd result of voltage on NFC_WAKE 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_LOW (0) NFC_HAL_ASSERT_NFC_WAKE (0) pull down NFC_WAKE (GND) 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_LOW (0) NFC_HAL_DEASSERT_NFC_WAKE (1) pull up NFC_WAKE (VCC) 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_HIGH (1) NFC_HAL_ASSERT_NFC_WAKE (0) pull up NFC_WAKE (VCC) 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_HIGH (1) NFC_HAL_DEASSERT_NFC_WAKE (1) pull down NFC_WAKE (GND) 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (cmd == nfc_hal_cb.dev_cb.nfc_wake_active_mode) 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_OFF); /* pull down NFC_WAKE */ 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_ON); /* pull up NFC_WAKE */ 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_power_mode_execute 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description If snooze mode is enabled in full power mode, 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Assert NFC_WAKE before sending data 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Deassert NFC_WAKE when idle timer expires 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if DH can send data to NFCC 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfc_hal_dm_power_mode_execute (tNFC_HAL_LP_EVT event) 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN send_to_nfcc = FALSE; 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_power_mode_execute () event = %d", event); 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if any transport activity */ 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (event == NFC_HAL_LP_TX_DATA_EVT) 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(event == NFC_HAL_LP_RX_DATA_EVT) ) 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if idle timer is not running */ 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.lp_timer.in_use == FALSE) 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE); 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start or extend idle timer */ 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00, 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 884e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 885e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (event == NFC_HAL_LP_TIMEOUT_EVT) 886e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 887e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* let NFCC go to snooze mode */ 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_DEASSERT_NFC_WAKE); 889e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 891e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 892e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project send_to_nfcc = TRUE; 893e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 894e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 895e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (send_to_nfcc); 896e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 897e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 900e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_brcm_lp_timeout_cback 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description callback function for low power timeout 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nci_brcm_lp_timeout_cback (void *p_tle) 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 9095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nci_brcm_lp_timeout_cback ()"); 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TIMEOUT_EVT); 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_pre_init_nfcc 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes Broadcom specific control blocks for 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NCI transport 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_pre_init_nfcc (void) 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 9265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_pre_init_nfcc ()"); 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if it was waiting for core reset notification after raising REG_PU */ 9295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_NFCC_ENABLE) 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 9315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_send_get_build_info_cmd (); 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 9335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if it was waiting for core reset notification after setting Xtal */ 9345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_POST_XTAL_SET) 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 9365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 9375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Core reset ntf after xtal setting indicating NFCC loaded patch from NVM */ 9385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_PATCH_INFO); 9395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 9405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, NULL); 9415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_shutting_down_nfcc 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes Broadcom specific control blocks for 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NCI transport 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_shutting_down_nfcc (void) 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 9575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_shutting_down_nfcc ()"); 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_CLOSING; 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* reset low power mode variables */ 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) ) 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE); 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE; 9695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hcp_conn_id = 0; 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.power_mode = NFC_HAL_POWER_MODE_FULL; 972e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.snooze_mode = NFC_HAL_LP_SNOOZE_MODE_NONE; 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop all timers */ 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer); 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer); 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer); 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer); 9795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_stop_quick_timer (&nfc_hal_cb.timer); 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_init 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes Broadcom specific control blocks for 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NCI transport 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_init (void) 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 9945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_init ()"); 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.lp_timer.p_cback = nci_brcm_lp_timeout_cback; 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp_timer.p_cback = nfc_hal_nci_cmd_timeout_cback; 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback; 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 100245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu nfc_hal_cb.pre_discover_done = FALSE; 100345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu 10045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_post_reset_cb.spd_nvm_detection_cur_count = 0; 10055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_post_reset_cb.spd_skip_on_power_cycle = FALSE; 10065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcDevInitDone 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify that pre-initialization of NFCC is complete 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1016e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcPreInitDone (tHAL_NFC_STATUS status) 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 10205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("HAL_NfcPreInitDone () status=%d", status); 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE) 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_pre_init_done (status); 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcReInit 1033e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 10345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function is called to restart initialization after REG_PU 10355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** toggled because of failure to detect NVM type or download patchram. 1036e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note This function should be called only during the HAL init process 1038e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns HAL_NFC_STATUS_OK if successfully initiated 1040e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_NFC_STATUS_FAILED otherwise 1041e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 10435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentHAL_NFC_STATUS HAL_NfcReInit (void) 1044e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1045e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED; 10465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("HAL_NfcReInit () init st=0x%x", nfc_hal_cb.dev_cb.initializing_state); 1048e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE) 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 10505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Wait for NFCC to enable - Core reset notification */ 10525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_NFCC_ENABLE); 10535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* NFCC Enable timeout */ 10555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE, 10565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ((p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout)*QUICK_TIMER_TICKS_PER_SEC)/1000); 10575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = HAL_NFC_STATUS_OK; 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1064e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_snooze_mode_cback 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This is baud rate update complete callback. 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_dm_set_snooze_mode_cback (tNFC_HAL_BTVSC_CPLT *pData) 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 status = pData->p_param_buf[0]; 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS hal_status; 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS_CBACK *p_cback; 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it is completed */ 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == HCI_SUCCESS) 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update snooze mode */ 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.snooze_mode = nfc_hal_cb.dev_cb.new_snooze_mode; 1084e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1085e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE); 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1087e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) 1088e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start idle timer */ 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00, 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer); 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project hal_status = HAL_NFC_STATUS_OK; 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project hal_status = HAL_NFC_STATUS_FAILED; 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.p_prop_cback) 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cback = nfc_hal_cb.dev_cb.p_prop_cback; 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.p_prop_cback = NULL; 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cback) (hal_status); 1109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcSetSnoozeMode 1115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set snooze mode 1117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** snooze_mode 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_SNOOZE_MODE_NONE - Snooze mode disabled 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_SNOOZE_MODE_UART - Snooze mode for UART 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_SNOOZE_MODE_SPI_I2C - Snooze mode for SPI/I2C 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** idle_threshold_dh/idle_threshold_nfcc 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Idle Threshold Host in 100ms unit 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** nfc_wake_active_mode/dh_wake_active_mode 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_ACTIVE_LOW - high to low voltage is asserting 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_ACTIVE_HIGH - low to high voltage is asserting 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_snooze_cback 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Notify status of operation 1131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tHAL_NFC_STATUS 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_STATUS HAL_NfcSetSnoozeMode (UINT8 snooze_mode, 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 idle_threshold_dh, 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 idle_threshold_nfcc, 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 nfc_wake_active_mode, 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 dh_wake_active_mode, 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS_CBACK *p_snooze_cback) 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH]; 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 11455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API1 ("HAL_NfcSetSnoozeMode (): snooze_mode = %d", snooze_mode); 1146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.new_snooze_mode = snooze_mode; 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.nfc_wake_active_mode = nfc_wake_active_mode; 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.p_prop_cback = p_snooze_cback; 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = cmd; 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add the HCI command */ 1154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, HCI_BRCM_WRITE_SLEEP_MODE); 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH); 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (p, 0x00, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH); 1158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, snooze_mode); /* Sleep Mode */ 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, idle_threshold_dh); /* Idle Threshold Host */ 1162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, idle_threshold_nfcc); /* Idle Threshold HC */ 1163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, nfc_wake_active_mode); /* BT Wake Active Mode */ 1164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, dh_wake_active_mode); /* Host Wake Active Mode */ 1165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_bt_cmd (cmd, 1167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH, 1168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_snooze_mode_cback); 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NCI_STATUS_OK); 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1179