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 HCI events 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 26a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#include "nfc_hal_target.h" 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_api.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h" 29a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 30a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE)) 31a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_nv_ci.h" 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_nv_co.h" 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h> 36a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFC_HAL_HCI_NV_READ_TIMEOUT 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_HCI_NV_READ_TIMEOUT 1000 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifndef NFC_HAL_HCI_NFCC_RSP_TIMEOUT 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_HCI_NFCC_RSP_TIMEOUT 3000 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET 0x0C 475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET 0x32 485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET 0x7F 495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET 0xB4 505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#define NFC_HAL_HCI_PIPE_VALID_MASK 0x80 525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 53a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL 0xFF 54a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL 0xFE 55a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 56a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/* Version string for BCM20791B3 */ 57a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuconst UINT8 NFC_HAL_DM_BCM20791B3_STR[] = "20791B3"; 58a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_DM_BCM20791B3_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B3_STR)-1) 59a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 60a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/* Version string for BCM20791B4 */ 61a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuconst UINT8 NFC_HAL_DM_BCM20791B4_STR[] = "20791B4"; 62a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_DM_BCM20791B4_STR_LEN (sizeof (NFC_HAL_DM_BCM20791B4_STR)-1) 63a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 64a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/* Version string for BCM43341B0 */ 65a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuconst UINT8 NFC_HAL_DM_BCM43341B0_STR[] = "43341B0"; 66a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#define NFC_HAL_DM_BCM43341B0_STR_LEN (sizeof (NFC_HAL_DM_BCM43341B0_STR)-1) 67a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFC_HAL_CFG *p_nfc_hal_cfg; 695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/**************************************************************************** 705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Internal function prototypes 715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen****************************************************************************/ 72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_set_next_hci_netwk_config (UINT8 block); 735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void nfc_hal_hci_remove_dyn_pipe_to_uicc1 (void); 74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 size); 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_init_complete (tHAL_NFC_STATUS status); 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_vsc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data); 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_evt_hdlr 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Processing event for NFA HCI 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_evt_hdlr (tNFC_HAL_HCI_EVENT_DATA *p_evt_data) 88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 89df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG0 ("nfc_hal_hci_evt_hdlr ()"); 90df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (p_evt_data->hdr.event) 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_HAL_HCI_RSP_NV_READ_EVT: 94a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf && (p_evt_data->nv_read.block == HC_F3_NV_BLOCK || p_evt_data->nv_read.block == HC_F4_NV_BLOCK || p_evt_data->nv_read.block == HC_F5_NV_BLOCK)) 955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf && p_evt_data->nv_read.block == HC_F2_NV_BLOCK) ) 965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 97a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_hci_handle_nv_read (p_evt_data->nv_read.block, p_evt_data->nv_read.status, p_evt_data->nv_read.size); 985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 1005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 1015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Invalid block or no buffer, Ignore */ 1025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR1 ("nfc_hal_hci_evt_hdlr: No buffer for handling read NV block: 0x%02x", p_evt_data->nv_read.block); 1035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case NFC_HAL_HCI_RSP_NV_WRITE_EVT: 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NV Ram write completed - nothing to do... */ 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_enable 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Program nv data on to controller 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_enable (void) 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_hci_netwk_cmd; 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 129df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG0 ("nfc_hal_hci_enable ()"); 130df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 1315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_NONE) 1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 1335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_hci_enable (): No HCI NETWK CMD to send for NVM Type: 0x%02x", nfc_hal_cb.nvm_cb.nvm_type); 1345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_hci_init_complete (HAL_NFC_STATUS_OK); 1355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return; 1365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf) 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE); 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_hci_netwk_cmd); 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = NULL; 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE); 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_hci_netwk_cmd); 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = NULL; 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST) 153a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||((p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) && ((!nfc_hal_cb.hci_cb.hci_fw_workaround) || (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM))) 154a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||(p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST) ) 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((p_hci_netwk_cmd = (UINT8 *) GKI_getbuf (NCI_MSG_HDR_SIZE + NFC_HAL_HCI_NETWK_INFO_SIZE)) == NULL) 1575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 1585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_hci_enable: unable to allocate buffer for reading hci network info from nvram"); 1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED); 1605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 1625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 1635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = (UINT8 *) (p_hci_netwk_cmd + NCI_MSG_HDR_SIZE); 1645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.hci_netwk_config_block = 0; 1655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC0_HOST) 1665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 1675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE); 1685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F3_NV_BLOCK); 1695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT); 1705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 1725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 1735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_hci_enable (): Skip send F3 HCI NETWK CMD for UICC Mask: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support); 1745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_hci_set_next_hci_netwk_config (HC_F3_NV_BLOCK); 1755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 1765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 1775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG2 ("nfc_hal_hci_enable (): No HCI NETWK CMD to send for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type); 1825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_hci_set_next_hci_netwk_config (HC_F2_NV_BLOCK); 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 188a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Function nfc_hal_hci_handle_build_info 189a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 190a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Description handle build info evt 191a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 192a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** Returns void 193a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 194a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu*******************************************************************************/ 195a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chuvoid nfc_hal_hci_handle_build_info (UINT8 chipverlen, UINT8 *p_chipverstr) 196a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu{ 197a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_build_info ()"); 198a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 199a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ((chipverlen == NFC_HAL_DM_BCM20791B3_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B3_STR, p_chipverstr, NFC_HAL_DM_BCM20791B3_STR_LEN) == 0)) 200a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 201a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* BCM2079B3 FW - eSE restarted for patch download */ 202a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; 203a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = TRUE; 204a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 205a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if ( ((chipverlen == NFC_HAL_DM_BCM20791B4_STR_LEN) && (memcmp (NFC_HAL_DM_BCM20791B4_STR, p_chipverstr, NFC_HAL_DM_BCM20791B4_STR_LEN) == 0)) 206a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||((chipverlen == NFC_HAL_DM_BCM43341B0_STR_LEN) && (memcmp (NFC_HAL_DM_BCM43341B0_STR, p_chipverstr, NFC_HAL_DM_BCM43341B0_STR_LEN) == 0)) ) 207a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 208a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* BCM43341B0/BCM2079B4 FW - eSE restarted for patch download */ 209a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_fw_workaround = TRUE; 210a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; 211a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 212a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 213a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 214a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* BCM2079B5 FW - eSE not be restarted for patch download from UICC */ 215a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_fw_workaround = FALSE; 216a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd = FALSE; 217a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 218a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu} 219a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 220a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu/******************************************************************************* 221a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu** 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_handle_hci_netwk_info 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Handler function for HCI Network Notification 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_handle_hci_netwk_info (UINT8 *p_data) 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p = p_data; 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 data_len; 233a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8 target_handle = 0; 234a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8 hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN]; 235a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8 block = 0; 236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 237df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hci_netwk_info ()"); 238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* skip NCI header byte0 (MT,GID), byte1 (OID) */ 240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p += 2; 241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (data_len, p); 243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project target_handle = *(UINT8 *) p; 244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (target_handle == NFC_HAL_HCI_DH_TARGET_HANDLE) 246a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 247a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* Correct the session id assigned by DH */ 248a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu *(p+1) = nfc_hal_cb.hci_cb.dh_session_id[0]; 2495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_nv_co_write (p, data_len, HC_F2_NV_BLOCK); 250a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu return; 251a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 253a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (target_handle == NFC_HAL_HCI_UICC0_TARGET_HANDLE) 254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 255a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu block = HC_F3_NV_BLOCK; 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (target_handle == NFC_HAL_HCI_UICC1_TARGET_HANDLE) 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 259a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu block = HC_F4_NV_BLOCK; 260a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 261a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if (target_handle == NFC_HAL_HCI_UICC2_TARGET_HANDLE) 262a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 263a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu block = HC_F5_NV_BLOCK; 264a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 265a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 266a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 267a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Invalid Target handle: 0x%02x", target_handle); 268a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu return; 269a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 270a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 271a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (!nfc_hal_cb.hci_cb.hci_fw_validate_netwk_cmd) 272a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) 273a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_B_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) 274a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_BP_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) 275a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu ||(p[NFC_HAL_HCI_NETWK_CMD_TYPE_F_CE_PIPE_INFO_OFFSET] & NFC_HAL_HCI_PIPE_VALID_MASK) ) 276a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 277a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* HCI Network notification received for UICC0/UICC1/UICC2, Update nv data */ 278a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_nv_co_write (p, data_len, block); 279a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 280a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 281a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 282a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hci_netwk_info(): Type A Card Emulation invalid, Reset nv file: 0x%02x", p[NFC_HAL_HCI_NETWK_CMD_TYPE_A_CE_PIPE_INFO_OFFSET]); 283a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu hci_netwk_cmd[0] = target_handle; 284a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); 285a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_nv_co_write (hci_netwk_cmd, 1, block); 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 2915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh 2925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 2935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task 2945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 2955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns None 2965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 2975c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 2985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh (void) 2995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 3005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NFC_HDR *p_msg; 3015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p, *ps; 3025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh (): Fake ADM_NOTIFY_ALL_PIPE_CLEARED (0x%02x) from HAL", NFC_HAL_HCI_HOST_ID_UICC1); 3045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Start of new message. Allocate a buffer for message */ 3065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((p_msg = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 3075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Initialize NFC_HDR */ 3095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_msg->len = NCI_DATA_HDR_SIZE + 0x03; 3105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_msg->event = 0; 3115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_msg->offset = 0; 3125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_msg->layer_specific = 0; 3135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = (UINT8 *) (p_msg + 1) + p_msg->offset; 3155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ps = p; 3165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen NCI_DATA_BLD_HDR (p, nfc_hal_cb.hci_cb.hcp_conn_id, 0x03); 3175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* HCP header with ADMIN pipe id and chaining bit set */ 3185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p++ = ((1 << 0x07) | (NFC_HAL_HCI_ADMIN_PIPE & 0x7F)); 3195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* HCP Message header with Command type instruction and ADM_NOTIFY_ALL_PIPE_CLEARED command */ 3205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p++ = ((NFC_HAL_HCI_COMMAND_TYPE << 6) | (NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED & 0x3F)); 3215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* HCP Data with UICC1 host id */ 3225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *p = NFC_HAL_HCI_HOST_ID_UICC1; 3235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifdef DISP_NCI 3255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen DISP_NCI (ps, (UINT16) p_msg->len, TRUE); 3265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif 3275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_send_nci_msg_to_nfc_task (p_msg); 3285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else 3315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("Unable to allocate buffer for faking ADM_NOTIFY_ALL_PIPE_CLEARED cmd from HAL to stack"); 3335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 3345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 3355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 3375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function nfc_hal_hci_handle_hcp_pkt_to_hc 3395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle HCP Packet from NFC task to Host Controller 3415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns FALSE to send the packet to host controller 3435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** TRUE to drop the packet and fake credit ntf for hcp connection 3445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 3455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 3465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn CoenenBOOLEAN nfc_hal_hci_handle_hcp_pkt_to_hc (UINT8 *p_data) 3475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 3485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 chaining_bit; 3495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 pipe; 3505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 type; 3515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 inst; 3525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 index; 3535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hcp_pkt_to_hc ()"); 3555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen chaining_bit = ((*p_data) >> 0x07) & 0x01; 3575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen pipe = (*p_data++) & 0x7F; 3585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (chaining_bit) 3605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen &&(pipe == NFC_HAL_HCI_ADMIN_PIPE) ) 3615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen type = ((*p_data) >> 0x06) & 0x03; 3635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 3645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if (type == NFC_HAL_HCI_COMMAND_TYPE) 3655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen inst = (*p_data++ & 0x3F); 367a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (inst == NFC_HAL_HCI_ANY_GET_PARAMETER) 3685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 3695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen index = *(p_data++); 370a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX) 3715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 372a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* Set flag to modify session id[0] on response 373a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu * from host controller to set session id cmd 3745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen */ 375a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.update_session_id = TRUE; 376a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 377a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 378a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if (inst == NFC_HAL_HCI_ANY_SET_PARAMETER) 379a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 380a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu index = *(p_data++); 381a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (index == NFC_HAL_HCI_WHITELIST_INDEX) 382a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 383a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (nfc_hal_cb.hci_cb.hci_fw_workaround) 384a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu &&(nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC) ) 385a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 386a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* Set flag to fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to nfc task after 387a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu * response from host controller to set whitelist cmd 388a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu */ 389a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = TRUE; 390a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 391a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 392a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if (index == NFC_HAL_HCI_SESSION_IDENTITY_INDEX) 393a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 394a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.dh_session_id[0] = *p_data; 395a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (p_nfc_hal_cfg->nfc_hal_first_boot) 396a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu *p_data = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL; 397a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 398a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu *p_data = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL; 3995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (type == NFC_HAL_HCI_RESPONSE_TYPE) 4035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 404a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (nfc_hal_cb.hci_cb.hci_fw_workaround) 405a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu &&(nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC) 406a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu &&(nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) ) 4075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 4085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Got response to the fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd sent by HAL to nfc task */ 4095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1 = FALSE; 4105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* return TRUE to drop this hcp without forwarding to host controller */ 4115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return TRUE; 4125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 4155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen return FALSE; 4175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 4185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 4195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 4205c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 4215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function nfc_hal_hci_handle_hcp_pkt_from_hc 422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 4235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Handle HCP Packet from Host controller to Terminal Host 424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 427e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 4285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_hci_handle_hcp_pkt_from_hc (UINT8 *p_data) 429e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 430e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 chaining_bit; 431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 pipe; 432e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 type; 433e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 inst; 434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 hci_netwk_cmd[1 + NFC_HAL_HCI_SESSION_ID_LEN]; 435e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 source_host; 436a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8 block = 0; 437e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 438df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG0 ("nfc_hal_hci_handle_hcp_pkt_from_hc ()"); 439df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 440e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project chaining_bit = ((*p_data) >> 0x07) & 0x01; 441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project pipe = (*p_data++) & 0x7F; 442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (chaining_bit) 444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project &&(pipe == NFC_HAL_HCI_ADMIN_PIPE) ) 445e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 446e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project type = ((*p_data) >> 0x06) & 0x03; 447e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 448e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (type == NFC_HAL_HCI_COMMAND_TYPE) 449e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 450a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (!nfc_hal_cb.hci_cb.hci_fw_workaround) 451a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu return; 452a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 453e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project inst = (*p_data++ & 0x3F); 454e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 455e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (inst == NFC_HAL_HCI_ADM_NOTIFY_ALL_PIPE_CLEARED) 456e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 457e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project STREAM_TO_UINT8 (source_host, p_data); 458e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 4595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Received ADM_NOTIFY_ALL_PIPE_CLEARED command for UICC: 0x%02x", source_host); 460e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (source_host == NFC_HAL_HCI_HOST_ID_UICC0) 461e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 462a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu block = HC_F3_NV_BLOCK; 463e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project hci_netwk_cmd[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE; 464e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 465e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else if (source_host == NFC_HAL_HCI_HOST_ID_UICC1) 466e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 467a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu block = HC_F4_NV_BLOCK; 468e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project hci_netwk_cmd[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE; 469a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 470a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if (source_host == NFC_HAL_HCI_HOST_ID_UICC2) 471a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 472a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu block = HC_F5_NV_BLOCK; 473a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu hci_netwk_cmd[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE; 474a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 475a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 476a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (source_host >= NFC_HAL_HCI_HOST_ID_UICC0) 477a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 478e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Reset Session ID */ 479e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (&hci_netwk_cmd[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); 480a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_nv_co_write (hci_netwk_cmd, 1, block); 481a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_hcp_pkt_from_hc (): Sent command to reset nv file for block: 0x%02x", block); 482e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 483e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 484e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 4855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen else if (type == NFC_HAL_HCI_RESPONSE_TYPE) 4865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 487a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (nfc_hal_cb.hci_cb.update_session_id) 488a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 489a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.update_session_id = FALSE; 490a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu inst = (*p_data++ & 0x3F); 491a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (inst == NFC_HAL_HCI_ANY_OK) 492a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 493a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* Correct the session id assigned by DH */ 494a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu *p_data = nfc_hal_cb.hci_cb.dh_session_id[0]; 495a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 496a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 497a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if (nfc_hal_cb.hci_cb.clear_all_pipes_to_uicc1) 4985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 4995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* NVM Type is UICC and got response from host controller 5005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen * to Set whitelist command. Now fake ADM_NOTIFY_ALL_PIPE_CLEARED cmd to 5015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen * NFC Task and then forward the whitelist cmd response 5025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen */ 5035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_hci_fake_adm_notify_all_pipe_cleared_to_dh (); 5045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 506e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 507e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 508e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 509e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 510e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_handle_nv_read 512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description handler function for nv read complete event 514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_handle_nv_read (UINT8 block, tHAL_NFC_STATUS status, UINT16 size) 519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p; 521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_hci_netwk_info = NULL; 522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 523df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG3 ("nfc_hal_hci_handle_nv_read (): Block: [0x%02x], Status: [0x%02x], Size: [0x%04x]", block, status, size); 524df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Stop timer as NVDATA Read Completed */ 526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_stop_quick_timer (&nfc_hal_cb.hci_cb.hci_timer); 527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (block) 529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HC_F3_NV_BLOCK: 531e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HC_F4_NV_BLOCK: 532a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case HC_F5_NV_BLOCK: 533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ( (status != HAL_NFC_STATUS_OK) 5345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(size > NFC_HAL_HCI_NETWK_INFO_SIZE) 5355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(size < NFC_HAL_HCI_MIN_NETWK_INFO_SIZE) 5365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||((nfc_hal_cb.hci_cb.hci_fw_workaround) && (block == HC_F4_NV_BLOCK) && (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC)) ) 537e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set DEFAULT Configuration for block:0x%02x", block); 539e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE); 540a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (block == HC_F3_NV_BLOCK) 541a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC0_TARGET_HANDLE; 542a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else if (block == HC_F4_NV_BLOCK) 543a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC1_TARGET_HANDLE; 544a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 545a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[0] = NFC_HAL_HCI_UICC2_TARGET_HANDLE; 546a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 547e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (&nfc_hal_cb.hci_cb.p_hci_netwk_info_buf[1], 0xFF, NFC_HAL_HCI_SESSION_ID_LEN); 548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project size = NFC_HAL_HCI_NETWK_INFO_SIZE; 549e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 550e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 551e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_hci_netwk_info = (UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE; 552e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 553e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 5545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case HC_F2_NV_BLOCK: 555a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.dh_session_id[0] = nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1]; 556a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if (p_nfc_hal_cfg->nfc_hal_first_boot) 557a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] = NFC_HAL_HCI_FIRST_BOOT_SESSION_ID_0_VAL; 558a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu else 559a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[1] = NFC_HAL_HCI_NEXT_BOOT_SESSION_ID_0_VAL; 5605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (status != HAL_NFC_STATUS_OK) 5625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(size > NFC_HAL_HCI_DH_NETWK_INFO_SIZE) 5635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen ||(size < NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE) ) 564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG1 ("nfc_hal_hci_handle_nv_read: Invalid data from nv memory, Set DEFAULT Configuration for block:0x%02x", block); 5665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[0] = NFC_HAL_HCI_DH_TARGET_HANDLE; 567a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.dh_session_id[0] = 0xFF; 568a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu memset (&nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf[2], 0xFF, (NFC_HAL_HCI_SESSION_ID_LEN - 1)); 569a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu memset ((nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_SESSION_ID_LEN + 1), 0, (NFC_HAL_HCI_DH_NETWK_INFO_SIZE - NFC_HAL_HCI_SESSION_ID_LEN - 1)); 5705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE; 5715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_hci_netwk_info = (UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE; 572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 5755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((nfc_hal_cb.hci_cb.hci_fw_workaround) && (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_UICC)) 5765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 5775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* if NVM Type is UICC, then UICC1 will find session id mismatch when activated for patch download, 5785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen * and will remove pipes connected to DH even before DH is enabled, So DH will update NFCC 5795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen * control block by removing all dynamic pipes connected to UICC1 */ 5805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 5815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_hci_remove_dyn_pipe_to_uicc1 (); 5825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen size = NFC_HAL_HCI_DH_NETWK_INFO_SIZE; 5835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 5845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p_hci_netwk_info = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE); 585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 586e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 592a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu p = p_hci_netwk_info; 593a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* Send HCI Network ntf command using nv data */ 594a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu NCI_MSG_BLD_HDR0 (p, NCI_MT_CMD, NCI_GID_PROP); 595a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu NCI_MSG_BLD_HDR1 (p, NCI_MSG_HCI_NETWK); 596a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu UINT8_TO_STREAM (p, (UINT8) size); 597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 598a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_dm_send_nci_cmd (p_hci_netwk_info, (UINT16) (NCI_MSG_HDR_SIZE + size), nfc_hal_hci_vsc_cback); 599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 600a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_cb.hci_cb.hci_netwk_config_block = block; 6015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen} 6025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/******************************************************************************* 6045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 6055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function nfc_hal_hci_remove_dyn_pipe_to_uicc1 6065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 6075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description Prepare hci network command read from nv file removing 6085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** all pipes connected to UICC1 6095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 6105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns None 6115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** 6125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/ 6135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_hci_remove_dyn_pipe_to_uicc1 (void) 6145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{ 6155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 *p, *np; 6165c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 num_dyn_pipes = 0, new_num_dyn_pipes = 0; 6175c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 xx; 6185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen UINT8 source_host, dest_host, pipe_id; 6195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 620df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG0 ("nfc_hal_hci_remove_dyn_pipe_to_uicc1 ()"); 621df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 6225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE); 6235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen np = p; 6245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen num_dyn_pipes = *(p - 1); 6255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen for (xx = 0; xx < num_dyn_pipes; xx++,p += NFC_HAL_HCI_PIPE_INFO_SIZE) 627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 6285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen source_host = *(UINT8 *) (p); 6295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen dest_host = *(UINT8 *) (p + 1); 6305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen pipe_id = *(UINT8 *) (p + 4); 6315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ((source_host != NFC_HAL_HCI_HOST_ID_UICC1) && (dest_host != NFC_HAL_HCI_HOST_ID_UICC1)) 6335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 6345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memcpy (np, p, NFC_HAL_HCI_PIPE_INFO_SIZE); 6355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen np += NFC_HAL_HCI_PIPE_INFO_SIZE; 6365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen new_num_dyn_pipes++; 6375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 6395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memset ((UINT8 *) (np), 0, NFC_HAL_HCI_PIPE_INFO_SIZE * (20 - new_num_dyn_pipes)); 6415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 6425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Update number of pipes after removing pipes connected to UICC1 */ 6435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen p = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf + NFC_HAL_HCI_MIN_DH_NETWK_INFO_SIZE); 6445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen *(p - 1) = new_num_dyn_pipes; 645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_init_complete 650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Notify VSC initialization is complete 652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_init_complete (tHAL_NFC_STATUS status) 657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_hci_netwk_cmd; 659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 660df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG1 ("nfc_hal_hci_init_complete (): Status: [0x%02x]", status); 661df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf) 663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf - NCI_MSG_HDR_SIZE); 665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_hci_netwk_cmd); 666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = NULL; 667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) 670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_hci_netwk_cmd = (UINT8 *) (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf - NCI_MSG_HDR_SIZE); 672e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_freebuf (p_hci_netwk_cmd); 673e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.p_hci_netwk_info_buf = NULL; 674e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 675e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_IDLE); 6775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 678df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu nfc_hal_cb.p_stack_cback (HAL_NFC_POST_INIT_CPLT_EVT, status); 679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_set_next_hci_netwk_config 684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description set next hci network configuration 686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns None 688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_set_next_hci_netwk_config (UINT8 block) 691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_hci_netwk_cmd; 693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 694df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG1 ("nfc_hal_hci_set_next_hci_netwk_config (): Block: [0x%02x]", block); 695df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (block) 697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HC_F3_NV_BLOCK: 6995c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen if ( (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC1_HOST) 700df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu &&(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) 7015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen &&((!nfc_hal_cb.hci_cb.hci_fw_workaround) || (nfc_hal_cb.nvm_cb.nvm_type == NCI_SPD_NVM_TYPE_EEPROM)) ) 7025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen { 7035c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Send command to read nvram data for 0xF4 */ 7045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE); 7055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F4_NV_BLOCK); 7065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT); 7075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen break; 7085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen } 7095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG2 ("nfc_hal_hci_set_next_hci_netwk_config (): Skip send F4 HCI NETWK CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type); 710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 711e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HC_F4_NV_BLOCK: 712a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu if ( (p_nfc_hal_cfg->nfc_hal_hci_uicc_support & HAL_NFC_HCI_UICC2_HOST) 713a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu &&(nfc_hal_cb.hci_cb.p_hci_netwk_info_buf) ) 714a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu { 715a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu /* Send command to read nvram data for 0xF5 */ 716a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu memset (nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, 0, NFC_HAL_HCI_NETWK_INFO_SIZE); 717a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_info_buf, NFC_HAL_HCI_NETWK_INFO_SIZE, HC_F5_NV_BLOCK); 718a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT); 719a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu break; 720a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu } 721a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu HAL_TRACE_DEBUG2 ("nfc_hal_hci_set_next_hci_netwk_config (): Skip send F5 HCI NETWK CMD for UICC Mask: 0x%02x & NVM Type: 0x%02x", p_nfc_hal_cfg->nfc_hal_hci_uicc_support, nfc_hal_cb.nvm_cb.nvm_type); 722a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 723a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case HC_F5_NV_BLOCK: 724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_hci_netwk_cmd = (UINT8 *) GKI_getbuf (NCI_MSG_HDR_SIZE + NFC_HAL_HCI_DH_NETWK_INFO_SIZE)) == NULL) 725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 7265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer for reading hci network info from nvram"); 727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED); 728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project else 730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf = (UINT8 *) (p_hci_netwk_cmd + NCI_MSG_HDR_SIZE); 732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send command to read nvram data for 0xF2 */ 733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memset (nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf, 0, NFC_HAL_HCI_DH_NETWK_INFO_SIZE); 7345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen nfc_hal_nv_co_read ((UINT8 *) nfc_hal_cb.hci_cb.p_hci_netwk_dh_info_buf, NFC_HAL_HCI_DH_NETWK_INFO_SIZE, HC_F2_NV_BLOCK); 735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_start_quick_timer (&nfc_hal_cb.hci_cb.hci_timer, NFC_HAL_HCI_VSC_TIMEOUT_EVT, NFC_HAL_HCI_NV_READ_TIMEOUT); 736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 7395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case HC_F2_NV_BLOCK: 740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_init_complete (HAL_NFC_STATUS_OK); 741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 7445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR1 ("nfc_hal_hci_set_next_hci_netwk_config: unable to allocate buffer to send VSC 0x%02x", block); 745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Brcm initialization failed */ 746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED); 747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 753e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_hci_vsc_cback 754e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 755e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description process VS callback event from stack 756e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 757e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns none 758e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 759e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 760e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_hci_vsc_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data) 761e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 762e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 *p_ret = NULL; 763e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 status; 764e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 765e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_ret = p_data + NCI_MSG_HDR_SIZE; 766e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project status = *p_ret; 767e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 768df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu HAL_TRACE_DEBUG3 ("nfc_hal_hci_vsc_cback (): Event: [0x%02x], Data length: [0x%04x], Status: [0x%02x]", event, data_len, status); 769df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu 770e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (event != NFC_VS_HCI_NETWK_RSP) 771e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 772e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 773e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (status != HAL_NFC_STATUS_OK) 774df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu { 775e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED); 776df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu return; 777df5080d7feca9827fd0306471c54f52ecf185c22Evan Chu } 778e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 779e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project switch (nfc_hal_cb.hci_cb.hci_netwk_config_block) 780e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 781e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HC_F3_NV_BLOCK: 782e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project case HC_F4_NV_BLOCK: 783a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu case HC_F5_NV_BLOCK: 7845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen case HC_F2_NV_BLOCK: 785e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_set_next_hci_netwk_config (nfc_hal_cb.hci_cb.hci_netwk_config_block); 786e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 787e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 788e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project default: 789e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Ignore the event */ 790e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project break; 791e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 792e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 793e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 794e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 795e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 796e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function nfc_hal_nci_cmd_timeout_cback 797e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 798e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description callback function for timeout 799e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 800e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 801e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 802e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 803e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_hci_timeout_cback (void *p_tle) 804e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 805e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project TIMER_LIST_ENT *p_tlent = (TIMER_LIST_ENT *)p_tle; 806e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 8075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_DEBUG0 ("nfc_hal_hci_timeout_cback ()"); 808e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 809e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_tlent->event == NFC_HAL_HCI_VSC_TIMEOUT_EVT) 810e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 8115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR0 ("nfc_hal_hci_timeout_cback: Timeout - NFC HAL HCI BRCM Initialization Failed!"); 812e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_hci_init_complete (HAL_NFC_STATUS_FAILED); 813e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 814e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 815e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 816a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif 817a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu 818