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