我正在尝试在 Nexus 5X(牛头)或 Nexus 6P(钓鱼者)上配置 NFC 芯片组,以使用 UICC 作为我在 OffHostApduService 中声明的 AID 的 NFC 离主机路由。
编辑 2016 年 1 月 17 日: 我更新了这个问题,还包括了 Nexus 6P,因为我也有机会对其进行测试,它的行为与 5X 完全一样。因此,之前 5X 的所有发现似乎也适用于 6P。
感谢 Michael Roland 在此问题上的回答以及 Nexus 6 (shamu)(请参阅我的 Github 存储库中的 Nexus 6 bcm2079x 配置),我之前在 Nexus 5(锤头)上设法做到了这一点。
但是,Nexus 5X(以及 6P)似乎有所不同:
- 根据 iFixit 拆解,它包含来自 NXP (PN548) 的新芯片组,而不是像 Nexus 4、5 和 6 那样的 Broadcom bcm2079x)。
- 我可以确认该设备可以读取 Mifare Classic 标签(这加强了它包含 NXP 芯片组的假设,因为 Broadcom 芯片组不支持 Mifare Classic)并且设备文件
/dev/pn548
存在 - 但奇怪的是它同时包含一个
libnfc-brcm.conf
和libnfc-nxp.conf
配置文件/system/etc/
(你也可以在我的 Github 存储库中找到这些文件)
作为起点,我修改了两个配置文件中的跟踪/日志设置
- 设置
APPL_TRACE_LEVEL
为0x05
brcm NXPLOG_*_LOGLEVEL
为0x03
nxp设置
让我感到奇怪的是,我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(代表:NFC控制器接口)仅用于 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
文件,从注释指示 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 在上述问题中所述),但仍然没有成功。
问题:
- 有没有人设法在 Nexus 5X 或 6P 上配置 NFC 离主机路由去 UICC?
- 或者也许有一些提示可以让我寻找进一步的见解?
- PN548 芯片组的数据表也会很有帮助。
编辑 2:
我仍然没有找到可行的解决方案,但我将我的尝试推送到了dev1分支下的 github 存储库。我还为每个测试推送了生成的 logcat 输出。我正在 Stock Android 6.0.1 上使用新的无根 Nexus 5X 进行测试。(编辑:与此同时,我还得到了一个 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