我正在尝试在Nexus 5X(bullhead)或Nexus 6P(钓鱼者)上配置NFC芯片组,以便将UICC用作我在OffHostApduService中声明的AID的NFC离线路径。
编辑2016年1月17日: 我已经更新了这个问题并且还包含了Nexus 6P,因为我也有机会测试它,它的行为与5X完全相同。因此,5X的所有先前发现似乎也适用于6P。
由于Michael Roland在this question here和Nexus 6(shamu)上的回答(见Nexus 6 bcm2079x config in my Github repository),我之前在Nexus 5(锤头)上设法做到了这一点。
然而,Nexus 5X(以及6P)似乎有所不同:
/dev/pn548
libnfc-brcm.conf
下的libnfc-nxp.conf
和/system/etc/
配置文件(您也可以在我的Github存储库中找到它们)作为起点,我修改了两个配置文件
中的跟踪/日志设置APPL_TRACE_LEVEL
设为0x05
NXPLOG_*_LOGLEVEL
为0x03
令我惊讶的是,我在启动过程中看到很多BrcmNfcJni
消息在logcat中,类似于我在Nexus 5和6上看到的消息(我不希望在设备上出现这些消息)使用恩智浦芯片组):
12-11 20:45:36.840 D/BrcmNfcJni( 3434): JNI_OnLoad: enter
12-11 20:45:36.841 I/BrcmNfcJni( 3434): NFC Service: loading nci JNI
12-11 20:45:36.841 D/BrcmNfcJni( 3434): register_com_android_nfc_NativeNfcManager: enter
12-11 20:45:36.841 D/BrcmNfcJni( 3434): PowerSwitch::initialize: level=PS-UNKNOWN (0)
12-11 20:45:36.923 D/BrcmNfcJni( 3434): PowerSwitch::initialize: desired screen-off state=1
12-11 20:45:36.923 D/BrcmNfcJni( 3434): register_com_android_nfc_NativeNfcManager: exit
12-11 20:45:36.923 D/BrcmNfcJni( 3434): register_com_android_nfc_NativeNfcTag
12-11 20:45:36.924 D/BrcmNfcJni( 3434): RoutingManager::RoutingManager(): default route is 0x00
12-11 20:45:36.924 D/BrcmNfcJni( 3434): RoutingManager::RoutingManager(): mOffHostEe=0xF2
12-11 20:45:36.924 D/BrcmNfcJni( 3434): RoutingManager::registerJniFunctions
12-11 20:45:36.924 D/BrcmNfcJni( 3434): JNI_OnLoad: exit
....
....
编辑1: 我从源代码中了解到,这些“BrcmNfc ..”日志消息是从 libnfc-nci 库中的代码发出的。在以前的设备上,NCI(代表: N FC c ontroller i nterface)仅被Broadcom芯片组使用(我猜这就是为什么代码使用前缀“Brcm”进行日志记录)。但显然新的NXP芯片组现在也使用这种标准化接口(这很好),现在我们也看到了“Brcm ...”日志信息,即使使用恩智浦芯片组也是如此。
编辑3: 这两款手机(Nexus 5X和6P)似乎都包含运行固件版本10.01.19的恩智浦PN548 / C2 NFC芯片组(至少在Android 6.0.1版本中)。
当然还有恩智浦pn54x halimpl的输出:
12-11 20:45:37.407 D/ ( 3434): phNxpLog_InitializeLogLevel: global =1, Fwdnld =3, extns =3, hal =3, tml =3, ncir =3, ncix =3
12-11 20:45:37.408 D/NxpHal ( 3434): Entering phNxpNciHal_init_monitor
12-11 20:45:37.408 D/NxpHal ( 3434): Returning with SUCCESS
12-11 20:45:37.408 D/NxpTml ( 3434): Opening port=/dev/pn54x
12-11 20:45:37.408 D/NxpTml ( 3434): phTmlNfc_i2c_reset(), VEN level 1
12-11 20:45:37.527 D/NxpTml ( 3434): phTmlNfc_i2c_reset(), VEN level 0
12-11 20:45:37.647 D/NxpTml ( 3434): phTmlNfc_i2c_reset(), VEN level 1
12-11 20:45:37.667 D/NxpTml ( 3434): PN54X - Tml Reader Thread Started................
12-11 20:45:37.667 D/NxpTml ( 3434): PN54X - Read requested.....
12-11 20:45:37.667 D/NxpTml ( 3434): PN54X - Invoking I2C Read.....
....
....
所以作为第一次开始,我尝试修改libnfc-nxp.conf
文件,从注释表明UICC或SWP的实现的参数开始:
# No secure element 0x00
# eSE 0x01
# UICC 0x02
-NXP_DEFAULT_SE=0x03
+NXP_DEFAULT_SE=0x02
并将A0EC
中的NXP_CORE_CONF_EXTN
标记设置为0x01
(因为注释表明此标记负责SWP1连接器):
# A0EC - SWP1 interface
# 0x00 - Disabled
# 0x01 - Enabled
- A0, EC, 01, 00,
+ A0, EC, 01, 01,
不幸的是,这不起作用,我仍然收到主机系统中针对我的offhost-service的APDU(如此logcat消息所示:E/HostEmulationManager( 3434): AID that was meant to go off-host was routed to host.
)。
在后来的尝试中,我也尝试使用libnfc-brcm.conf
中的参数(正如Michael Roland在上述问题中所描述的那样),但仍未成功。
编辑2:
我仍然没有找到一个有效的解决方案,但我把我的尝试推到了我的github repository under the dev1 branch。我还为每个测试推送了生成的logcat输出。我正在使用新的无根Nexus 5X on Stock Android 6.0.1进行测试。 (编辑:与此同时我还有一个Nexus 6P用于测试,但行为相同。)为了修改系统分区上的配置文件,我暂时启动到侧载恢复映像:(fastboot boot twrp-2.8.7.2-bullhead.img
)。
目前我总是收到此错误(我还尝试使用0xf2
和0xf4
作为脱离主机路由目标):
12-16 09:38:05.524 I/BrcmNfcNfa( 3480): NFA_EeAddAidRouting(): handle:<0xf3>
12-16 09:38:05.524 I/BrcmNfcNfa( 3480): nfa_ee_find_ecb ()
12-16 09:38:05.524 E/BrcmNfcNfa( 3480): Bad ee_handle or AID (len=14)
12-16 09:38:05.524 E/BrcmNfcJni( 3480): RoutingManager::addAidRouting: failed to route AID
答案 0 :(得分:6)
正如您已经发现的那样,SWP线路未连接到UICC插槽。我们通常不会为Nexus设备执行此操作,因为我们不会在AOSP中支持UICC上的安全元素。唯一的例外是Lollipop上的Nexus 6,它支持美国的SoftCard移动支付(以及HCE)。在SoftCard被Google收购后,我们在Marshmallow中删除了代码以再次支持UICC。
我很惊讶BTW这对N5有用 - 它应该也没有连接SWP。也许这并没有在所有设备上正确完成。
答案 1 :(得分:5)
在Nexus 5X(编辑:以及Nexus 6P)上似乎无法通过NFC Offhost路由到UICC。据我所知,SWP NFC芯片的线路未连接到UICC(在两部手机上)。
修改1 :
与此同时,我在Nexus 6P上获得了所有相同的测试,就像我在5X上做的那样。我现在可以确认6P的行为相同。在调用 phNxpNciHal_SwpTest
函数时,我甚至在logcat中遇到了相同的错误。因此,在Nexus 6P上,SWP线路未连接到UICC。
在使用不同配置文件设置的多次尝试失败后,我查看了libnfc-hci库中的NXP实现,并在“self-test /”中找到了有趣的函数“ phNxpNciHal_SwpTest ”根据评论,phNxpNciHal_SelfTest.c“似乎测试了SWP线:
/*******************************************************************************
**
** Function phNxpNciHal_SwpTest
**
** Description Test function to validate the SWP line. SWP line number is
** is sent as parameter to the API.
**
** Returns NFCSTATUS_SUCCESS if successful,otherwise NFCSTATUS_FAILED.
**
*******************************************************************************/
然后我修改了hal/phNxpNciHal.c
文件(添加了许多调试日志语句只是为了更好地理解流程)并添加了2个调用此测试函数。首先我尝试在phNxpNciHal_open
函数的末尾添加它(请参阅我的更改here on GitHub),之后还尝试在实际关闭NFCC接口之前在phNxpNciHal_close
函数的开头添加它,只是为了确保UICC和所有内容都在此时初始化(请参阅我上面链接的GitHub帐户上的提交6b33149)。
在测试期间,将具有SWP功能的UICC插入设备中。
不幸的是,对phNxpNciHal_SwpTest
的所有调用都返回了错误(对于两个SWP行)。在下面的logcat输出中查找字符串“ phNxpNciHal_SwpTest - FAILED ”:
12-22 08:48:01.597 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - testing SWP line 0x01
12-22 08:48:01.597 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - performing test...
12-22 08:48:01.597 D/NxpTml ( 3691): PN54X - Write requested.....
12-22 08:48:01.597 D/NxpTml ( 3691): PN54X - Invoking I2C Write.....
12-22 08:48:01.598 D/NxpNciX ( 3691): len = 4 > 20000101
12-22 08:48:01.598 D/NxpTml ( 3691): PN54X - I2C Write successful.....
12-22 08:48:01.598 D/NxpTml ( 3691): PN54X - Posting Fresh Write message.....
12-22 08:48:01.598 D/NxpTml ( 3691): PN54X - Tml Writer Thread Running................
12-22 08:48:01.598 D/NxpHal ( 3691): write successful status = 0x0
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ performTest: write success. staring read locked from NFCC..
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ readLocked: semaphore created, starting tml nfc read..
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ readLocked: read returned..
12-22 08:48:01.598 E/NxpHal ( 3691): TML Read status error status = 16f
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ performTest: at clean_and_return label.. concurrency_unlock..
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - performing test FAILED...will break loop
12-22 08:48:01.598 D/NxpHal ( 3691): phNxpNciHal_SwpTest - FAILED
12-22 08:48:01.598 D/NxpHal ( 3691): phNxpNciHal_SwpTest - end
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ: SWP1 test done, will perform SWP2 test now.
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - start
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - testing SWP line 0x02
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - performing test..
12-22 08:48:01.598 D/NxpHal ( 3691): JZJZ performTest: concurrency locked. write locked to NFCC..
12-22 08:48:01.598 D/NxpTml ( 3691): PN54X - Write requested.....
12-22 08:48:01.598 D/NxpTml ( 3691): PN54X - Invoking I2C Write.....
12-22 08:48:01.599 D/NxpNciX ( 3691): len = 4 > 20000101
12-22 08:48:01.599 D/NxpTml ( 3691): PN54X - I2C Write successful.....
12-22 08:48:01.599 D/NxpTml ( 3691): PN54X - Posting Fresh Write message.....
12-22 08:48:01.599 D/NxpTml ( 3691): PN54X - Tml Writer Thread Running................
12-22 08:48:01.599 D/NxpHal ( 3691): write successful status = 0x0
12-22 08:48:01.599 D/NxpHal ( 3691): JZJZ performTest: write success. staring read locked from NFCC..
12-22 08:48:01.599 D/NxpHal ( 3691): JZJZ readLocked: semaphore created, starting tml nfc read..
12-22 08:48:01.599 D/NxpHal ( 3691): JZJZ readLocked: read returned..
12-22 08:48:01.599 E/NxpHal ( 3691): TML Read status error status = 16f
12-22 08:48:01.599 D/NxpHal ( 3691): JZJZ performTest: at clean_and_return label.. concurrency_unlock..
12-22 08:48:01.599 D/NxpHal ( 3691): JZJZ phNxpNciHal_SwpTest - performing test FAILED...will break loop.
12-22 08:48:01.599 D/NxpHal ( 3691): phNxpNciHal_SwpTest - FAILED
12-22 08:48:01.599 D/NxpHal ( 3691): phNxpNciHal_SwpTest - end
12-22 08:48:01.599 D/NxpHal ( 3691): JZJZ: SWP2 test done.
如果不进一步了解恩智浦PN548 / C2 芯片组的硬件细节,我认为这意味着芯片组的两条SWP线路都没有连接到Nexus 5X(bullhead)手机中。
如果有人对此话题有更多了解,请随意纠正我! :)