Ubuntu Pastebin - This is Matt Mower's pnfw https://paste.ubuntu.com/18137835/ Paste from pnfw instructions at Thu, 30 Jun 2016 00:54:13 +0000 I read the contents of nxp_nfc_full_version[] and nxp_nfc_fw[] using a simple executable linked to libpn544_fw.so. I didn't want to deal with Android denying me the ability to load the library, but I needed a linker available, so I prepared these instructions for use with TWRP. 1) Save http://paste.ubuntu.com/18137145/ as a patch (e.g. pnfw.patch) 2) In your device tree: $ git am /path/to/pnfw.patch 3) Copy the libpn544_fw.so blob to the pnfw/ subdirectory 4) Read the symbols from the libpn544_fw.so blob: $ /path/to/cm/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-readelf -Ws /path/to/libpn544_fw.so Sample output: http://paste.ubuntu.com/18137244/ 5) What matters to me is: a) nxp_nfc_fw has size 51397 b) nxp_nfc_full_version has size 12 6) Edit pnfw/pnfw.c to adjust the size of nxp_nfc_fw_len and nxp_nfc_full_version_len accordingly 7) From the top of your cm tree, lunch for your device and then build the module: mka pnfw 8) For reasons unknown to me, the linker renames the shared lib in the executable, so the following replacement was necessary: $ strings $OUT/recovery/root/sbin/pnfw | grep libpn544_fw libpn544_fw_C3_1_41_SP.so $ sed -i "s|libpn544_fw_C3_1_41_SP.so|libpn544_fw.so\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0|g" $OUT/recovery/root/sbin/pnfw Make sure the replacement string is the same length as the original, hence the \x0 fillers. 9) In TWRP, the linker is in /sbin: $ sed -i "s|/system/bin/linker\x0|/sbin/linker\x0\x0\x0\x0\x0\x0\x0|g" $OUT/recovery/root/sbin/pnfw 10) Push the files to your device $ adb push $OUT/recovery/root/sbin/pnfw /sbin/pnfw $ adb push $OUT/recovery/root/sbin/libpn544_fw.so /sbin/libpn544_fw.so 10) Run the executable (in TWRP): $ adb shell $ pnfw > /tmp/fw.c $ exit $ adb pull /tmp/fw.c From 7d7530016736767ebcbf171872e5306eb9a9bb12 Mon Sep 17 00:00:00 2001 From: Matt Mower Date: Sat, 25 Jun 2016 16:39:09 -0500 Subject: [PATCH] pn544 firmware creation Change-Id: I382a83c26f277a31c20c7d1b55d969322a8093b0 --- pnfw/Android.mk | 32 +++++++++++++++++++++++++++++ pnfw/pnfw.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 pnfw/Android.mk create mode 100644 pnfw/pnfw.c diff --git a/pnfw/Android.mk b/pnfw/Android.mk new file mode 100644 index 0000000..35bede8 --- /dev/null +++ b/pnfw/Android.mk @@ -0,0 +1,32 @@ +# Copyright (C) 2016 The CyanogenMod Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_MODULE := pnfw +LOCAL_SRC_FILES := pnfw.c +LOCAL_SHARED_LIBRARIES := libpn544_fw libc +LOCAL_PACK_MODULE_RELOCATIONS := false +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin +include $(BUILD_EXECUTABLE) + +include $(CLEAR_VARS) +LOCAL_MODULE := libpn544_fw +LOCAL_MODULE_CLASS := SHARED_LIBRARIES +LOCAL_MODULE_SUFFIX := .so +LOCAL_MODULE_TAGS := optional +LOCAL_SRC_FILES := libpn544_fw.so +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/sbin +include $(BUILD_PREBUILT) diff --git a/pnfw/pnfw.c b/pnfw/pnfw.c new file mode 100644 index 0000000..3a27cfd --- /dev/null +++ b/pnfw/pnfw.c @@ -0,0 +1,63 @@ +#include + +/* Quick build instructions + +mka pnfw +sed -i "s|libpn544_fw_C3_1_41_SP.so|libpn544_fw.so\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0\x0|g" $OUT/recovery/root/sbin/pnfw +sed -i "s|/system/bin/linker\x0|/sbin/linker\x0\x0\x0\x0\x0\x0\x0|g" $OUT/recovery/root/sbin/pnfw +adb push $OUT/recovery/root/sbin/pnfw /sbin/pnfw +*/ + +/* Example readelf output from grouper libpn544_fw.so + +$ arm-eabi-readelf -Ws libpn544_fw.so + +Symbol table '.dynsym' contains 18 entries: + Num: Value Size Type Bind Vis Ndx Name + 0: 00000000 0 NOTYPE LOCAL DEFAULT UND + 1: 000003d4 12 OBJECT GLOBAL DEFAULT 8 nxp_nfc_full_version + 2: 000003e0 51397 OBJECT GLOBAL DEFAULT 8 nxp_nfc_fw + 3: 00000000 0 FUNC GLOBAL DEFAULT UND __cxa_finalize + 4: 000110f0 0 NOTYPE GLOBAL DEFAULT 13 __dso_handle + 5: 00011000 0 NOTYPE GLOBAL DEFAULT 9 __INIT_ARRAY__ + 6: 00011008 0 NOTYPE GLOBAL DEFAULT 10 __FINI_ARRAY__ + 7: 000107a8 0 NOTYPE GLOBAL DEFAULT ABS __exidx_start + 8: 000107a8 0 NOTYPE GLOBAL DEFAULT ABS __exidx_end + 9: 000110ec 0 NOTYPE GLOBAL DEFAULT ABS __data_start + 10: 000110ec 0 NOTYPE GLOBAL DEFAULT ABS _edata + 11: 000110ec 0 NOTYPE GLOBAL DEFAULT ABS __bss_start + 12: 000110ec 0 NOTYPE GLOBAL DEFAULT ABS __bss_start__ + 13: 00011100 0 NOTYPE GLOBAL DEFAULT ABS _bss_end__ + 14: 00011100 0 NOTYPE GLOBAL DEFAULT ABS __bss_end__ + 15: 00011100 0 NOTYPE GLOBAL DEFAULT ABS __end__ + 16: 00011100 0 NOTYPE GLOBAL DEFAULT ABS _end + 17: 00080000 0 NOTYPE GLOBAL DEFAULT ABS _stack +*/ + +const unsigned long nxp_nfc_fw_len = 51397; +const unsigned long nxp_nfc_full_version_len = 12; + +extern const unsigned char nxp_nfc_fw[]; +extern const unsigned char nxp_nfc_full_version[]; + +int main() { + unsigned long i = 0; + + printf("const unsigned char nxp_nfc_fw[] = {\n "); + for (i = 0; i < nxp_nfc_fw_len; i++) { + if (i == nxp_nfc_fw_len-1) + printf("0x%02x", nxp_nfc_fw[i]); + else if ((i+1)%12 == 0) + printf("0x%02x,\n ", nxp_nfc_fw[i]); + else + printf("0x%02x, ", nxp_nfc_fw[i]); + } + printf("\n};\n\n"); + + printf("const unsigned char nxp_nfc_full_version[] = {\n "); + for (i = 0; i < nxp_nfc_full_version_len; i++) + printf("0x%02x, ", nxp_nfc_full_version[i]); + printf("\n};\n"); + + return 0; +} -- 2.7.4