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
19e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************
20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *  Functions for handling NFC HAL NCI Transport events
22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project *
23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/
24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include <string.h>
25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h"
265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include "nfc_hal_post_reset.h"
27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "upio.h"
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi#include "userial.h"
29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************
31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Definitions
32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project****************************************************************************/
33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Default NFC HAL NCI port configuration  */
356fca02d5010de7bd31d83b853c32138021da5f29Ruchi KandoiNFC_HAL_TRANS_CFG_QUALIFIER tNFC_HAL_TRANS_CFG nfc_hal_trans_cfg = {
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFC_HAL_SHARED_TRANSPORT_ENABLED, /* bSharedTransport */
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    USERIAL_BAUD_115200,              /* Baud rate */
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    USERIAL_FC_HW                     /* Flow control */
39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/* Control block for NFC HAL NCI transport */
42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjecttNFC_HAL_CB nfc_hal_cb;
43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiextern tNFC_HAL_CFG* p_nfc_hal_cfg;
45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************
46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Internal function prototypes
47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project****************************************************************************/
486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_userial_cback(tUSERIAL_PORT port, tUSERIAL_EVT evt,
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                       tUSERIAL_EVT_DATA* p_data);
506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_handle_terminate(void);
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_timeout_cback(void* p_tle);
52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#if (NFC_HAL_DEBUG == TRUE)
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiconst char* const nfc_hal_init_state_str[] = {
556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "IDLE",           /* Initialization is done                */
566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_XTAL_SET",    /* Waiting for crystal setting rsp       */
576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "POST_XTAL_SET",  /* Waiting for reset ntf after xtal set  */
586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_NFCC_ENABLE", /* Waiting for reset ntf atter REG_PU up */
596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_BUILD_INFO",  /* Waiting for build info rsp            */
606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_PATCH_INFO",  /* Waiting for patch info rsp            */
616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_APP_COMPL",   /* Waiting for complete from application */
626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_POST_INIT",   /* Waiting for complete of post init     */
636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_CONTROL",     /* Waiting for control release           */
646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "W4_PREDISC",     /* Waiting for complete of prediscover   */
656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    "CLOSING"         /* Shutting down                         */
66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project};
67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
71e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_init
72e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function initializes control block for NFC HAL
74e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_init(void) {
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Clear control block */
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  memset(&nfc_hal_cb, 0, sizeof(tNFC_HAL_CB));
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.ncit_cb.nci_ctrl_size = NFC_HAL_NCI_INIT_CTRL_PAYLOAD_SIZE;
836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.trace_level = NFC_HAL_INITIAL_TRACE_LEVEL;
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.timer.p_cback = nfc_hal_main_timeout_cback;
85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
88e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_open_transport
90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Open transport and prepare for new incoming message;
92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_open_transport(void) {
976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tUSERIAL_OPEN_CFG open_cfg;
986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Initialize control block */
1006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.ncit_cb.rcv_state =
1016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NFC_HAL_RCV_IDLE_ST; /* to process packet type */
1026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
1046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
1056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
1066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
1076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* open transport */
1096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  open_cfg.fmt =
1106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (USERIAL_DATABITS_8 | USERIAL_PARITY_NONE | USERIAL_STOPBITS_1);
1116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  open_cfg.baud = nfc_hal_trans_cfg.userial_baud;
1126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  open_cfg.fc = nfc_hal_trans_cfg.userial_fc;
1136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  open_cfg.buf = USERIAL_BUF_BYTE;
1146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  USERIAL_Open(USERIAL_NFC_PORT, &open_cfg, nfc_hal_main_userial_cback);
1166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  {
1186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Wait for NFCC to enable - Core reset notification */
1196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_NFCC_ENABLE);
1206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NFCC Enable timeout */
1226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_main_start_quick_timer(
1236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        &nfc_hal_cb.timer, NFC_HAL_TTYPE_NFCC_ENABLE,
1246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        ((p_nfc_hal_cfg->nfc_hal_nfcc_enable_timeout) *
1256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         QUICK_TIMER_TICKS_PER_SEC) /
1266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            1000);
1276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
132bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu** Function         nfc_hal_main_close
133bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
134bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu** Description      Check and shutdown NFCC
135bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
136bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu** Returns          None
137bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
138bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu*******************************************************************************/
1396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_close(void) {
1406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  tHAL_NFC_CBACK* p_stack_cback_temp;
1416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((nfc_hal_cb.dev_cb.initializing_state !=
1436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi       NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF) &&
1446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (nfc_hal_cb.hal_flags & NFC_HAL_FLAGS_NEED_DISABLE_VSC)) {
1456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_cb.dev_cb.initializing_state = NFC_HAL_INIT_STATE_W4_NFCC_TURN_OFF;
1466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_dm_set_power_level_zero();
1476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
1486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_main_handle_terminate();
1496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Close uart */
1516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    USERIAL_Close(USERIAL_NFC_PORT);
1526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
1536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfc_hal_cb.p_stack_cback) {
1546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_stack_cback_temp = nfc_hal_cb.p_stack_cback;
1556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_cb.p_stack_cback = NULL;
1566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      p_stack_cback_temp(HAL_NFC_CLOSE_CPLT_EVT, HAL_NFC_STATUS_OK);
157bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu    }
1586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
159bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu}
160bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu
161bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu/*******************************************************************************
162bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
16345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Function         nfa_hal_pre_discover_done_cback
16445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
16545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Description      Pre-discovery CFG is sent.
16645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
16745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Returns          nothing
16845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
16945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu*******************************************************************************/
1706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hal_pre_discover_done_cback(tNFC_HAL_NCI_EVT event, uint16_t data_len,
1716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                     uint8_t* p_data) {
1726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_IDLE);
1736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
1746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.p_stack_cback(HAL_NFC_PRE_DISCOVER_CPLT_EVT, HAL_NFC_STATUS_OK);
17545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu}
17645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
17745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu/*******************************************************************************
17845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
17945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Function         nfa_hal_send_pre_discover_cfg
18045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
18145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Description      sending Pre-discovery CFG
18245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
18345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu** Returns          nothing
18445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
18545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu*******************************************************************************/
1866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfa_hal_send_pre_discover_cfg(void) {
1876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_dm_set_config(
1886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_nfc_hal_pre_discover_cfg[0], &p_nfc_hal_pre_discover_cfg[1],
1896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfa_hal_pre_discover_done_cback) != HAL_NFC_STATUS_OK) {
1906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfa_hal_pre_discover_done_cback(0, 0, NULL);
1916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
19245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu}
19345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu
19445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu/*******************************************************************************
19545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu**
196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_send_error
197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
198e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      send an Error event to NFC stack
199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_send_error(tHAL_NFC_STATUS status) {
2046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify stack */
2056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.p_stack_cback(HAL_NFC_ERROR_EVT, status);
206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_userial_cback
211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      USERIAL callback for NCI transport
213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2176fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_userial_cback(tUSERIAL_PORT port, tUSERIAL_EVT evt,
2186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                       tUSERIAL_EVT_DATA* p_data) {
2196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (evt == USERIAL_RX_READY_EVT) {
2206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Notify transport task of serial port event */
2216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_send_event(NFC_HAL_TASK, NFC_HAL_TASK_EVT_DATA_RDY);
2226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (evt == USERIAL_TX_DONE_EVT) {
2236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Serial driver has finshed sending data from USERIAL_Write */
2246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Currently, no action is needed for this event */
2256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (evt == USERIAL_ERR_EVT) {
2266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_TRACE_ERROR0(
2276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "nfc_hal_main_userial_cback: USERIAL_ERR_EVT. Notifying NFC_TASK of "
2286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "transport error");
2296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfc_hal_cb.ncit_cb.nci_wait_rsp != NFC_HAL_WAIT_RSP_NONE) {
2306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_stop_quick_timer(&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
2316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_nci_cmd_timeout_cback(
2326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (void*)&nfc_hal_cb.ncit_cb.nci_wait_rsp_timer);
2336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
2346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_send_error(HAL_NFC_STATUS_ERR_TRANSPORT);
235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
2366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else if (evt == USERIAL_WAKEUP_EVT) {
2376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_TRACE_DEBUG1("nfc_hal_main_userial_cback: USERIAL_WAKEUP_EVT: %d",
2386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     p_data->sigs);
2396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
2406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_TRACE_DEBUG1("nfc_hal_main_userial_cback: unhandled userial evt: %i",
2416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                     evt);
2426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
243e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
244e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
245e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
246e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
247bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu** Function         nfc_hal_main_exit_op_done
248bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
249bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu** Description      handle completion of HAL exit operation
250bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
251bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu** Returns          nothing
252bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
253bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu*******************************************************************************/
2546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_exit_op_done(tNFC_HAL_NCI_EVT event, uint16_t data_len,
2556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                               uint8_t* p_data) {
2566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_main_close();
257bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu}
258bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu
259bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu/*******************************************************************************
260bc2e8f4efbc9ae33e0dffa68a2b2f11634eabda7Evan Chu**
261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_pre_init_done
262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      notify complete of pre-initialization
264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_pre_init_done(tHAL_NFC_STATUS status) {
2696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_TRACE_DEBUG1("nfc_hal_main_pre_init_done () status = %d", status);
270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (status != HAL_NFC_STATUS_OK) {
2726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_main_handle_terminate();
273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Close uart */
2756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    USERIAL_Close(USERIAL_NFC_PORT);
2766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Notify NFC Task the status of initialization */
2796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.p_stack_cback(HAL_NFC_OPEN_CPLT_EVT, status);
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** Function         nfc_hal_main_timeout_cback
285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      callback function for timeout
287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
2916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_timeout_cback(void* p_tle) {
2926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  TIMER_LIST_ENT* p_tlent = (TIMER_LIST_ENT*)p_tle;
293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_TRACE_DEBUG0("nfc_hal_main_timeout_cback ()");
295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
2966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  switch (p_tlent->event) {
297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    case NFC_HAL_TTYPE_POWER_CYCLE:
2986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_open_transport();
2996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen    case NFC_HAL_TTYPE_NFCC_ENABLE:
3026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* NFCC should have enabled now, notify transport openned */
3036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_dm_pre_init_nfcc();
3046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3055c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    default:
3076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_TRACE_DEBUG1(
3086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "nfc_hal_main_timeout_cback: unhandled timer event (0x%04x)",
3096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          p_tlent->event);
3106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      break;
3116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
312e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
313e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
314e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
315e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
316e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_handle_terminate
317e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
318e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Handle NFI transport shutdown
319e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
320e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          nothing
321e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
322e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_handle_terminate(void) {
3246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_msg;
3256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* dequeue and free buffer */
3276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.ncit_cb.p_pend_cmd != NULL) {
3286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(nfc_hal_cb.ncit_cb.p_pend_cmd);
3296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_cb.ncit_cb.p_pend_cmd = NULL;
3306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Free unsent nfc rx buffer */
3336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
3346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
3356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
3366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Free buffer for pending fragmented response/notification */
3396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.ncit_cb.p_frag_msg) {
3406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(nfc_hal_cb.ncit_cb.p_frag_msg);
3416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_cb.ncit_cb.p_frag_msg = NULL;
3426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
3436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Free buffers in the tx mbox */
3456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  while ((p_msg = (NFC_HDR*)GKI_read_mbox(NFC_HAL_TASK_MBOX)) != NULL) {
3466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_msg);
3476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
348e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* notify closing transport */
3506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_dm_shutting_down_nfcc();
351e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
352e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
353e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
354e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
355e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_start_quick_timer
356e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
357e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Start a timer for the specified amount of time.
358e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  NOTE: The timeout resolution depends on including modules.
359e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  QUICK_TIMER_TICKS_PER_SEC should be used to convert from
360e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  time to ticks.
361e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
362e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
363e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
364e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
365e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
3666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_start_quick_timer(TIMER_LIST_ENT* p_tle, uint16_t type,
3676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                                    uint32_t timeout) {
3686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_msg;
3696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
3706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if timer list is currently empty, start periodic GKI timer */
3716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.quick_timer_queue.p_first == NULL) {
3726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* if timer starts on other than NCIT task (script wrapper) */
3736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (GKI_get_taskid() != NFC_HAL_TASK) {
3746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* post event to start timer in NCIT task */
3750c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      p_msg = (NFC_HDR*)GKI_getbuf(NFC_HDR_SIZE);
3760c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi      if (p_msg != NULL) {
3776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        p_msg->event = NFC_HAL_EVT_TO_START_QUICK_TIMER;
3786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        GKI_send_msg(NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg);
3796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
3806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
3816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      GKI_start_timer(NFC_HAL_QUICK_TIMER_ID,
3826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      ((GKI_SECS_TO_TICKS(1) / QUICK_TIMER_TICKS_PER_SEC)),
3836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                      true);
384e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
3856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
386e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_remove_from_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
388e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_tle->event = type;
3906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_tle->ticks = timeout; /* Save the number of ticks for the timer */
391e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
3926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_add_to_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
393e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
394e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
395e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
396e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
397e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_stop_quick_timer
398e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
399e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Stop a timer.
400e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
401e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
402e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
403e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_main_stop_quick_timer(TIMER_LIST_ENT* p_tle) {
4056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_remove_from_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
4066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if timer list is empty stop periodic GKI timer */
4086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.quick_timer_queue.p_first == NULL) {
4096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_stop_timer(NFC_HAL_QUICK_TIMER_ID);
4106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
411e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
412e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
413e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
414e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
415e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_process_quick_timer_evt
416e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
417e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      Process quick timer event
418e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
419e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
420e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
421e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
4226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_process_quick_timer_evt(void) {
4236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  TIMER_LIST_ENT* p_tle;
424e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_update_timer_list(&nfc_hal_cb.quick_timer_queue, 1);
426e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  while ((nfc_hal_cb.quick_timer_queue.p_first) &&
4286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi         (!nfc_hal_cb.quick_timer_queue.p_first->ticks)) {
4296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_tle = nfc_hal_cb.quick_timer_queue.p_first;
4306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_remove_from_timer_list(&nfc_hal_cb.quick_timer_queue, p_tle);
431e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (p_tle->p_cback) {
4336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (*p_tle->p_cback)(p_tle);
434e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
4356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
436e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
4376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* if timer list is empty stop periodic GKI timer */
4386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (nfc_hal_cb.quick_timer_queue.p_first == NULL) {
4396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_stop_timer(NFC_HAL_QUICK_TIMER_ID);
4406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
441e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
442e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
443e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
444e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
4455c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_send_nci_msg_to_nfc_task
4465c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4475c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function is called to send nci message to nfc task
4485c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4495c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          void
4505c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4515c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
4526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoivoid nfc_hal_send_nci_msg_to_nfc_task(NFC_HDR* p_msg) {
4535c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifdef NFC_HAL_SHARED_GKI
4546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Using shared NFC/HAL GKI resources - send message buffer directly to
4556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi   * NFC_TASK for processing */
4566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  p_msg->event = BT_EVT_TO_NFC_NCI;
4576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_send_msg(NFC_TASK, NFC_MBOX_ID, p_msg);
4585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#else
4596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Send NCI message to the stack */
4606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  nfc_hal_cb.p_data_cback(p_msg->len, (uint8_t*)((p_msg + 1) + p_msg->offset));
4616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_freebuf(p_msg);
4625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
4635c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
4645c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
4655c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
4665c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4675c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Function         nfc_hal_send_credit_ntf_for_cid
4685c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4695c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Description      This function is called to send credit ntf
4705c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**                  for the specified connection id to nfc task
4715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen** Returns          void
4735c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
4745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen*******************************************************************************/
4756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_send_credit_ntf_for_cid(uint8_t cid) {
4766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_msg;
4776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *p, *ps;
4786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Start of new message. Allocate a buffer for message */
4800c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  p_msg = (NFC_HDR*)GKI_getpoolbuf(NFC_HAL_NCI_POOL_ID);
4810c515ae1d2edf9202878a7ac7bcbf195333643e5Ruchi Kandoi  if (p_msg != NULL) {
4826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Initialize NFC_HDR */
4836fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_msg->len = NCI_DATA_HDR_SIZE + 0x03;
4846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_msg->event = 0;
4856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_msg->offset = 0;
4866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p_msg->layer_specific = 0;
4876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    p = (uint8_t*)(p_msg + 1) + p_msg->offset;
4896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ps = p;
4906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NCI_MSG_BLD_HDR0(p, NCI_MT_NTF, NCI_GID_CORE);
4916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NCI_MSG_BLD_HDR1(p, NCI_MSG_CORE_CONN_CREDITS);
4926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    UINT8_TO_STREAM(p, 0x03);
4936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
4946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Number of credit entries */
4956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p++ = 0x01;
4966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Connection id of the credit ntf */
4976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p++ = cid;
4986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Number of credits */
4996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    *p = 0x01;
5005c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifdef DISP_NCI
5016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    DISP_NCI(ps, (uint16_t)p_msg->len, true);
5025c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif
5036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_send_nci_msg_to_nfc_task(p_msg);
5046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
5056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    HAL_TRACE_ERROR0(
5066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        "Unable to allocate buffer for Sending credit ntf to stack");
5076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
5085c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen}
5095c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen
5105c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen/*******************************************************************************
5115c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen**
512e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_send_message
513e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
514e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function is calledto send an NCI message.
515e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
516e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          void
517e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
518e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic void nfc_hal_main_send_message(NFC_HDR* p_msg) {
520303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (NFC_HAL_HCI_INCLUDED == TRUE)
5216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t cid, pbf;
5226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t data_len;
523a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif
5246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t *ps, *pp;
5256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t len = p_msg->len;
526e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifdef DISP_NCI
5276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t delta;
528e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
529e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
5306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_TRACE_DEBUG1("nfc_hal_main_send_message() ls:0x%x",
5316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                   p_msg->layer_specific);
5326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((p_msg->layer_specific == NFC_HAL_WAIT_RSP_CMD) ||
5336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      (p_msg->layer_specific == NFC_HAL_WAIT_RSP_VSC)) {
5346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_nci_send_cmd(p_msg);
5356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
5366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NFC task has fragmented the data packet to the appropriate size
5376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     * and data credit is available; just send it */
5386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* add NCI packet type in front of message */
5406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    nfc_hal_nci_add_nfc_pkt_type(p_msg);
5416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* send this packet to transport */
5436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    ps = (uint8_t*)(p_msg + 1) + p_msg->offset;
5446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    pp = ps + 1;
545e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#ifdef DISP_NCI
5466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    delta = p_msg->len - len;
5476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    DISP_NCI(ps + delta, (uint16_t)(p_msg->len - delta), false);
548e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#endif
549a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
550303fec1d79b7ac30a09713e5db9fff299f7227fbRuchi Kandoi#if (NFC_HAL_HCI_INCLUDED == TRUE)
5516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfc_hal_cb.hci_cb.hcp_conn_id) {
5526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      NCI_DATA_PRS_HDR(pp, pbf, cid, data_len);
5536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      if (cid == nfc_hal_cb.hci_cb.hcp_conn_id) {
5546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (nfc_hal_hci_handle_hcp_pkt_to_hc(pp)) {
5556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          HAL_TRACE_DEBUG0(
5566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              "nfc_hal_main_send_message() - Drop rsp to Fake cmd, Fake credit "
5576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              "ntf");
5586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          GKI_freebuf(p_msg);
5596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfc_hal_send_credit_ntf_for_cid(cid);
5606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          return;
5615c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen        }
5626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
5636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
564a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu#endif
565a24be4f06674b2707b57904deaa0dff5a95823bdEvan Chu
5666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* check low power mode state */
5676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (nfc_hal_dm_power_mode_execute(NFC_HAL_LP_TX_DATA_EVT)) {
5686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      USERIAL_Write(USERIAL_NFC_PORT, ps, p_msg->len);
5696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    } else {
5706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_TRACE_ERROR0(
5716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "nfc_hal_main_send_message(): drop data in low power mode");
572e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
5736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    GKI_freebuf(p_msg);
5746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
575e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
576e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
577e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
578e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
579e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         nfc_hal_main_task
580e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
581e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      NFC HAL NCI transport event processing task
582e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
583e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          0
584e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
585e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
5866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint32_t nfc_hal_main_task(uint32_t param) {
5876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t event;
5886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t byte;
5896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t num_interfaces;
5906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint8_t* p;
5916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  NFC_HDR* p_msg;
5926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  bool free_msg;
5936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_TRACE_DEBUG0("NFC_HAL_TASK started");
5956fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
5966fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  /* Main loop */
5976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  while (true) {
5986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    event = GKI_wait(0xFFFF, 0);
5996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Handle NFC_HAL_TASK_EVT_INITIALIZE (for initializing NCI transport) */
6016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event & NFC_HAL_TASK_EVT_INITIALIZE) {
6026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_TRACE_DEBUG0(
6036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "NFC_HAL_TASK got NFC_HAL_TASK_EVT_INITIALIZE signal. Opening NFC "
6046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          "transport...");
6056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_open_transport();
6076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
608e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Check for terminate event */
6106fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event & NFC_HAL_TASK_EVT_TERMINATE) {
6116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_TRACE_DEBUG0("NFC_HAL_TASK got NFC_HAL_TASK_EVT_TERMINATE");
612e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_close();
614e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      continue;
6166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
617e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Check for power cycle event */
6196fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event & NFC_HAL_TASK_EVT_POWER_CYCLE) {
6206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      HAL_TRACE_DEBUG0("NFC_HAL_TASK got NFC_HAL_TASK_EVT_POWER_CYCLE");
6216fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_handle_terminate();
622e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* Close uart */
6246fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      USERIAL_Close(USERIAL_NFC_PORT);
625e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      /* power cycle timeout */
6276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_start_quick_timer(
6286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          &nfc_hal_cb.timer, NFC_HAL_TTYPE_POWER_CYCLE,
6296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          (NFC_HAL_POWER_CYCLE_DELAY * QUICK_TIMER_TICKS_PER_SEC) / 1000);
6306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      continue;
6316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
632e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* NCI message ready to be sent to NFCC */
6346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event & NFC_HAL_TASK_EVT_MBOX) {
6356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      while ((p_msg = (NFC_HDR*)GKI_read_mbox(NFC_HAL_TASK_MBOX)) != NULL) {
6366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        free_msg = true;
6376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        switch (p_msg->event & NFC_EVT_MASK) {
6386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          case NFC_HAL_EVT_TO_NFC_NCI:
6396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_main_send_message(p_msg);
6406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* do not free buffer. NCI VS code may keep it for processing later
6416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi             */
6426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            free_msg = false;
6436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
6446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          case NFC_HAL_EVT_POST_CORE_RESET:
6466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_POST_INIT_DONE);
6476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* set NCI Control packet size from CORE_INIT_RSP */
6496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p = (uint8_t*)(p_msg + 1) + p_msg->offset + NCI_MSG_HDR_SIZE;
6506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p += 5;
6516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            STREAM_TO_UINT8(num_interfaces, p);
6526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            p += (num_interfaces + 3);
6536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_cb.ncit_cb.nci_ctrl_size = *p;
6546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6556fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            /* start post initialization */
6566fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_cb.dev_cb.next_dm_config = NFC_HAL_DM_CONFIG_LPTD;
6576fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_cb.dev_cb.next_startup_vsc = 1;
6586fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6596fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_dm_config_nfcc();
6606fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
6616fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6626fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          case NFC_HAL_EVT_TO_START_QUICK_TIMER:
6636fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            GKI_start_timer(
6646fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                NFC_HAL_QUICK_TIMER_ID,
6656fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                ((GKI_SECS_TO_TICKS(1) / QUICK_TIMER_TICKS_PER_SEC)), true);
6666fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
6676fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          case NFC_HAL_EVT_HCI:
6696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_hci_evt_hdlr((tNFC_HAL_HCI_EVENT_DATA*)p_msg);
6706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
6716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          case NFC_HAL_EVT_PRE_DISCOVER:
6736fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            NFC_HAL_SET_INIT_STATE(NFC_HAL_INIT_STATE_W4_PREDISCOVER_DONE);
6746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfa_hal_send_pre_discover_cfg();
6756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
6766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          case NFC_HAL_EVT_CONTROL_GRANTED:
6786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_dm_send_pend_cmd();
6796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
6806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          default:
6826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            break;
683e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
684e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6856fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (free_msg) GKI_freebuf(p_msg);
6866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      }
6876fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
6886fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
6896fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Data waiting to be read from serial port */
6906fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event & NFC_HAL_TASK_EVT_DATA_RDY) {
6916fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      while (true) {
6926fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        /* Read one byte to see if there is anything waiting to be read */
6936fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (USERIAL_Read(USERIAL_NFC_PORT, &byte, 1) == 0) {
6946fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          break;
695e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
696e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
6976fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi        if (nfc_hal_nci_receive_msg(byte)) {
6986fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          /* complete of receiving NCI message */
6996fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          nfc_hal_nci_assemble_nci_msg();
7006fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          if (nfc_hal_cb.ncit_cb.p_rcv_msg) {
7016fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            if (nfc_hal_nci_preproc_rx_nci_msg(nfc_hal_cb.ncit_cb.p_rcv_msg)) {
7026fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              /* Send NCI message to the stack */
7036fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              nfc_hal_send_nci_msg_to_nfc_task(nfc_hal_cb.ncit_cb.p_rcv_msg);
7046fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            } else {
7056fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi              if (nfc_hal_cb.ncit_cb.p_rcv_msg)
7066fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi                GKI_freebuf(nfc_hal_cb.ncit_cb.p_rcv_msg);
7076fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            }
7086fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi            nfc_hal_cb.ncit_cb.p_rcv_msg = NULL;
7096fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi          }
710e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project        }
7116fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      } /* while (TRUE) */
7126fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    }
7136fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi
7146fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Process quick timer tick */
7156fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    if (event & NFC_HAL_QUICK_TIMER_EVT_MASK) {
7166fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      nfc_hal_main_process_quick_timer_evt();
717e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project    }
7186fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
719e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7206fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  HAL_TRACE_DEBUG0("nfc_hal_main_task terminated");
721e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7226fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  GKI_exit_task(GKI_get_taskid());
7236fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return 0;
724e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
725e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
726e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/*******************************************************************************
727e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
728e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function         HAL_NfcSetTraceLevel
729e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
730e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description      This function sets the trace level for HAL.  If called with
731e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**                  a value of 0xFF, it simply returns the current trace level.
732e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
733e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns          The new or current trace level
734e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project**
735e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/
7366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint8_t HAL_NfcSetTraceLevel(uint8_t new_level) {
7376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if (new_level != 0xFF) nfc_hal_cb.trace_level = new_level;
738e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project
7396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return (nfc_hal_cb.trace_level);
740e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project}
741