我想配置上的Nexus 5X(大头鱼)或Nexus 6P(钓鱼)的NFC芯片组使用UICC作为NFC脱离主机艾滋病我在OffHostApduService声明路线.
编辑2016年1月17日: 我已经更新了这个问题并且还包括了Nexus 6P,因为我也有机会测试它,它的行为与5X完全相同.因此,5X的所有先前发现似乎也适用于6P.
我设法在Nexus 5(锤头)感谢迈克尔·罗兰在回答之前做到这一点这里这个问题,并在Nexus 6(杀母)(见的Nexus 6 在我Github上库bcm2079x配置).
然而,Nexus 5X(以及6P)似乎有所不同:
根据ifixit的拆解,它包含一个来自NXP(PN548)的新芯片组,而不是像Nexus 4,5和6那样的broadcom bcm2079x.
我可以确认该设备可以读取Mifare Classic标签(这加强了它包含NXP芯片组的假设,因为Broadcom芯片组不支持Mifare Classic)并且/dev/pn548
存在设备文件
但奇怪的是它包含了a libnfc-brcm.conf
和libnfc-nxp.conf
配置文件/system/etc/
(你也可以在我的Github存储库中找到它们)
作为起点,我修改了两个配置文件中的跟踪/日志设置
设置APPL_TRACE_LEVEL
到0x05
为BRCM
设置NXPLOG_*_LOGLEVEL
到0x03
恩智浦
令我惊讶的是,我BrcmNfcJni
在启动过程中看到了很多logcat中的消息,类似于我在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(代表:ñ FC Ç ontroller 我覆盖整个院落)只使用了Broadcom的芯片组(我想这就是为什么该代码使用前缀"BRCM"伐木的原因).但显然新的NXP芯片组现在也使用这种标准化接口(这很好),现在我们也看到了"Brcm ..."日志消息,即使使用恩智浦芯片组也是如此.
编辑3: 两款手机(Nexus 5X和6P)似乎都包含运行固件版本10.01.19 的NXP 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
(正如迈克尔罗兰在上面提到的问题中描述的那样),但仍然没有成功.
有没有人设法在Nexus 5X或6P上配置NFC offhost路由到UICC?
或者可能有一些提示,我可以寻找进一步的见解?
此外,PN548芯片组的数据表非常有用.
编辑2:
我仍然没有找到一个可行的解决方案,但是我把我的尝试推到了现在的dev1分支下的github存储库.我还为每个测试推送了生成的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
小智.. 6
如您所知,SWP线路未连接到UICC插槽.我们通常不会为Nexus设备执行此操作,因为我们不支持AOSP中UICC上的安全元素.唯一的例外是Lollipop上的Nexus 6,它支持美国的SoftCard移动支付(以及HCE).在SoftCard被Google收购后,我们删除了代码以在Marshmallow中再次支持UICC.
我很惊讶,这对N5有用 - 它本应该没有连接SWP.也许这并没有在所有设备上正确完成.
如您所知,SWP线路未连接到UICC插槽.我们通常不会为Nexus设备执行此操作,因为我们不支持AOSP中UICC上的安全元素.唯一的例外是Lollipop上的Nexus 6,它支持美国的SoftCard移动支付(以及HCE).在SoftCard被Google收购后,我们删除了代码以在Marshmallow中再次支持UICC.
我很惊讶,这对N5有用 - 它本应该没有连接SWP.也许这并没有在所有设备上正确完成.
似乎无法在Nexus 5X上进行NFC Offhost路由到UICC(编辑:以及Nexus 6P).据我所知,NFC芯片的SWP线路没有连接到UICC(在两部手机上).
编辑1:与此同时,我在Nexus 6P上进行了所有相同的测试,就像我在5X上所做的那样.我现在可以确认6P的行为相同.调用phNxpNciHal_SwpTest
函数时,我甚至在logcat中遇到了相同的错误.因此,在Nexus 6P上,SWP线路未连接到UICC.
无数的尝试失败有不同的配置文件设置后,我朝内NXP执行libnfc-HCl库,发现有趣的功能" 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
函数末尾添加它 (请参阅我在GitHub上的更改),phNxpNciHal_close
然后在实际关闭NFCC接口之前尝试将其添加到函数的开头,以确保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)手机中.
如果有人对这个话题有更多的了解,请随意纠正我!:)