android pn551模块分析笔记
pn551的底层是I2C模块,这里采用断点+函数调用的自底向上的分析方式
模块架构
hal_->phNxpNciHal_->phTmlNfc_*,其中phNxpNciHal内部维护了一个队列
从i2c读取数据
phTmlNfc_TmlThread->phTmlNfc_i2c_Thread。猜测phTmlNfc_TmlThread应该是某个线程的入口函数
,果然,在同文件下phTmlNfc_startThread通过pthread_create创建了上述线程。在phTmlNfc_startThread中先后创建了读写线程
nfc_nci.c
nfc_open打开或者创建nfc设备实例,内部注册hal_*函数,将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
对文件内容下断点。在NFC没有完全启动前,phDnldNfc_*函数会被调用。启动后不再调用
自顶向上分析
对hardware层的write函数下断点,跟进,发现其进入pn551的nci模块。
打开设备
在dev目录下并没有找到hal层的代码中的pn54x,仅有一个pn551。这让我一度怀疑人生。发现内核中注册的设备为pn551,感觉代码hal层的表述出现了偏差。于是:
关闭NFC前对phNxpNciHal_open下断点,重启nfc,中断到phNxpNciHal_open。待函数执行过GetNxpStrValue后,执行p nfc_dev_node
显示 /dev/pn551
。这和代码中的pn54x不同。
真想只有一个,nfc驱动也只有一个,那就是pn551!!!