はじめに
当社では、PN7160/PN7220 Android 15公式ポーティングガイド(PN7160/PN7220 – Android 15ポーティングガイド)をご用意しております。ただし、パッチはAndroid 15 AOSP r1(android-15.0.0_r1)専用です。AOSP最新版へのポーティングを希望する場合、ソースコードのコンパイル中でエラーが頻発します。このドキュメントを参考に、エラーを一つずつ解決してください。
注:変更はすべて参考目的で提供されており、AOSP最新版へのポーティング向けのNXP公式パッチではありません。変更が最善の解決策ではない可能性がありますので、AOSPソースコードを自社のニーズに基づいて変更してください。これは製品向けではありません。ポーティング後は、お客様側で引き続き完全なテストを実施する必要があります。
ハードウェアボード:
i.MX8MN EVK (i.MX 8M Nano評価キット | NXP Semiconductors)
PN7160 EVK (OM27160|PN7160 プラグアンドプレイ NFC コントローラ用開発キット|NXP Semiconductors)
i.MX8MN EVKとPN7160 OM29110ARD-Bの接続
|
i.MX8M ナノ EVK |
ピン |
PN7160 |
ピン |
|
3.3V |
J1003-1 |
VDD(3.3V) |
J1-4 |
|
5V |
J1003-2 |
VBAT(5V) |
J1-5 |
|
I2C3 SDA |
J1003-3 |
SDA |
J2-2 |
|
I2C3 SCL |
J1003-5 |
SCL |
J2-1 |
|
GPIO3_22 |
J1003-37 |
IRQ |
J2-10 |
|
GPIO3_21 |
J1003-38 |
REQ |
J4-2 |
|
GND |
J1003-39 |
GND |
J1-6 |
|
GPIO3_20 |
J1003-40 |
N/A |
J4-1 |
i.MX8MN EVK向けAndroidの構築
ここで使用したi.MX Android BSPはAndroid 15.0.0_2.0.0(L6.12.20_2.0.0 BSP)で、こちらからダウンロードしていただけます:i.MX アプリケーション・プロセッサ向けAndroid OS | NXP Semiconductors
1. 「ドキュメント」と「インストールソースパッケージ」をダウンロードします。
2. まず、Androidユーザーガイドの手順に従って、i.MX8MN EVK用のAndroid BSPをビルドします。
android_build/.repo/manifests/aosp-android-15.0.0_2.0.0.xmlによると、表示されるAOSPバージョンはandroid-15.0.0_r32です。
ポーティングに関する参考文献:
PN7160/PN7220 – Android 15 移植ガイド
i.MX8M NanoボードでPN7160をAndroid 14に移植
さて、移植を始めましょう。
1. カーネル・ドライバ
PN7220またはPN7160との接続を確立するために、Androidスタックはnxpnfcカーネルドライバを使用します。以下のGitHubからドライバをダウンロードできます:
コマンドは次のとおりです。
git clone "https://github.com/nxp-nfc-infra/nfcandroid_platform_drivers.git" -b br_ar_16_comm_infra_dev
カーネル6.6および6.12用のドライバがありますので、ポーティングに適したドライバをダウンロードしてください。例えば、i.MX Android BSP Android 15.0.0_2.0.0のカーネルは6.12ですので、ポーティングには6.12ドライバを使用します。
ポーティングする際は、MakefileとKconfigファイルのパスが正しく設定されていることを確認してください。
例えば、ここでは以下のようにポーティングします。
.
├── Kconfig
├── Makefile
└── pn7160
├── common.c
├── common.h
├── i2c_drv.c
├── i2c_drv.h
├── Kbuild
├── Kconfig
├── Makefile
├── spi_drv.c
└── spi_drv.h
すべてを簡素化するため、I2Cのみをサポートし、SPIはサポートしません。ドライバ/nfc/pn7160/Makefile のデフォルトコードを以下のコードに置き換えてください(理解しやすくするため)。
nxpnfc-i2c-objs = i2c_drv.o common.o
obj-$(CONFIG_NXP_NFC_I2C) += nxpnfc_i2c.o
ドライバ/nfc/Kconfig の内容。PN7160を以下のように追加してください。
source "drivers/nfc/pn7160/Kconfig"
source "drivers/nfc/fdp/Kconfig"
source "drivers/nfc/pn544/Kconfig"
source "drivers/nfc/pn533/Kconfig"
source "drivers/nfc/microread/Kconfig"
source "drivers/nfc/nfcmrvl/Kconfig"
source "drivers/nfc/st21nfca/Kconfig"
source "drivers/nfc/st-nci/Kconfig"
source "drivers/nfc/nxp-nci/Kconfig"
source "drivers/nfc/s3fwrn5/Kconfig"
source "drivers/nfc/st95hf/Kconfig"
endmenu
The contents of ドライバ/nfc/Makefile. Add the PN7160 like below:
# SPDX-License-Identifier: GPL-2.0
#
# Makefile for nfc devices
#
obj-$(CONFIG_NXP_NFC_I2C) += pn7160/
obj-$(CONFIG_NFC_FDP) += fdp/
obj-$(CONFIG_NFC_PN544) += pn544/
obj-$(CONFIG_NFC_MICROREAD) += microread/
obj-$(CONFIG_NFC_PN533) += pn533/
obj-$(CONFIG_NFC_MEI_PHY) += mei_phy.o
obj-$(CONFIG_NFC_SIM) += nfcsim.o
obj-$(CONFIG_NFC_PORT100) += port100.o
obj-$(CONFIG_NFC_MRVL) += nfcmrvl/
obj-$(CONFIG_NFC_TRF7970A) += trf7970a.o
obj-$(CONFIG_NFC_ST21NFCA) += st21nfca/
obj-$(CONFIG_NFC_ST_NCI) += st-nci/
obj-$(CONFIG_NFC_NXP_NCI) += nxp-nci/
obj-$(CONFIG_NFC_S3FWRN5) += s3fwrn5/
obj-$(CONFIG_NFC_ST95HF) += st95hf/
obj-$(CONFIG_NFC_VIRTUAL_NCI) += virtual_ncidev.o
2. i.MX8MN EVKデバイスツリーファイルに「nxpnfc」を追加します。
&i2c3 {
clock-frequency = <100000>;
pinctrl-names = "default", "gpio";
pinctrl-0 = <&pinctrl_i2c3>;
pinctrl-1 = <&pinctrl_i2c3_gpio>;
scl-gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>;
sda-gpios = <&gpio5 19 GPIO_ACTIVE_HIGH>;
status = "okay";
nxpnfc@28{
compatible = "nxp,nxpnfc";
reg = <0x28>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_nfc>;
nxp,nxpnfc-irq = <&gpio3 22 0>;
nxp,nxpnfc-ven = <&gpio3 20 0>;
nxp,nxpnfc-fw-dwnld = <&gpio3 21 0>;
};
The GPIO settings in the IOMUXC:
&iomuxc {
pinctrl_nfc: nfcgrp {
fsl,pins = <
MX8MN_IOMUXC_SAI5_RXC_GPIO3_IO20 0X19 // VEN
MX8MN_IOMUXC_SAI5_RXD0_GPIO3_IO21 0X19 // FW-DWNLD
MX8MN_IOMUXC_SAI5_RXD1_GPIO3_IO22 0X19 // IRQ
>;
};
3. imx8mn_gki.fragmentを変更します。
ファイル:android_build/vendor/nxp-opensource/kernel_imx/arch/arm64/configs/imx8mn_gki.fragment
"CONFIG_NXP_NFC_I2C=m" を imx8mn_gki.fragment に追加します。
4. Androidの対応するボード設定ファイルに設定を追加してください。
- android_build/device/nxp/imx8m/evk_8mn/ に移動してください
BoardConfig.mkを修正します。
# selinux permissive
+ BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive
BOARD_SEPOLICY_DIRS := \
$(CONFIG_REPO_PATH)/imx8m/sepolicy \
$(IMX_DEVICE_PATH)/sepolicy \
+ vendor/nxp/nfc/sepolicy \
+ vendor/nxp/nfc/sepolicy/nfc
+ include vendor/nxp/nfc/BoardConfigNfc.mk
- ShareBoardConfig.mkに”nxpnfc_i2c.ko”を追加します。パスとファイル名が正しいか確認します。
$(KERNEL_OUT)/drivers/net/phy/realtek.ko \
$(KERNEL_OUT)/drivers/pps/pps_core.ko \
$(KERNEL_OUT)/drivers/ptp/ptp.ko \
$(KERNEL_OUT)/drivers/net/ethernet/freescale/fec.ko
+ $(KERNEL_OUT)/drivers/nfc/pn7160/nxpnfc_i2c.ko
endif
$(KERNEL_OUT)/drivers/trusty/trusty-core.ko \
$(KERNEL_OUT)/drivers/trusty/trusty-log.ko \
$(KERNEL_OUT)/drivers/trusty/trusty-ipc.ko \
$(KERNEL_OUT)/drivers/trusty/trusty-virtio.ko \
+ $(KERNEL_OUT)/drivers/nfc/pn7160/nxpnfc_i2c.ko
else
BOARD_VENDOR_RAMDISK_KERNEL_MODULES += \
$(KERNEL_OUT)/drivers/input/touchscreen/goodix_ts.ko \
$(KERNEL_OUT)/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_i2c.ko
Endif
- Compatibility_matrix.xmlに以下を追加します
netutils-wrapper
1.0
android.hardware.emvco
1
IEmvco
default
- device_framework_matrix.xmlに以下を追加します。
nxp.hardware.secureime
1
ISecureIME
default
nxp.hardware.imx_dek_extractor
1
IDek_Extractor
default
vendor.nxp.nxpnfc
2
INxpNfc
default
android.hardware.emvco
1
IEmvco
default
- evk_8mn.mkに以下を追加します。
# ------nfc-------
$(call inherit-product, vendor/nxp/nfc/device-nfc.mk)
$(call inherit-product, vendor/nxp/emvco/device-emvco.mk)
PRODUCT_PACKAGES += \
android.hardware.nfc-service.nxp
PRODUCT_PACKAGES += \
com.nxp.emvco \
com.nxp.nfc \
nfc_nci_nxp_pn72xx
- init.rcにnxpnfc_i2cを追加します。
# Grant permission for fetching available_pages info of statsd
chown system system /proc/pagetypeinfo
chmod 0440 /proc/pagetypeinfo
exec u:r:vendor_modprobe:s0 -- /vendor/bin/modprobe -a -d \
/vendor/lib/modules nxpnfc_i2c
write /sys/power/wake_lock nosleep
on post-fs-data && property:vendor.skip.charger_not_need=0
setprop vold.post_fs_data_done 1
- ueventd.nxp.rc に nxpnfc を追加します。
/sys/devices/virtual/thermal/thermal_zone* trip_point_0_hyst 0660 system system
/sys/devices/virtual/thermal/thermal_zone* trip_point_1_hyst 0660 system system
/dev/dmabuf_imx 0664 system system
/sys/class/backlight/* brightness 0660 system system
/dev/ttymxc1 0666 nfc nfc
/dev/ttymxc2 0666 nfc nfc
/dev/nxpnfc 0666 nfc nfc
# for libcamera
/dev/media* 0660 system camera
/dev/v4l-subdev* 0660 system camera
5. NXP AOSPパッチの適用
NXP公式のNFCパッチはAOSP android-15.0.0_r1のみで、 android-15.0.0_r1と android-15.0.0_r32では大きな違いがあります。このため、パッチを適用する前に、Android-15.0.0_r1からNFCフォルダをコピーして、Android-15.0.0_r32のNFCフォルダを置き換えます。
まず、GitHubからAOSP android-15.0.0_r1をダウンロードしてください。
$ mkdir android-15.0.0_r1
$ cd android-15.0.0_r1
$ repo init -u https://android.googlesource.com/platform/manifest -b android-15.0.0_r1
$ repo sync
次に、以下のフォルダをandroid-15.0.0_r32から削除します。そして、Android-15.0.0_r1から次のNFCフォルダをコピーして、Android-15.0.0_r32の同じフォルダを置き換えます。
パッケージ/apps/Nfc
frameworks/base/nfc
frameworks/base/nfc-extras
システム/NFC
以下にその例をご紹介します。
$ rm -rf android_build/packages/apps/Nfc
$ cp -ra android-15.0.0_r1/packages/apps/Nfc android_build/packages/apps/
私はGitHubからパッチをダウンロードするスクリプトを作成します。お客様は以下のスクリプトを、android_buildと同じディレクトリに配置できます。
AOSP_adaptation.sh
# nxp_nci_hal_nfc
git clone "https://github.com/nxp-nfc-infra/nxp_nci_hal_nfc.git"
cd nxp_nci_hal_nfc
git checkout br_ar_15_comm_infra_dev
cp -rf * ../android_build/packages/apps/Nfc/
cd ..
# nxp_nci_hal_libnfc-nci
git clone "https://github.com/nxp-nfc-infra/nxp_nci_hal_libnfc-nci.git"
cd nxp_nci_hal_libnfc-nci
git checkout br_ar_15_comm_infra_dev
cp -rf * ../android_build/system/nfc/
cd ..
# nfcandroid_nfc_hidlimpl
git clone "https://github.com/nxp-nfc-infra/nfcandroid_nfc_hidlimpl.git"
cd nfcandroid_nfc_hidlimpl
git checkout br_ar_15_comm_infra_dev
cp -rf * ../android_build/hardware/nxp/nfc
cd ..
# nfcandroid_frameworks
git clone "https://github.com/nxp-nfc-infra/nfcandroid_frameworks.git"
cd nfcandroid_frameworks
git checkout br_ar_15_comm_infra_dev
mkdir ../android_build/vendor/nxp/frameworks
cp -rf * ../android_build/vendor/nxp/frameworks
cd ..
# nfcandroid_emvco_aidlimpl
git clone "https://github.com/nxp-nfc-infra/nfcandroid_emvco_aidlimpl.git"
cd nfcandroid_emvco_aidlimpl
git checkout br_ar_15_comm_infra_dev
mkdir ../android_build/hardware/nxp/emvco
cp -rf * ../android_build/hardware/nxp/emvco
cd ..
# nfcandroid_platform_reference
git clone "https://github.com/nxp-nfc-infra/nfcandroid_platform_reference.git"
cd nfcandroid_platform_reference
git checkout br_ar_15_comm_infra_dev
cp -rf vendor/nxp/* ../android_build/vendor/nxp/
cd ..
# nfcandroid_infra_test_apps
git clone https://github.com/nxp-nfc-infra/nfcandroid_infra_test_apps.git
cd nfcandroid_infra_test_apps/
git checkout br_ar_15_comm_infra_dev
cd test_apps/
cp -rf SMCU_Switch/ ../../android_build/packages/apps/
cp -rf EMVCoModeSwitchApp/ ../../android_build/packages/apps/Nfc/
cp -rf load_unload/ ../../android_build/hardware/nxp/nfc/
cp -rf SelfTestAidl/ ../../android_build/hardware/nxp/nfc/
cd ../..
# nfcandroid_infra_comm_libs
git clone "https://github.com/nxp-nfc-infra/nfcandroid_infra_comm_libs.git"
cd nfcandroid_infra_comm_libs
git checkout br_ar_15_comm_infra_dev
cp -rf nfc_tda/ ../android_build/system/
cp -rf emvco_tda/ emvco_tda_test/ ../android_build/hardware/nxp/emvco/
cp -rf NfcTdaTestApp/ ../android_build/packages/apps/Nfc/
cd ..
Apply_patches.sh
cd android_build/build/bazel/
patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_build_bazel.patch
cd ../release
patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_build_release.patch
cd ../../external/libchrome
patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_external_libchrome.patch
cd ../../frameworks/base
patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_frameworks_base.patch
cd ../../system/logging
patch -p1 < ../../../nfcandroid_platform_reference/build_cfg/build_pf_patches/AROOT_system_logging.patch
このため、 AOSP_adaptation.shを実行し、その後、 Apply_patches.shを実行します。
6. hardware/interfaces/compatibility_matrices に変更を加えます
Androidのバージョンごとに互換性マトリックスが異なります。
ファイル: android_build/hardware/interfaces/compatibility_matrices/compatibility_matrix.202404.xml
android.hardware.audio.effect
1-2
IFactory
default
+
+ nxp.hardware.imx_dek_extractor
+ 1
+
+ IDek_Extractor
+ default
+
+
+
+ vendor.nxp.nxpnfc
+ 2
+
+ INxpNfc
+ default
+
+
+
+ vendor.nxp.emvco
+ 1
+
+ INxpEmvco
+ default
+
+
android.hardware.audio.sounddose
1-3
7. デバイス固有の .mk を変更
pn7160の場合、 NXP_NFC_HWはpn7160と等しくなる必要があります。
pn7220の場合、 NXP_NFC_HWはpn7220_i2csと等しくなる必要があります。
File : android_build/vendor/nxp/nfc/device-nfc.mk
#####
##### NXP NFC Device Configuration makefile
######
NXP_NFC_HOST := $(TARGET_PRODUCT)
ifndef TARGET_NXP_NFC_HW
NXP_NFC_HW := pn7160
else
NXP_NFC_HW := $(TARGET_NXP_NFC_HW)
endif
NXP_NFC_PLATFORM := pn54x
NXP_VENDOR_DIR := nxp
NXP_I2CM_S := $(TARGET_NXP_I2C_M_S)
ファイル: android_build/vendor/nxp/emvco/device-emvco.mk
NXP_VENDOR_DIR := nxp
NXP_NFC_HW := $(TARGET_NXP_NFC_HW)
ifeq ($(strip $(TARGET_NXP_NFC_HW)),)
NXP_NFC_HW := pn7160
endif
# Nfc service has dependency with EMVCo JAR
PRODUCT_PACKAGES += \
com.nxp.emvco
8. これで、Android BSPの構築を始めることができます。
i.MX8MN EVKの場合、
$ source build/envsetup.sh
$ lunch evk_8mn-nxp_stable-userdebug
$ export TARGET_RELEASE=nxp_stable
$ build_build_var_cache
$ ./imx-make.sh -j4 2>&1 | tee build-log.txt
BSPをビルディングする際には、ビルド中に多くのエラーが発生します。以下にいくつかの誤りと参考解決策を挙げておきます。
| エラー |
リファレンス・ソリューション |
| nfc_aconifg_flagsについて苦情を申し上げます。 |
packages/apps/Nfc/flags/Android.bp |
| android.hardware.nfc-V2-ndk に関して苦情を伝える |
ファイル: hardware/interfaces/nfc/aidl/vts/functional/Android.bp android.hardware.nfc-V2-ndk を変更しますandroid.hardware.nfc-V1-ndkへ |
|
platform_testing/build/tasks/tests/native_test_list.mk: error: continuous_native_tests:モジュール 'libnfc-nci-jni-tests' のインストールされたファイルが不明です。 |
'libnfc-nci-jni-tests' を削除します。
native_test_list.mk |
|
error: パッケージ/apps/Nfc/tests/instrumentation/Android.bp:6:1:モジュール「NfcNciInstrumentationTests」バリアント「Android_common」は、java_sdk_library「android.test.runner」に直接依存することはできません。「android.test.runner.stubs」に頼ってみて、「android.test.runner.stubs.system」「android.test.runner.stubs.test」または「android.test.runner.impl」その代わり |
ヒントはエラーメッセージに記載されています。 "android.test.runner" を "android.test.runner.stubs"、"android.test.runner.stubs.system""android.test.runner.stubs.test"または"android.test.runner.impl"に変更します。 |
|
エラー: vendor/nxp/frameworks/nfc/Android.bp:12:1:モジュール "com.nxp.nfc"バリアント"android_common"は、このモジュールから見えない //frameworks/base/nfc:framework-nfc.impl に依存しています。 "//vendor/nxp/frameworks/nfc"を可視性に追加する必要があるかもしれません。 |
ファイル: frameworks/base/nfc/Android.bp |
|
packages/apps/Nfc/nci/src/com/android/nfc/dhimpl/NativeT4tNfceeManager.java:20: エラー:重複クラス:com.android.nfc.dhimpl.nativet4tnfceemanager |
ファイルを編集してください。
パッケージ/apps/Nfc/nci/src/com/Android/nfc/dhimpl/NativeT4tNfceeManager.java そして重複したクラスをコメントアウトします。 |
|
android/R.java:12483:エラー: フィールド FLAG_NFC_ASSOCIATED_ROLE_SERVICES を解決できません @android.注釈。FlaggedApi(android.nfc.Flags.FLAG_NFC_ASSOCIATED_ROLE_SERVICES) |
編集
frameworks/base/nfc/java/android/nfc/flags.aconfig 下のフラグを追加してください。 |
|
失敗: platform_testing/build/tasks/tests/native_test_list.mk: エラー: continuous_native_tests: モジュール 'libnfc-nci-tests'のインストールされたファイルが不明です。 |
native_test_list.mkのlibnfc-nci-testを削除します。 |
|
prebuilts/clang/host/linux-x86/clang-r536225/include/c++/v1/string:780:43: error: implicit instantiation of undefined template 'std::char_traits 780 | static_assert((is_same<_CharT, typename traits_type::char_type>::value)、 | ^ packages/apps/Nfc/nci/jni/NativeNfcTda.cpp:32:35: note: ここで要求されるテンプレートクラス「std::basic_string 32 | 静的 std::basic_string | ^ |
パッケージ/アプリ/Nfc/nci/jni/NativeNfcTda.cppを編集してください |
|
packages/apps/Nfc/nci/jni/NativeT4tNfcee.cpp:493:21: エラー: 'append'への呼び出しに一致するメンバー関数がありません。 493 | sRxDataBuffer.append(data.p_data,data.len); | ~~~~~~~~~~~~~~^~~~~~ |
パッケージ/アプリ/Nfc/nci/jni/NativeT4tNfcee.cppを編集してください |
|
frameworks/base/core/java/android/provider/Settings.java:2351: エラー: フィールド FLAG_NFC_ACTION_MANAGE_SERVICES_SETTINGS を解決できませんでした @FlaggedApi(android.nfc.Flags.FLAG_NFC_ACTION_MANAGE_SERVICES_SETTINGS) |
ファイル: frameworks/base/nfc/java/android/nfc/flags.aconfig flags.aconfig に以下を追加します |
エラーメッセージには、エラーを修正するためのヒントがいくつか含まれているため、表に記載されていないエラーもあります。お客様はヒントに従い、ニーズに応じてソースコードを変更することができます。
時々、お客様はr1とr32のソースコードを比較できます。こちらは AOSP ソースコード android-15.0.0_r32 と android-15.0.0_r1です。
9. 画像をi.MX8MN EVKボードにダウンロードします
- 8MN EVKボード上でダウンロードモードに切り替えます
- まず、Android BSP WebページからAndroid 15 BSP i.MX8MN EVKデモイメージをダウンロードします。UUUスクリプトと必要なイメージファイルはすでにデモイメージパッケージに入っているためです。
- ここから UUU をダウンロードします: リリース · nxp-imx/mfgtools
- UUU実行ファイルをデモイメージフォルダに配置します。 uuu_imx_android_flash.batが同じフォルダに配置されているスクリプトです。
- ビルドに成功した後、画像をデモイメージのフォルダにコピーします。画像は、android_build/out/target/product/evk_8mn/ に位置しています
- UUUスクリプトを実行して、画像をEVKボードにダウンロードします。
参考情報:
Yocto Linux + PN7160を実行しているi.MX6ULL EVK
i.MX8M NanoボードでPN7160をAndroid 14に移植
i.MXアプリケーション・プロセッサ用Android OS | NXP Semiconductors
PN7160/PN7220 – Android 15 移植ガイド
プラグ・アンド・プレイNFCフロントエンド、統合ファームウェア搭載 | NXP Semiconductors