1e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 2e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 3e9629bad30a9f478b336ab46b8e6e02f7f87af46Evan Chu * Copyright (C) 2012-2014 Broadcom Corporation 4e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 5e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 6e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * you may not use this file except in compliance with the License. 7e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * You may obtain a copy of the License at: 8e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 9e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 11e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * See the License for the specific language governing permissions and 15e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * limitations under the License. 16e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 17e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 18e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 195c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 20e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/****************************************************************************** 21e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 22e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * NFC Hardware Abstraction Layer API: Implementation for Broadcom NFC 23e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * controllers 24e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project * 25e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project ******************************************************************************/ 265c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#include <string.h> 27e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "gki.h" 28e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_target.h" 29e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_api.h" 30e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#include "nfc_hal_int.h" 31e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 32e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 33e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** NFC_HAL_TASK declarations 34e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 35e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_TASK_STR ((INT8 *) "NFC_HAL_TASK") 36e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project#define NFC_HAL_TASK_STACK_SIZE 0x400 37e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectUINT32 nfc_hal_task_stack[(NFC_HAL_TASK_STACK_SIZE+3)/4]; 38e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 39e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 40e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 41e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcInitialize 42e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 43e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called when HAL library is loaded. 44e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 45e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Initialize GKI and start the HCIT task 46e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 47e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 48e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 49e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 50e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcInitialize (void) 51e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 52e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Initialize HAL control block */ 53e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_main_init (); 54e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 555c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API1 ("HAL_NfcInitialize (): NFC_HAL_TASK id=%i", NFC_HAL_TASK); 56e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 575c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen 585c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFC_HAL_SHARED_GKI 595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Initialize GKI (not needed if using shared NFC/HAL GKI resources) */ 605c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen GKI_init (); 61e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_enable (); 625c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif 63e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 64e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Create the NCI transport task */ 65e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_create_task ((TASKPTR)nfc_hal_main_task, 66e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_TASK, 67e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HAL_TASK_STR, 68e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project (UINT16 *) ((UINT8 *)nfc_hal_task_stack + NFC_HAL_TASK_STACK_SIZE), 69e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project sizeof(nfc_hal_task_stack), NULL, NULL); 70e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 715c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#ifndef NFC_HAL_SHARED_GKI 725c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen /* Start GKI scheduler (not needed if using shared NFC/HAL GKI resources) */ 73e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_run (0); 745c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen#endif 75e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 76e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 77e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 78e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 79e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcTerminate 80e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 81e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called to terminate NFC HAL 82e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 83e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 84e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 85e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 86e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcTerminate(void) 87e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 885c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcTerminate ()"); 89e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 90e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 91e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 92e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 93e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 94e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcOpen 95e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 96e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Open transport and intialize the NFCC, and 97e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Register callback for HAL event notifications, 98e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 99e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_OPEN_CPLT_EVT will notify when operation is complete. 100e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 101e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 102e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 103e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 104e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcOpen (tHAL_NFC_CBACK *p_hal_cback, tHAL_NFC_DATA_CBACK *p_data_cback) 105e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1065c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcOpen ()"); 107e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 108e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Only handle if HAL is not opened (stack cback is NULL) */ 109e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (p_hal_cback) 110e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 111e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_dm_init (); 112e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_stack_cback = p_hal_cback; 113e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project nfc_hal_cb.p_data_cback = p_data_cback; 114e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 115e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send startup event to NFC_HAL_TASK */ 116e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_INITIALIZE); 117e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 118e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 119e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 120e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 121e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 122e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcClose 123e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 124e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Prepare for shutdown. A HAL_CLOSE_DONE_EVENT will be 125e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** reported when complete. 126e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 127e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 128e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 129e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 130e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcClose (void) 131e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 1325c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcClose ()"); 133e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 134e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Only handle if HAL is opened (stack cback is not-NULL) */ 135e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.p_stack_cback) 136e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 137e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send shutdown event to NFC_HAL_TASK */ 138e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_TERMINATE); 139e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 140e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 141e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 142e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 143e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 144e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcCoreInitialized 145e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 146e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Called after the CORE_INIT_RSP is received from the NFCC. 147e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** At this time, the HAL can do any chip-specific configuration, 148e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** and when finished signal the libnfc-nci with event 149e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_POST_INIT_DONE. 150e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 151e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 152e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 153e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 154e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcCoreInitialized (UINT8 *p_core_init_rsp_params) 155e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 156e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_msg; 157e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT16 size; 158e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1595c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcCoreInitialized ()"); 160e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 161e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* NCI payload len + NCI header size */ 162e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project size = p_core_init_rsp_params[2] + NCI_MSG_HDR_SIZE; 163e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 164e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send message to NFC_HAL_TASK */ 165e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_msg = (NFC_HDR *)GKI_getbuf ((UINT16)(size + NFC_HDR_SIZE))) != NULL) 166e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 167e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->event = NFC_HAL_EVT_POST_CORE_RESET; 168e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset = 0; 169e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len = size; 170e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->layer_specific = 0; 171e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((UINT8 *)(p_msg + 1) + p_msg->offset, p_core_init_rsp_params, size); 172e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 173e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg); 174e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 175e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 176e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 177e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 178e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 179e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcWrite 180e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 181e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Send an NCI control message or data packet to the 182e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** transport. If an NCI command message exceeds the transport 183e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** size, HAL is responsible for fragmenting it, Data packets 184e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** must be of the correct size. 185e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 186e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 187e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 188e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 189e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcWrite (UINT16 data_len, UINT8 *p_data) 190e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 191e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_msg; 192e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project UINT8 mt; 193e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 1945c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcWrite ()"); 195e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 196e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (data_len > (NCI_MAX_CTRL_SIZE + NCI_MSG_HDR_SIZE)) 197e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 1985c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_ERROR1 ("HAL_NfcWrite (): too many bytes (%d)", data_len); 199e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return; 200e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 201e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 202e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send message to NFC_HAL_TASK */ 203e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 204e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 205e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->event = NFC_HAL_EVT_TO_NFC_NCI; 206e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->offset = NFC_HAL_NCI_MSG_OFFSET_SIZE; 207e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->len = data_len; 208e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project memcpy ((UINT8 *)(p_msg+1) + p_msg->offset, p_data, data_len); 209e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 210e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Check if message is a command or data */ 211e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project mt = (*(p_data) & NCI_MT_MASK) >> NCI_MT_SHIFT; 212e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->layer_specific = (mt == NCI_MT_CMD) ? NFC_HAL_WAIT_RSP_CMD : 0; 213e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 214e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 215e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg); 216e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 217e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 218e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 219e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 220e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 221e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcPreDiscover 222e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 223e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Perform any vendor-specific pre-discovery actions (if needed) 224e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** If any actions were performed TRUE will be returned, and 225e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_PRE_DISCOVER_DONE_EVENT will notify when actions are 226e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** completed. 227e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 228e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns TRUE if vendor-specific pre-discovery actions initialized 229e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** FALSE if no vendor-specific pre-discovery actions are needed. 230e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 231e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 232e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source ProjectBOOLEAN HAL_NfcPreDiscover (void) 233e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 234e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project BOOLEAN status = FALSE; 235e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 23645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu NFC_HDR *p_msg; 23745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu 23845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu HAL_TRACE_API0 ("HAL_NfcPreDiscover ()"); 23945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu if (nfc_hal_cb.pre_discover_done == FALSE) 24045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu { 24145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu nfc_hal_cb.pre_discover_done = TRUE; 24245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu if (p_nfc_hal_pre_discover_cfg && *p_nfc_hal_pre_discover_cfg) 24345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu { 24445e68232b8524aca5165dca28b994ec8c11593b1Evan Chu status = TRUE; 24545e68232b8524aca5165dca28b994ec8c11593b1Evan Chu /* Send message to NFC_HAL_TASK */ 24645e68232b8524aca5165dca28b994ec8c11593b1Evan Chu if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 24745e68232b8524aca5165dca28b994ec8c11593b1Evan Chu { 24845e68232b8524aca5165dca28b994ec8c11593b1Evan Chu p_msg->event = NFC_HAL_EVT_PRE_DISCOVER; 24945e68232b8524aca5165dca28b994ec8c11593b1Evan Chu GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg); 25045e68232b8524aca5165dca28b994ec8c11593b1Evan Chu } 25145e68232b8524aca5165dca28b994ec8c11593b1Evan Chu } 25245e68232b8524aca5165dca28b994ec8c11593b1Evan Chu } 25345e68232b8524aca5165dca28b994ec8c11593b1Evan Chu 2545c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API1 ("HAL_NfcPreDiscover status:%d", status); 255e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project return status; 256e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 257e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 258e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 259e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 260e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcControlGranted 261e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 262e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Grant control to HAL control for sending NCI commands. 263e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 264e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Call in response to HAL_REQUEST_CONTROL_EVENT. 265e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 266e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Must only be called when there are no NCI commands pending. 267e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 268e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_RELEASE_CONTROL_EVENT will notify when HAL no longer 269e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** needs control of NCI. 270e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 271e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 272e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 273e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 274e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 275e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcControlGranted (void) 276e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 277e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project NFC_HDR *p_msg; 2785c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcControlGranted ()"); 279e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 280e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send message to NFC_HAL_TASK */ 281e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 282e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 283e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project p_msg->event = NFC_HAL_EVT_CONTROL_GRANTED; 284e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg); 285e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 286e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 287e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 288e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project/******************************************************************************* 289e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 290e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Function HAL_NfcPowerCycle 291e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 292e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Description Restart NFCC by power cyle 293e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 294e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** HAL_OPEN_CPLT_EVT will notify when operation is complete. 295e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 296e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** Returns void 297e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project** 298e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project*******************************************************************************/ 299e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Projectvoid HAL_NfcPowerCycle (void) 300e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project{ 3015c65c3a0f42e174e47fecd4e569606003217ff4eMartijn Coenen HAL_TRACE_API0 ("HAL_NfcPowerCycle ()"); 302e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 303e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Only handle if HAL is opened (stack cback is not-NULL) */ 304e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project if (nfc_hal_cb.p_stack_cback) 305e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project { 306e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project /* Send power cycle event to NFC_HAL_TASK */ 307e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_POWER_CYCLE); 308e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project } 309e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project} 310e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 311d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu/******************************************************************************* 312d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** 313d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** Function HAL_NfcGetMaxNfcee 314d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** 315d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** Description Retrieve the maximum number of NFCEEs supported by NFCC 316d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** 317d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** Returns the maximum number of NFCEEs supported by NFCC 318d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu** 319d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu*******************************************************************************/ 320d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan ChuUINT8 HAL_NfcGetMaxNfcee (void) 321d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu{ 322d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu HAL_TRACE_API1 ("HAL_NfcGetMaxNfcee: %d",nfc_hal_cb.max_ee); 323d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu return nfc_hal_cb.max_ee; 324d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu} 325d23e0531b6835ab75b543dd51cfe5edec8edefe4Evan Chu 326e9df6ba5a8fcccf306a80b1670b423be8fe7746The Android Open Source Project 327