1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu *  Copyright (C) 2010-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 *  Functions for handling NFC HAL NCI Transport events
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
26e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#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** Definitions
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project****************************************************************************/
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Default NFC HAL NCI port configuration  */
36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectNFC_HAL_TRANS_CFG_QUALIFIER tNFC_HAL_TRANS_CFG nfc_hal_trans_cfg =
37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HAL_SHARED_TRANSPORT_ENABLED,   /* bSharedTransport */
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USERIAL_BAUD_115200,                /* Baud rate */
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USERIAL_FC_HW                       /* Flow control */
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Control block for NFC HAL NCI transport */
44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if NFC_DYNAMIC_MEMORY == FALSE
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_HAL_CB nfc_hal_cb;
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenextern tNFC_HAL_CFG *p_nfc_hal_cfg;
49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************
50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internal function prototypes
51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project****************************************************************************/
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_userial_cback (tUSERIAL_PORT port, tUSERIAL_EVT evt, tUSERIAL_EVT_DATA *p_data);
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_handle_terminate (void);
545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void nfc_hal_main_timeout_cback (void *p_tle);
55e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_HAL_DEBUG == TRUE)
57e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectconst char * const nfc_hal_init_state_str[] =
58e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
59e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "IDLE",             /* Initialization is done                */
60e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_XTAL_SET",      /* Waiting for crystal setting rsp       */
615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    "POST_XTAL_SET",    /* Waiting for reset ntf after xtal set  */
625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    "W4_NFCC_ENABLE",   /* Waiting for reset ntf atter REG_PU up */
63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_BUILD_INFO",    /* Waiting for build info rsp            */
64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_PATCH_INFO",    /* Waiting for patch info rsp            */
65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_APP_COMPL",     /* Waiting for complete from application */
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_POST_INIT",     /* Waiting for complete of post init     */
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_CONTROL",       /* Waiting for control release           */
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "W4_PREDISC",       /* Waiting for complete of prediscover   */
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    "CLOSING"           /* Shutting down                         */
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_init
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function initializes control block for NFC HAL
78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_main_init (void)
83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Clear control block */
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    memset (&nfc_hal_cb, 0, sizeof (tNFC_HAL_CB));
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_cb.ncit_cb.nci_ctrl_size   = NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE;
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_cb.trace_level             = NFC_HAL_INITIAL_TRACE_LEVEL;
895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    nfc_hal_cb.timer.p_cback           = nfc_hal_main_timeout_cback;
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_open_transport
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Open transport and prepare for new incoming message;
97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_open_transport (void)
102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    tUSERIAL_OPEN_CFG open_cfg;
104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Initialize control block */
106e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_cb.ncit_cb.rcv_state = NFC_HAL_RCV_IDLE_ST; /* to process packet type */
107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.ncit_cb.p_rcv_msg)
109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (nfc_hal_cb.ncit_cb.p_rcv_msg);
111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* open transport */
115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    open_cfg.fmt    = (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1);
116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    open_cfg.baud   = nfc_hal_trans_cfg.userial_baud;
117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    open_cfg.fc     = nfc_hal_trans_cfg.userial_fc;
118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    open_cfg.buf    = USERIAL_BUF_BYTE;
119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    USERIAL_Open (USERIAL_NFC_PORT, &open_cfg, nfc_hal_main_userial_cback);
121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
1225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
1235c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Wait for NFCC to enable - Core reset notification */
1245c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_NFCC_ENABLE);
1255c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
1265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* NFCC Enable timeout */
1275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE,
1285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                        ((p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout)*QUICK_TIMER_TICKS_PER_SEC)/1000);
1295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
132e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
13445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Function         nfa_hal_pre_discover_done_cback
13545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
13645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Description      Pre-discovery CFG is sent.
13745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
13845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Returns          nothing
13945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
14045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu*******************************************************************************/
14145e68232b8524aca5165dca28b994ec8c11593b1Evan Chuvoid nfa_hal_pre_discover_done_cback (tNFC_HAL_NCI_EVT event, UINT16 data_len, UINT8 *p_data)
14245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu{
14345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
14445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
14545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    nfc_hal_cb.p_stack_cback (HAL_NFC_PRE_DISCOVER_CPLT_EVT, HAL_NFC_STATUS_OK);
14645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu}
14745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
14845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu/*******************************************************************************
14945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
15045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Function         nfa_hal_send_pre_discover_cfg
15145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
15245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Description      sending Pre-discovery CFG
15345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
15445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Returns          nothing
15545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
15645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu*******************************************************************************/
15745e68232b8524aca5165dca28b994ec8c11593b1Evan Chuvoid nfa_hal_send_pre_discover_cfg (void)
15845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu{
15945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    if (nfc_hal_dm_set_config (p_nfc_hal_pre_discover_cfg [0],
16045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                               &p_nfc_hal_pre_discover_cfg[1],
16145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                                nfa_hal_pre_discover_done_cback) != HAL_NFC_STATUS_OK)
16245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    {
16345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu        nfa_hal_pre_discover_done_cback(0, 0, NULL);
16445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu    }
16545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu}
16645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
16745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu/*******************************************************************************
16845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_send_error
170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      send an Error event to NFC stack
172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_main_send_error (tHAL_NFC_STATUS status)
177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Notify stack */
179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_cb.p_stack_cback(HAL_NFC_ERROR_EVT, status);
180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_userial_cback
185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      USERIAL callback for NCI transport
187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_userial_cback (tUSERIAL_PORT port, tUSERIAL_EVT evt, tUSERIAL_EVT_DATA *p_data)
192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (evt == USERIAL_RX_READY_EVT)
194e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Notify transport task of serial port event */
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_DATA_RDY);
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (evt == USERIAL_TX_DONE_EVT)
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Serial driver has finshed sending data from USERIAL_Write */
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Currently, no action is needed for this event */
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (evt == USERIAL_ERR_EVT)
204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_ERROR0 ("nfc_hal_main_userial_cback: USERIAL_ERR_EVT. Notifying NFC_TASK of transport error");
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE)
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_stop_quick_timer (&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_nci_cmd_timeout_cback ((void *)&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_send_error (HAL_NFC_STATUS_ERR_TRANSPORT);
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else if (evt == USERIAL_WAKEUP_EVT)
217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2185c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_DEBUG1 ("nfc_hal_main_userial_cback: USERIAL_WAKEUP_EVT: %d", p_data->sigs);
219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
2225c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_DEBUG1 ("nfc_hal_main_userial_cback: unhandled userial evt: %i", evt);
223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_pre_init_done
229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      notify complete of pre-initialization
231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_main_pre_init_done (tHAL_NFC_STATUS status)
236e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
2375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG1 ("nfc_hal_main_pre_init_done () status = %d", status);
238e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
239e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (status != HAL_NFC_STATUS_OK)
240e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
241e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_main_handle_terminate ();
242e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Close uart */
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        USERIAL_Close (USERIAL_NFC_PORT);
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
247e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Notify NFC Task the status of initialization */
248e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_cb.p_stack_cback (HAL_NFC_OPEN_CPLT_EVT, status);
249e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
250e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
251e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
252e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
253e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_timeout_cback
254e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      callback function for timeout
256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_timeout_cback (void *p_tle)
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    TIMER_LIST_ENT  *p_tlent = (TIMER_LIST_ENT *) p_tle;
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG0 ("nfc_hal_main_timeout_cback ()");
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    switch (p_tlent->event)
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_TTYPE_POWER_CYCLE:
269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_main_open_transport ();
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFC_HAL_TTYPE_NFCC_ENABLE:
2735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* NFCC should have enabled now, notify transport openned */
2745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_dm_pre_init_nfcc ();
2755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        break;
2765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
2785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_DEBUG1 ("nfc_hal_main_timeout_cback: unhandled timer event (0x%04x)", p_tlent->event);
279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        break;
280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_handle_terminate
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle NFI transport shutdown
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_handle_terminate (void)
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HDR *p_msg;
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* dequeue and free buffer */
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.ncit_cb.p_pend_cmd != NULL)
298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (nfc_hal_cb.ncit_cb.p_pend_cmd);
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.ncit_cb.p_pend_cmd = NULL;
301e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Free unsent nfc rx buffer */
304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.ncit_cb.p_rcv_msg)
305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (nfc_hal_cb.ncit_cb.p_rcv_msg);
307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.ncit_cb.p_rcv_msg  = NULL;
308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Free buffer for pending fragmented response/notification */
311e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.ncit_cb.p_frag_msg)
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (nfc_hal_cb.ncit_cb.p_frag_msg);
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.ncit_cb.p_frag_msg = NULL;
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Free buffers in the tx mbox */
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while ((p_msg = (NFC_HDR *) GKI_read_mbox (NFC_HAL_TASK_MBOX)) != NULL)
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_msg);
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
323e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* notify closing transport */
324e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    nfc_hal_dm_shutting_down_nfcc ();
325e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
327e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
328e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
329e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_start_quick_timer
330e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
331e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Start a timer for the specified amount of time.
332e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NOTE: The timeout resolution depends on including modules.
333e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  QUICK_TIMER_TICKS_PER_SEC should be used to convert from
334e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  time to ticks.
335e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
336e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
337e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
338e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
339e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
340e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_main_start_quick_timer (TIMER_LIST_ENT *p_tle, UINT16 type, UINT32 timeout)
341e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
342e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HDR *p_msg;
343e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
344e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if timer list is currently empty, start periodic GKI timer */
345e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.quick_timer_queue.p_first == NULL)
346e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
347e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* if timer starts on other than NCIT task (script wrapper) */
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if(GKI_get_taskid () != NFC_HAL_TASK)
349e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
350e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* post event to start timer in NCIT task */
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            if ((p_msg = (NFC_HDR *) GKI_getbuf (NFC_HDR_SIZE)) != NULL)
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                p_msg->event = NFC_HAL_EVT_TO_START_QUICK_TIMER;
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        else
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            GKI_start_timer (NFC_HAL_QUICK_TIMER_ID, ((GKI_SECS_TO_TICKS (1) / QUICK_TIMER_TICKS_PER_SEC)), TRUE);
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_remove_from_timer_list (&nfc_hal_cb.quick_timer_queue, p_tle);
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_tle->event = type;
366e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    p_tle->ticks = timeout; /* Save the number of ticks for the timer */
367e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
368e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_add_to_timer_list (&nfc_hal_cb.quick_timer_queue, p_tle);
369e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
370e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
371e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
372e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
373e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_stop_quick_timer
374e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
375e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Stop a timer.
376e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
377e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
378e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
379e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
380e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid nfc_hal_main_stop_quick_timer (TIMER_LIST_ENT *p_tle)
381e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
382e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_remove_from_timer_list (&nfc_hal_cb.quick_timer_queue, p_tle);
383e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if timer list is empty stop periodic GKI timer */
385e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.quick_timer_queue.p_first == NULL)
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
387e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_stop_timer (NFC_HAL_QUICK_TIMER_ID);
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
389e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
390e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
392e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_process_quick_timer_evt
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process quick timer event
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_process_quick_timer_evt (void)
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    TIMER_LIST_ENT  *p_tle;
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
404e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_update_timer_list (&nfc_hal_cb.quick_timer_queue, 1);
405e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
406e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while ((nfc_hal_cb.quick_timer_queue.p_first) && (!nfc_hal_cb.quick_timer_queue.p_first->ticks))
407e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
408e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        p_tle = nfc_hal_cb.quick_timer_queue.p_first;
409e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_remove_from_timer_list (&nfc_hal_cb.quick_timer_queue, p_tle);
410e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (p_tle->p_cback)
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            (*p_tle->p_cback) (p_tle);
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* if timer list is empty stop periodic GKI timer */
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (nfc_hal_cb.quick_timer_queue.p_first == NULL)
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_stop_timer (NFC_HAL_QUICK_TIMER_ID);
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
422e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
423e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
425e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
4265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_send_nci_msg_to_nfc_task
4275c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4285c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function is called to send nci message to nfc task
4295c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          void
4315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
4335c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenvoid nfc_hal_send_nci_msg_to_nfc_task (NFC_HDR * p_msg)
4345c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
4355c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifdef NFC_HAL_SHARED_GKI
4365c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Using shared NFC/HAL GKI resources - send message buffer directly to NFC_TASK for processing */
4375c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    p_msg->event = BT_EVT_TO_NFC_NCI;
4385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    GKI_send_msg (NFC_TASK, NFC_MBOX_ID, p_msg);
4395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#else
4405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Send NCI message to the stack */
4415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    nfc_hal_cb.p_data_cback (p_msg->len, (UINT8 *) ((p_msg + 1)
4425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                 + p_msg->offset));
4435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    GKI_freebuf(p_msg);
4445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
4455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
4465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
4485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_send_credit_ntf_for_cid
4505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function is called to send credit ntf
4525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  for the specified connection id to nfc task
4535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          void
4555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
4575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenenstatic void nfc_hal_send_credit_ntf_for_cid (UINT8 cid)
4585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen{
4595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    NFC_HDR  *p_msg;
4605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT8    *p, *ps;
4615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    /* Start of new message. Allocate a buffer for message */
4635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    if ((p_msg = (NFC_HDR *) GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL)
4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Initialize NFC_HDR */
4665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->len    = NCI_DATA_HDR_SIZE + 0x03;
4675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->event  = 0;
4685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->offset = 0;
4695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p_msg->layer_specific = 0;
4705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        p = (UINT8 *) (p_msg + 1) + p_msg->offset;
4725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        ps = p;
4735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        NCI_MSG_BLD_HDR0(p, NCI_MT_NTF, NCI_GID_CORE);
4745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        NCI_MSG_BLD_HDR1(p, NCI_MSG_CORE_CONN_CREDITS);
4755c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        UINT8_TO_STREAM (p, 0x03);
4765c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4775c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Number of credit entries */
4785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        *p++ = 0x01;
4795c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Connection id of the credit ntf */
4805c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        *p++ = cid;
4815c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* Number of credits */
4825c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        *p = 0x01;
4835c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifdef DISP_NCI
4845c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        DISP_NCI (ps, (UINT16) p_msg->len, TRUE);
4855c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
4865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        nfc_hal_send_nci_msg_to_nfc_task (p_msg);
4875c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
4885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    else
4895c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    {
4905c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        HAL_TRACE_ERROR0 ("Unable to allocate buffer for Sending credit ntf to stack");
4915c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    }
4925c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
4935c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
4955c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
496e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_send_message
497e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
498e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is calledto send an NCI message.
499e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
500e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
501e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
502e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
503e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectstatic void nfc_hal_main_send_message (NFC_HDR *p_msg)
504e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
505a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE))
506a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8   cid, pbf;
5075c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    UINT16  data_len;
508a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif
509a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT8   *ps, *pp;
510a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu    UINT16  len = p_msg->len;
511e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifdef DISP_NCI
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8   delta;
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG1 ("nfc_hal_main_send_message() ls:0x%x", p_msg->layer_specific);
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (  (p_msg->layer_specific == NFC_HAL_WAIT_RSP_CMD)
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ||(p_msg->layer_specific == NFC_HAL_WAIT_RSP_VSC)  )
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
519e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nci_send_cmd (p_msg);
520e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
521e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    else
522e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
523e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NFC task has fragmented the data packet to the appropriate size
524e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project         * and data credit is available; just send it */
525e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* add NCI packet type in front of message */
527e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_nci_add_nfc_pkt_type (p_msg);
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* send this packet to transport */
530e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        ps = (UINT8 *) (p_msg + 1) + p_msg->offset;
5315c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        pp = ps + 1;
532e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifdef DISP_NCI
533e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        delta = p_msg->len - len;
534e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        DISP_NCI (ps + delta, (UINT16) (p_msg->len - delta), FALSE);
535e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
536a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
537a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#if (defined(NFC_HAL_HCI_INCLUDED) && (NFC_HAL_HCI_INCLUDED == TRUE))
5385c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfc_hal_cb.hci_cb.hcp_conn_id)
5395c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
5405c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            NCI_DATA_PRS_HDR(pp, pbf, cid, data_len);
5415c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (cid == nfc_hal_cb.hci_cb.hcp_conn_id)
5425c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
5435c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                if (nfc_hal_hci_handle_hcp_pkt_to_hc (pp))
5445c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                {
5455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    HAL_TRACE_DEBUG0 ("nfc_hal_main_send_message() - Drop rsp to Fake cmd, Fake credit ntf");
5465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    GKI_freebuf (p_msg);
5475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    nfc_hal_send_credit_ntf_for_cid (cid);
5485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                    return;
5495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                }
5505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
5515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5525c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
553a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif
554a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
5555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        /* check low power mode state */
5565c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        if (nfc_hal_dm_power_mode_execute (NFC_HAL_LP_TX_DATA_EVT))
5575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
5585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            USERIAL_Write (USERIAL_NFC_PORT, ps, p_msg->len);
5595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
5605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        else
5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        {
5625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_ERROR0 ("nfc_hal_main_send_message(): drop data in low power mode");
5635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
564e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        GKI_freebuf (p_msg);
565e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
566e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
567e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
568e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
569e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
570e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_task
571e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      NFC HAL NCI transport event processing task
573e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
574e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          0
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 nfc_hal_main_task (UINT32 param)
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT16   event;
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    byte;
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    num_interfaces;
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    UINT8    *p;
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    NFC_HDR  *p_msg;
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    BOOLEAN  free_msg;
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5865c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG0 ("NFC_HAL_TASK started");
587e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
588e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    /* Main loop */
589e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    while (TRUE)
590e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    {
591e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        event = GKI_wait (0xFFFF, 0);
592e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
593e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Handle NFC_HAL_TASK_EVT_INITIALIZE (for initializing NCI transport) */
594e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event & NFC_HAL_TASK_EVT_INITIALIZE)
595e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
5965c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_DEBUG0 ("NFC_HAL_TASK got NFC_HAL_TASK_EVT_INITIALIZE signal. Opening NFC transport...");
597e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
598e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_open_transport ();
599e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
600e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
601e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check for terminate event */
602e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event & NFC_HAL_TASK_EVT_TERMINATE)
603e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
6045c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_DEBUG0 ("NFC_HAL_TASK got NFC_HAL_TASK_EVT_TERMINATE");
605e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_handle_terminate ();
606e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
607e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Close uart */
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            USERIAL_Close (USERIAL_NFC_PORT);
609e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            if (nfc_hal_cb.p_stack_cback)
6115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            {
6125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_cb.p_stack_cback (HAL_NFC_CLOSE_CPLT_EVT, HAL_NFC_STATUS_OK);
6135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                nfc_hal_cb.p_stack_cback = NULL;
6145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            }
615e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            continue;
616e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
618e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Check for power cycle event */
619e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event & NFC_HAL_TASK_EVT_POWER_CYCLE)
620e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
6215c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen            HAL_TRACE_DEBUG0 ("NFC_HAL_TASK got NFC_HAL_TASK_EVT_POWER_CYCLE");
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_handle_terminate ();
623e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
624e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* Close uart */
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            USERIAL_Close (USERIAL_NFC_PORT);
626e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
627e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            /* power cycle timeout */
628e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_start_quick_timer (&nfc_hal_cb.timer, NFC_HAL_TTYPE_POWER_CYCLE,
629e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                                            (NFC_HAL_POWER_CYCLE_DELAY*QUICK_TIMER_TICKS_PER_SEC)/1000);
630e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            continue;
631e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
633e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* NCI message ready to be sent to NFCC */
634e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event & NFC_HAL_TASK_EVT_MBOX)
635e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
636e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while ((p_msg = (NFC_HDR *) GKI_read_mbox (NFC_HAL_TASK_MBOX)) != NULL)
637e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
638e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                free_msg = TRUE;
639e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                switch (p_msg->event & NFC_EVT_MASK)
640e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
641e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                case NFC_HAL_EVT_TO_NFC_NCI:
642e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_main_send_message (p_msg);
643e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* do not free buffer. NCI VS code may keep it for processing later */
644e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    free_msg = FALSE;
645e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
646e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
647e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                case NFC_HAL_EVT_POST_CORE_RESET:
648e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    NFC_HAL_SET_INIT_STATE (NFC_HAL_INIT_STATE_W4_POST_INIT_DONE);
649e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
650e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* set NCI Control packet size from CORE_INIT_RSP */
651e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p = (UINT8 *) (p_msg + 1) + p_msg->offset + NCI_MSG_HDR_SIZE;
652e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p += 5;
653e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    STREAM_TO_UINT8 (num_interfaces, p);
654e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    p += (num_interfaces + 3);
655e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_cb.ncit_cb.nci_ctrl_size = *p;
656e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
657e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* start post initialization */
658e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_LPTD;
659e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_cb.dev_cb.next_startup_vsc = 1;
660e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
661e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_dm_config_nfcc ();
662e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
663e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
664e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                case NFC_HAL_EVT_TO_START_QUICK_TIMER:
665e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    GKI_start_timer (NFC_HAL_QUICK_TIMER_ID, ((GKI_SECS_TO_TICKS (1) / QUICK_TIMER_TICKS_PER_SEC)), TRUE);
666e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
667e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
668e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                case NFC_HAL_EVT_HCI:
669e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_hci_evt_hdlr ((tNFC_HAL_HCI_EVENT_DATA *) p_msg);
670e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
671e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
67245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                case NFC_HAL_EVT_PRE_DISCOVER:
67345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE);
67445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                    nfa_hal_send_pre_discover_cfg ();
67545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu                    break;
676e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
677e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                case NFC_HAL_EVT_CONTROL_GRANTED:
678e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_dm_send_pend_cmd ();
679e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
680e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
681e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                default:
682e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
685e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (free_msg)
686e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    GKI_freebuf (p_msg);
687e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            }
688e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
689e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
690e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Data waiting to be read from serial port */
691e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event & NFC_HAL_TASK_EVT_DATA_RDY)
692e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
693e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            while (TRUE)
694e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            {
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                /* Read one byte to see if there is anything waiting to be read */
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (USERIAL_Read (USERIAL_NFC_PORT, &byte, 1) == 0)
697e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
698e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    break;
699e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
700e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
701e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                if (nfc_hal_nci_receive_msg (byte))
702e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                {
703e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    /* complete of receiving NCI message */
704e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    nfc_hal_nci_assemble_nci_msg ();
705e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    if (nfc_hal_cb.ncit_cb.p_rcv_msg)
706e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    {
707e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        if (nfc_hal_nci_preproc_rx_nci_msg (nfc_hal_cb.ncit_cb.p_rcv_msg))
708e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        {
709e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                            /* Send NCI message to the stack */
7105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                            nfc_hal_send_nci_msg_to_nfc_task (nfc_hal_cb.ncit_cb.p_rcv_msg);
7115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                        }
7125c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                        else
7135c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                        {
7145c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                            if (nfc_hal_cb.ncit_cb.p_rcv_msg)
7155c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen                                GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
716e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        }
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                        nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
718e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                    }
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project                }
720e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            } /* while (TRUE) */
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
722e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
723e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        /* Process quick timer tick */
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        if (event & NFC_HAL_QUICK_TIMER_EVT_MASK)
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        {
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project            nfc_hal_main_process_quick_timer_evt ();
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7305c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    HAL_TRACE_DEBUG0 ("nfc_hal_main_task terminated");
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    GKI_exit_task (GKI_get_taskid ());
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return 0;
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
736e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
737e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcSetTraceLevel
739e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sets the trace level for HAL.  If called with
741e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  a value of 0xFF, it simply returns the current trace level.
742e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
743e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          The new or current trace level
744e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
745e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
746e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT8 HAL_NfcSetTraceLevel (UINT8 new_level)
747e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{
748e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    if (new_level != 0xFF)
749e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        nfc_hal_cb.trace_level = new_level;
750e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
751e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    return (nfc_hal_cb.trace_level);
752e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
753