I’m using Replicant on my Samsung SIII (i9300) phone (see my earlier posts). During my vacation the Replicant project released version 4.2-0002 as a minor update to their initial 4.2 release. I didn’t anticipate any significant differences, so I followed the installation instructions but instead of “wipe data/factory reset” I chose “wipe cache partition” and rebooted. Everything appeared to work fine, but I soon discovered that NFC was not working. Using adb logcat
I could get some error messages:
E/NFC-HCI ( 7022): HCI Timeout - Exception raised - Force restart of NFC service F/libc ( 7022): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 7046 (message) I/DEBUG ( 1900): *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** I/DEBUG ( 1900): Build fingerprint: 'samsung/m0xx/m0:4.1.1/JRO03C/I9300XXDLIB:user/release-keys' I/DEBUG ( 1900): Revision: '12' I/DEBUG ( 1900): pid: 7022, tid: 7046, name: message >>> com.android.nfc <<<
The phone would loop trying to start NFC and having the NFC sub-system die over and over. Talking on #replicant channel, paulk quickly realized and fixed the bug. I had to rebuild the images to get things to work, so I took the time to create a new virtual machine based on Debian 7.5 for building Replicant on. As a side note, the only thing not covered by Replicant build dependency documentation was that I needed the Debian xmllint
package to avoid a build failure and the Debian xsltproc
package to avoid a error message being printed in the beginning of every build. Soon I had my own fresh images and installed them and NFC was working again, after installing the non-free libpn544_fw.so
file.
During this, I noticed that there are multiple libpn544_fw.so
files floating around. I have the following files:
version string | source |
---|---|
libpn544_fw_C3_1_26_SP.so | internet |
libpn544_fw_C3_1_34_SP.so | stock ROM on S3 bought in Sweden during 2013 and 2014 (two phones) |
libpn544_fw_C3_1_39_SP.so | internet |
(For reference the md5sum's of these files are 682e50666effa919d557688c276edc48, b9364ba59de1947d4588f588229bae20 and 18b4e634d357849edbe139b04c939593 respectively.)
If you do not have any of these files available as /vendor/firmware/libpn544_fw.so you will get the following error message:
I/NfcService( 2488): Enabling NFC D/NFCJNI ( 2488): Start Initialization E/NFC-HCI ( 2488): Could not open /system/vendor/firmware/libpn544_fw.so or /system/lib/libpn544_fw.so E/NFCJNI ( 2488): phLibNfc_Mgt_Initialize() returned 0x00ff[NFCSTATUS_FAILED] E/NFC-HCI ( 2488): Could not open /system/vendor/firmware/libpn544_fw.so or /system/lib/libpn544_fw.so W/NFCJNI ( 2488): Firmware update FAILED E/NFC-HCI ( 2488): Could not open /system/vendor/firmware/libpn544_fw.so or /system/lib/libpn544_fw.so W/NFCJNI ( 2488): Firmware update FAILED E/NFC-HCI ( 2488): Could not open /system/vendor/firmware/libpn544_fw.so or /system/lib/libpn544_fw.so W/NFCJNI ( 2488): Firmware update FAILED E/NFCJNI ( 2488): Unable to update firmware, giving up D/NFCJNI ( 2488): phLibNfc_Mgt_UnConfigureDriver() returned 0x0000[NFCSTATUS_SUCCESS] D/NFCJNI ( 2488): Terminating client thread... W/NfcService( 2488): Error enabling NFC
Using the first (26) file or the last (39) file does not appear to be working on my phone, I get the following error messages. Note that the line starting with 'NFC capabilities' has 'Rev = 34' in it, possibly indicating that I need the version 34 file.
I/NfcService( 5735): Enabling NFC D/NFCJNI ( 5735): Start Initialization D/NFCJNI ( 5735): NFC capabilities: HAL = 8150100, FW = b10122, HW = 620003, Model = 12, HCI = 1, Full_FW = 1, Rev = 34, FW Update Info = 8 D/NFCJNI ( 5735): Download new Firmware W/NFCJNI ( 5735): Firmware update FAILED D/NFCJNI ( 5735): Download new Firmware W/NFCJNI ( 5735): Firmware update FAILED D/NFCJNI ( 5735): Download new Firmware W/NFCJNI ( 5735): Firmware update FAILED E/NFCJNI ( 5735): Unable to update firmware, giving up D/NFCJNI ( 5735): phLibNfc_Mgt_UnConfigureDriver() returned 0x0000[NFCSTATUS_SUCCESS] D/NFCJNI ( 5735): Terminating client thread... W/NfcService( 5735): Error enabling NFC
Loading the 34 works fine.
I/NfcService( 2501): Enabling NFC D/NFCJNI ( 2501): Start Initialization D/NFCJNI ( 2501): NFC capabilities: HAL = 8150100, FW = b10122, HW = 620003, Model = 12, HCI = 1, Full_FW = 1, Rev = 34, FW Update Info = 0 D/NFCJNI ( 2501): phLibNfc_SE_GetSecureElementList() D/NFCJNI ( 2501): D/NFCJNI ( 2501): > Number of Secure Element(s) : 1 D/NFCJNI ( 2501): phLibNfc_SE_GetSecureElementList(): SMX detected, handle=0xabcdef D/NFCJNI ( 2501): phLibNfc_SE_SetMode() returned 0x000d[NFCSTATUS_PENDING] I/NFCJNI ( 2501): NFC Initialized D/NdefPushServer( 2501): start, thread = null D/NdefPushServer( 2501): starting new server thread D/NdefPushServer( 2501): about create LLCP service socket D/NdefPushServer( 2501): created LLCP service socket D/NdefPushServer( 2501): about to accept D/NfcService( 2501): NFC-EE OFF D/NfcService( 2501): NFC-C ON
What is interesting is, that my other S3 running CyanogenMod does not have the libpn544_fw.so file but still NFC works. The messages are:
I/NfcService( 2619): Enabling NFC D/NFCJNI ( 2619): Start Initialization E/NFC-HCI ( 2619): Could not open /system/vendor/firmware/libpn544_fw.so or /system/lib/libpn544_fw.so W/NFC ( 2619): Firmware image not available: this device might be running old NFC firmware! D/NFCJNI ( 2619): NFC capabilities: HAL = 8150100, FW = b10122, HW = 620003, Model = 12, HCI = 1, Full_FW = 1, Rev = 34, FW Update Info = 0 D/NFCJNI ( 2619): phLibNfc_SE_GetSecureElementList() D/NFCJNI ( 2619): D/NFCJNI ( 2619): > Number of Secure Element(s) : 1 D/NFCJNI ( 2619): phLibNfc_SE_GetSecureElementList(): SMX detected, handle=0xabcdef D/NFCJNI ( 2619): phLibNfc_SE_SetMode() returned 0x000d[NFCSTATUS_PENDING] I/NFCJNI ( 2619): NFC Initialized D/NdefPushServer( 2619): start, thread = null D/NdefPushServer( 2619): starting new server thread D/NdefPushServer( 2619): about create LLCP service socket D/NdefPushServer( 2619): created LLCP service socket D/NdefPushServer( 2619): about to accept D/NfcService( 2619): NFC-EE OFF D/NfcService( 2619): NFC-C ON
Diffing the two NFC-relevant repositories between Replicant (external_libnfc-nxp and packages_apps_nfc) and CyanogenMod (android_external_libnfc-nxp and android_packages_apps_Nfc) I found a commit in Replicant that changes a soft-fail on missing firmware to a hard-fail. I manually reverted that patch in my build tree, and rebuilt and booted a new image. Enabling NFC now prints this on my Replicant phone:
I/NfcService( 2508): Enabling NFC D/NFCJNI ( 2508): Start Initialization E/NFC-HCI ( 2508): Could not open /system/vendor/firmware/libpn544_fw.so or /system/lib/libpn544_fw.so W/NFC ( 2508): Firmware image not available: this device might be running old NFC firmware! D/NFCJNI ( 2508): NFC capabilities: HAL = 8150100, FW = b10122, HW = 620003, Model = 12, HCI = 1, Full_FW = 1, Rev = 34, FW Update Info = 0 D/NFCJNI ( 2508): phLibNfc_SE_GetSecureElementList() D/NFCJNI ( 2508): D/NFCJNI ( 2508): > Number of Secure Element(s) : 1 D/NFCJNI ( 2508): phLibNfc_SE_GetSecureElementList(): SMX detected, handle=0xabcdef D/NFCJNI ( 2508): phLibNfc_SE_SetMode() returned 0x000d[NFCSTATUS_PENDING] I/NFCJNI ( 2508): NFC Initialized D/NdefPushServer( 2508): start, thread = null D/NdefPushServer( 2508): starting new server thread D/NdefPushServer( 2508): about create LLCP service socket D/NdefPushServer( 2508): created LLCP service socket D/NdefPushServer( 2508): about to accept D/NfcService( 2508): NFC-EE OFF D/NfcService( 2508): NFC-C ON
And NFC works! At least YubiKey NEO with the Yubico Authenticator app. One less non-free blob on my phone.
I have double-checked that power-cycling the phone (even removing battery for a while) does not affect anything, so it seems the NFC chip has firmware loaded from the factory.
Question remains why that commit was added. Is it necessary on some other phone? I have no idea, other than if the patch is reverted, S3 owners will have NFC working with Replicant without non-free software added. Alternatively, make the patch apply only on the platform where it was needed, or even to all non-S3 builds.