8

OffHostApduService で宣言する AID の NFC オフホスト ルートとして UICC を使用するように、Nexus 5X (ブルヘッド) または Nexus 6P (Angler) で NFC チップセットを構成しようとしています。

編集 2016 年 1 月 17 日: この質問を更新し、Nexus 6P もテストする機会があり、5X とまったく同じように動作するため、Nexus 6P も含めました。そのため、5X で得られたこれまでの調査結果はすべて 6P にも当てはまるようです。

ここでのこの質問に対するMichael Rolandの回答とNexus 6(shamu)のおかげで、Nexus 5(ハンマーヘッド)でこれを行うことができました( GithubリポジトリのNexus 6 bcm2079x構成を参照)。

ただし、Nexus 5X (および 6P) は異なるようです。

  • ifixit の分解によると、Nexus 4、5、6 のような Broadcom bcm2079x ではなく、NXP (PN548) の新しいチップセットが含まれています。
  • デバイスが Mifare Classic タグを読み取ることができ (Broadcom チップセットは Mifare Classic をサポートしていないため、NXP チップセットが含まれているという仮定を強化します)、デバイス ファイル/dev/pn548が存在することを確認できます。
  • しかし、奇妙なことに、下にlibnfc-brcm.confと構成libnfc-nxp.confファイルの両方が含まれています/system/etc/(これらは、私の Github リポジトリにもあります)。

出発点として、両方の構成ファイルのトレース/ログ設定を変更しました

  • brcmAPPL_TRACE_LEVELに設定0x05
  • nxp を にNXPLOG_*_LOGLEVEL設定します0x03

不思議に思ったのは、BrcmNfcJniNexus 5 および 6 で見たものと同様に、起動時に logcat に多くのメッセージが表示されることでした (これは、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 ( N FCコントローラー インターフェイスの略) は Broadcom チップセットでのみ使用されていました (これが、コードがログに " Brcm " というプレフィックスを使用する理由だと思います)。しかし、どうやら新しい NXP チップセットもこの標準化されたインターフェイスを使用するようになり (これは良いことです)、NXP チップセットでも「Brcm...」ログ メッセージも表示されるようになりました。

編集 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,

残念ながら、これは機能せず、ホスト システムのオフホスト サービスをターゲットとする APDU をまだ受信しています (この logcat メッセージで示されているように: E/HostEmulationManager( 3434): AID that was meant to go off-host was routed to host.)。

後の試行で、libnfc-brcm.conf(上記の質問で Michael Roland によって説明されているように) のパラメーターをいじってみましたが、それでも成功しませんでした。

質問:

  • UICCに行くNexus 5Xまたは6PでNFCオフホストルーティングを設定できた人はいますか?
  • または、さらなる洞察を探すことができるヒントがいくつかありますか?
  • また、PN548 チップセットのデータシートも非常に役立ちます。

編集 2:有効 な解決策はまだ見つかりませんでしたが、今まで試したことをdev1ブランチの下の github リポジトリにプッシュしました。また、各テストの結果の logcat 出力もプッシュしました。ストック 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
4

2 に答える 2

5

簡潔な答え:

UICC への NFC オフホスト ルーティングは、Nexus 5X (編集:および Nexus 6P) では可能ではないようです。私の知る限り、NFC チップの SWP ラインは UICC に接続されていません (両方の電話で)。


編集1:その間、5Xで行ったのと同じすべてのテストを行ったNexus 6Pを手に入れました. 6P が同じように動作することを確認できました。関数を呼び出すときに、logcat でも同じエラーが発生しましたphNxpNciHal_SwpTest。したがって、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 つの呼び出しを追加しました)。最初に、関数の最後に追加しようとしました ( GitHubphNxpNciHal_openの私の変更を参照してください)。後で 、UICC とすべてが初期化されていることを確認するために、実際に NFCC インターフェイスを閉じる前に、関数の先頭にも追加しようとしました。この時点で (上記にリンクされている私の GitHub アカウントのコミット 6b33149 を参照してください)。phNxpNciHal_close

テスト中、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 (ブルヘッド) 電話で接続されていないことを意味すると思います。

誰かがこのトピックについてもっと洞察を持っている場合は、お気軽に訂正してください! :)

于 2015-12-22T08:33:03.770 に答える