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