1 /****************************************************************************** 2 * 3 * Copyright (C) 2012-2014 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 37 UINT32 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 *******************************************************************************/ 50 void 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 *******************************************************************************/ 86 void 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 *******************************************************************************/ 104 void 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 *******************************************************************************/ 130 void 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 *******************************************************************************/ 154 void 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 *******************************************************************************/ 189 void 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 *******************************************************************************/ 232 BOOLEAN HAL_NfcPreDiscover (void) 233 { 234 BOOLEAN status = FALSE; 235 236 NFC_HDR *p_msg; 237 238 HAL_TRACE_API0 ("HAL_NfcPreDiscover ()"); 239 if (nfc_hal_cb.pre_discover_done == FALSE) 240 { 241 nfc_hal_cb.pre_discover_done = TRUE; 242 if (p_nfc_hal_pre_discover_cfg && *p_nfc_hal_pre_discover_cfg) 243 { 244 status = TRUE; 245 /* Send message to NFC_HAL_TASK */ 246 if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 247 { 248 p_msg->event = NFC_HAL_EVT_PRE_DISCOVER; 249 GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg); 250 } 251 } 252 } 253 254 HAL_TRACE_API1 ("HAL_NfcPreDiscover status:%d", status); 255 return status; 256 } 257 258 /******************************************************************************* 259 ** 260 ** Function HAL_NfcControlGranted 261 ** 262 ** Description Grant control to HAL control for sending NCI commands. 263 ** 264 ** Call in response to HAL_REQUEST_CONTROL_EVENT. 265 ** 266 ** Must only be called when there are no NCI commands pending. 267 ** 268 ** HAL_RELEASE_CONTROL_EVENT will notify when HAL no longer 269 ** needs control of NCI. 270 ** 271 ** 272 ** Returns void 273 ** 274 *******************************************************************************/ 275 void HAL_NfcControlGranted (void) 276 { 277 NFC_HDR *p_msg; 278 HAL_TRACE_API0 ("HAL_NfcControlGranted ()"); 279 280 /* Send message to NFC_HAL_TASK */ 281 if ((p_msg = (NFC_HDR *)GKI_getpoolbuf (NFC_HAL_NCI_POOL_ID)) != NULL) 282 { 283 p_msg->event = NFC_HAL_EVT_CONTROL_GRANTED; 284 GKI_send_msg (NFC_HAL_TASK, NFC_HAL_TASK_MBOX, p_msg); 285 } 286 } 287 288 /******************************************************************************* 289 ** 290 ** Function HAL_NfcPowerCycle 291 ** 292 ** Description Restart NFCC by power cyle 293 ** 294 ** HAL_OPEN_CPLT_EVT will notify when operation is complete. 295 ** 296 ** Returns void 297 ** 298 *******************************************************************************/ 299 void HAL_NfcPowerCycle (void) 300 { 301 HAL_TRACE_API0 ("HAL_NfcPowerCycle ()"); 302 303 /* Only handle if HAL is opened (stack cback is not-NULL) */ 304 if (nfc_hal_cb.p_stack_cback) 305 { 306 /* Send power cycle event to NFC_HAL_TASK */ 307 GKI_send_event (NFC_HAL_TASK, NFC_HAL_TASK_EVT_POWER_CYCLE); 308 } 309 } 310 311 /******************************************************************************* 312 ** 313 ** Function HAL_NfcGetMaxNfcee 314 ** 315 ** Description Retrieve the maximum number of NFCEEs supported by NFCC 316 ** 317 ** Returns the maximum number of NFCEEs supported by NFCC 318 ** 319 *******************************************************************************/ 320 UINT8 HAL_NfcGetMaxNfcee (void) 321 { 322 HAL_TRACE_API1 ("HAL_NfcGetMaxNfcee: %d",nfc_hal_cb.max_ee); 323 return nfc_hal_cb.max_ee; 324 } 325 326 327