03.05 NFC Enable

NFC Enable

認識NFC系統是如何工作的,最好的方法莫過於熟悉NFC各個流程,本篇就介紹下NFC使能的流程。

NFC的上層服務 com.android.nfc 啟動隨著使能整個NFC系統,通過JNI層的 NativeNfcManager.nfcManager_doInitialize()初始化底層的相關so庫。

整個使能的過程中,需要記住層層向下設置的回調函數,這些回調都是以後底層數據上報的通路。Enable的詳細流程圖如下:

NFC Enable

上面紅色字體標註的相關函數在整個NFC系統中是很重要的回調。打開pn54x模塊的初始化操作,具體請查看 《NFC Controller》。模塊打開完成通過 phNxpNciHal_open_complete()上報完成事件。打開的完成事件上報流程見下圖:

NFC Enable

打開的完成事件(數據)上報最終都會通過NFC_TASK線程的處理函數nfc_task(),接收到NFC_TASK_EVT_TRANSPORT_READY事件,協議棧會默認重置、初始化NFC芯片(同打開pn54x模塊時重置、初始化芯片流程一樣),同時改變nfc_cb.nfc_state的狀態:NFC_STATE_W4_HAL_OPEN -> NFC_STATE_CORE_INIT。

數據下發的一般流程為協議棧按照指令的不同封裝數據格式,最後調用HAL_WRITE()將數據下發到底層庫中繼續處理,最後通過I2C總線將數據寫入芯片。硬件芯片收到數據處理完成後會對下發的指令進行回覆,Tml的讀線程就會將芯片上報的數據讀取過來。Tml的讀、寫線程如何工作的可以查看《NFC Controller》。Tml讀數據的流程見下圖:

NFC Enable

經過Reset、Init指令的成功執行後nfc_cb.nfc_state的變化為:NFC_STATE_CORE_INIT -> NFC_STATE_W4_POST_INIT_CPLT。

最後調用nfc_cb.p_hal->core_initialized()內核初始化完成。在core_initialized的完成事件上報中將nfc_cb.nfc_state的狀態值置到一個正常值:NFC_STATE_IDLE。

以NFA_DM_ENABLE_EVT事件上報到JNI層代表NFC系統的初始化工作完成,最後設置芯片進入斷電休眠模式(LOW_POWER)來降低功耗。

最終的 nfc_cb.nfc_state:NFC_STATE_IDLE -> NFC_STATE_NFCC_POWER_OFF_SLEEP。


分享到:


相關文章: