nfa_ee_api.c revision e9df6ba5a8fcccf306a80b1670b423be8fe7746a
1/****************************************************************************** 2 * 3 * Copyright (C) 2010-2012 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 * NFA interface to NFCEE - API functions 22 * 23 ******************************************************************************/ 24#include <string.h> 25#include "nfa_ee_api.h" 26#include "nfa_ee_int.h" 27#include "nfa_sys_int.h" 28#include "nfa_dm_int.h" 29 30/***************************************************************************** 31** APIs 32*****************************************************************************/ 33/******************************************************************************* 34** 35** Function NFA_EeDiscover 36** 37** Description This function retrieves the NFCEE information from NFCC. 38** The NFCEE information is reported in NFA_EE_DISCOVER_EVT. 39** 40** This function may be called when a system supports removable 41** NFCEEs, 42** 43** Returns NFA_STATUS_OK if information is retrieved successfully 44** NFA_STATUS_FAILED If wrong state (retry later) 45** NFA_STATUS_INVALID_PARAM If bad parameter 46** 47*******************************************************************************/ 48tNFA_STATUS NFA_EeDiscover(tNFA_EE_CBACK *p_cback) 49{ 50 tNFA_EE_API_DISCOVER *p_msg; 51 tNFA_STATUS status = NFA_STATUS_FAILED; 52 53 NFA_TRACE_API0 ("NFA_EeDiscover()"); 54 55 if (nfa_ee_cb.em_state != NFA_EE_EM_STATE_INIT_DONE) 56 { 57 NFA_TRACE_ERROR1 ("NFA_EeDiscover bad em state: %d", nfa_ee_cb.em_state); 58 status = NFA_STATUS_FAILED; 59 } 60 else if ((nfa_ee_cb.p_ee_disc_cback != NULL) || (p_cback == NULL)) 61 { 62 NFA_TRACE_ERROR0 ("NFA_EeDiscover() in progress or NULL callback function"); 63 status = NFA_STATUS_INVALID_PARAM; 64 } 65 else if ((p_msg = (tNFA_EE_API_DISCOVER *) GKI_getbuf (sizeof(tNFA_EE_API_DISCOVER))) != NULL) 66 { 67 p_msg->hdr.event = NFA_EE_API_DISCOVER_EVT; 68 p_msg->p_cback = p_cback; 69 70 nfa_sys_sendmsg (p_msg); 71 72 status = NFA_STATUS_OK; 73 } 74 75 return status; 76} 77 78/******************************************************************************* 79** 80** Function NFA_EeGetInfo 81** 82** Description This function retrieves the NFCEE information from NFA. 83** The actual number of NFCEE is returned in p_num_nfcee 84** and NFCEE information is returned in p_info 85** 86** Returns NFA_STATUS_OK if information is retrieved successfully 87** NFA_STATUS_FAILED If wrong state (retry later) 88** NFA_STATUS_INVALID_PARAM If bad parameter 89** 90*******************************************************************************/ 91tNFA_STATUS NFA_EeGetInfo(UINT8 *p_num_nfcee, 92 tNFA_EE_INFO *p_info) 93{ 94 int xx, ret = nfa_ee_cb.cur_ee; 95 tNFA_EE_ECB *p_cb = nfa_ee_cb.ecb; 96 UINT8 max_ret; 97 UINT8 num_ret = 0; 98 99 NFA_TRACE_DEBUG2 ("NFA_EeGetInfo em_state:%d cur_ee:%d", nfa_ee_cb.em_state, nfa_ee_cb.cur_ee); 100 /* validate parameters */ 101 if (p_info == NULL || p_num_nfcee == NULL) 102 { 103 NFA_TRACE_ERROR0 ("NFA_EeGetInfo bad parameter"); 104 return (NFA_STATUS_INVALID_PARAM); 105 } 106 max_ret = *p_num_nfcee; 107 *p_num_nfcee = 0; 108 if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT) 109 { 110 NFA_TRACE_ERROR1 ("NFA_EeGetInfo bad em state: %d", nfa_ee_cb.em_state); 111 return (NFA_STATUS_FAILED); 112 } 113 114 /* compose output */ 115 for (xx = 0; (xx < ret) && (num_ret < max_ret); xx++, p_cb++) 116 { 117 NFA_TRACE_DEBUG4 ("xx:%d max_ret:%d, num_ret:%d ee_status:0x%x", xx, max_ret, num_ret, p_cb->ee_status); 118 if ((p_cb->ee_status & NFA_EE_STATUS_INT_MASK) || (p_cb->ee_status == NFA_EE_STATUS_REMOVED)) 119 { 120 continue; 121 } 122 p_info->ee_handle = NFA_HANDLE_GROUP_EE | (tNFA_HANDLE)p_cb->nfcee_id; 123 p_info->ee_status = p_cb->ee_status; 124 p_info->num_interface = p_cb->num_interface; 125 p_info->num_tlvs = p_cb->num_tlvs; 126 memcpy(p_info->ee_interface, p_cb->ee_interface, p_cb->num_interface); 127 memcpy(p_info->ee_tlv, p_cb->ee_tlv, p_cb->num_tlvs * sizeof(tNFA_EE_TLV)); 128 p_info++; 129 num_ret++; 130 } 131 NFA_TRACE_DEBUG1 ("num_ret:%d", num_ret); 132 *p_num_nfcee = num_ret; 133 return (NFA_STATUS_OK); 134} 135 136/******************************************************************************* 137** 138** Function NFA_EeRegister 139** 140** Description This function registers a callback function to receive the 141** events from NFA-EE module. 142** 143** Returns NFA_STATUS_OK if successfully initiated 144** NFA_STATUS_FAILED otherwise 145** NFA_STATUS_INVALID_PARAM If bad parameter 146** 147*******************************************************************************/ 148tNFA_STATUS NFA_EeRegister(tNFA_EE_CBACK *p_cback) 149{ 150 tNFA_EE_API_REGISTER *p_msg; 151 tNFA_STATUS status = NFA_STATUS_FAILED; 152 153 NFA_TRACE_API0 ("NFA_EeRegister()"); 154 155 if (p_cback == NULL) 156 { 157 NFA_TRACE_ERROR0 ("NFA_EeRegister(): with NULL callback function"); 158 status = NFA_STATUS_INVALID_PARAM; 159 } 160 else if ((p_msg = (tNFA_EE_API_REGISTER *) GKI_getbuf (sizeof(tNFA_EE_API_REGISTER))) != NULL) 161 { 162 p_msg->hdr.event = NFA_EE_API_REGISTER_EVT; 163 p_msg->p_cback = p_cback; 164 165 nfa_sys_sendmsg (p_msg); 166 167 status = NFA_STATUS_OK; 168 } 169 170 return status; 171} 172 173/******************************************************************************* 174** 175** Function NFA_EeDeregister 176** 177** Description This function de-registers the callback function 178** 179** Returns NFA_STATUS_OK if successfully initiated 180** NFA_STATUS_FAILED otherwise 181** NFA_STATUS_INVALID_PARAM If bad parameter 182** 183*******************************************************************************/ 184tNFA_STATUS NFA_EeDeregister(tNFA_EE_CBACK *p_cback) 185{ 186 tNFA_EE_API_DEREGISTER *p_msg; 187 tNFA_STATUS status = NFA_STATUS_INVALID_PARAM; 188 int index = NFA_EE_MAX_CBACKS; 189 int xx; 190 191 for (xx = 0; xx < NFA_EE_MAX_CBACKS; xx++) 192 { 193 if (nfa_ee_cb.p_ee_cback[xx] == p_cback) 194 { 195 index = xx; 196 status = NFA_STATUS_FAILED; 197 break; 198 } 199 } 200 201 NFA_TRACE_API2 ("NFA_EeDeregister() %d, status:%d", index, status); 202 if ((status != NFA_STATUS_INVALID_PARAM) && 203 (p_msg = (tNFA_EE_API_DEREGISTER *) GKI_getbuf (sizeof(tNFA_EE_API_DEREGISTER))) != NULL) 204 { 205 p_msg->hdr.event = NFA_EE_API_DEREGISTER_EVT; 206 p_msg->index = index; 207 208 nfa_sys_sendmsg (p_msg); 209 210 status = NFA_STATUS_OK; 211 } 212 213 return status; 214} 215 216/******************************************************************************* 217** 218** Function NFA_EeModeSet 219** 220** Description This function is called to activate (mode = NFA_EE_MD_ACTIVATE) 221** or deactivate (mode = NFA_EE_MD_DEACTIVATE) the NFCEE 222** identified by the given ee_handle. The result of this 223** operation is reported with the NFA_EE_MODE_SET_EVT. 224** 225** Returns NFA_STATUS_OK if successfully initiated 226** NFA_STATUS_FAILED otherwise 227** NFA_STATUS_INVALID_PARAM If bad parameter 228** 229*******************************************************************************/ 230tNFA_STATUS NFA_EeModeSet(tNFA_HANDLE ee_handle, 231 tNFA_EE_MD mode) 232{ 233 tNFA_EE_API_MODE_SET *p_msg; 234 tNFA_STATUS status = NFA_STATUS_FAILED; 235 tNFA_EE_ECB *p_cb, *p_found = NULL; 236 UINT32 xx; 237 UINT8 nfcee_id = (ee_handle & 0xFF); 238 239 p_cb = nfa_ee_cb.ecb; 240 for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) 241 { 242 if (nfcee_id == p_cb->nfcee_id) 243 { 244 p_found = p_cb; 245 break; 246 } 247 } 248 NFA_TRACE_API2 ("NFA_EeModeSet(): handle:<0x%x>, mode:0x%02X", ee_handle, mode); 249 250 if (p_found == NULL) 251 { 252 NFA_TRACE_ERROR1 ("NFA_EeModeSet() invalid NFCEE:0x%04x", ee_handle); 253 status = NFA_STATUS_INVALID_PARAM; 254 } 255 else if ((p_msg = (tNFA_EE_API_MODE_SET *) GKI_getbuf (sizeof(tNFA_EE_API_MODE_SET))) != NULL) 256 { 257 p_msg->hdr.event = NFA_EE_API_MODE_SET_EVT; 258 p_msg->nfcee_id = nfcee_id; 259 p_msg->mode = mode; 260 p_msg->p_cb = p_found; 261 262 nfa_sys_sendmsg (p_msg); 263 264 status = NFA_STATUS_OK; 265 } 266 267 268 return status; 269} 270 271 272/******************************************************************************* 273** 274** Function NFA_EeSetDefaultTechRouting 275** 276** Description This function is called to add, change or remove the 277** default routing based on RF technology in the listen mode 278** routing table for the given ee_handle. The status of this 279** operation is reported as the NFA_EE_SET_TECH_CFG_EVT. 280** 281** Note: If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT 282** should happen before calling this function 283** 284** Note: NFA_EeUpdateNow() should be called after last NFA-EE function 285** to change the listen mode routing is called. 286** 287** Returns NFA_STATUS_OK if successfully initiated 288** NFA_STATUS_FAILED otherwise 289** NFA_STATUS_INVALID_PARAM If bad parameter 290** 291*******************************************************************************/ 292tNFA_STATUS NFA_EeSetDefaultTechRouting(tNFA_HANDLE ee_handle, 293 tNFA_TECHNOLOGY_MASK technologies_switch_on, 294 tNFA_TECHNOLOGY_MASK technologies_switch_off, 295 tNFA_TECHNOLOGY_MASK technologies_battery_off) 296{ 297 tNFA_EE_API_SET_TECH_CFG *p_msg; 298 tNFA_STATUS status = NFA_STATUS_FAILED; 299 UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); 300 tNFA_EE_ECB *p_cb; 301 302 NFA_TRACE_API4 ("NFA_EeSetDefaultTechRouting(): handle:<0x%x>technology_mask:<0x%x>/<0x%x>/<0x%x>", 303 ee_handle, technologies_switch_on, technologies_switch_off, technologies_battery_off); 304 p_cb = nfa_ee_find_ecb (nfcee_id); 305 306 if (p_cb == NULL) 307 { 308 NFA_TRACE_ERROR0 ("Bad ee_handle"); 309 status = NFA_STATUS_INVALID_PARAM; 310 } 311 else if ((p_msg = (tNFA_EE_API_SET_TECH_CFG *) GKI_getbuf (sizeof(tNFA_EE_API_SET_TECH_CFG))) != NULL) 312 { 313 p_msg->hdr.event = NFA_EE_API_SET_TECH_CFG_EVT; 314 p_msg->nfcee_id = nfcee_id; 315 p_msg->p_cb = p_cb; 316 p_msg->technologies_switch_on = technologies_switch_on; 317 p_msg->technologies_switch_off = technologies_switch_off; 318 p_msg->technologies_battery_off = technologies_battery_off; 319 320 nfa_sys_sendmsg (p_msg); 321 322 status = NFA_STATUS_OK; 323 } 324 325 return status; 326} 327 328/******************************************************************************* 329** 330** Function NFA_EeSetDefaultProtoRouting 331** 332** Description This function is called to add, change or remove the 333** default routing based on Protocol in the listen mode routing 334** table for the given ee_handle. The status of this 335** operation is reported as the NFA_EE_SET_PROTO_CFG_EVT. 336** 337** Note: If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT 338** should happen before calling this function 339** 340** Note: NFA_EeUpdateNow() should be called after last NFA-EE function 341** to change the listen mode routing is called. 342** 343** Returns NFA_STATUS_OK if successfully initiated 344** NFA_STATUS_FAILED otherwise 345** NFA_STATUS_INVALID_PARAM If bad parameter 346** 347*******************************************************************************/ 348tNFA_STATUS NFA_EeSetDefaultProtoRouting(tNFA_HANDLE ee_handle, 349 tNFA_PROTOCOL_MASK protocols_switch_on, 350 tNFA_PROTOCOL_MASK protocols_switch_off, 351 tNFA_PROTOCOL_MASK protocols_battery_off) 352{ 353 tNFA_EE_API_SET_PROTO_CFG *p_msg; 354 tNFA_STATUS status = NFA_STATUS_FAILED; 355 UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); 356 tNFA_EE_ECB *p_cb; 357 358 NFA_TRACE_API4 ("NFA_EeSetDefaultProtoRouting(): handle:<0x%x>protocol_mask:<0x%x>/<0x%x>/<0x%x>", 359 ee_handle, protocols_switch_on, protocols_switch_off, protocols_battery_off); 360 p_cb = nfa_ee_find_ecb (nfcee_id); 361 362 if (p_cb == NULL) 363 { 364 NFA_TRACE_ERROR0 ("Bad ee_handle"); 365 status = NFA_STATUS_INVALID_PARAM; 366 } 367 else if ((p_msg = (tNFA_EE_API_SET_PROTO_CFG *) GKI_getbuf (sizeof(tNFA_EE_API_SET_PROTO_CFG))) != NULL) 368 { 369 p_msg->hdr.event = NFA_EE_API_SET_PROTO_CFG_EVT; 370 p_msg->nfcee_id = nfcee_id; 371 p_msg->p_cb = p_cb; 372 p_msg->protocols_switch_on = protocols_switch_on; 373 p_msg->protocols_switch_off = protocols_switch_off; 374 p_msg->protocols_battery_off = protocols_battery_off; 375 376 nfa_sys_sendmsg (p_msg); 377 378 status = NFA_STATUS_OK; 379 } 380 381 return status; 382} 383 384/******************************************************************************* 385** 386** Function NFA_EeAddAidRouting 387** 388** Description This function is called to add an AID entry in the 389** listen mode routing table in NFCC. The status of this 390** operation is reported as the NFA_EE_ADD_AID_EVT. 391** 392** Note: If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT 393** should happen before calling this function 394** 395** Note: NFA_EeUpdateNow() should be called after last NFA-EE function 396** to change the listen mode routing is called. 397** 398** Returns NFA_STATUS_OK if successfully initiated 399** NFA_STATUS_FAILED otherwise 400** NFA_STATUS_INVALID_PARAM If bad parameter 401** 402*******************************************************************************/ 403tNFA_STATUS NFA_EeAddAidRouting(tNFA_HANDLE ee_handle, 404 UINT8 aid_len, 405 UINT8 *p_aid, 406 tNFA_EE_PWR_STATE power_state) 407{ 408 tNFA_EE_API_ADD_AID *p_msg; 409 tNFA_STATUS status = NFA_STATUS_FAILED; 410 UINT16 size = sizeof(tNFA_EE_API_ADD_AID) + aid_len; 411 UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); 412 tNFA_EE_ECB *p_cb; 413 414 NFA_TRACE_API1 ("NFA_EeAddAidRouting(): handle:<0x%x>", ee_handle); 415 p_cb = nfa_ee_find_ecb (nfcee_id); 416 417 /* validate parameters - make sure the AID is in valid length range */ 418 if ((p_cb == NULL) || (aid_len == 0) || (p_aid == NULL) || (aid_len < NFA_MIN_AID_LEN) || (aid_len > NFA_MAX_AID_LEN)) 419 { 420 NFA_TRACE_ERROR1 ("Bad ee_handle or AID (len=%d)", aid_len); 421 status = NFA_STATUS_INVALID_PARAM; 422 } 423 else if ((p_msg = (tNFA_EE_API_ADD_AID *) GKI_getbuf (size)) != NULL) 424 { 425 NFA_TRACE_DEBUG2 ("aid:<%02x%02x>", p_aid[0], p_aid[1]); 426 p_msg->hdr.event = NFA_EE_API_ADD_AID_EVT; 427 p_msg->nfcee_id = nfcee_id; 428 p_msg->p_cb = p_cb; 429 p_msg->aid_len = aid_len; 430 p_msg->power_state = power_state; 431 p_msg->p_aid = (UINT8 *)(p_msg + 1); 432 memcpy(p_msg->p_aid, p_aid, aid_len); 433 434 nfa_sys_sendmsg (p_msg); 435 436 status = NFA_STATUS_OK; 437 } 438 439 return status; 440} 441 442 443/******************************************************************************* 444** 445** Function NFA_EeRemoveAidRouting 446** 447** Description This function is called to remove the given AID entry from the 448** listen mode routing table. If the entry configures VS, 449** it is also removed. The status of this operation is reported 450** as the NFA_EE_REMOVE_AID_EVT. 451** 452** Note: If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT 453** should happen before calling this function 454** 455** Note: NFA_EeUpdateNow() should be called after last NFA-EE function 456** to change the listen mode routing is called. 457** 458** Returns NFA_STATUS_OK if successfully initiated 459** NFA_STATUS_FAILED otherwise 460** NFA_STATUS_INVALID_PARAM If bad parameter 461** 462*******************************************************************************/ 463tNFA_STATUS NFA_EeRemoveAidRouting(UINT8 aid_len, 464 UINT8 *p_aid) 465{ 466 tNFA_EE_API_REMOVE_AID *p_msg; 467 tNFA_STATUS status = NFA_STATUS_FAILED; 468 UINT16 size = sizeof(tNFA_EE_API_REMOVE_AID) + aid_len; 469 470 NFA_TRACE_API0 ("NFA_EeRemoveAidRouting()"); 471 if ((aid_len == 0) || (p_aid == NULL) || (aid_len > NFA_MAX_AID_LEN)) 472 { 473 NFA_TRACE_ERROR0 ("Bad AID"); 474 status = NFA_STATUS_INVALID_PARAM; 475 } 476 else if ((p_msg = (tNFA_EE_API_REMOVE_AID *) GKI_getbuf (size)) != NULL) 477 { 478 p_msg->hdr.event = NFA_EE_API_REMOVE_AID_EVT; 479 p_msg->aid_len = aid_len; 480 p_msg->p_aid = (UINT8 *)(p_msg + 1); 481 memcpy(p_msg->p_aid, p_aid, aid_len); 482 483 nfa_sys_sendmsg (p_msg); 484 485 status = NFA_STATUS_OK; 486 } 487 488 return status; 489} 490 491/******************************************************************************* 492** 493** Function NFA_EeUpdateNow 494** 495** Description This function is called to send the current listen mode 496** routing table and VS configuration to the NFCC (without waiting 497** for NFA_EE_ROUT_TIMEOUT_VAL). 498** 499** Returns NFA_STATUS_OK if successfully initiated 500** NFA_STATUS_FAILED otherwise 501** 502*******************************************************************************/ 503tNFA_STATUS NFA_EeUpdateNow(void) 504{ 505 BT_HDR *p_msg; 506 tNFA_STATUS status = NFA_STATUS_FAILED; 507 508 NFA_TRACE_API0 ("NFA_EeUpdateNow()"); 509 if ((p_msg = (BT_HDR *) GKI_getbuf (BT_HDR_SIZE)) != NULL) 510 { 511 p_msg->event = NFA_EE_API_UPDATE_NOW_EVT; 512 513 nfa_sys_sendmsg (p_msg); 514 515 status = NFA_STATUS_OK; 516 } 517 518 return status; 519} 520 521 522/******************************************************************************* 523** 524** Function NFA_EeConnect 525** 526** Description Open connection to an NFCEE attached to the NFCC 527** 528** The status of this operation is 529** reported with the NFA_EE_CONNECT_EVT. 530** 531** Returns NFA_STATUS_OK if successfully initiated 532** NFA_STATUS_FAILED otherwise 533** NFA_STATUS_INVALID_PARAM If bad parameter 534** 535*******************************************************************************/ 536tNFA_STATUS NFA_EeConnect(tNFA_HANDLE ee_handle, 537 UINT8 ee_interface, 538 tNFA_EE_CBACK *p_cback) 539{ 540 tNFA_EE_API_CONNECT *p_msg; 541 tNFA_STATUS status = NFA_STATUS_FAILED; 542 UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); 543 tNFA_EE_ECB *p_cb; 544 545 NFA_TRACE_API2 ("NFA_EeConnect(): handle:<0x%x> ee_interface:0x%x", ee_handle, ee_interface); 546 p_cb = nfa_ee_find_ecb (nfcee_id); 547 548 if ((p_cb == NULL) || (p_cback == NULL)) 549 { 550 NFA_TRACE_ERROR0 ("Bad ee_handle or NULL callback function"); 551 status = NFA_STATUS_INVALID_PARAM; 552 } 553 else if ((p_msg = (tNFA_EE_API_CONNECT *) GKI_getbuf (sizeof(tNFA_EE_API_CONNECT))) != NULL) 554 { 555 p_msg->hdr.event = NFA_EE_API_CONNECT_EVT; 556 p_msg->nfcee_id = nfcee_id; 557 p_msg->p_cb = p_cb; 558 p_msg->ee_interface = ee_interface; 559 p_msg->p_cback = p_cback; 560 561 nfa_sys_sendmsg (p_msg); 562 563 status = NFA_STATUS_OK; 564 } 565 566 return status; 567} 568 569/******************************************************************************* 570** 571** Function NFA_EeSendData 572** 573** Description Send data to the given NFCEE. 574** This function shall be called after NFA_EE_CONNECT_EVT is reported 575** and before NFA_EeDisconnect is called on the given ee_handle. 576** 577** Returns NFA_STATUS_OK if successfully initiated 578** NFA_STATUS_FAILED otherwise 579** NFA_STATUS_INVALID_PARAM If bad parameter 580** 581*******************************************************************************/ 582tNFA_STATUS NFA_EeSendData (tNFA_HANDLE ee_handle, 583 UINT16 data_len, 584 UINT8 *p_data) 585{ 586 tNFA_EE_API_SEND_DATA *p_msg; 587 tNFA_STATUS status = NFA_STATUS_FAILED; 588 UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); 589 tNFA_EE_ECB *p_cb; 590 591 NFA_TRACE_API1 ("NFA_EeSendData(): handle:<0x%x>", ee_handle); 592 593 p_cb = nfa_ee_find_ecb (nfcee_id); 594 595 if ((p_cb == NULL) || (p_cb->conn_st != NFA_EE_CONN_ST_CONN) || (p_data == NULL)) 596 { 597 NFA_TRACE_ERROR0 ("Bad ee_handle or NULL data"); 598 status = NFA_STATUS_INVALID_PARAM; 599 } 600 else if ((p_msg = (tNFA_EE_API_SEND_DATA *) GKI_getbuf ((UINT16)(sizeof(tNFA_EE_API_SEND_DATA) + data_len))) != NULL) 601 { 602 p_msg->hdr.event = NFA_EE_API_SEND_DATA_EVT; 603 p_msg->nfcee_id = nfcee_id; 604 p_msg->p_cb = p_cb; 605 p_msg->data_len = data_len; 606 p_msg->p_data = (UINT8 *)(p_msg + 1); 607 memcpy(p_msg->p_data, p_data, data_len); 608 609 nfa_sys_sendmsg (p_msg); 610 611 status = NFA_STATUS_OK; 612 } 613 614 return status; 615} 616 617/******************************************************************************* 618** 619** Function NFA_EeDisconnect 620** 621** Description Disconnect (if a connection is currently open) from an 622** NFCEE interface. The result of this operation is reported 623** with the NFA_EE_DISCONNECT_EVT. 624** 625** Returns NFA_STATUS_OK if successfully initiated 626** NFA_STATUS_FAILED otherwise 627** NFA_STATUS_INVALID_PARAM If bad parameter 628** 629*******************************************************************************/ 630tNFA_STATUS NFA_EeDisconnect(tNFA_HANDLE ee_handle) 631{ 632 tNFA_EE_API_DISCONNECT *p_msg; 633 tNFA_STATUS status = NFA_STATUS_FAILED; 634 UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); 635 tNFA_EE_ECB *p_cb; 636 637 NFA_TRACE_API1 ("NFA_EeDisconnect(): handle:<0x%x>", ee_handle); 638 p_cb = nfa_ee_find_ecb (nfcee_id); 639 640 if ((p_cb == NULL) || (p_cb->conn_st != NFA_EE_CONN_ST_CONN)) 641 { 642 NFA_TRACE_ERROR0 ("NFA_EeDisconnect() Bad ee_handle"); 643 status = NFA_STATUS_INVALID_PARAM; 644 } 645 else if ((p_msg = (tNFA_EE_API_DISCONNECT *) GKI_getbuf (sizeof(tNFA_EE_API_DISCONNECT))) != NULL) 646 { 647 p_msg->hdr.event = NFA_EE_API_DISCONNECT_EVT; 648 p_msg->nfcee_id = nfcee_id; 649 p_msg->p_cb = p_cb; 650 651 nfa_sys_sendmsg (p_msg); 652 653 status = NFA_STATUS_OK; 654 } 655 656 return status; 657} 658