NFC离机路由到Nexus 5X和Nexus 6P的UICC

8
我正在尝试在Nexus 5X(牛头)或Nexus 6P(钓鱼者)上配置NFC芯片,以便将UICC用作在我的OffHostApduService中声明的AID的NFC offhost路由。
编辑于2016年1月17日:我更新了这个问题,并且还包括了Nexus 6P,因为我有机会测试它,它的行为与5X完全相同。因此,所有先前从5X获得的发现似乎也适用于6P。
我之前在Nexus 5(锤头)上做到了这一点,感谢Michael Roland在这里的问题上的回答,也在Nexus 6(鲨鱼)上实现了这一点(请参见我的Github存储库中的Nexus 6 bcm2079x配置)。
然而,Nexus 5X(和6P)似乎不同:
  • 根据ifixit的拆解,它包含了来自NXP(PN548)的新芯片组,而不是像Nexus 4、5和6一样的Broadcom bcm2079x。
  • 我可以确认该设备可以读取Mifare Classic标签(这加强了它包含NXP芯片组的假设,因为Broadcom芯片组不支持Mifare Classic),并且存在一个设备文件/dev/pn548
  • 但奇怪的是,它同时包含了/system/etc/下的libnfc-brcm.conflibnfc-nxp.conf配置文件(你也可以在我的Github存储库中找到这些文件)

作为起点,我修改了两个配置文件中的跟踪/日志设置

  • 将brcm的APPL_TRACE_LEVEL设置为0x05
  • 将nxp的NXPLOG_*_LOGLEVEL设置为0x03
我感到疑惑的是,在启动过程中,我在logcat中看到了很多与Nexus 5和6上看到的类似的BrcmNfcJni消息(我没有预料到在具有NXP芯片组的设备上会出现这种情况)。
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(代表:NFC controller interface)仅由Broadcom芯片组使用(我想这就是代码使用“Brcm”前缀记录的原因)。但显然,新的NXP芯片组现在也使用此标准化接口(这很好),现在我们甚至可以看到带有NXP芯片组的“Brcm…”日志消息。

编辑3:两部手机(Nexus 5X和6P)似乎都包含运行固件版本10.01.19的NXP PN548/C2 NFC芯片组(至少在Android 6.0.1发布版中)。

当然,NXP 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

同时,还需将NXP_CORE_CONF_EXTN中的A0EC标签设置为0x01(注释指出该标签负责SWP1连接器):

# A0EC      - SWP1 interface
#             0x00 - Disabled
#             0x01 - Enabled

-        A0, EC, 01, 00,
+        A0, EC, 01, 01,

很不幸,这并没有起作用,我仍然在主机系统中接收到针对我的离机服务的APDU(如此logcat消息所示:E/HostEmulationManager( 3434): AID that was meant to go off-host was routed to host.)。
在后续尝试中,我还尝试了在libnfc-brcm.conf参数中进行调整(如上述问题中Michael Roland所描述的),但仍然没有成功。
问题:
  • 有人成功地配置过Nexus 5X或6P上的NFC离机路由到UICC吗?
  • 或者可能有一些提示,我可以寻找更深入的见解?
  • PN548芯片组的数据表也将非常有帮助。
编辑 2: 我仍然没有找到可行的解决方案,但我已经将我的尝试推送到了github代码库中的dev1分支。我还推送了每个测试的结果logcat输出。我正在使用一台新的未root的Nexus 5X手机进行测试,其运行着Stock Android 6.0.1。(编辑:同时我也拿到了一台Nexus 6P进行测试,但它的表现相同)。为了修改系统分区上的配置文件,我会临时启动一个sideloaded恢复镜像:fastboot boot twrp-2.8.7.2-bullhead.img

目前我总是得到这个错误(我已经尝试过使用0xf20xf4作为离线主机路由目标):

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

好的,我现在明白为什么还有一个libnfc-brcm.conf配置文件了:原因是NXP PN548芯片使用标准化的libnfc-nci主机接口(而不再使用先前具有PN544的旧设备中使用的libnfc-nxp堆栈)。 (请参见NXP的github存储库libnfc-brcm.conf文件只是libnfc-nci库的配置文件,而libnfc-nxp.conf则是nxp特定设置的配置文件。 - Johannes Zweng
更新2:我的Nexus 5X测试设备中的芯片组似乎是运行固件版本为10.01.19的NXP PN548C2。有没有办法确定SWP1或SWP2引脚是否连接到UICC? - Johannes Zweng
2个回答

6

正如您已经发现的那样,SWP线路与UICC插槽没有连接。我们通常不会在Nexus设备上这样做,因为我们不支持AOSP中UICC上的安全元素。唯一的例外是Lollipop上的Nexus 6,在美国支持SoftCard移动支付(以及HCE)。在SoftCard被Google收购后,我们在Marshmallow中删除了支持UICC的代码。

顺便说一句,我很惊讶这在N5上能够工作 - 它本应该也没有连接SWP。也许并非所有设备都正确地执行了此操作。


嗨@martijn-coenen,非常感谢您宝贵的意见。我认为这意味着我不必再查看Nexus 6P,因为它也没有与UICC的SWP连接。目前,我已在运行Android 6.0.1的Nexus 6(shamu)上安装了OpenMobile API。我期待着能够切换到其中一款新的nexus设备,同时仍然能够使用基于UICC的银行卡(https://www.bankomatkarte-mobil.at/)。 - Johannes Zweng
1
是的,6P是一样的。请注意,这就是我们告诉华为和LGE要做的事情,我实际上没有打开任何一个设备来验证这一点。但在(早期的)原理图上,它们没有连接。 - Martijn Coenen
再次感谢@martijn-coenen提供的信息。如果我有机会拿到6P,也许我还会尝试检查一下(因为它在我的LG Nexus 5上也意外地起作用)。 - Johannes Zweng
我拿到了一台Nexus 6P用于测试,并出于好奇做了相同的测试。现在我可以证实,我所有的发现也适用于Nexus 6P。它的行为是完全一样的。此外,在Nexus 6P上,SWP线路未连接到UICC。 - Johannes Zweng

5

简短回答:

Nexus 5X(编辑:以及Nexus 6P)似乎无法将NFC Offhost路由到UICC。据我了解,NFC芯片的SWP线与UICC没有连接(这两个手机都是如此)。


编辑1:目前我拥有一部Nexus 6P并进行了与5X相同的测试。我可以证实,6P的表现相同。当调用phNxpNciHal_SwpTest函数时,我甚至在logcat中得到了相同的错误。因此,在Nexus 6P上,SWP线也未连接到UICC。


详细说明:

在尝试不同配置文件设置多次失败后,我查看了libnfc-hci库中的NXP实现,并在"self-test/phNxpNciHal_SelfTest.c"中找到了有趣的函数“phNxpNciHal_SwpTest”,根据说明,该函数似乎测试了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函数的末尾(请参见我在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.

结论:

如果没有更多关于NXP PN548/C2芯片组的硬件细节知识,我认为这意味着Nexus 5X(bullhead)手机中芯片组的两条SWP线路都未连接。

如果有人对此主题有更深入的了解,请随时纠正我! :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接