Enrutamiento de NFC Offhost al UICC en el Nexus 5X y el Nexus 6P

Estoy tratando de configurar el chipset NFC en el Nexus 5X (bullhead) o Nexus 6P (pescador) para usar la UICC como ruta de NFC offhost para AIDs declaro en mi OffHostApduService.

Editar 17 de enero de 2016: He actualizado esta pregunta y también incluye el Nexus 6P, ya que tuve la oportunidad de probarlo también y se comporta exactamente como el 5X. Así que todos los resultados anteriores de la 5X también parecen aplicarse a la 6P.

He conseguido hacer esto antes en un Nexus 5 (hammerhead) gracias a la respuesta de Michael Roland sobre esta cuestión aquí y también en un Nexus 6 (shamu) (ver el Nexus 6 bcm2079x config en mi repositorio Github ).

Sin embargo, el Nexus 5X (y también 6P) parecen ser diferentes:

  • Según el desmontaje de ifixit contiene un nuevo chipset de NXP (PN548) y no broadcom bcm2079x como Nexus 4, 5 y 6).
  • Puedo confirmar que el dispositivo puede leer las etiquetas Mifare Classic (lo que refuerza la suposición de que contiene un chipset NXP, ya que los chipsets Broadcom no soportan Mifare Classic) y existe un archivo de dispositivo /dev/pn548
  • Pero lo suficientemente extraño contiene tanto un libnfc-brcm.conf libnfc-nxp.conf archivo de configuración libnfc-nxp.conf en /system/etc/ (también puede encontrarlos en mi repositorio Github)

Como punto de partida, modifiqué la configuración de seguimiento / registro en ambos archivos de configuración

  • Establece APPL_TRACE_LEVEL a 0x05 para brcm
  • NXPLOG_*_LOGLEVEL el NXPLOG_*_LOGLEVEL a 0x03 para nxp

Lo que me hizo preguntarme fue que veo muchos de los mensajes de BrcmNfcJni en logcat durante el arranque, similares a los que he visto en Nexus 5 y 6 (que no esperaba en un dispositivo con chipset 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 .... .... 

Editar 1: Aprendí de la fuente que estos mensajes de registro "BrcmNfc .." se emiten desde el código de la librería libnfc-nci . En los dispositivos anteriores, el NCI (es decir: N FC c ontroller i nterface) sólo fue utilizado por los chipsets Broadcom (supongo que esa es la razón por la que el código utiliza el prefijo "Brcm" para el registro). Pero al parecer los nuevos chipsets NXP ahora también usan esta interfaz estandarizada (que es buena), y ahora también vemos los mensajes de registro "Brcm …" incluso con un chipset NXP.

Edit 3: Ambos teléfonos (Nexus 5X y 6P) parecen contener el chipset NXP PN548 / C2 NFC que ejecuta la versión de firmware 10.01.19 (al menos en la versión de Android 6.0.1).

Por supuesto, también hay salidas de la 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..... .... .... 

Así que como primera tentativa intenté modificar el archivo libnfc-nxp.conf , comenzando con los parámetros donde los comentarios indicaban una realción a UICC o SWP:

  # No secure element 0x00 # eSE 0x01 # UICC 0x02 -NXP_DEFAULT_SE=0x03 +NXP_DEFAULT_SE=0x02 

Y también establecer la etiqueta A0EC en NXP_CORE_CONF_EXTN a 0x01 (ya que el comentario indica que esta etiqueta es responsable del conector SWP1):

 # A0EC - SWP1 interface # 0x00 - Disabled # 0x01 - Enabled - A0, EC, 01, 00, + A0, EC, 01, 01, 

Desafortunadamente esto no funcionó y todavía recibo las APDUs dirigidas a mi servicio de hospedaje en el sistema host (como se indica por este mensaje de logcat: E/HostEmulationManager( 3434): AID that was meant to go off-host was routed to host. ).

En intentos posteriores también intenté jugar con los parámetros de libnfc-brcm.conf (como lo describió Michael Roland en la pregunta mencionada anteriormente), pero aún así no tuvo éxito.

PREGUNTA:

  • ¿Alguien ha logrado configurar el enrutamiento off-host NFC en el Nexus 5X o 6P que va a la UICC?
  • O tal vez tiene algunas pistas donde puedo buscar más información?
  • También una hoja de datos para el chipset PN548 sería muy útil.

Editar 2: Todavía no encontré una solución de trabajo, pero empujé mis intentos hasta ahora a mi repositorio github bajo la rama dev1 . También empujé las salidas logcat resultantes para cada prueba. Estoy probando con un nuevo Nexus unrooted 5X en Stock Android 6.0.1. (Editar: Mientras tanto, también tengo un Nexus 6P para la prueba, pero se comporta de manera idéntica.) Para modificar los archivos de configuración en la partición del sistema temporalmente arrancar en una imagen de recuperación de fastboot boot twrp-2.8.7.2-bullhead.img : ( fastboot boot twrp-2.8.7.2-bullhead.img ).

En este momento siempre obtengo este error (también intenté ya con 0xf2 y 0xf4 como destino de enrutamiento fuera de host):

 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 

2 Solutions collect form web for “Enrutamiento de NFC Offhost al UICC en el Nexus 5X y el Nexus 6P”

Como ya se ha descubierto, las líneas SWP no están conectadas a la ranura UICC. Normalmente no lo hacemos para dispositivos Nexus, ya que no soportamos elementos seguros en la UICC en AOSP. La única excepción a esto es el Nexus 6 en Lollipop, que soporta los pagos móviles de SoftCard en los EE.UU. (junto con HCE). Después de que SoftCard fue adquirida por Google, eliminamos el código para respaldar UICCs nuevamente en Marshmallow.

Estoy sorprendido BTW que esto funcionó en N5 – se supone que no tienen SWP conectado tampoco. Tal vez esto no se hizo correctamente en todos los dispositivos.

Respuesta corta:

El enrutamiento de NFC Offhost a la UICC no parece posible en el Nexus 5X ( editar: y también en Nexus 6P). Hasta donde yo entiendo, las líneas SWP del chip NFC no están conectadas a la UICC (en ambos teléfonos).

Editar 1 : Mientras tanto conseguí las manos en un Nexus 6P hizo las mismas pruebas que hice en el 5X. Ahora puedo confirmar que el 6P se comporta de manera idéntica. Incluso tengo los mismos errores en logcat al llamar a la función phNxpNciHal_SwpTest . Así también en el Nexus 6P la línea SWP no está conectada a la UICC.

Detalles:

Después de numerosos intentos fallidos con diferentes configuraciones de archivos de configuración, busqué la implementación de NXP dentro de la biblioteca libnfc-hci y encontré la interesante función " phNxpNciHal_SwpTest " en "self-test / phNxpNciHal_SelfTest.c" que según el comentario, parece probar el SWP líneas:

 /******************************************************************************* ** ** 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. ** *******************************************************************************/ 

A continuación, modificó el archivo hal/phNxpNciHal.c (agregó un montón de declaraciones de registro de depuración sólo para entender mejor el flujo y) agregó 2 llamadas a esta función de prueba. Primero intenté añadirlo al final de la función phNxpNciHal_open (ver mis cambios aquí en GitHub ) y más tarde también traté de añadirlo al principio de la función phNxpNciHal_close antes de cerrar realmente la interfaz NFCC, solo para estar seguro de que UICC y todo lo demás Inicializado en este momento (ver commit 6b33149 en mi cuenta GitHub vinculada arriba).

Durante las pruebas se insertó un UICC compatible con SWP en el dispositivo.

Desafortunadamente todas las llamadas a phNxpNciHal_SwpTest devolvió un error (para ambas líneas de SWP). Busque la cadena " phNxpNciHal_SwpTest – FAILED " en la salida logcat siguiente:

 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. 

Conclusión:

Sin más conocimientos de los detalles de hardware del chipset NXP PN548 / C2 , supongo que esto significa que ambas líneas SWP del chipset no están conectadas en el teléfono Nexus 5X (bullhead).

Si alguien tiene más información sobre este tema, por favor, siéntase libre de corregirme! 🙂

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.