NXP Mass Market Driver(FP92 版本)是支持多款 NXP Wi-Fi/BT 芯片的 Linux 内核模块,核心编译逻辑是 “环境准备→内核适配→驱动编译”,兼容 ARM(如 i.MX 系列)和 X86(Ubuntu 多版本)双平台,支持 Linux 内核 4.9~6.12 等多个版本。本文详解从依赖安装到驱动生成的完整流程,包含具体命令、配置模板和避坑要点,开发者可直接复用步骤快速编译适配目标平台的驱动。
1. 核心目标与前置准备
1.1 技术目标
- 搭建通用编译环境(Ubuntu 20.04),兼容 ARM/X86 交叉编译;
- 编译 ARM 平台驱动:适配 i.MX 系列开发板,支持 32/64 位 ARM 架构;
- 编译 X86 平台驱动:兼容 Ubuntu 16.04~22.04 LTS,支持多内核版本交叉编译;
- 生成可用内核模块(mlan.ko、moal.ko),搭配固件和配置文件即可加载使用。
1.2 基础环境准备(Ubuntu 20.04 主机)
(1)安装依赖包(一次性执行)
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install flex bison gperf build-essential zlib1g-dev lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc gcc-multilib g++-multilib subversion openssh-server openssh-client uuid uuid-dev liblz-dev lzop liblzo2-2 liblzo2-dev git-core curl python3 python3-pip python3-pexpect python3-git python3-jinja2 pylint3 u-boot-tools mtd-utils openjdk-8-jdk device-tree-compiler aptitude libcurl4-openssl-dev nss-updatedb chrpath texinfo gawk cpio diffstat libncursesw5-dev libssl-dev libegl1-mesa libncurses5 net-tools libsdl1.2-dev xterm socat icedtea-netx-common icedtea-netx android-sdk-libsparse-utils android-sdk-ext4-utils gdisk m4 zlib1g-dev make libghc-gnutls-dev swig liblz4-tool liblz4-tool libdw-dev dwarves bc tar lz4 rsync ninja-build -y
(2)配置 Git(可选)
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱"
(3)下载驱动与固件源码
# 1. 下载驱动源码(FP92版本)
git clone https://github.com/nxp-imx/mwifiex.git
cd mwifiex
# 选择对应内核版本的分支(示例:内核6.6.52-2.2.0)
git checkout lf-6.6.52_2.2.0
# 2. 下载固件与配置文件(对应分支)
git clone https://github.com/nxp-imx/imx-firmware.git -b lf-6.6.52_2.2.0
# 固件路径:imx-firmware/nxp/(包含8801/8987/9098等芯片固件)
# 配置文件:imx-firmware/nxp/wifi_mod_para.conf(驱动加载参数)
2. ARM 平台编译流程(以 i.MX 系列为例)
2.1 交叉编译工具链准备(二选一)
(1)从 ARM 官网下载
- 32 位 ARM:https://developer.arm.com/downloads/-/gnu-rm(老版本)
- 64 位 ARM:https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads(新版本,如 13.2.rel1)
- 解压安装:
sudo tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
(2)从 Yocto BSP 导出(NXP i.MX 专属)
编译 Yocto 镜像后,工具链位于
build/tmp/deploy/sdk/目录,安装到 /opt/:sudo sh fsl-imx-fb-glibc-x86_64-imx-image-multimedia-cortexa7t2hf-neon-imx7dsabresd-toolchain-6.6-scarthgap.sh -d /opt/
2.2 编译目标板 Linux 内核
驱动依赖内核头文件,需先编译对应版本内核:
# 1. 下载内核源码(以i.MX 6.6.36为例)
git clone https://github.com/nxp-imx/linux-imx -b lf-6.6.y
cd linux-imx
# 2. 配置编译环境(64位ARM示例)
export ARCH=arm64
export CROSS_COMPILE=/opt/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
export PATH=$CROSS_COMPILE:$PATH
# 3. 编译内核
make imx_v8_defconfig # 加载i.MX8默认配置(根据开发板调整)
make -j8 # 8线程编译(根据CPU核心数调整)
2.3 编译 Mass Market Driver
# 1. 进入驱动源码目录
cd ~/mwifiex
# 2. 配置内核路径(指向编译好的内核源码)
export KERNELDIR=~/linux-imx
# 3. 适配非NXP平台(可选)
# 若目标CPU不是i.MX系列,修改Makefile:CONFIG_IMX_SUPPORT=y → CONFIG_IMX_SUPPORT=n
sed -i 's/CONFIG_IMX_SUPPORT=y/CONFIG_IMX_SUPPORT=n/' Makefile
# 4. 加载交叉编译环境(Yocto工具链示例)
source /opt/fsl-imx-wayland/6.6-nanbield/environment-setup-armv8a-poky-linux
# 5. 编译驱动
make
# 6. 验证产物(ARM架构ko文件)
file mlan.ko # 输出:ELF 64-bit LSB relocatable, ARM aarch64, version 1...
- 成功产物:
mlan.ko(核心驱动)、moal.ko(适配层驱动)。
3. X86 平台编译流程(Ubuntu 多版本兼容)
方案 1:Ubuntu 本地直接编译(对应主机内核)
(1)适用场景
Ubuntu 16.04/18.04/20.04/22.04 LTS,直接编译适配当前主机内核的驱动。
(2)关键步骤
# 1. 进入驱动源码目录
cd ~/mwifiex
# 2. 打X86适配补丁(修改Makefile)
# 补丁功能:禁用i.MX专属配置,适配X86内核路径
wget https://xxx/0001-MXM-Makefile-for-X86.patch # 文档附件补丁
git apply 0001-MXM-Makefile-for-X86.patch
# 3. 编译驱动
make
# 4. 验证产物(X86架构ko文件)
file moal.ko # 输出:ELF 64-bit LSB relocatable, x86-64, version 1...
方案 2:多内核版本交叉编译(Ubuntu 20.04 主机)
(1)核心需求
在单主机上编译适配不同内核(4.9/5.10/6.12)的驱动,需多版本 gcc 切换。
(2)步骤 1:安装多版本 gcc 并管理
# 1. 添加软件源
sudo vim /etc/apt/sources.list
# 末尾添加:deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal main
sudo apt update
# 2. 安装gcc 4.8/5/6/7/8/10/13(适配不同内核)
sudo apt install gcc-4.8 gcc-5 gcc-6 gcc-7 gcc-8 gcc-10 gcc-13 g++-4.8 g++-5 g++-6 g++-7 g++-8 g++-10 g++-13 -y
# 3. 配置版本切换(设置优先级)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 60
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 70
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10
# 4. 切换gcc版本(示例:切换到gcc-4.8适配内核4.9)
sudo update-alternatives --config gcc # 输入对应序号选择
(3)步骤 2:编译目标内核(以 4.9 为例)
# 1. 下载内核源码
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.9.88.tar.gz
tar -zxvf linux-4.9.88.tar.gz
cd linux-4.9.88
# 2. 配置内核(禁用签名验证)
make menuconfig # 退出时保存默认配置
scripts/config --disable SYSTEM_TRUSTED_KEYS
# 3. 编译内核(用对应gcc版本)
make -j16
(4)步骤 3:编译驱动(适配目标内核)
# 1. 进入驱动目录,打X86补丁(已打过可省略)
cd ~/mwifiex
# 2. 配置目标内核路径
export KERNELDIR=~/linux-4.9.88
# 3. 编译驱动
make
# 4. 验证:不同内核驱动产物独立,可按需复制到目标设备
4. 关键避坑事项
- 内核版本匹配:驱动分支需与目标内核版本一致(如 lf-6.6.52_2.2.0 适配内核 6.6.52),否则编译报错;
- 非 i.MX 平台适配:必须修改 Makefile 中
CONFIG_IMX_SUPPORT=y为n,否则会注入 i.MX 专属宏定义; - X86 补丁必打:直接编译 X86 驱动需先打 Makefile 补丁,否则会因 ARM 架构配置失败;
- gcc 版本适配:老内核(4.9)需用 gcc-4.8,新内核(6.12)需用 gcc-10+,否则编译兼容性报错;
- 固件路径:驱动加载时需指定
wifi_mod_para.conf路径,确保fw_name指向正确的固件文件; - 编译线程:
make -jN中 N 建议设为 CPU 核心数的 1.5 倍,避免内存溢出。
5. 驱动加载与验证(补充)
编译完成后,将
mlan.ko、moal.ko、wifi_mod_para.conf和固件复制到目标设备,执行加载命令:# 加载驱动
insmod mlan.ko
insmod moal.ko mod_para=nxp/wifi_mod_para.conf
# 验证加载成功
dmesg | grep -e mlan -e moal -e FW # 输出"Driver loaded successfully"即生效
NXP Mass Market Driver 的 Linux 编译核心是 “环境适配 + 内核对齐”:ARM 平台重点配置交叉工具链和 i.MX 专属参数,X86 平台需通过补丁适配架构并管理多版本 gcc。整个流程无需复杂开发,按本文步骤执行即可生成适配不同平台、不同内核的驱动模块,支持 88W8987、88W9098 等多款 NXP Wi-Fi 芯片。
阅读全文
155