/******************************************************************************* ** ** Function nfc_enabled ** ** Description NFCC enabled, proceed with stack start up. ** ** Returns void ** *******************************************************************************/ void nfc_enabled (tNFC_STATUS nfc_status, BT_HDR *p_init_rsp_msg) { tNFC_RESPONSE evt_data; tNFC_CONN_CB *p_cb = &nfc_cb.conn_cb[NFC_RF_CONN_ID]; UINT8 *p; UINT8 num_interfaces = 0, xx; int yy = 0; memset (&evt_data, 0, sizeof (tNFC_RESPONSE)); if (nfc_status == NCI_STATUS_OK) { nfc_set_state (NFC_STATE_IDLE); p = (UINT8 *) (p_init_rsp_msg + 1) + p_init_rsp_msg->offset + NCI_MSG_HDR_SIZE + 1; /* we currently only support NCI of the same version. * We may need to change this, when we support multiple version of NFCC */ evt_data.enable.nci_version = NCI_VERSION; STREAM_TO_UINT32 (evt_data.enable.nci_features, p); STREAM_TO_UINT8 (num_interfaces, p); evt_data.enable.nci_interfaces = 0; for (xx = 0; xx < num_interfaces; xx++) { if ((*p) <= NCI_INTERFACE_MAX) evt_data.enable.nci_interfaces |= (1 << (*p)); #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE) else if (((*p) >= NCI_INTERFACE_FIRST_VS) && (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) #else else if (((*p) > NCI_INTERFACE_FIRST_VS) && (yy < NFC_NFCC_MAX_NUM_VS_INTERFACE)) #endif { /* save the VS RF interface in control block, if there's still room */ nfc_cb.vs_interface[yy++] = *p; } p++; } nfc_cb.nci_interfaces = evt_data.enable.nci_interfaces; memcpy (evt_data.enable.vs_interface, nfc_cb.vs_interface, NFC_NFCC_MAX_NUM_VS_INTERFACE); evt_data.enable.max_conn = *p++; STREAM_TO_UINT16 (evt_data.enable.max_ce_table, p); #if (NFC_RW_ONLY == FALSE) nfc_cb.max_ce_table = evt_data.enable.max_ce_table; nfc_cb.nci_features = evt_data.enable.nci_features; nfc_cb.max_conn = evt_data.enable.max_conn; #endif nfc_cb.nci_ctrl_size = *p++; /* Max Control Packet Payload Length */ p_cb->init_credits = p_cb->num_buff = 0; STREAM_TO_UINT16 (evt_data.enable.max_param_size, p); nfc_set_conn_id (p_cb, NFC_RF_CONN_ID); evt_data.enable.manufacture_id = *p++; STREAM_TO_ARRAY (evt_data.enable.nfcc_info, p, NFC_NFCC_INFO_LEN); NFC_DiscoveryMap (nfc_cb.num_disc_maps, (tNCI_DISCOVER_MAPS *) nfc_cb.p_disc_maps, NULL); }
/******************************************************************************* ** ** Function nfc_task_shutdown_nfcc ** ** Description Handle NFC shutdown ** ** Returns nothing ** *******************************************************************************/ void nfc_task_shutdown_nfcc (void) { BT_HDR *p_msg; /* Free any messages still in the mbox */ while ((p_msg = (BT_HDR *) GKI_read_mbox (NFC_MBOX_ID)) != NULL) { GKI_freebuf (p_msg); } nfc_gen_cleanup (); if (nfc_cb.flags & NFC_FL_POWER_OFF_SLEEP) { nfc_set_state (NFC_STATE_W4_HAL_CLOSE); nfc_cb.p_hal->close(shutingdown_reason); } else if (nfc_cb.flags & NFC_FL_POWER_CYCLE_NFCC) { nfc_set_state (NFC_STATE_W4_HAL_OPEN); nfc_cb.p_hal->power_cycle(); } else { nfc_set_state (NFC_STATE_W4_HAL_CLOSE); nfc_cb.p_hal->close(shutingdown_reason); /* Perform final clean up */ llcp_cleanup (); /* Stop the timers */ GKI_stop_timer (NFC_TIMER_ID); GKI_stop_timer (NFC_QUICK_TIMER_ID); #if (defined (NFA_INCLUDED) && NFA_INCLUDED == TRUE) GKI_stop_timer (NFA_TIMER_ID); #endif } }
/******************************************************************************* ** ** Function nfc_task ** ** Description NFC event processing task ** ** Returns nothing ** *******************************************************************************/ UINT32 nfc_task (UINT32 param) { UINT16 event; BT_HDR *p_msg; BOOLEAN free_buf; /* Initialize the nfc control block */ memset (&nfc_cb, 0, sizeof (tNFC_CB)); nfc_cb.trace_level = NFC_INITIAL_TRACE_LEVEL; nfc_cb.get_nfcc_info = FALSE; NFC_TRACE_DEBUG0 ("NFC_TASK started."); /* main loop */ while (TRUE) { event = GKI_wait (0xFFFF, 0); /* Handle NFC_TASK_EVT_TRANSPORT_READY from NFC HAL */ if (event & NFC_TASK_EVT_TRANSPORT_READY) { NFC_TRACE_DEBUG0 ("NFC_TASK got NFC_TASK_EVT_TRANSPORT_READY."); /* Reset the NFC controller. */ nfc_set_state (NFC_STATE_CORE_INIT); nci_snd_core_reset (NCI_RESET_TYPE_RESET_CFG); } if (event & NFC_MBOX_EVT_MASK) { /* Process all incoming NCI messages */ while ((p_msg = (BT_HDR *) GKI_read_mbox (NFC_MBOX_ID)) != NULL) { free_buf = TRUE; /* Determine the input message type. */ switch (p_msg->event & BT_EVT_MASK) { case BT_EVT_TO_NFC_NCI: if((!nfc_cb.get_nfcc_info)) { nfc_task_get_nfcc_info(p_msg); nfc_cb.get_nfcc_info = TRUE; } else { free_buf = nfc_ncif_process_event (p_msg); } break; case BT_EVT_TO_START_TIMER : /* Start nfc_task 1-sec resolution timer */ GKI_start_timer (NFC_TIMER_ID, GKI_SECS_TO_TICKS (1), TRUE); break; case BT_EVT_TO_START_QUICK_TIMER : /* Quick-timer is required for LLCP */ GKI_start_timer (NFC_QUICK_TIMER_ID, ((GKI_SECS_TO_TICKS (1) / QUICK_TIMER_TICKS_PER_SEC)), TRUE); break; case BT_EVT_TO_NFC_MSGS: nfc_main_handle_hal_evt ((tNFC_HAL_EVT_MSG*)p_msg); break; default: NFC_TRACE_DEBUG1 ("nfc_task: unhandle mbox message, event=%04x", p_msg->event); break; } /*check if the buffer status is BUF_STATUS_UNLINKED*/ if (BUF_STATUS_UNLINKED == GKI_getbufstatus(p_msg) && free_buf) { GKI_freebuf (p_msg); } } } /* Process gki timer tick */ if (event & NFC_TIMER_EVT_MASK) { nfc_process_timer_evt (); } /* Process quick timer tick */ if (event & NFC_QUICK_TIMER_EVT_MASK) { nfc_process_quick_timer_evt (); } #if (defined (NFA_INCLUDED) && NFA_INCLUDED == TRUE) if (event & NFA_MBOX_EVT_MASK) { while ((p_msg = (BT_HDR *) GKI_read_mbox (NFA_MBOX_ID)) != NULL) { nfa_sys_event (p_msg); } } if (event & NFA_TIMER_EVT_MASK) { nfa_sys_timer_update (); } #endif } NFC_TRACE_DEBUG0 ("nfc_task terminated"); return 0; }