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