/******************************************************************************* ** ** Function NFA_EeDiscover ** ** Description This function retrieves the NFCEE information from NFCC. ** The NFCEE information is reported in NFA_EE_DISCOVER_EVT. ** ** This function may be called when a system supports removable ** NFCEEs, ** ** Returns NFA_STATUS_OK if information is retrieved successfully ** NFA_STATUS_FAILED If wrong state (retry later) ** NFA_STATUS_INVALID_PARAM If bad parameter ** *******************************************************************************/ tNFA_STATUS NFA_EeDiscover(tNFA_EE_CBACK *p_cback) { tNFA_EE_API_DISCOVER *p_msg; tNFA_STATUS status = NFA_STATUS_FAILED; NFA_TRACE_API0 ("NFA_EeDiscover()"); if (nfa_ee_cb.em_state != NFA_EE_EM_STATE_INIT_DONE) { NFA_TRACE_ERROR1 ("NFA_EeDiscover bad em state: %d", nfa_ee_cb.em_state); status = NFA_STATUS_FAILED; } else if ((nfa_ee_cb.p_ee_disc_cback != NULL) || (p_cback == NULL)) { NFA_TRACE_ERROR0 ("NFA_EeDiscover() in progress or NULL callback function"); status = NFA_STATUS_INVALID_PARAM; } else if ((p_msg = (tNFA_EE_API_DISCOVER *) GKI_getbuf (sizeof(tNFA_EE_API_DISCOVER))) != NULL) { p_msg->hdr.event = NFA_EE_API_DISCOVER_EVT; p_msg->p_cback = p_cback; nfa_sys_sendmsg (p_msg); status = NFA_STATUS_OK; } return status; }
/******************************************************************************* ** ** Function NFA_CeConfigureLocalTag ** ** Description Configure local NDEF tag. ** ** Tag events will be notifed using the tNFA_CONN_CBACK ** (registered during NFA_Enable) ** ** The NFA_CE_LOCAL_TAG_CONFIGURED_EVT reports the status of the ** operation. ** ** Activation and deactivation are reported using the ** NFA_ACTIVATED_EVT and NFA_DEACTIVATED_EVT events ** ** If a write-request is received to update the tag memory, ** an NFA_CE_NDEF_WRITE_CPLT_EVT will notify the application, along ** with a buffer containing the updated contents. ** ** To disable the local NDEF tag, set protocol_mask=0 ** ** The NDEF data provided by p_ndef_data must be persistent ** as long as the local NDEF tag is enabled. ** ** ** Note: If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT ** should happen before calling this function. Also, Input parameters p_uid and ** uid_len are reserved for future use. ** ** Returns: ** NFA_STATUS_OK, if command accepted ** NFA_STATUS_INVALID_PARAM, ** if protocol_maks is not 0 and p_ndef_data is NULL ** (or)uid_len is not 0 ** (or)if protocol mask is set for Type 1 or Type 2 ** ** NFA_STATUS_FAILED: otherwise ** *******************************************************************************/ tNFA_STATUS NFA_CeConfigureLocalTag (tNFA_PROTOCOL_MASK protocol_mask, UINT8 *p_ndef_data, UINT16 ndef_cur_size, UINT16 ndef_max_size, BOOLEAN read_only, UINT8 uid_len, UINT8 *p_uid) { tNFA_CE_MSG *p_msg; NFA_TRACE_API0 ("NFA_CeConfigureLocalTag ()"); if (protocol_mask) { /* If any protocols are specified, then NDEF buffer pointer must be non-NULL */ if (p_ndef_data == NULL) { NFA_TRACE_ERROR0 ("NFA_CeConfigureLocalTag: NULL ndef data pointer"); return (NFA_STATUS_INVALID_PARAM); } if ((protocol_mask & NFA_PROTOCOL_MASK_T1T) || (protocol_mask & NFA_PROTOCOL_MASK_T2T)) { NFA_TRACE_ERROR0 ("NFA_CeConfigureLocalTag: Cannot emulate Type 1 / Type 2 tag"); return (NFA_STATUS_INVALID_PARAM); } if (uid_len) { NFA_TRACE_ERROR1 ("NFA_CeConfigureLocalTag: Cannot Set UID for Protocol_mask: 0x%x", protocol_mask); return (NFA_STATUS_INVALID_PARAM); } } if ((p_msg = (tNFA_CE_MSG *) GKI_getbuf ((UINT16) sizeof(tNFA_CE_MSG))) != NULL) { p_msg->local_tag.hdr.event = NFA_CE_API_CFG_LOCAL_TAG_EVT; /* Copy ndef info */ p_msg->local_tag.protocol_mask = protocol_mask; p_msg->local_tag.p_ndef_data = p_ndef_data; p_msg->local_tag.ndef_cur_size = ndef_cur_size; p_msg->local_tag.ndef_max_size = ndef_max_size; p_msg->local_tag.read_only = read_only; p_msg->local_tag.uid_len = uid_len; if (uid_len) memcpy (p_msg->local_tag.uid, p_uid, uid_len); nfa_sys_sendmsg (p_msg); return (NFA_STATUS_OK); } return (NFA_STATUS_FAILED); }
/******************************************************************************* ** ** Function NFA_HciDeregister ** ** Description This function is called to deregister an application ** from HCI. The app will be notified by NFA_HCI_DEREGISTER_EVT ** after deleting all the pipes owned by the app and deallocating ** all the gates allocated to the app or if an error occurs. ** Even if deregistration fails, the app has to register again ** to provide a new cback function. ** ** Returns NFA_STATUS_OK if the application is deregistered successfully ** NFA_STATUS_FAILED otherwise *******************************************************************************/ tNFA_STATUS NFA_HciDeregister (char *p_app_name) { tNFA_HCI_API_DEREGISTER_APP *p_msg; int xx; UINT8 app_name_len; if (p_app_name == NULL) { NFA_TRACE_API0 ("NFA_HciDeregister (): Invalid Application"); return (NFA_STATUS_FAILED); } NFA_TRACE_API1 ("NFA_HciDeregister (): Application Name: %s", p_app_name); app_name_len = (UINT8) strlen (p_app_name); if (app_name_len > NFA_MAX_HCI_APP_NAME_LEN) return (NFA_STATUS_FAILED); /* Find the application registration */ for (xx = 0; xx < NFA_HCI_MAX_APP_CB; xx++) { if ( (nfa_hci_cb.cfg.reg_app_names[xx][0] != 0) &&(!strncmp (p_app_name, &nfa_hci_cb.cfg.reg_app_names[xx][0], app_name_len)) ) break; } if (xx == NFA_HCI_MAX_APP_CB) { NFA_TRACE_ERROR1 ("NFA_HciDeregister (): Application Name: %s NOT FOUND", p_app_name); return (NFA_STATUS_FAILED); } /* Deregister the application with HCI */ if ( (nfa_hci_cb.hci_state != NFA_HCI_STATE_DISABLED) &&((p_msg = (tNFA_HCI_API_DEREGISTER_APP *) GKI_getbuf (sizeof (tNFA_HCI_API_DEREGISTER_APP))) != NULL) ) { p_msg->hdr.event = NFA_HCI_API_DEREGISTER_APP_EVT; memset (p_msg->app_name, 0, sizeof (p_msg->app_name)); BCM_STRNCPY_S (p_msg->app_name, sizeof (p_msg->app_name), p_app_name, NFA_MAX_HCI_APP_NAME_LEN); nfa_sys_sendmsg (p_msg); return (NFA_STATUS_OK); } return (NFA_STATUS_FAILED); }
/******************************************************************************* ** ** Function NFA_EeGetInfo ** ** Description This function retrieves the NFCEE information from NFA. ** The actual number of NFCEE is returned in p_num_nfcee ** and NFCEE information is returned in p_info ** ** Returns NFA_STATUS_OK if information is retrieved successfully ** NFA_STATUS_FAILED If wrong state (retry later) ** NFA_STATUS_INVALID_PARAM If bad parameter ** *******************************************************************************/ tNFA_STATUS NFA_EeGetInfo(UINT8 *p_num_nfcee, tNFA_EE_INFO *p_info) { int xx, ret = nfa_ee_cb.cur_ee; tNFA_EE_ECB *p_cb = nfa_ee_cb.ecb; UINT8 max_ret; UINT8 num_ret = 0; NFA_TRACE_DEBUG2 ("NFA_EeGetInfo em_state:%d cur_ee:%d", nfa_ee_cb.em_state, nfa_ee_cb.cur_ee); /* validate parameters */ if (p_info == NULL || p_num_nfcee == NULL) { NFA_TRACE_ERROR0 ("NFA_EeGetInfo bad parameter"); return (NFA_STATUS_INVALID_PARAM); } max_ret = *p_num_nfcee; *p_num_nfcee = 0; if (nfa_ee_cb.em_state == NFA_EE_EM_STATE_INIT) { NFA_TRACE_ERROR1 ("NFA_EeGetInfo bad em state: %d", nfa_ee_cb.em_state); return (NFA_STATUS_FAILED); } /* compose output */ for (xx = 0; (xx < ret) && (num_ret < max_ret); xx++, p_cb++) { NFA_TRACE_DEBUG4 ("xx:%d max_ret:%d, num_ret:%d ee_status:0x%x", xx, max_ret, num_ret, p_cb->ee_status); if ((p_cb->ee_status & NFA_EE_STATUS_INT_MASK) || (p_cb->ee_status == NFA_EE_STATUS_REMOVED)) { continue; } p_info->ee_handle = NFA_HANDLE_GROUP_EE | (tNFA_HANDLE)p_cb->nfcee_id; p_info->ee_status = p_cb->ee_status; p_info->num_interface = p_cb->num_interface; p_info->num_tlvs = p_cb->num_tlvs; memcpy(p_info->ee_interface, p_cb->ee_interface, p_cb->num_interface); memcpy(p_info->ee_tlv, p_cb->ee_tlv, p_cb->num_tlvs * sizeof(tNFA_EE_TLV)); p_info++; num_ret++; } NFA_TRACE_DEBUG1 ("num_ret:%d", num_ret); *p_num_nfcee = num_ret; return (NFA_STATUS_OK); }
/******************************************************************************* ** ** Function nfa_rw_handle_event ** ** Description nfa rw main event handling function. ** ** Returns TRUE if caller should free p_msg buffer ** *******************************************************************************/ BOOLEAN nfa_rw_handle_event(BT_HDR *p_msg) { UINT16 act_idx; #if (BT_TRACE_VERBOSE == TRUE) NFA_TRACE_EVENT3 ("nfa_rw_handle_event event: %s (0x%02x), flags: %08x", nfa_rw_evt_2_str (p_msg->event), p_msg->event, nfa_rw_cb.flags); #else NFA_TRACE_EVENT2 ("nfa_rw_handle_event event: 0x%x, flags: %08x",p_msg->event, nfa_rw_cb.flags); #endif /* Get NFA_RW sub-event */ if ((act_idx = (p_msg->event & 0x00FF)) < (NFA_RW_MAX_EVT & 0xFF)) { return (*nfa_rw_action_tbl[act_idx]) ( (tNFA_RW_MSG*) p_msg); } else { NFA_TRACE_ERROR1 ("nfa_rw_handle_event: unhandled event 0x%02X", p_msg->event); return TRUE; } }
/******************************************************************************* ** ** Function NFA_EeModeSet ** ** Description This function is called to activate (mode = NFA_EE_MD_ACTIVATE) ** or deactivate (mode = NFA_EE_MD_DEACTIVATE) the NFCEE ** identified by the given ee_handle. The result of this ** operation is reported with the NFA_EE_MODE_SET_EVT. ** ** Returns NFA_STATUS_OK if successfully initiated ** NFA_STATUS_FAILED otherwise ** NFA_STATUS_INVALID_PARAM If bad parameter ** *******************************************************************************/ tNFA_STATUS NFA_EeModeSet(tNFA_HANDLE ee_handle, tNFA_EE_MD mode) { tNFA_EE_API_MODE_SET *p_msg; tNFA_STATUS status = NFA_STATUS_FAILED; tNFA_EE_ECB *p_cb, *p_found = NULL; UINT32 xx; UINT8 nfcee_id = (ee_handle & 0xFF); p_cb = nfa_ee_cb.ecb; for (xx = 0; xx < nfa_ee_cb.cur_ee; xx++, p_cb++) { if (nfcee_id == p_cb->nfcee_id) { p_found = p_cb; break; } } NFA_TRACE_API2 ("NFA_EeModeSet(): handle:<0x%x>, mode:0x%02X", ee_handle, mode); if (p_found == NULL) { NFA_TRACE_ERROR1 ("NFA_EeModeSet() invalid NFCEE:0x%04x", ee_handle); status = NFA_STATUS_INVALID_PARAM; } else if ((p_msg = (tNFA_EE_API_MODE_SET *) GKI_getbuf (sizeof(tNFA_EE_API_MODE_SET))) != NULL) { p_msg->hdr.event = NFA_EE_API_MODE_SET_EVT; p_msg->nfcee_id = nfcee_id; p_msg->mode = mode; p_msg->p_cb = p_found; nfa_sys_sendmsg (p_msg); status = NFA_STATUS_OK; } return status; }
/******************************************************************************* ** ** Function NFA_EeAddAidRouting ** ** Description This function is called to add an AID entry in the ** listen mode routing table in NFCC. The status of this ** operation is reported as the NFA_EE_ADD_AID_EVT. ** ** Note: If RF discovery is started, NFA_StopRfDiscovery()/NFA_RF_DISCOVERY_STOPPED_EVT ** should happen before calling this function ** ** Note: NFA_EeUpdateNow() should be called after last NFA-EE function ** to change the listen mode routing is called. ** ** Returns NFA_STATUS_OK if successfully initiated ** NFA_STATUS_FAILED otherwise ** NFA_STATUS_INVALID_PARAM If bad parameter ** *******************************************************************************/ tNFA_STATUS NFA_EeAddAidRouting(tNFA_HANDLE ee_handle, UINT8 aid_len, UINT8 *p_aid, tNFA_EE_PWR_STATE power_state) { tNFA_EE_API_ADD_AID *p_msg; tNFA_STATUS status = NFA_STATUS_FAILED; UINT16 size = sizeof(tNFA_EE_API_ADD_AID) + aid_len; UINT8 nfcee_id = (UINT8)(ee_handle & 0xFF); tNFA_EE_ECB *p_cb; NFA_TRACE_API1 ("NFA_EeAddAidRouting(): handle:<0x%x>", ee_handle); p_cb = nfa_ee_find_ecb (nfcee_id); /* validate parameters - make sure the AID is in valid length range */ if ((p_cb == NULL) || (aid_len == 0) || (p_aid == NULL) || (aid_len < NFA_MIN_AID_LEN) || (aid_len > NFA_MAX_AID_LEN)) { NFA_TRACE_ERROR1 ("Bad ee_handle or AID (len=%d)", aid_len); status = NFA_STATUS_INVALID_PARAM; } else if ((p_msg = (tNFA_EE_API_ADD_AID *) GKI_getbuf (size)) != NULL) { NFA_TRACE_DEBUG2 ("aid:<%02x%02x>", p_aid[0], p_aid[1]); p_msg->hdr.event = NFA_EE_API_ADD_AID_EVT; p_msg->nfcee_id = nfcee_id; p_msg->p_cb = p_cb; p_msg->aid_len = aid_len; p_msg->power_state = power_state; p_msg->p_aid = (UINT8 *)(p_msg + 1); memcpy(p_msg->p_aid, p_aid, aid_len); nfa_sys_sendmsg (p_msg); status = NFA_STATUS_OK; } return status; }