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