android pn551模塊分析筆記
pn551的底層是I2C模塊,這里采用斷點+函數(shù)調(diào)用的自底向上的分析方式
模塊架構(gòu)
hal_->phNxpNciHal_->phTmlNfc_*,其中phNxpNciHal內(nèi)部維護(hù)了一個隊列
從i2c讀取數(shù)據(jù)
phTmlNfc_TmlThread->phTmlNfc_i2c_Thread。猜測phTmlNfc_TmlThread應(yīng)該是某個線程的入口函數(shù)
,果然,在同文件下phTmlNfc_startThread通過pthread_create創(chuàng)建了上述線程。在phTmlNfc_startThread中先后創(chuàng)建了讀寫線程
nfc_nci.c
nfc_open打開或者創(chuàng)建nfc設(shè)備實例,內(nèi)部注冊hal_*函數(shù),將nfc_open注冊到HAL_MODULE_INFO_SYM中
command and response
phNxpNciHal_process_ext_cmd_rsp:
send ext command -- start timer -- wait for response -- stop timer
下斷點技巧
用rbreak對文件內(nèi)容下斷點。在NFC沒有完全啟動前,phDnldNfc_*函數(shù)會被調(diào)用。啟動后不再調(diào)用
自頂向上分析
對hardware層的write函數(shù)下斷點,跟進(jìn),發(fā)現(xiàn)其進(jìn)入pn551的nci模塊。
打開設(shè)備
在dev目錄下并沒有找到hal層的代碼中的pn54x,僅有一個pn551。這讓我一度懷疑人生。發(fā)現(xiàn)內(nèi)核中注冊的設(shè)備為pn551,感覺代碼hal層的表述出現(xiàn)了偏差。于是:
關(guān)閉NFC前對phNxpNciHal_open下斷點,重啟nfc,中斷到phNxpNciHal_open。待函數(shù)執(zhí)行過GetNxpStrValue后,執(zhí)行p nfc_dev_node 顯示 /dev/pn551。這和代碼中的pn54x不同。
真想只有一個,nfc驅(qū)動也只有一個,那就是pn551?。?!