首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nexus 5X和Nexus 6P上的NFC离开路由到UICC

Nexus 5X和Nexus 6P上的NFC离开路由到UICC
EN

Stack Overflow用户
提问于 2015-12-13 12:20:14
回答 2查看 2.5K关注 0票数 8

我正在尝试配置Nexus5X(牛头)或Nexus6P(垂钓者)上的NFC芯片组,以便使用UICC作为我在OffHostApduService中声明的艾滋病的非主机路由。

编辑2016年1月17日:我更新了这个问题,还包括了Nexus6P,因为我也有机会测试它,它的行为与5X完全一样。因此,5X之前的所有发现似乎也适用于6P。

由于Michael在这个问题在这里上的回答,以及在Nexus 6 (shamu)上的回答(参见Nexus 6 在我的bcm2079x存储库中的配置),我在Nexus 5(锤头)上成功地做到了这一点。

然而,Nexus 5X (以及6P)似乎是不同的:

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

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

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

让我感到奇怪的是,在启动过程中,我在logcat中看到了许多BrcmNfcJni消息,类似于我在Nexus 5和6上看到的消息(我在使用NXP芯片组的设备上没有想到这一点):

代码语言:javascript
复制
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 (代表:NFC controller ontroller interface)仅用于Broadcom芯片组(我猜这就是代码使用前缀"Brcm“进行日志记录的原因)。但是很明显,新的NXP芯片组现在也使用了这个标准化的接口(这很好),现在我们也看到了“Brcm.”记录消息,即使使用NXP芯片组。

编辑3:和手机(Nexus5X和6P)似乎都包含运行固件版本10.01.19的NXP 548/C2 NFC芯片组(至少在Android6.0.1版中是如此)。

当然,也有来自NXP pn54x halimpl的输出:

代码语言:javascript
复制
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的实现的参数开始:

代码语言:javascript
复制
 # No secure element 0x00
 # eSE               0x01
 # UICC              0x02
-NXP_DEFAULT_SE=0x03
+NXP_DEFAULT_SE=0x02

并将NXP_CORE_CONF_EXTN中的NXP_CORE_CONF_EXTN标记设置为0x01 (如注释指出该标记负责SWP1连接器):

代码语言:javascript
复制
# 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所描述的),但仍然没有成功。

问题:

  • 有人成功地在Nexus 5X或6P上配置到UICC的NFC离开主机路由吗?
  • 或者可能有一些提示,我可以在那里寻找更深入的见解?
  • 另外,PN548芯片组的数据表将非常有用。

编辑2:我仍然没有找到一个可行的解决方案,但是我一直把我的尝试推到了我的分支上。我还为每个测试推送了最终的logcat输出。我正在测试一个新的未根植的Nexus5X的股票,Android 6.0.1。(编辑:同时,我也有一个Nexus6P测试,但它的行为相同。)为了修改系统分区上的配置文件,我暂时引导为一个旁置恢复映像:(fastboot boot twrp-2.8.7.2-bullhead.img)。

目前,我总是收到这个错误(我也尝试过将0xf20xf4作为关闭主机的路由目标):

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-22 11:20:43

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

我感到惊讶的是,这在N5上起作用-它应该没有SWP连接。也许这并不是在所有的设备上都是正确的。

票数 6
EN

Stack Overflow用户

发布于 2015-12-22 08:33:03

简短答覆:

在Nexus5X (edit: 和Nexus6P上,NFC离主机路由似乎是不可能的。据我所知,NFC芯片的SWP线路没有连接到UICC (两部手机上)。

编辑1:与此同时,我得到了Nexus6P的手,做了所有相同的测试,就像我在5X上做的一样。我现在可以确认6P的行为是一样的。在调用phNxpNciHal_SwpTest函数时,我甚至在logcat中得到了相同的错误。因此,在Nexus6P上,SWP线路也没有连接到UICC。

详细信息:

在多次尝试使用不同配置文件设置失败后,我在"phNxpNciHal_SwpTest“库中查看了NXP实现,并在"self-test/phNxpNciHal_SelfTest.c"中找到了有趣的函数”self-test/phNxpNciHal_SelfTest.c“,根据注释,该函数似乎测试了libnfc-hci行:

代码语言:javascript
复制
/*******************************************************************************
 **
 ** 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“:

代码语言:javascript
复制
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 548/C2芯片组的硬件细节,我假设这意味着芯片组的两条SWP线路在Nexus5X(牛头)电话中没有连接。

如果有人对这个话题有更深入的见解,请随时纠正我!:)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34251005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档