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