【问题标题】:NFC Offhost routing to the UICC on the Nexus 5X and the Nexus 6PNFC 离主机路由到 Nexus 5X 和 Nexus 6P 上的 UICC
【发布时间】:2015-12-13 12:20:14
【问题描述】:

我正在尝试在 Nexus 5X(牛头)或 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)似乎有所不同:

  • 根据 ifixit 拆解,它包含来自 NXP (PN548) 的新芯片组,而不是像 Nexus 4、5 和 6 那样的 Broadcom bcm2079x。
  • 我可以确认该设备可以读取 Mifare Classic 标签(这加强了它包含 NXP 芯片组的假设,因为 Broadcom 芯片组不支持 Mifare Classic)并且设备文件 /dev/pn548 存在
  • 但很奇怪,它同时包含libnfc-brcm.conflibnfc-nxp.conf 配置文件,位于/system/etc/ 下(您也可以在我的Github 存储库中找到这些文件)

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

  • APPL_TRACE_LEVEL 设置为0x05 用于brcm
  • 为 nxp 将 NXPLOG_*_LOGLEVEL 设置为 0x03

让我感到奇怪的是,我在启动期间在 logcat 中看到了很多 BrcmNfcJnimessages,类似于我在 Nexus 5 和 6 上看到的那些(我不会在配备 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 ininterface)仅用于 Broadcom 芯片组(我想这就是为什么该代码使用前缀“Brcm”进行日志记录)。但显然,新的 NXP 芯片组现在也使用这种标准化接口(这很好),现在我们也可以看到“Brcm...”日志消息,即使是 NXP 芯片组。

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

当然还有来自 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 文件,从 cmets 指示 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,

不幸的是,这不起作用,我仍然收到针对主机系统中我的 offhost-service 的 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 repository under the dev1 branch。我还为每个测试推送了生成的 logcat 输出。我正在 Stock Android 6.0.1 上使用新的无根 Nexus 5X 进行测试。 (编辑:与此同时,我还得到了一个 Nexus 6P 进行测试,但它的行为相同。)为了修改系统分区上的配置文件,我暂时启动到一个侧面加载的恢复映像:(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 堆栈)。 (另见here in NXP's github repositorylibnfc-brcm.conf 文件只是 libnfc-nci 库的配置文件,而 libnfc-nxp.conf nxp 特定设置。
  • Update2:我的 Nexus 5X 测试设备中的芯片组似乎是运行固件版本为 10.01.19 的 NXP PN548C2。有什么方法可以判断SWP1或者SWP2引脚是接UICC的吗?

标签: android nfc apdu hce nxp-microcontroller


【解决方案1】:

您已经发现,SWP 线路没有连接到 UICC 插槽。我们通常不对 Nexus 设备执行此操作,因为我们不支持 AOSP 中 UICC 上的安全元素。一个例外是 Lollipop 上的 Nexus 6,它在美国支持 SoftCard 移动支付(以及 HCE)。 SoftCard 被 Google 收购后,我们删除了 Marshmallow 中再次支持 UICC 的代码。

我很惊讶顺便说一句,这在 N5 上有效 - 它也应该没有连接 SWP。也许这并不是在所有设备上都正确完成。

【讨论】:

  • 嗨@mar​​tijn-coenen,非常感谢您的宝贵意见。我认为这意味着我不必进一步研究 Nexus 6P,因为它也没有与 UICC 的 SWP 连接。目前,我已经在运行 Android 6.0.1 的 Nexus 6 (shamu) 上安装了 OpenMobile API。我期待着切换到新的 nexus 设备之一,同时仍然能够使用我的基于 UICC 的银行卡 (bankomatkarte-mobil.at)。
  • 是的,6P 是一样的。请注意,这是我们告诉华为和 LGE 要做的事情,我实际上还没有打开任何设备来验证这一点。但是在(早期的)原理图中,它们没有连接。
  • 再次感谢@martijn-coenen 提供此信息。如果我拿到了 6P,也许我仍然会尝试检查(因为它在我的 LG Nexus 5 上也能出人意料地工作)。
  • 我得到了一个 Nexus 6P 进行测试,出于好奇,我做了同样的测试。我现在可以确认,我的所有发现也适用于 Nexus 6P。它的行为相同。同样在 Nexus 6P 上,SWP 线没有连接到 UICC。
【解决方案2】:

简答:

到 UICC 的 NFC Offhost 路由似乎在 Nexus 5X 上是不可能的(edit: 以及在 Nexus 6P 上)。 据我了解,SWP NFC 芯片的线路未连接到 UICC(在两部手机上)。


编辑 1: 与此同时,我拿到了 Nexus 6P,进行了与 5X 相同的测试。我现在可以确认 6P 的行为相同。在调用 phNxpNciHal_SwpTest 函数时,我什至在 logcat 中遇到了同样的错误。所以在 Nexus 6P 上,SWP 线也没有连接到 UICC。


详情:

在多次尝试使用不同的配置文件设置均不成功后,我查看了 libnfc-hci 库中的 NXP 实现,并在 "self-test/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.

结论:

在没有进一步了解 NXP PN548/C2 芯片组的硬件细节的情况下,我假设这意味着芯片组的两条 SWP 线都没有连接到 Nexus 5X(牛头式)手机中。

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

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 1970-01-01
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多