1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2012-2014 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 */ 59f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith#ifndef NCI_PROP_PARAM_MAX_SIZE_XTAL_INDEX 60f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith#define NCI_PROP_PARAM_MAX_SIZE_XTAL_INDEX 20 61f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith#endif 62e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 nfc_hal_dm_get_build_info_cmd[NCI_MSG_HDR_SIZE] = 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MTS_CMD|NCI_GID_PROP, 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_GET_BUILD_INFO, 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0x00 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NCI_BUILD_INFO_OFFSET_HWID 25 /* HW ID offset in build info RSP */ 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst UINT8 nfc_hal_dm_get_patch_version_cmd [NCI_MSG_HDR_SIZE] = 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MTS_CMD|NCI_GID_PROP, 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_GET_PATCH_VERSION, 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 0x00 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}; 775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NCI_PATCH_INFO_VERSION_LEN 16 /* Length of patch version string in PATCH_INFO */ 785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Extern function prototypes 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_lptd_cfg; 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_pll_325_cfg; 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_start_up_cfg; 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectextern UINT8 *p_nfc_hal_dm_start_up_vsc_cfg; 865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFC_HAL_CFG *p_nfc_hal_cfg; 87c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaissonextern tNFC_HAL_DM_PRE_SET_MEM *p_nfc_hal_dm_pre_set_mem; 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/***************************************************************************** 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Local function prototypes 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*****************************************************************************/ 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_config 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send NCI config items to NFCC 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tHAL_NFC_STATUS 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_STATUS nfc_hal_dm_set_config (UINT8 tlv_size, 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_param_tlvs, 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_HAL_NCI_CBACK *p_cback) 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_buff, *p; 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 num_param = 0, param_len, rem_len, *p_tlv; 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 cmd_len = NCI_MSG_HDR_SIZE + tlv_size + 1; 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED; 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((tlv_size == 0)||(p_param_tlvs == NULL)) 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_buff = (UINT8 *) GKI_getbuf ((UINT16)(NCI_MSG_HDR_SIZE + tlv_size))) != NULL) 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_buff; 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_CORE); 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_BLD_HDR1 (p, NCI_MSG_CORE_SET_CONFIG); 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (UINT8) (tlv_size + 1)); 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rem_len = tlv_size; 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_tlv = p_param_tlvs; 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project while (rem_len > 1) 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project num_param++; /* number of params */ 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_tlv ++; /* param type */ 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project param_len = *p_tlv++; /* param length */ 132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rem_len -= 2; /* param type and length */ 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rem_len >= param_len) 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project rem_len -= param_len; 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_tlv += param_len; /* next param_type */ 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (rem_len == 0) 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = HAL_NFC_STATUS_OK; 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* error found */ 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == HAL_NFC_STATUS_OK) 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, num_param); 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ARRAY_TO_STREAM (p, p_param_tlvs, tlv_size); 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (p_buff, cmd_len, p_cback); 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_set_config ():Bad TLV"); 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_buff); 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_fw_fsm 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Enable or disable FW FSM 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_set_fw_fsm (BOOLEAN enable, tNFC_HAL_NCI_CBACK *p_cback) 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (enable) 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x01; /* Enable, default is disabled */ 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_fw_fsm_cmd[NCI_SET_FWFSM_OFFSET_ENABLE] = 0x00; /* Disable */ 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (nfc_hal_dm_set_fw_fsm_cmd, NCI_MSG_HDR_SIZE + 1, p_cback); 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_config_nfcc_cback 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Callback for NCI vendor specific command complete 194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_config_nfcc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data) 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config == NFC_HAL_DM_CONFIG_NONE) 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_enable (); 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc (); 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_startup_vsc 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send VS command before NFA start-up 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_startup_vsc (void) 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p, *p_end; 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 len; 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_send_startup_vsc ()"); 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* VSC must have NCI header at least */ 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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) 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = p_nfc_hal_dm_start_up_vsc_cfg + nfc_hal_cb.dev_cb.next_startup_vsc; 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project len = *(p + 2); 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_end = p + NCI_MSG_HDR_SIZE - 1 + len; 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_end <= p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg) 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* move to next VSC */ 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_startup_vsc += NCI_MSG_HDR_SIZE + len; 237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if this is last VSC */ 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_end == p_nfc_hal_dm_start_up_vsc_cfg + *p_nfc_hal_dm_start_up_vsc_cfg) 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE; 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_nci_cmd (p, (UINT16)(NCI_MSG_HDR_SIZE + len), nfc_hal_dm_config_nfcc_cback); 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 2475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_send_startup_vsc (): Bad start-up VSC"); 248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_config_nfcc 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send VS config before NFA start-up 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_config_nfcc (void) 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 2645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_config_nfcc (): next_dm_config = %d", nfc_hal_cb.dev_cb.next_dm_config); 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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)) 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_PLL_325; 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_dm_set_config (p_nfc_hal_dm_lptd_cfg[0], 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &p_nfc_hal_dm_lptd_cfg[1], 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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)) 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP; 2875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 2885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_dm_set_config (NFC_HAL_PLL_325_SETCONFIG_PARAM_LEN, 2895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_nfc_hal_dm_pll_325_cfg, 2905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 2925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 2935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 2945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 2955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 2965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 2975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 2985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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)) 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_I93_DATA_RATE; 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_dm_set_config (p_nfc_hal_dm_start_up_cfg[0], 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &p_nfc_hal_dm_start_up_cfg[1], 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_HAL_I93_FLAG_DATA_RATE == NFC_HAL_I93_FLAG_DATA_RATE_HIGH) 320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_I93_DATA_RATE) 321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_FW_FSM; 323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_dm_set_config (NFC_HAL_I93_RW_CFG_LEN, 324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_i93_rw_cfg, 325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback) == HAL_NFC_STATUS_OK) 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, HAL_NFC_STATUS_FAILED); 333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* FW FSM is disabled as default in NFCC */ 339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_FW_FSM) 340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_START_UP_VSC; 342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_fw_fsm (NFC_HAL_DM_MULTI_TECH_RESP, nfc_hal_dm_config_nfcc_cback); 343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.next_dm_config <= NFC_HAL_DM_CONFIG_START_UP_VSC) 347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_nfc_hal_dm_start_up_vsc_cfg && *p_nfc_hal_dm_start_up_vsc_cfg) 349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_startup_vsc (); 351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* nothing to config */ 356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_NONE; 357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_config_nfcc_cback (0, 0, NULL); 358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 3625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function: nfc_hal_dm_get_xtal_index 3635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description: Return Xtal index and frequency 3655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns: tNFC_HAL_XTAL_INDEX 3675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 3695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentNFC_HAL_XTAL_INDEX nfc_hal_dm_get_xtal_index (UINT32 brcm_hw_id, UINT16 *p_xtal_freq) 3705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 3715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 xx; 3725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1("nfc_hal_dm_get_xtal_index() brcm_hw_id:0x%x", brcm_hw_id); 3745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen for (xx = 0; xx < nfc_post_reset_cb.dev_init_config.num_xtal_cfg; xx++) 3765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 377df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu if ((brcm_hw_id & BRCM_NFC_GEN_MASK) 378df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu == nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].brcm_hw_id) 3795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p_xtal_freq = nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].xtal_freq; 3815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (nfc_post_reset_cb.dev_init_config.xtal_cfg[xx].xtal_index); 3825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if not found */ 3865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p_xtal_freq = 0; 3875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return (NFC_HAL_XTAL_INDEX_MAX); 3885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 3895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 3915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_xtal_freq_index 393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set crystal frequency index 395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_set_xtal_freq_index (void) 400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 401f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith UINT8 nci_brcm_xtal_index_cmd[NCI_MSG_HDR_SIZE + NCI_PROP_PARAM_MAX_SIZE_XTAL_INDEX]; 402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_HAL_XTAL_INDEX xtal_index; 4045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16 xtal_freq; 405f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith UINT8 cmd_len = NCI_PROP_PARAM_SIZE_XTAL_INDEX; 406f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith extern UINT8 *p_nfc_hal_dm_xtal_params_cfg; 407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_set_xtal_freq_index (): brcm_hw_id = 0x%x", nfc_hal_cb.dev_cb.brcm_hw_id); 409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen xtal_index = nfc_hal_dm_get_xtal_index (nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq); 411f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith if ((xtal_index == NFC_HAL_XTAL_INDEX_SPECIAL) && (p_nfc_hal_dm_xtal_params_cfg)) 412f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith { 413f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith cmd_len += p_nfc_hal_dm_xtal_params_cfg[0]; /* [0] is the length of extra params */ 414f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith } 415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = nci_brcm_xtal_index_cmd; 417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, (NCI_MTS_CMD|NCI_GID_PROP)); 418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, NCI_MSG_GET_XTAL_INDEX_FROM_DH); 419f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith UINT8_TO_STREAM (p, cmd_len); 420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, xtal_index); 4215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT16_TO_STREAM (p, xtal_freq); 422f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith if (cmd_len > NCI_PROP_PARAM_SIZE_XTAL_INDEX) 423f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith { 424f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith memcpy (p, &p_nfc_hal_dm_xtal_params_cfg[1], p_nfc_hal_dm_xtal_params_cfg[0]); 425f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith } 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_XTAL_SET); 428e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 429f0ab6c7239c3580550eda490042eaa1805b98302Sherry Smith nfc_hal_dm_send_nci_cmd (nci_brcm_xtal_index_cmd, NCI_MSG_HDR_SIZE + cmd_len, NULL); 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function nfc_hal_dm_send_get_build_info_cmd 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Send NCI_MSG_GET_BUILD_INFO CMD 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 438e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 439e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_dm_send_get_build_info_cmd (void) 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 4435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_BUILD_INFO); 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* get build information to find out HW */ 4465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_build_info_cmd, NCI_MSG_HDR_SIZE, NULL); 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 44875c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson/******************************************************************************* 44975c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** 45075c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** Function: nfc_hal_dm_adjust_hw_id 45175c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** 45275c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** Description: The hw_id of certain chips are shifted by 8 bits. 45375c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** Adjust the hw_id before processing. 45475c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** 45575c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** Returns: Nothing 45675c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson** 45775c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson*******************************************************************************/ 45875c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaissonstatic UINT32 nfc_hal_dm_adjust_hw_id (UINT32 hw_id) 45975c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson{ 46075c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson if ((hw_id & 0xF0000000) == 0) 46175c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson hw_id <<= 4; /* shift hw_id by 4 bits to align w the format of most chips */ 46275c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson return hw_id; 46375c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson} 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 465c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 466c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson/******************************************************************************* 467c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 468c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Function nfc_hal_dm_check_xtal 469c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 470c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Description check if need to send xtal command. 471c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** If not, proceed to next step get_patch_version. 472c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 473c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Returns void 474c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 475c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson*******************************************************************************/ 476c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaissonstatic void nfc_hal_dm_check_xtal (void) 477c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson{ 478c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT16 xtal_freq; 479c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson tNFC_HAL_XTAL_INDEX xtal_index; 480c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 481c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson /* if NFCC needs to set Xtal frequency before getting patch version */ 482c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson xtal_index = nfc_hal_dm_get_xtal_index (nfc_hal_cb.dev_cb.brcm_hw_id, &xtal_freq); 483c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson if ((xtal_index < NFC_HAL_XTAL_INDEX_MAX) || (xtal_index == NFC_HAL_XTAL_INDEX_SPECIAL)) 484c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson { 485c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson { 486c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson /* set Xtal index before getting patch version */ 487c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_dm_set_xtal_freq_index (); 488c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson return; 489c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 490c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 491c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 492c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_PATCH_INFO); 493c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 494c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, NULL); 495c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson} 496c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 497c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson/******************************************************************************* 498c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 499c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Function nfc_hal_dm_pre_set_mem_cback 500c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 501c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Description This is pre-set mem complete callback. 502c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 503c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Returns void 504c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 505c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson*******************************************************************************/ 506c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaissonstatic void nfc_hal_dm_pre_set_mem_cback (tNFC_HAL_BTVSC_CPLT *pData) 507c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson{ 508c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT8 status = pData->p_param_buf[0]; 509c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 510c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson HAL_TRACE_DEBUG1 ("nfc_hal_dm_pre_set_mem_cback: %d", status); 511c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson /* if it is completed */ 512c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson if (status == HCI_SUCCESS) 513c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson { 514c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson if (!nfc_hal_dm_check_pre_set_mem()) 515c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson { 516c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson return; 517c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 518c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 519c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_dm_check_xtal(); 520c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson} 521c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 522c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 523c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson/******************************************************************************* 524c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 525c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Function nfc_hal_dm_check_pre_set_mem 526c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 527c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Description Check if need to send the command. 528c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 529c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Returns TRUE if done. 530c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** 531c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson*******************************************************************************/ 532c6d8cda88d41587a86032d6cc778e920dab94cf8Paul ChaissonBOOLEAN nfc_hal_dm_check_pre_set_mem (void) 533c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson{ 534c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT8 cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_PRE_SET_MEM_LENGTH]; 535c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT8 *p; 536c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT32 addr = 0; 537c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 538c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson if (p_nfc_hal_dm_pre_set_mem) 539c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson addr = p_nfc_hal_dm_pre_set_mem[nfc_hal_cb.pre_set_mem_idx].addr; 540c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson HAL_TRACE_DEBUG2 ("nfc_hal_dm_check_pre_set_mem: %d/0x%x", nfc_hal_cb.pre_set_mem_idx, addr); 541c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson if (addr == 0) 542c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson { 543c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson return TRUE; 544c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 545c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson p = cmd; 546c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 547c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson /* Add the command */ 548c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT16_TO_STREAM (p, HCI_BRCM_PRE_SET_MEM); 549c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT8_TO_STREAM (p, HCI_BRCM_PRE_SET_MEM_LENGTH); 550c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 551c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT8_TO_STREAM (p, HCI_BRCM_PRE_SET_MEM_TYPE); 552c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT32_TO_STREAM (p, addr); 553c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT8_TO_STREAM (p, 0); 554c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson UINT32_TO_STREAM (p, p_nfc_hal_dm_pre_set_mem[nfc_hal_cb.pre_set_mem_idx].data); 555c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_cb.pre_set_mem_idx++; 556c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 557c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_dm_send_bt_cmd (cmd, 558c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_PRE_SET_MEM_LENGTH, 559c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_dm_pre_set_mem_cback); 560c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson return FALSE; 561c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson} 562c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 563e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_proc_msg_during_init 566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Process NCI message while initializing NFCC 568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_proc_msg_during_init (NFC_HDR *p_msg) 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 reset_reason, reset_type; 576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 mt, pbf, gid, op_code; 577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_old, old_gid, old_oid, old_mt; 5785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 u8; 579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tNFC_HAL_NCI_CBACK *p_cback = NULL; 5805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 chipverlen; 5815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 chipverstr[NCI_SPD_HEADER_CHIPVER_LEN]; 58275c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson UINT32 hw_id = 0; 583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_proc_msg_during_init(): init state:%d", nfc_hal_cb.dev_cb.initializing_state); 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_msg + 1) + p_msg->offset; 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_PRS_HDR0 (p, mt, pbf, gid); 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_PRS_HDR1 (p, op_code); 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check if waiting for this response */ 592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_CMD) 593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_VSC) ) 594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (mt == NCI_MT_RSP) 596e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_old = nfc_hal_cb.ncit_cb.last_hdr; 598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NCI_MSG_PRS_HDR0 (p_old, old_mt, pbf, old_gid); 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project old_oid = ((*p_old) & NCI_OID_MASK); 600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* make sure this is the RSP we are waiting for before updating the command window */ 601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((old_gid == gid) && (old_oid == op_code)) 602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE; 604e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cback = (tNFC_HAL_NCI_CBACK *)nfc_hal_cb.ncit_cb.p_vsc_cback; 605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_vsc_cback = NULL; 606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer); 607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 610e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 611e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (gid == NCI_GID_CORE) 612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 613e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (op_code == NCI_MSG_CORE_RESET) 614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (mt == NCI_MT_NTF) 616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_NFCC_ENABLE) 6185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_POST_XTAL_SET) ) 619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* 6215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** Core reset ntf in the following cases; 6225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** 1) after power up (raising REG_PU) 6235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** 2) after setting xtal index 6245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ** Start pre-initializing NFCC 6255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen */ 6265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_stop_quick_timer (&nfc_hal_cb.timer); 6275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_pre_init_nfcc (); 628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Core reset ntf after post-patch download, Call reset notification callback */ 6325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p++; /* Skip over param len */ 6335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (reset_reason, p); 6345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (reset_type, p); 6355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_prm_spd_reset_ntf (reset_reason, reset_type); 636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cback) 640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code), 642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len, 643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT8 *) (p_msg + 1) + p_msg->offset); 644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (gid == NCI_GID_PROP) /* this is for download patch */ 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (mt == NCI_MT_NTF) 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project op_code |= NCI_NTF_BIT; 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project op_code |= NCI_RSP_BIT; 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_XTAL_SET) 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (op_code == (NCI_RSP_BIT|NCI_MSG_GET_XTAL_INDEX_FROM_DH)) 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* start timer in case that NFCC doesn't send RESET NTF after loading patch from NVM */ 6585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_POST_XTAL_SET); 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE, 6615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ((p_nfc_hal_cfg->nfc_hal_post_xtal_timeout)*QUICK_TIMER_TICKS_PER_SEC)/1000); 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (op_code == NFC_VS_GET_BUILD_INFO_EVT) 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_BUILD_INFO) ) 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += NCI_BUILD_INFO_OFFSET_HWID; 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 66975c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson STREAM_TO_UINT32 (hw_id, p); 67075c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson nfc_hal_cb.dev_cb.brcm_hw_id = nfc_hal_dm_adjust_hw_id (hw_id); 67175c48f079b2f77797c56e9662af1e569b872fb0cPaul Chaisson HAL_TRACE_DEBUG2 ("brcm_hw_id: 0x%x -> 0x%x", hw_id, nfc_hal_cb.dev_cb.brcm_hw_id); 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (chipverlen, p); 6745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memset (chipverstr, 0, NCI_SPD_HEADER_CHIPVER_LEN); 6755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_ARRAY (chipverstr, p, chipverlen); 6775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 678a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_hci_handle_build_info (chipverlen, chipverstr); 679c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_cb.pre_set_mem_idx = 0; 680c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson if (!nfc_hal_dm_check_pre_set_mem()) 6815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 682c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson /* pre-set mem started */ 683c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson return; 6845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 685c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson nfc_hal_dm_check_xtal(); 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if ( (op_code == NFC_VS_GET_PATCH_VERSION_EVT) 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_PATCH_INFO) ) 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Store NVM info to control block */ 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 6925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Skip over rsp len */ 6935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p++; 6945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get project id */ 6965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.project_id, p); 6975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* RFU */ 6995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p++; 7005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get chip version string */ 7025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (u8, p); 703d05817f02d578becbf79b46f2599126404c7b413Evan Chu if (u8 > NFC_HAL_PRM_MAX_CHIP_VER_LEN) 704d05817f02d578becbf79b46f2599126404c7b413Evan Chu u8 = NFC_HAL_PRM_MAX_CHIP_VER_LEN; 705d05817f02d578becbf79b46f2599126404c7b413Evan Chu memcpy (nfc_hal_cb.nvm_cb.chip_ver, p, u8); 7065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p += NCI_PATCH_INFO_VERSION_LEN; 7075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get major/minor version */ 7095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.ver_major, p); 7105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.ver_minor, p); 7115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Skip over max_size and patch_max_size */ 7135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p += 4; 7145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Get current lpm patch size */ 7165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.lpm_size, p); 7175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT16 (nfc_hal_cb.nvm_cb.fpm_size, p); 7185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* clear all flags which may be set during previous initialization */ 7205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags = 0; 7215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Set patch present flag */ 7235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((nfc_hal_cb.nvm_cb.fpm_size) || (nfc_hal_cb.nvm_cb.lpm_size)) 7245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_PATCH_PRESENT; 7255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* LPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */ 7275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (u8, p); 7285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (u8) 7295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 7305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* LPM patch in NVM fails CRC check */ 7315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_LPM_BAD; 7325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 7335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* FPMPatchCodeHasBadCRC (if not bad crc, then indicate LPM patch is present in nvm) */ 7365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (u8, p); 7375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (u8) 7385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 7395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* FPM patch in NVM fails CRC check */ 7405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_FPM_BAD; 7415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 7425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 7435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Check if downloading patch to RAM only (no NVM) */ 7445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen STREAM_TO_UINT8 (nfc_hal_cb.nvm_cb.nvm_type, p); 7455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_NONE) 7465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 7475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.nvm_cb.flags |= NFC_HAL_NVM_FLAGS_NO_NVM; 7485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* let platform update baudrate or download patch */ 7515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_APP_COMPLETE); 7525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_post_reset_init (nfc_hal_cb.dev_cb.brcm_hw_id, nfc_hal_cb.nvm_cb.nvm_type); 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (p_cback) 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cback) ((tNFC_HAL_NCI_EVT) (op_code), 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len, 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT8 *) (p_msg + 1) + p_msg->offset); 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (op_code == NFC_VS_SEC_PATCH_AUTH_EVT) 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 7625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("signature!!"); 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_prm_nci_command_complete_cback ((tNFC_HAL_NCI_EVT) (op_code), 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len, 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT8 *) (p_msg + 1) + p_msg->offset); 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 768e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 769e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_nci_cmd 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 774e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send NCI command to NFCC while initializing BRCM NFCC 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 776e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 777e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_nci_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_NCI_CBACK *p_cback) 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_buf; 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *ps; 783e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_send_nci_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp); 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 7885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_send_nci_cmd(): no command window"); 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_buf = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_VSC; 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE; 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->event = NFC_HAL_EVT_TO_NFC_NCI; 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->len = len; 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len); 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Keep a copy of the command and send to NCI transport */ 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the message header to double check the response */ 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ps = (UINT8 *)(p_buf + 1) + p_buf->offset; 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(nfc_hal_cb.ncit_cb.last_hdr, ps, NFC_HAL_SAVED_HDR_SIZE); 807e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(nfc_hal_cb.ncit_cb.last_cmd, ps + NCI_MSG_HDR_SIZE, NFC_HAL_SAVED_CMD_SIZE); 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the callback for NCI VSCs */ 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback; 811e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_nci_send_cmd (p_buf); 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start NFC command-timeout timer */ 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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), 816e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 817e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 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** Function nfc_hal_dm_send_pend_cmd 823e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 824e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send a command to NFCC 825e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 826e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 827e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 828e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 829e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_pend_cmd (void) 830e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 831e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_buf = nfc_hal_cb.ncit_cb.p_pend_cmd; 832e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 833e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 834e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_buf == NULL) 835e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 836e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 837e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* check low power mode state */ 838e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (!nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT)) 839e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 840e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 841e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 842e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 843e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.ncit_cb.nci_wait_rsp == NFC_HAL_WAIT_RSP_PROP) 844e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 845e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_HAL_TRACE_PROTOCOL == TRUE) 846e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project DispHciCmd (p_buf); 847e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 848e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 849e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the message header to double check the response */ 850e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *)(p_buf + 1) + p_buf->offset; 851e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy(nfc_hal_cb.ncit_cb.last_hdr, p, NFC_HAL_SAVED_HDR_SIZE); 852e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 853e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* add packet type for BT message */ 854e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->offset--; 855e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->len++; 856e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 857e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = (UINT8 *) (p_buf + 1) + p_buf->offset; 858e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *p = HCIT_TYPE_COMMAND; 859e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 860e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project USERIAL_Write (USERIAL_NFC_PORT, p, p_buf->len); 861e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 862e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_buf); 863e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_pend_cmd = NULL; 864e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 865e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start NFC command-timeout timer */ 866e9df6ba5a8fcccf306a80b1670b423be8fe7746The 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), 867e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_CMD_TOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 868e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 869e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 870e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 871e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 872e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 873e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 874e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_send_bt_cmd 875e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 876e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send BT message to NFCC while initializing BRCM NFCC 877e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 878e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 879e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 880e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 881e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_send_bt_cmd (const UINT8 *p_data, UINT16 len, tNFC_HAL_BTVSC_CPLT_CBACK *p_cback) 882e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 883e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_buf; 884c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson char buff[300]; 885c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson char tmp[4]; 886c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson buff[0] = 0; 887c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson int i; 888e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_send_bt_cmd (): nci_wait_rsp = 0x%x", nfc_hal_cb.ncit_cb.nci_wait_rsp); 890e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 891c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson for (i = 0; i < len; i++) 892c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson { 893c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson sprintf (tmp, "%02x ", p_data[i]); 894c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson strcat(buff, tmp); 895c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson } 896c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson HAL_TRACE_DEBUG2 ("nfc_hal_dm_send_bt_cmd (): HCI Write (%d bytes): %s", len, buff); 897c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson 898e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) 899e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 9005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_dm_send_bt_cmd(): no command window"); 901e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 902e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 903e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 904e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_buf = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 905e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 906e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_PROP; 907e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 908e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE; 909e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_buf->len = len; 910e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 911e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((UINT8*) (p_buf + 1) + p_buf->offset, p_data, len); 912e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 913e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* save the callback for NCI VSCs) */ 914e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_vsc_cback = (void *)p_cback; 915e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 916e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.p_pend_cmd = p_buf; 917e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_IDLE) 918e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 919e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_CONTROL_DONE); 920e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback (HAL_NFC_REQUEST_CONTROL_EVT, HAL_NFC_STATUS_OK); 921e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 922e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 923e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 924e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_pend_cmd(); 925e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 926e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 927e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 928e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 929e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 930e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_set_nfc_wake 931e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 932e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set NFC_WAKE line 933e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 934e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 935e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 936e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 937e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_set_nfc_wake (UINT8 cmd) 938e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 9395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_set_nfc_wake () %s", 940e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (cmd == NFC_HAL_ASSERT_NFC_WAKE ? "ASSERT" : "DEASSERT")); 941e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 942e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* 943e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** nfc_wake_active_mode cmd result of voltage on NFC_WAKE 944e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** 945e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_LOW (0) NFC_HAL_ASSERT_NFC_WAKE (0) pull down NFC_WAKE (GND) 946e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_LOW (0) NFC_HAL_DEASSERT_NFC_WAKE (1) pull up NFC_WAKE (VCC) 947e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_HIGH (1) NFC_HAL_ASSERT_NFC_WAKE (0) pull up NFC_WAKE (VCC) 948e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ** NFC_HAL_LP_ACTIVE_HIGH (1) NFC_HAL_DEASSERT_NFC_WAKE (1) pull down NFC_WAKE (GND) 949e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project */ 950e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 951e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (cmd == nfc_hal_cb.dev_cb.nfc_wake_active_mode) 952e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_OFF); /* pull down NFC_WAKE */ 953e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 954e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UPIO_Set (UPIO_GENERAL, NFC_HAL_LP_NFC_WAKE_GPIO, UPIO_ON); /* pull up NFC_WAKE */ 955e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 956e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 957e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 958e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 959e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_power_mode_execute 960e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 961e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description If snooze mode is enabled in full power mode, 962e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Assert NFC_WAKE before sending data 963e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Deassert NFC_WAKE when idle timer expires 964e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 965e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if DH can send data to NFCC 966e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 967e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 968e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN nfc_hal_dm_power_mode_execute (tNFC_HAL_LP_EVT event) 969e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 970e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN send_to_nfcc = FALSE; 971e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 9725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_dm_power_mode_execute () event = %d", event); 973e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 974e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) 975e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 976e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) 977e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 978e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if any transport activity */ 979e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (event == NFC_HAL_LP_TX_DATA_EVT) 980e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ||(event == NFC_HAL_LP_RX_DATA_EVT) ) 981e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 982e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if idle timer is not running */ 983e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.lp_timer.in_use == FALSE) 984e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 985e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE); 986e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 987e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 988e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start or extend idle timer */ 989e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00, 990e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 991e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 992e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (event == NFC_HAL_LP_TIMEOUT_EVT) 993e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 994e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* let NFCC go to snooze mode */ 995e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_DEASSERT_NFC_WAKE); 996e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 997e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 998e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 999e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project send_to_nfcc = TRUE; 1000e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1001e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1002e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (send_to_nfcc); 1003e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1004e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1005e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1006e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1007e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nci_brcm_lp_timeout_cback 1008e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1009e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description callback function for low power timeout 1010e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1011e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1012e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1013e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1014e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nci_brcm_lp_timeout_cback (void *p_tle) 1015e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 10165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nci_brcm_lp_timeout_cback ()"); 1017e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1018e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TIMEOUT_EVT); 1019e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1020e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1021e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1022e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1023e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_pre_init_nfcc 1024e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1025e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes Broadcom specific control blocks for 1026e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NCI transport 1027e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1028e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1029e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1030e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1031e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_pre_init_nfcc (void) 1032e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 10335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_pre_init_nfcc ()"); 1034e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 10355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if it was waiting for core reset notification after raising REG_PU */ 10365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_NFCC_ENABLE) 1037e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 10385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_send_get_build_info_cmd (); 1039e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 10405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if it was waiting for core reset notification after setting Xtal */ 10415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_POST_XTAL_SET) 1042e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 10435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 10445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Core reset ntf after xtal setting indicating NFCC loaded patch from NVM */ 10455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_PATCH_INFO); 10465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 10475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_dm_send_nci_cmd (nfc_hal_dm_get_patch_version_cmd, NCI_MSG_HDR_SIZE, NULL); 10485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1049e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1050e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1051e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1052e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1053e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1054e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_shutting_down_nfcc 1055e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1056e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes Broadcom specific control blocks for 1057e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NCI transport 1058e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1059e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1060e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1061e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1062e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_shutting_down_nfcc (void) 1063e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 10645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_shutting_down_nfcc ()"); 1065e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1066e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_CLOSING; 1067e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1068e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* reset low power mode variables */ 1069e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (nfc_hal_cb.dev_cb.power_mode == NFC_HAL_POWER_MODE_FULL) 1070e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) ) 1071e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1072e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE); 1073e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1074e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1075e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp = NFC_HAL_WAIT_RSP_NONE; 1076e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1077e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.power_mode = NFC_HAL_POWER_MODE_FULL; 1078e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.snooze_mode = NFC_HAL_LP_SNOOZE_MODE_NONE; 1079e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1080e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop all timers */ 1081e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer); 1082e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer); 1083e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.prm.timer); 1084a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) 1085a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hcp_conn_id = 0; 1086e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer); 1087a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 10885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_stop_quick_timer (&nfc_hal_cb.timer); 1089e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1090e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1091e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1092e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1093e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_dm_init 1094e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1095e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description This function initializes Broadcom specific control blocks for 1096e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NCI transport 1097e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1098e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1099e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_dm_init (void) 1102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 11035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_dm_init ()"); 1104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.lp_timer.p_cback = nci_brcm_lp_timeout_cback; 1106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.ncit_cb.nci_wait_rsp_timer.p_cback = nfc_hal_nci_cmd_timeout_cback; 1108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1109a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) 1110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.hci_timer.p_cback = nfc_hal_hci_timeout_cback; 1111a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 1112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 111345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu nfc_hal_cb.pre_discover_done = FALSE; 111445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu 11155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_post_reset_cb.spd_nvm_detection_cur_count = 0; 11165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_post_reset_cb.spd_skip_on_power_cycle = FALSE; 11175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcDevInitDone 1123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify that pre-initialization of NFCC is complete 1125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcPreInitDone (tHAL_NFC_STATUS status) 1130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 11315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("HAL_NfcPreInitDone () status=%d", status); 1132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE) 1134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 1136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_pre_init_done (status); 1138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcReInit 1144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 11455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description This function is called to restart initialization after REG_PU 11465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** toggled because of failure to detect NVM type or download patchram. 1147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Note This function should be called only during the HAL init process 1149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns HAL_NFC_STATUS_OK if successfully initiated 1151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_NFC_STATUS_FAILED otherwise 1152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 11545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenentHAL_NFC_STATUS HAL_NfcReInit (void) 1155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS status = HAL_NFC_STATUS_FAILED; 11575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("HAL_NfcReInit () init st=0x%x", nfc_hal_cb.dev_cb.initializing_state); 1159e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.initializing_state == NFC_HAL_INIT_STATE_W4_APP_COMPLETE) 1160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 11615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 11625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Wait for NFCC to enable - Core reset notification */ 11635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_NFCC_ENABLE); 11645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 11655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* NFCC Enable timeout */ 11665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE, 11675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ((p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout)*QUICK_TIMER_TICKS_PER_SEC)/1000); 11685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = HAL_NFC_STATUS_OK; 1171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 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** Function nfc_hal_dm_set_snooze_mode_cback 1178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1179c6d8cda88d41587a86032d6cc778e920dab94cf8Paul Chaisson** Description This is snooze update complete callback. 1180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 1182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_dm_set_snooze_mode_cback (tNFC_HAL_BTVSC_CPLT *pData) 1185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 status = pData->p_param_buf[0]; 1187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS hal_status; 1188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS_CBACK *p_cback; 1189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* if it is completed */ 1191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status == HCI_SUCCESS) 1192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* update snooze mode */ 1194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.snooze_mode = nfc_hal_cb.dev_cb.new_snooze_mode; 1195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_nfc_wake (NFC_HAL_ASSERT_NFC_WAKE); 1197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( nfc_hal_cb.dev_cb.snooze_mode != NFC_HAL_LP_SNOOZE_MODE_NONE) 1199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* start idle timer */ 1201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.dev_cb.lp_timer, 0x00, 1202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ((UINT32) NFC_HAL_LP_IDLE_TIMEOUT) * QUICK_TIMER_TICKS_PER_SEC / 1000); 1203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.dev_cb.lp_timer); 1207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project hal_status = HAL_NFC_STATUS_OK; 1209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 1211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project hal_status = HAL_NFC_STATUS_FAILED; 1213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.dev_cb.p_prop_cback) 1216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_cback = nfc_hal_cb.dev_cb.p_prop_cback; 1218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.p_prop_cback = NULL; 1219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (*p_cback) (hal_status); 1220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 1221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 1224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcSetSnoozeMode 1226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Set snooze mode 1228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** snooze_mode 1229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_SNOOZE_MODE_NONE - Snooze mode disabled 1230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_SNOOZE_MODE_UART - Snooze mode for UART 1231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_SNOOZE_MODE_SPI_I2C - Snooze mode for SPI/I2C 1232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** idle_threshold_dh/idle_threshold_nfcc 1234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Idle Threshold Host in 100ms unit 1235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** nfc_wake_active_mode/dh_wake_active_mode 1237e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_ACTIVE_LOW - high to low voltage is asserting 1238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_LP_ACTIVE_HIGH - low to high voltage is asserting 1239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** p_snooze_cback 1241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Notify status of operation 1242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns tHAL_NFC_STATUS 1244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 1245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 1246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttHAL_NFC_STATUS HAL_NfcSetSnoozeMode (UINT8 snooze_mode, 1247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 idle_threshold_dh, 1248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 idle_threshold_nfcc, 1249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 nfc_wake_active_mode, 1250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 dh_wake_active_mode, 1251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project tHAL_NFC_STATUS_CBACK *p_snooze_cback) 1252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 cmd[NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH]; 1254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 1255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 12565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API1 ("HAL_NfcSetSnoozeMode (): snooze_mode = %d", snooze_mode); 1257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.new_snooze_mode = snooze_mode; 1259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.nfc_wake_active_mode = nfc_wake_active_mode; 1260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.dev_cb.p_prop_cback = p_snooze_cback; 1261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p = cmd; 1263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Add the HCI command */ 1265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16_TO_STREAM (p, HCI_BRCM_WRITE_SLEEP_MODE); 1266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH); 1267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (p, 0x00, HCI_BRCM_WRITE_SLEEP_MODE_LENGTH); 1269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, snooze_mode); /* Sleep Mode */ 1271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, idle_threshold_dh); /* Idle Threshold Host */ 1273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, idle_threshold_nfcc); /* Idle Threshold HC */ 1274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, nfc_wake_active_mode); /* BT Wake Active Mode */ 1275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8_TO_STREAM (p, dh_wake_active_mode); /* Host Wake Active Mode */ 1276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_send_bt_cmd (cmd, 1278e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_BT_HCI_CMD_HDR_SIZE + HCI_BRCM_WRITE_SLEEP_MODE_LENGTH, 1279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_set_snooze_mode_cback); 1280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return (NCI_STATUS_OK); 1281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 1282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1290