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