NXP PN7160 NFC 控制器在 i.MX6ULL EVK 开发板上的 Yocto Linux 移植,核心是完成 BSP 编译、驱动内核集成、设备树配置、硬件连接与应用部署,最终实现 NFC 标签读写功能。本文详解从环境搭建到 demo 运行的完整步骤,适用于物联网、消费电子等 NFC 应用开发场景,开发者可直接复用配置与命令快速落地。
1. 核心目标与环境准备
1.1 技术目标
- 编译适配 i.MX6ULL 的 Yocto Linux BSP(内核 6.6.36);
- 将 PN7160 NFC 驱动集成到 Linux 内核,实现硬件适配;
- 修改设备树配置 GPIO 与 I2C 通信,确保 PN7160 与开发板正常交互;
- 编译 NFC 库与
nfcDemoApp,验证标签识别、NDEF 数据读写功能。
1.2 软硬件环境
- 硬件:i.MX6ULL 14x14 EVK 开发板、PN7160 NFC 模块(OM27160A1HN)、OM29110ARD-B 连接器板、SD 卡、USB 线;
- 软件:Yocto Project 环境、Linux 内核源码、nxpnfc 驱动源码、meta-nxp-nfc 层、UUU 烧录工具;
- 依赖工具:Git、BitBake(Yocto 编译工具)、SSH(文件传输)。
2. Yocto Linux BSP 编译(基础步骤)
2.1 初始化编译环境
# 创建工作目录并进入
mkdir L6.6.36_2.1.0 && cd L6.6.36_2.1.0
# 初始化repo仓库
repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-scarthgap -m imx6.6.36-2.1.0.xml
# 同步源码
repo sync
# 配置编译参数(指定发行版与开发板)
DISTRO=fsl-imx-xwayland MACHINE=imx6ull14x14evk source imx-setup-release.sh -b build-for-6ullevk
2.2 编译基础镜像
bitbake core-image-full-cmdline
- 编译成功后,内核源码路径:
build-for-6ullevk/tmp/work/imx6ull14x14evk-poky-linux-gnueabi/linux-imx/6.6.36+git/git/
3. PN7160 驱动集成(内核层面)
3.1 下载并替换 NFC 驱动
# 进入内核源码目录
cd build-for-6ullevk/tmp/work/imx6ull14x14evk-poky-linux-gnueabi/linux-imx/6.6.36+git/git/
# 删除原有NFC驱动目录
rm -rf drivers/nfc
# 克隆NXP官方NFC驱动
git clone https://github.com/NXPNFCLinux/nxpnfc.git drivers/nfc
- 驱动目录结构:包含 I2C/SPI 驱动实现(
i2c.c/spi.c)、设备树示例(i2c_devicetree.txt)等核心文件。
3.2 内核配置启用驱动
# 启动内核配置菜单
bitbake linux-imx -c menuconfig
- 配置路径:
Device Drivers → NFC support → NFC I2C Slave driver for NXP-NFCC; - 选择方式:设为内置驱动(
<*>),确保驱动随内核启动加载; - 保存配置并退出,驱动将纳入后续内核编译流程。
4. 硬件连接:i.MX6ULL EVK ↔ PN7160
- 关键说明:I2C2 为通信核心,3 个 GPIO 引脚负责 PN7160 的中断、使能与固件下载控制。
5. 设备树修改(关键适配步骤)
修改 i.MX6ULL EVK 设备树文件
imx6ul-14x14-evk.dtsi(路径:linux-imx/arch/arm/boot/dts/nxp/imx/),完成 3 项核心配置:5.1 禁用 UART2(释放 GPIO 引脚)
&uart2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_uart2>;
uart-has-rtscts;
status = "disabled"; // 禁用UART2,复用其引脚为GPIO
bluetooth {
compatible = "nxp,88w8987-bt";
};
};
5.2 添加 PN7160 I2C 节点(挂载到 I2C2)
&i2c2 {
clock-frequency = <100000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
nxpnfc: nxpnfc@28 {
compatible = "nxp,nxpnfc";
reg = <0x28>; // PN7160 I2C从设备地址
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_nfcgpio>; // 绑定GPIO配置
nxp,nxpnfc-irq = <&gpio1 21 0>; // IRQ对应GPIO1_21
nxp,nxpnfc-ven = <&gpio1 20 0>; // VEN对应GPIO1_20
nxp,nxpnfc-fw-dwnld = <&gpio1 25 0>; // DWL_REQ对应GPIO1_25
};
codec: wm8960@1a {
// 原有 codec 节点配置不变
};
};
5.3 配置 NFC GPIO 引脚复用
pinctrl_nfcgpio: nfcgpiogrp {
fsl,pins = <
MX6UL_PAD_UART2_RX_DATA__GPIO1_IO21 0xb0 // IRQ引脚配置
MX6UL_PAD_UART2_TX_DATA__GPIO1_IO20 0xb0 // VEN引脚配置
MX6UL_PAD_UART3_RX_DATA__GPIO1_IO25 0xb0 // DWL_REQ引脚配置
>;
};
- 关键参数:
0xb0为引脚电气属性配置(含上拉 / 下拉、驱动强度等),无需修改。
6. 重新编译内核与镜像
6.1 编译内核
bitbake linux-imx -c compile
6.2 编译完整镜像
bitbake core-image-full-cmdline
- 镜像输出路径:
build-for-6ullevk/tmp/deploy/images/imx6ull14x14evk/,文件格式为.wic.zst。
7. 镜像烧录与开发板启动
7.1 烧录准备
- 下载 UUU 烧录工具:https://github.com/nxp-imx/mfgtools/releases;
- 解压编译生成的
.wic.zst镜像文件,将 UUU.exe 复制到镜像解压目录; - 开发板连接:USB 线连接 PC 与开发板 USB 端口,切换启动模式为 “Serial Downloader mode”(SW602 拨码:D1=OFF,D2=ON)。
7.2 执行烧录
在 PC 端命令行进入镜像目录,执行烧录命令(烧录到 SD 卡):
uuu -b sd_all core-image-full-cmdline-imx6ull14x14evk.rootfs-xxxxxx.wic.zst
- 替换
xxxxxx为实际镜像文件名; - 烧录完成后,切换启动模式为 “Internal Boot”(SW602 拨码:D1=ON,D2=OFF),重启开发板。
7.3 验证驱动加载
开发板登录 root 用户,执行以下命令查看驱动加载状态:
dmesg | grep nfc
ls /dev/nxpnfc
- 成功标志:dmesg 输出 “Loading NXP NFC I2C driver” 等日志,
/dev/nxpnfc设备节点存在。
8. NFC 库与应用编译(Yocto 层面)
8.1 添加 meta-nxp-nfc 层
# 进入Yocto sources目录
cd L6.6.36_2.1.0/sources
# 克隆meta层
git clone https://github.com/NXPNFCLinux/meta-nxp-nfc.git
8.2 配置 bblayers.conf
编辑
build-for-6ullevk/conf/bblayers.conf,添加 meta 层路径:BBLAYERS += " ${BSPDIR}/sources/meta-nxp-nfc"
8.3 编译 NFC 库与 demo 应用
bitbake nxp-nfc
- 编译产物:库文件(
.libs/目录)、nfcDemoApp(demo 程序)、配置文件(libnfc-nci.conf); - 产物路径:
build-for-6ullevk/tmp/work/cortexa7t2hf-neon-poky-linux-gnueabi/nxp-nfc/git/。
8.4 部署到开发板
通过 SSH(
scp命令)将文件传输到 i.MX6ULL EVK:# 传输库文件
scp build/.libs/* root@[开发板IP]:/.libs/
# 传输配置文件
scp image/etc/libnfc* root@[开发板IP]:/etc/
# 传输usr/lib文件
scp image/usr/lib/* root@[开发板IP]:/usr/lib/
- 开发板端创建目录并复制配置文件:
mkdir -p /usr/local/etc cp /etc/libnfc-nci.conf /usr/local/etc/
9.功能验证:运行 nfcDemoApp
9.1 启动 NFC 标签探测
cd .libs/
./nfcDemoApp poll
9.2 成功标志
- 终端输出:“Poll mode activated → Waiting for a Tag/Device...”;
- 贴近 NFC 标签(如 NTAG424 DNA)后,日志显示标签信息:
- 标签类型:Type A-Mifare Ultralight;
- NFCID:如 04 B7 CA AA 28 63 80;
- NDEF 数据:如 “test..test..”(20 字节),验证读写功能正常。
10. 避坑核心事项
- 设备树配置:确保 I2C 地址(0x28)、GPIO 引脚编号与硬件连接一致,否则驱动无法识别模块;
- 驱动编译:必须设为内置驱动(
<*>),模块驱动(<M>)可能导致启动时加载失败; - 烧录模式:严格按要求切换启动模式,否则烧录失败或无法正常启动;
- 文件传输:
scp传输时确保开发板与 PC 在同一子网,避免权限问题(可加-r递归传输目录); - 引脚复用:禁用 UART2 后不可再使用其串口功能,避免资源冲突。
PN7160 + i.MX6ULL EVK 的 Yocto Linux 移植核心流程可概括为 “BSP 编译→驱动集成→硬件连接→设备树适配→镜像烧录→应用部署”,全程无需复杂开发,重点在于配置文件的精准匹配。该方案实现了 NFC 标签的识别与 NDEF 数据读写,为后续开发门禁、支付、溯源等 NFC 应用提供了稳定的底层基础。
阅读全文
73