需求说明
飞牛社区固件 Github 项目是一个 Fnos 固件 Re 打包项目,飞牛内核(`6.18.18-trim`)以预编译制品形式提供(boot/dtb/modules/header 四个 tar.gz 包),项目本身不编译内核。
easepi-r2 设备使用的 AP6256 (BCM43455) WiFi 模组依赖 `brcmfmac` 驱动,但飞牛内核未编译此模块。因此需要:
1. **下载内核源码** `~/fnnas/linux-6.18.18` 和内核头文件 `~/fnnas/linux-6.18.18/header-rockchip-6.18.18-trim/`,用于交叉编译飞牛内核缺失的驱动模块
2. 将编译产物集成到项目的 `~/fnnas/make-fnnas/kernel/6.18.18/6.18.18-rockchip/modules-rockchip-6.18.18-trim.tar.gz` 中
3. 通过 `renas` 打包脚本将模块打包到固件
> `linux-6.18.18` 内核源码和其中的 `header-rockchip-6.18.18-trim` 不是项目自身代码,仅为外部驱动模块提供编译支持。
### 方案概述
**─────────────** **──────────────────** **─────────────────** **──────────────**
** 交叉编译 ** → ** 注入 modules 包 ** → ** renas 固件打包 ** → ** 刷写验证 **
** brcmfmac.ko ** ** depmod 更新元数据 ** ** fix_wifi.sh ** ** WiFi 可用 **
** brcmutil.ko ** ** sha256sums 更新 ** ** rc.local ** ** **
** brcmfmac-wcc** ** ** ** 固件链接生成 ** ** **
**─────────────** **──────────────────** **─────────────────** **──────────────**
第二章编译 第三章集成 第四章打包适配 第七章验证
***
## 一、测试设备硬件信息
| 项目 | 值 |
| ---------- | ----------------------------------------------------------------- |
| 设备 | EasePi-R2 |
| SoC | RK3588 (4xA76 + 4xA55) |
| WiFi/BT 模组 | AP6256 (BCM43455) |
| WiFi 接口 | SDIO (mmc1) |
| BT 接口 | UART9 (serdev/hci\_bcm) |
| SDIO ID | 0x02d0:0xa9bf |
| 固件版本 | BCM4345/6 wl0: Feb 27 2018 03:15:32 version 7.45.154 (r684107 CY) |
| BT 固件 | BCM4345C0 (003.001.025) build 0382 |
> **注意**: SDIO 设备 ID 0x02d0:0xa9bf 对应 BCM43455,即 AP6256 模组。
***
## 二、驱动编译
### 2.1 编译环境
| 项目 | 值 | 说明 |
| ----- | -------------------------------------------- | ---------------------- |
| 内核源码 | `~/fnnas/linux-6.18.18` | 外部下载,仅用于编译缺失模块 |
| 内核头文件 | `linux-6.18.18/header-rockchip-6.18.18-trim` | 飞牛发布的精简头文件,提供编译依赖 |
| 交叉编译器 | `aarch64-linux-gnu-gcc 13.3.0` | 宿主机安装(建议安装 gcc 12.2.0) |
| 目标内核 | `6.18.18-trim` | 飞牛预编译内核 (gcc 12.2.0) |
下载地址:
| 资源 | 地址 |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| Linux 6.18.18 内核源码 | `https://mirrors.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.18.18.tar.xz` |
| 飞牛内核头文件 (`header-rockchip-6.18.18-trim`) | `https://github.com/ophub/fnnas/releases/download/kernel_fnnas/6.18.18-rockchip.tar.gz` |
| 飞牛内核配置 `config-6.18.18-trim` 来自基础镜像 | `https://github.com/ophub/fnnas/releases/download/fnnas_base_image/fnnas-official-arm64-image_rockchip_1253.img.xz` |
### 2.2 模块编译配置
飞牛内核配置 `config-6.18.18-trim` 中 `CONFIG_BRCMFMAC` 未启用,编译外部模块时需在 `.config` 中补充以下配置:
CONFIG_BRCMUTIL=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
同时需要同步更新 `include/config/auto.conf` 和 `include/generated/autoconf.h`:
**auto.conf 新增配置项**(追加到 `include/config/auto.conf` 末尾):
CONFIG_BRCMUTIL=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
**autoconf.h 新增宏定义**(追加到 `include/generated/autoconf.h` 末尾):
`c
#define CONFIG_BRCMUTIL_MODULE 1
#define CONFIG_BRCMFMAC_MODULE 1
#define CONFIG_BRCMFMAC_SDIO 1
#define CONFIG_BRCMFMAC_USB 1
#define CONFIG_BRCMFMAC_PCIE 1
#define CONFIG_BRCMFMAC_PROTO_BCDC 1
#define CONFIG_BRCMFMAC_PROTO_MSGBUF 1
说明: auto.conf 中 =m 表示编译为模块,=y 表示内建特性(在模块内部启用对应子功能)。autoconf.h 中 =m 转换为 _MODULE 1 宏,=y 转换为 1 宏。编译时 C 代码通过 #ifdef CONFIG_BRCMFMAC_MODULE 等条件编译控制功能启用。此修改仅影响外部模块编译环境,不修改飞牛内核本身。
2.3 编译步骤
cd ~/fnnas/linux-6.18.18
# 1. 准备编译环境:从飞牛头文件中复制生成文件
cp -rn header-rockchip-6.18.18-trim/include/generated include/
cp -rn header-rockchip-6.18.18-trim/include/config/* include/config/
cp -rn header-rockchip-6.18.18-trim/arch/arm64/include/generated arch/arm64/include/
cp -n header-rockchip-6.18.18-trim/Module.symvers .
# 2. 创建 .config (基于飞牛 auto.conf + BRCMFMAC 配置)
cat include/config/auto.conf > .config
cat >> .config << 'EOF'
CONFIG_BRCMUTIL=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
EOF
# 3. 同步 auto.conf 和 autoconf.h(追加 BRCMFMAC 配置项和宏定义,内容见 2.2 节)
# 4. 编译整个 brcm80211 目录(必须一起编译,brcmfmac 依赖 brcmutil 符号)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
M=drivers/net/wireless/broadcom/brcm80211 modules
# 5. 精简模块(去除调试信息,15M → 476K)
aarch64-linux-gnu-strip --strip-unneeded \
drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko \
drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko \
drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/brcmfmac-wcc.ko
2.4 编译产物
| 模块 |
路径 |
strip 后大小 |
说明 |
| brcmutil.ko |
.../brcm80211/brcmutil/ |
15K |
Broadcom 工具库 |
| brcmfmac.ko |
.../brcm80211/brcmfmac/ |
476K |
主驱动 (SDIO/USB/PCIE) |
| brcmfmac-wcc.ko |
.../brcmfmac/wcc/ |
5.3K |
WCC 厂商变体 (BCM43455 必需) |
关键: BCM43455 需要 brcmfmac-wcc.ko(WCC = Cypress/Infineon 厂商驱动),brcmfmac 初始化时会通过 fwvid 机制自动请求加载此模块。
三、modules 包集成
3.1 概述
将编译好的 brcmfmac 驱动模块注入到飞牛的 modules-rockchip-6.18.18-trim.tar.gz 中,使 renas 打包固件后内核能够自动加载 WiFi 驱动。
3.2 集成步骤
KERNEL_PKG_DIR="~/fnnas/make-fnnas/kernel/6.18.18/6.18.18-rockchip"
MODULES_PKG="modules-rockchip-6.18.18-trim.tar.gz"
SRC_BRCM="~/fnnas/linux-6.18.18/drivers/net/wireless/broadcom/brcm80211"
WORKDIR="/tmp/modules-patch"
# 1. 解压 modules 包
mkdir -p "$WORKDIR"
tar -xzf "$KERNEL_PKG_DIR/$MODULES_PKG" -C "$WORKDIR"
# 2. 创建目标目录并复制模块
BRCM_DIR="$WORKDIR/6.18.18-trim/kernel/drivers/net/wireless/broadcom/brcm80211"
mkdir -p "$BRCM_DIR/brcmutil" "$BRCM_DIR/brcmfmac/wcc"
cp "$SRC_BRCM/brcmutil/brcmutil.ko" "$BRCM_DIR/brcmutil/"
cp "$SRC_BRCM/brcmfmac/brcmfmac.ko" "$BRCM_DIR/brcmfmac/"
cp "$SRC_BRCM/brcmfmac/wcc/brcmfmac-wcc.ko" "$BRCM_DIR/brcmfmac/wcc/"
# 3. 运行 depmod 更新模块元数据(需要 lib/modules 路径结构)
mkdir -p "$WORKDIR/lib/modules"
mv "$WORKDIR/6.18.18-trim" "$WORKDIR/lib/modules/"
depmod -a -b "$WORKDIR" 6.18.18-trim
mv "$WORKDIR/lib/modules/6.18.18-trim" "$WORKDIR/"
# 4. 重新打包
tar -czf "$KERNEL_PKG_DIR/$MODULES_PKG" -C "$WORKDIR" 6.18.18-trim/
# 5. 更新 sha256sums
cd "$KERNEL_PKG_DIR"
sha256sum boot-rockchip-6.18.18-trim.tar.gz \
dtb-rockchip-6.18.18-trim.tar.gz \
header-rockchip-6.18.18-trim.tar.gz \
modules-rockchip-6.18.18-trim.tar.gz > sha256sums
# 6. 清理
rm -rf "$WORKDIR"
3.3 集成验证
| 验证项 |
结果 |
| sha256sums 校验 |
✅ 全部通过 |
| brcmfmac 模块文件 |
✅ brcmutil.ko, brcmfmac.ko, brcmfmac-wcc.ko |
| modules.dep 依赖 |
✅brcmfmac.ko: brcmutil.ko, cfg80211.ko, rfkill.ko |
| modules.alias SDIO |
✅sdio:c*v02D0dA9BF* brcmfmac |
| modules.symbols |
✅ 32 个 brcm 符号导出 |
| 模拟 renas 解压 |
✅ 路径 /usr/lib/modules/6.18.18-trim/ 正确 |
| 模块架构 |
✅ELF 64-bit LSB relocatable, ARM aarch64 |
四、固件打包适配
4.1 renas 脚本修改
在 refactor_rootfs 函数的 WiFi/BT 固件优化部分添加 easepi-r2 固件链接生成:
# easepi-r2 is AP6256 (BCM43455) wifi/bluetooth
sed -e "s/macaddr=.*/macaddr=${random_macaddr}:08/" "brcmfmac43455-sdio.txt" >"brcmfmac43455-sdio.linkease,easepi-r2.txt"
ln -sf brcmfmac43455-sdio.bin brcmfmac43455-sdio.linkease,easepi-r2.bin
ln -sf brcmfmac43455-sdio.clm_blob brcmfmac43455-sdio.linkease,easepi-r2.clm_blob
4.2 different-files 修改
| 文件 |
操作 |
说明 |
easepi-r2/rootfs/usr/local/wifi/fix_wifi.sh |
新增 |
WiFi 初始化脚本(rfkill unblock + regulatory.db 切换 + nmcli radio on) |
easepi-r2/rootfs/etc/rc.local |
修改 |
添加 WiFi 初始化调用 |
4.3 renas 打包流程
使用 renas 打包固件时,WiFi 驱动的完整流程:
replace_kernel 函数: 将 modules-rockchip-6.18.18-trim.tar.gz 解压到 /usr/lib/modules/
- brcmfmac 模块自动安装到
/usr/lib/modules/6.18.18-trim/kernel/drivers/net/wireless/broadcom/brcm80211/
- modules.dep/alias 等元数据已包含 brcmfmac 条目
build 符号链接指向 /usr/src/linux-headers-6.18.18-trim
refactor_rootfs 函数: WiFi/BT 固件优化
- 自动创建
brcmfmac43455-sdio.linkease,easepi-r2.* 固件链接
- 生成带随机 MAC 地址的 NVRAM 文件
copy_files 函数: 复制 different-files
fix_wifi.sh → /usr/local/wifi/fix_wifi.sh
rc.local → /etc/rc.local(含 WiFi 初始化调用)
brcmfmac.conf → /etc/modprobe.d/brcmfmac.conf(common-files 中已存在)
五、驱动加载与持久化
5.1 自动加载机制
EasePi-R2 的 WiFi 驱动通过 SDIO alias 自动加载,无需手动添加到 modules-load.d:
- 内核启动时检测到 SDIO 设备
mmc1:0001:1
- 读取 modalias:
sdio:c00v02D0dA9BF
- modules.alias 中匹配:
alias sdio:c*v02D0dA9BF* brcmfmac
- modprobe 自动加载 brcmfmac 及其依赖 (brcmutil, cfg80211)
- brcmfmac 初始化时通过 fwvid 机制自动加载 brcmfmac-wcc
5.2 手动加载
modprobe brcmfmac
# 或
insmod /usr/lib/modules/6.18.18-trim/kernel/net/wireless/cfg80211.ko
insmod /usr/lib/modules/6.18.18-trim/kernel/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko
insmod /usr/lib/modules/6.18.18-trim/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko
# brcmfmac-wcc 由 fwvid 自动加载
5.3 模块参数
/etc/modprobe.d/brcmfmac.conf(common-files 中已存在):
options brcmfmac feature_disable=0x282000
5.4 持久化状态
| 配置项 |
持久化位置 |
是否持久化 |
说明 |
| 内核模块文件 |
/usr/lib/modules/6.18.18-trim/kernel/ |
✅ 是 |
btrfs 根分区,重启不丢失 |
| modules.dep/alias |
/usr/lib/modules/6.18.18-trim/modules.* |
✅ 是 |
depmod -a 已更新 |
| WiFi 固件 |
/usr/lib/firmware/brcm/ |
✅ 是 |
btrfs 根分区 |
| 设备固件链接 |
/usr/lib/firmware/brcm/brcmfmac43455-sdio.linkease,easepi-r2.* |
✅ 是 |
符号链接在 btrfs |
| SDIO 自动加载 |
modules.alias 匹配 |
✅ 是 |
内核内置机制 |
| modprobe 参数 |
/etc/modprobe.d/brcmfmac.conf |
✅ 是 |
common-files 中已存在 |
| rfkill 状态 |
/var/lib/systemd/rfkill/ |
✅ 已修复 |
fix_wifi.sh 设为 0 (unblocked) |
| NetworkManager WiFi |
NM 配置 |
✅ 已修复 |
fix_wifi.sh 中 wifi radio enabled |
| regulatory.db |
/etc/alternatives/regulatory.db |
✅ 已修复 |
fix_wifi.sh 切换到 upstream 版本 |
| WiFi 初始化脚本 |
/usr/local/wifi/fix_wifi.sh |
✅ 新增 |
rc.local 调用 |
5.5 修复的持久化问题
问题 1: rfkill 软阻止 WiFi
- 现象: 重启后 WiFi 被 rfkill 软阻止,
ip link set wlan0 up 报 RTNETLINK answers: Operation not possible due to RF-kill
- 原因: systemd-rfkill 服务在关机时保存 rfkill 状态到
/var/lib/systemd/rfkill/,启动时恢复。WiFi 状态被保存为 1 (blocked)
- 修复: fix_wifi.sh 中遍历
/var/lib/systemd/rfkill/*:wlan 并写入 0
问题 2: regulatory.db 签名验证失败
- 现象:
cfg80211: loaded regulatory.db is malformed or signature is missing/invalid
- 原因: 飞牛系统默认使用
regulatory.db-debian 版本,其 p7s 签名与内核内置的 X.509 证书不匹配。内核配置 CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y,要求签名验证通过
- 修复: fix_wifi.sh 中切换到
regulatory.db-upstream 版本
问题 3: 缺少 WiFi 初始化脚本
- 修复: 创建
/usr/local/wifi/fix_wifi.sh 并在 /etc/rc.local 中调用
5.6 固件刷写后预期行为
- 内核启动 → SDIO 扫描发现 BCM43455 →
sdio:c*v02D0dA9BF* alias 匹配 → modprobe brcmfmac
- brcmfmac 加载 → 自动加载依赖 (cfg80211, brcmutil, rfkill) → fwvid 加载 brcmfmac-wcc
- 固件加载
brcmfmac43455-sdio.linkease,easepi-r2.*(renas 自动创建)
wlan0 接口创建 → rc.local 调用 fix_wifi.sh → rfkill unblock → regulatory.db 切换 → WiFi 可用
5.7 关键代码
/etc/rc.local
文件路径: make-fnnas/fnnas-files/different-files/easepi-r2/rootfs/etc/rc.local
#!/bin/bash
# 执行飞牛自定义服务
[[ -x "/etc/custom_service/start_service.sh" ]] && bash /etc/custom_service/start_service.sh &
# 蓝牙初始化
[[ -x "/usr/local/bluetooth/fix_bluetooth.sh" ]] && bash /usr/local/bluetooth/fix_bluetooth.sh >/dev/null 2>&1 &
# WiFi初始化
[[ -x "/usr/local/wifi/fix_wifi.sh" ]] && bash /usr/local/wifi/fix_wifi.sh >/dev/null 2>&1 &
exit 0
说明:
- WiFi 初始化行放在蓝牙初始化之后,因为两者共用 SDIO/UART 总线,WiFi 先于蓝牙加载可避免资源竞争
- 使用
[[ -x ... ]] 判断脚本是否可执行,确保不存在时不会报错
- 后台执行
& 不阻塞其他启动项
- 输出重定向到
/dev/null 避免控制台噪音
/usr/local/wifi/fix_wifi.sh
文件路径: make-fnnas/fnnas-files/different-files/easepi-r2/rootfs/usr/local/wifi/fix_wifi.sh
#!/bin/bash
WLAN_IF="wlan0"
RFKILL_WLAN=""
for f in /var/lib/systemd/rfkill/*:wlan; do
if [ -f "$f" ]; then
RFKILL_WLAN="$f"
break
fi
done
if [ -n "$RFKILL_WLAN" ]; then
echo 0 > "$RFKILL_WLAN" 2>/dev/null
fi
if [ -x /usr/bin/update-alternatives ]; then
UPSTREAM_DB="/lib/firmware/regulatory.db-upstream"
UPSTREAM_P7S="/lib/firmware/regulatory.db.p7s-upstream"
if [ -f "$UPSTREAM_DB" ] && [ -f "$UPSTREAM_P7S" ]; then
update-alternatives --set regulatory.db "$UPSTREAM_DB" >/dev/null 2>&1
update-alternatives --set regulatory.db.p7s "$UPSTREAM_P7S" >/dev/null 2>&1
fi
fi
if [ -d /sys/class/net/$WLAN_IF ]; then
nmcli radio wifi on 2>/dev/null
fi
说明:
- rfkill unblock (第 6-15 行):
- 遍历
/var/lib/systemd/rfkill/*:wlan 匹配 WiFi 设备的 rfkill 状态文件
- 使用通配符
*:wlan 而非硬编码设备路径,适配不同硬件平台的 rfkill 节点命名
- 写入
0 解除软阻止,允许 WiFi 接口正常工作
- 仅处理第一个匹配项(
break),避免重复操作
- regulatory.db 切换 (第 17-24 行):
- 检查
update-alternatives 是否可用
- 验证 upstream 版本的 regulatory.db 和 p7s 签名文件是否存在
- 切换到 upstream 版本,解决内核签名验证失败问题
- upstream 版本的 p7s 签名与内核内置的
sforshee 和 wens X.509 证书匹配
- WiFi radio 开启 (第 26-28 行):
- 检查 wlan0 接口是否存在(
/sys/class/net/wlan0)
- 使用
nmcli radio wifi on 确保 NetworkManager 开启 WiFi 射频
- 仅在接口存在时执行,避免无 WiFi 设备时产生错误
~/fnnas/doc/rebuild-brcmfmac.sh
文件路径: doc/rebuild-brcmfmac.sh
#!/bin/bash
set -e
KERNEL_SRC="/home/ifroncy/fnnas/linux-6.18.18"
HEADER_DIR="${KERNEL_SRC}/header-rockchip-6.18.18-trim"
CROSS_COMPILE="aarch64-linux-gnu-"
ARCH="arm64"
BRCM_DIR="drivers/net/wireless/broadcom/brcm80211"
MODULES_OUT="/tmp/brcmfmac-modules"
usage() {
echo "用法: $0 [compile|install|all]"
echo ""
echo "命令:"
echo " compile - 交叉编译 brcmfmac WiFi 驱动模块"
echo " install - 安装编译产物到目标设备 (需设置 TARGET_HOST)"
echo " all - 编译并安装"
echo ""
echo "环境变量:"
echo " TARGET_HOST - 目标设备 SSH 地址 (例: root@192.168.1.1)"
echo " KERNEL_SRC - 内核源码路径 (默认: ${KERNEL_SRC})"
echo " HEADER_DIR - 内核头文件路径 (默认: ${HEADER_DIR})"
exit 1
}
check_env() {
if [ ! -d "$KERNEL_SRC" ]; then
echo "错误: 内核源码目录不存在: $KERNEL_SRC"
exit 1
fi
if [ ! -f "$HEADER_DIR/Module.symvers" ]; then
echo "错误: 内核头文件目录无效: $HEADER_DIR"
exit 1
fi
if ! command -v ${CROSS_COMPILE}gcc &>/dev/null; then
echo "错误: 交叉编译器 ${CROSS_COMPILE}gcc 未找到"
exit 1
fi
}
prepare_kernel() {
echo "[1/4] 准备内核编译环境..."
cd "$KERNEL_SRC"
if [ ! -f ".config" ] || ! grep -q "CONFIG_BRCMFMAC=m" .config 2>/dev/null; then
echo " 创建 .config..."
echo "# Automatically generated file; DO NOT EDIT." > .config
echo "# Linux/arm64 6.18.18-trim Kernel Configuration" >> .config
echo "#" >> .config
cat "$HEADER_DIR/include/config/auto.conf" >> .config
if ! grep -q "CONFIG_BRCMFMAC=m" .config; then
cat >> .config << 'EOF'
CONFIG_BRCMUTIL=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
EOF
fi
fi
if [ ! -f "include/generated/autoconf.h" ] || [ ! -f "Module.symvers" ]; then
echo " 复制内核头文件生成文件..."
cp -rn "$HEADER_DIR/include/generated" include/ 2>/dev/null || true
cp -rn "$HEADER_DIR/include/config" include/ 2>/dev/null || true
cp -rn "$HEADER_DIR/arch/arm64/include/generated" arch/arm64/include/ 2>/dev/null || true
cp -n "$HEADER_DIR/Module.symvers" . 2>/dev/null || true
fi
echo " 内核编译环境准备完成"
}
compile_modules() {
echo "[2/4] 编译 brcm80211 模块..."
cd "$KERNEL_SRC"
make ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE \
M=$BRCM_DIR modules 2>&1 | tail -20
if [ ! -f "$BRCM_DIR/brcmfmac/brcmfmac.ko" ]; then
echo "错误: brcmfmac.ko 编译失败"
exit 1
fi
echo " 编译成功!"
echo ""
echo "编译产物:"
find $BRCM_DIR -name "*.ko" -exec ls -lh {} \;
mkdir -p "$MODULES_OUT"
cp -v "$BRCM_DIR/brcmutil/brcmutil.ko" "$MODULES_OUT/"
cp -v "$BRCM_DIR/brcmfmac/brcmfmac.ko" "$MODULES_OUT/"
cp -v "$BRCM_DIR/brcmfmac/wcc/brcmfmac-wcc.ko" "$MODULES_OUT/"
echo ""
echo "模块已保存到: $MODULES_OUT"
}
install_to_target() {
if [ -z "$TARGET_HOST" ]; then
echo "错误: 请设置 TARGET_HOST 环境变量"
echo " 例: TARGET_HOST='root@192.168.1.1' $0 install"
exit 1
fi
echo "[3/4] 上传模块到目标设备..."
scp "$MODULES_OUT/brcmutil.ko" "$MODULES_OUT/brcmfmac.ko" "$MODULES_OUT/brcmfmac-wcc.ko" \
"${TARGET_HOST}:/tmp/" 2>&1
echo "[4/4] 在目标设备上安装模块..."
ssh "$TARGET_HOST" '
KVER=$(uname -r)
MODDIR=/usr/lib/modules/$KVER/kernel/drivers/net/wireless/broadcom/brcm80211
mkdir -p $MODDIR/brcmutil
mkdir -p $MODDIR/brcmfmac/wcc
cp /tmp/brcmutil.ko $MODDIR/brcmutil/
cp /tmp/brcmfmac.ko $MODDIR/brcmfmac/
cp /tmp/brcmfmac-wcc.ko $MODDIR/brcmfmac/wcc/
depmod -a
cd /usr/lib/firmware/brcm/
if [ ! -e brcmfmac43455-sdio.linkease,easepi-r2.bin ]; then
ln -sf brcmfmac43455-sdio.bin brcmfmac43455-sdio.linkease,easepi-r2.bin
ln -sf brcmfmac43455-sdio.txt brcmfmac43455-sdio.linkease,easepi-r2.txt
ln -sf brcmfmac43455-sdio.clm_blob brcmfmac43455-sdio.linkease,easepi-r2.clm_blob
fi
echo 0 > /var/lib/systemd/rfkill/platform-fe2d0000.mmc:wlan 2>/dev/null || true
modprobe brcmfmac 2>/dev/null || true
nmcli radio wifi on 2>/dev/null || true
echo "安装完成! WiFi 驱动已加载"
lsmod | grep brcm
'
}
case "${1:-all}" in
compile)
check_env
prepare_kernel
compile_modules
;;
install)
install_to_target
;;
all)
check_env
prepare_kernel
compile_modules
install_to_target
;;
*)
usage
;;
esac
说明:
- check_env: 验证编译环境完整性(内核源码目录、头文件 Module.symvers、交叉编译器)
- prepare_kernel: 自动化内核编译环境准备(智能检测避免重复创建,使用
cp -rn 不覆盖已有文件)
- compile_modules: 编译 brcm80211 目录(brcmfmac 依赖 brcmutil 符号,必须一起编译)
- install_to_target: SSH 远程安装(创建目录 → 复制模块 → depmod → 固件链接 → rfkill → modprobe → nmcli)
使用方式:
./rebuild-brcmfmac.sh compile # 仅编译
TARGET_HOST='root@192.168.1.1' ./rebuild-brcmfmac.sh all # 编译并安装
TARGET_HOST='root@192.168.1.1' ./rebuild-brcmfmac.sh install # 仅安装
注意:此脚本用于直接向运行中的设备安装模块。如需更新固件包,需按第三章步骤注入 modules 包。
六、已知问题与注意事项
6.1 编译器版本差异
| 项目 |
版本 |
| 飞牛内核编译器 |
gcc 12.2.0 (Debian) |
| 外部模块编译器 |
gcc 13.3.0 (Ubuntu) |
编译时有警告 the compiler differs from the one used to build the kernel,但不影响模块功能。建议后续统一编译器版本。
6.2 regulatory.db 签名问题 ✅ 已修复
cfg80211: loaded regulatory.db is malformed or signature is missing/invalid
- 原因: 飞牛系统默认使用
regulatory.db-debian 版本,其 p7s 签名与内核内置的 X.509 证书不匹配。内核配置 CONFIG_CFG80211_REQUIRE_SIGNED_REGDB=y,要求签名验证通过
- 修复: 切换到
regulatory.db-upstream 版本,其 p7s 签名与内核内置证书匹配。切换后验证通过:
Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
Loaded X.509 cert 'wens: 61c038651aabdcf94bd0ac7ff06c7248db18c600'
修复已集成到 fix_wifi.sh 中,启动时自动切换。
6.3 brcmfmac.ko 体积过大 ✅ 已修复
原始 brcmfmac.ko 为 15MB(含 DWARF 调试信息),已使用 aarch64-linux-gnu-strip --strip-unneeded 精简:
| 模块 |
strip 前 |
strip 后 |
节省 |
| brcmfmac.ko |
15M |
476K |
97% |
| brcmutil.ko |
583K |
15K |
97% |
| brcmfmac-wcc.ko |
1.2M |
5.3K |
99% |
| modules 包 |
44M |
39M |
5M |
strip 后模块功能完整,vermagic 和 depends 信息保留,已重新注入 modules 包并更新 sha256sums。
七、固件镜像验证
7.1 验证方法
使用 losetup 挂载固件镜像,检查各分区中的关键文件:
sudo losetup -fP ~/fnnas/fnnas/out/fnnas_rockchip_easepi-r2_k6.18.18_2026.05.02.img
sudo mount /dev/loop0p1 /mnt/fnnas-boot
sudo mount /dev/loop0p2 /mnt/fnnas-root
7.2 验证结果
brcmfmac 模块文件 ✅
/usr/lib/modules/6.18.18-trim/kernel/drivers/net/wireless/broadcom/brcm80211/
**── brcmutil/brcmutil.ko 15K (strip 后)
**── brcmfmac/brcmfmac.ko 476K (strip 后)
**── brcmfmac/wcc/brcmfmac-wcc.ko 5.3K (strip 后)
modinfo 验证:
brcmfmac.ko:
depends: brcmutil,cfg80211
vermagic: 6.18.18-trim SMP preempt mod_unload aarch64
brcmfmac-wcc.ko:
depends: brcmfmac
vermagic: 6.18.18-trim SMP preempt mod_unload aarch64
modules.dep 依赖关系 ✅
brcmfmac.ko: brcmutil.ko, cfg80211.ko, rfkill.ko
brcmfmac-wcc.ko: brcmfmac.ko, brcmutil.ko, cfg80211.ko, rfkill.ko
modules.alias SDIO 匹配 ✅
alias sdio:c*v02D0dA9BF* brcmfmac
AP6256 的 SDIO ID 0x02d0:0xa9bf 精确匹配,内核可自动加载驱动。
/etc/rc.local WiFi 初始化 ✅
# WiFi初始化
[[ -x "/usr/local/wifi/fix_wifi.sh" ]] && bash /usr/local/wifi/fix_wifi.sh >/dev/null 2>&1 &
/usr/local/wifi/fix_wifi.sh ✅
- 权限:
-rwxrwxr-x (可执行)
- 内容: rfkill unblock + regulatory.db 切换 + nmcli radio on (完整代码见第五章 5.7 节)
WiFi 固件链接 ✅
brcmfmac43455-sdio.linkease,easepi-r2.bin -> brcmfmac43455-sdio.bin
brcmfmac43455-sdio.linkease,easepi-r2.clm_blob -> brcmfmac43455-sdio.clm_blob
brcmfmac43455-sdio.linkease,easepi-r2.txt (独立 NVRAM 文件,含随机 MAC)
regulatory.db alternatives ✅
/etc/alternatives/regulatory.db -> /lib/firmware/regulatory.db-debian (默认)
/etc/alternatives/regulatory.db.p7s -> /lib/firmware/regulatory.db.p7s-debian (默认)
默认指向 debian 版本,fix_wifi.sh 首次启动时自动切换到 upstream 版本。
modprobe.d brcmfmac.conf ✅
options brcmfmac feature_disable=0x282000
WiFi 固件基础文件 ✅
brcmfmac43455-sdio.bin 587K (WiFi 固件二进制)
brcmfmac43455-sdio.clm_blob 14K (国家/区域监管数据)
brcmfmac43455-sdio.txt 2.0K (NVRAM 配置模板)
内核版本与 build 链接 ✅
/usr/lib/modules/6.18.18-trim/
build -> /usr/src/linux-headers-6.18.18-trim
7.3 验证总结
| 验证项 |
状态 |
说明 |
| brcmfmac 模块文件 |
✅ |
3 个 .ko 文件完整,vermagic 匹配 |
| modules.dep 依赖 |
✅ |
brcmfmac → brcmutil + cfg80211 + rfkill |
| modules.alias SDIO |
✅ |
sdio:c*v02D0dA9BF* 精确匹配 AP6256 |
| rc.local WiFi 初始化 |
✅ |
fix_wifi.sh 调用已添加 |
| fix_wifi.sh 脚本 |
✅ |
rfkill + regulatory.db + nmcli 三重修复 |
| fix_wifi.sh 权限 |
✅ |
rwxrwxr-x 可执行 |
| WiFi 固件链接 |
✅ |
linkease,easepi-r2 三件套完整 |
| regulatory.db |
✅ |
upstream 版本存在,fix_wifi.sh 自动切换 |
| brcmfmac.conf |
✅ |
feature_disable=0x282000 |
| 内核 build 链接 |
✅ |
指向 /usr/src/linux-headers-6.18.18-trim |
结论: 固件镜像 fnnas_rockchip_easepi-r2_k6.18.18_2026.05.02.img 中 WiFi 驱动集成完整,所有关键文件和配置均已正确打包。刷写后预期 WiFi 可正常工作。
八、文件修改清单
8.1 FnNAS 项目文件修改
| 文件 |
操作 |
说明 |
renas |
修改 |
添加 easepi-r2 WiFi 固件链接生成 |
different-files/easepi-r2/rootfs/usr/local/wifi/fix_wifi.sh |
新增 |
WiFi 初始化脚本 |
different-files/easepi-r2/rootfs/etc/rc.local |
修改 |
添加 WiFi 初始化调用 |
make-fnnas/kernel/6.18.18/6.18.18-rockchip/modules-rockchip-6.18.18-trim.tar.gz |
修改 |
注入 brcmfmac 模块 + depmod 更新 |
make-fnnas/kernel/6.18.18/6.18.18-rockchip/sha256sums |
修改 |
更新 modules 包的 sha256 校验值 |
8.2 外部编译环境修改(非项目文件)
| 文件 |
操作 |
说明 |
linux-6.18.18/config-6.18.18-trim |
修改 |
启用 BRCMFMAC 编译配置 |
linux-6.18.18/.config |
创建 |
基于 auto.conf + BRCMFMAC 配置 |
linux-6.18.18/include/config/auto.conf |
修改 |
添加 BRCMFMAC 配置项(见第二章 2.2 节) |
linux-6.18.18/include/generated/autoconf.h |
修改 |
添加 BRCMFMAC 宏定义(见第二章 2.2 节) |
linux-6.18.18/arch/arm64/boot/dts/rockchip/rk3588-easepi-r2.dts 等 8 个文件 |
复制 |
DTS 源文件,供编译参考 |
8.3 目标设备临时修改(刷写新固件后无需手动操作)
| 文件 |
操作 |
说明 |
/var/lib/systemd/rfkill/platform-fe2d0000.mmc:wlan |
修改 |
rfkill 状态设为 0 |
/usr/lib/modules/6.18.18-trim/.../brcm80211/ |
新增 |
brcmfmac 模块文件 |
/usr/lib/firmware/brcm/brcmfmac43455-sdio.linkease,easepi-r2.* |
新增 |
设备特定固件链接 |
8.4 辅助脚本
| 文件 |
说明 |
~/fnnas/doc/rebuild-brcmfmac.sh |
内核升级 WiFi 恢复脚本 |
九、操作手册
本章节提供从零手动完成 WiFi 驱动模块编译、安装、持久化的完整操作流程。适用于不使用 rebuild-brcmfmac.sh 脚本或需要理解每一步细节的场景。
9.1 场景一:编译环境搭建与编译(首次)
步骤 1:下载内核源码和头文件
cd ~/fnnas
# 下载 Linux 6.18.18 内核源码
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.18.18.tar.xz
tar xf linux-6.18.18.tar.xz
# 下载飞牛内核头文件包并解压到源码目录
wget https://github.com/ophub/fnnas/releases/download/kernel_fnnas/6.18.18-rockchip.tar.gz
tar xf 6.18.18-rockchip.tar.gz
mv 6.18.18-rockchip/header-rockchip-6.18.18-trim linux-6.18.18/
步骤 2:复制头文件生成文件
cd ~/fnnas/linux-6.18.18
cp -rn header-rockchip-6.18.18-trim/include/generated include/
cp -rn header-rockchip-6.18.18-trim/include/config/* include/config/
cp -rn header-rockchip-6.18.18-trim/arch/arm64/include/generated arch/arm64/include/
cp -n header-rockchip-6.18.18-trim/Module.symvers .
验证:
ls -l include/generated/autoconf.h include/config/auto.conf Module.symvers
步骤 3:创建 .config 并同步配置文件
cd ~/fnnas/linux-6.18.18
# 创建 .config
cat include/config/auto.conf > .config
cat >> .config << 'EOF'
CONFIG_BRCMUTIL=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
EOF
# 追加配置项到 auto.conf(内容见第二章 2.2 节)
# 追加宏定义到 autoconf.h(内容见第二章 2.2 节)
验证:
grep BRCMFMAC include/config/auto.conf
grep BRCMFMAC include/generated/autoconf.h
步骤 4:编译并精简
cd ~/fnnas/linux-6.18.18
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
M=drivers/net/wireless/broadcom/brcm80211 modules
aarch64-linux-gnu-strip --strip-unneeded \
drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko \
drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko \
drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/brcmfmac-wcc.ko
验证:
find drivers/net/wireless/broadcom/brcm80211 -name "*.ko" -exec ls -lh {} \;
# 预期: brcmutil.ko 15K, brcmfmac.ko 476K, brcmfmac-wcc.ko 5.3K
modinfo drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko | grep vermagic
# 预期: vermagic: 6.18.18-trim SMP preempt mod_unload aarch64
9.2 场景二:直接安装到运行中的设备
适用于:设备已运行飞牛系统,WiFi 驱动缺失,需要临时修复。
步骤 1:上传并安装模块
TARGET=root@<device-ip>
scp ~/fnnas/linux-6.18.18/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko \
~/fnnas/linux-6.18.18/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko \
~/fnnas/linux-6.18.18/drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/brcmfmac-wcc.ko \
${TARGET}:/tmp/
ssh ${TARGET} '
KVER=$(uname -r)
MODDIR=/usr/lib/modules/$KVER/kernel/drivers/net/wireless/broadcom/brcm80211
mkdir -p $MODDIR/brcmutil $MODDIR/brcmfmac/wcc
cp /tmp/brcmutil.ko $MODDIR/brcmutil/
cp /tmp/brcmfmac.ko $MODDIR/brcmfmac/
cp /tmp/brcmfmac-wcc.ko $MODDIR/brcmfmac/wcc/
depmod -a
'
步骤 2:创建设备固件链接
ssh ${TARGET} '
cd /usr/lib/firmware/brcm/
ln -sf brcmfmac43455-sdio.bin brcmfmac43455-sdio.linkease,easepi-r2.bin
ln -sf brcmfmac43455-sdio.clm_blob brcmfmac43455-sdio.linkease,easepi-r2.clm_blob
if [ ! -f brcmfmac43455-sdio.linkease,easepi-r2.txt ]; then
sed "s/macaddr=.*/macaddr=$(printf "%02x:%02x:%02x:%02x:08:00" $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)))/" \
brcmfmac43455-sdio.txt > brcmfmac43455-sdio.linkease,easepi-r2.txt
fi
'
步骤 3:修复 rfkill 和 regulatory.db
ssh ${TARGET} '
for f in /var/lib/systemd/rfkill/*:wlan; do
[ -f "$f" ] && echo 0 > "$f" 2>/dev/null
done
if [ -x /usr/bin/update-alternatives ]; then
update-alternatives --set regulatory.db /lib/firmware/regulatory.db-upstream 2>/dev/null
update-alternatives --set regulatory.db.p7s /lib/firmware/regulatory.db.p7s-upstream 2>/dev/null
fi
'
步骤 4:加载驱动
ssh ${TARGET} '
modprobe brcmfmac
sleep 3
nmcli radio wifi on
lsmod | grep brcm
nmcli device wifi list
'
步骤 5:确保持久化
ssh ${TARGET} '
if [ ! -x /usr/local/wifi/fix_wifi.sh ]; then
mkdir -p /usr/local/wifi
cat > /usr/local/wifi/fix_wifi.sh << "SCRIPT"
#!/bin/bash
WLAN_IF="wlan0"
RFKILL_WLAN=""
for f in /var/lib/systemd/rfkill/*:wlan; do
if [ -f "$f" ]; then
RFKILL_WLAN="$f"
break
fi
done
if [ -n "$RFKILL_WLAN" ]; then
echo 0 > "$RFKILL_WLAN" 2>/dev/null
fi
if [ -x /usr/bin/update-alternatives ]; then
UPSTREAM_DB="/lib/firmware/regulatory.db-upstream"
UPSTREAM_P7S="/lib/firmware/regulatory.db.p7s-upstream"
if [ -f "$UPSTREAM_DB" ] && [ -f "$UPSTREAM_P7S" ]; then
update-alternatives --set regulatory.db "$UPSTREAM_DB" >/dev/null 2>&1
update-alternatives --set regulatory.db.p7s "$UPSTREAM_P7S" >/dev/null 2>&1
fi
fi
if [ -d /sys/class/net/$WLAN_IF ]; then
nmcli radio wifi on 2>/dev/null
fi
SCRIPT
chmod +x /usr/local/wifi/fix_wifi.sh
fi
if ! grep -q "fix_wifi.sh" /etc/rc.local; then
sed -i "/^exit 0/i # WiFi初始化\n[[ -x \"/usr/local/wifi/fix_wifi.sh\" ]] && bash /usr/local/wifi/fix_wifi.sh >/dev/null 2>&1 &" /etc/rc.local
fi
'
9.3 场景三:注入 modules 包(固件集成)
适用于:需要将 WiFi 驱动永久集成到固件包中,刷写后自动生效。
KERNEL_PKG_DIR=~/fnnas/make-fnnas/kernel/6.18.18/6.18.18-rockchip
MODULES_PKG=modules-rockchip-6.18.18-trim.tar.gz
SRC_DIR=~/fnnas/linux-6.18.18/drivers/net/wireless/broadcom/brcm80211
WORKDIR=/tmp/modules-patch
# 1. 解压
mkdir -p "$WORKDIR"
tar -xzf "$KERNEL_PKG_DIR/$MODULES_PKG" -C "$WORKDIR"
# 2. 复制模块
BRCM_DIR="$WORKDIR/6.18.18-trim/kernel/drivers/net/wireless/broadcom/brcm80211"
mkdir -p "$BRCM_DIR/brcmutil" "$BRCM_DIR/brcmfmac/wcc"
cp "$SRC_DIR/brcmutil/brcmutil.ko" "$BRCM_DIR/brcmutil/"
cp "$SRC_DIR/brcmfmac/brcmfmac.ko" "$BRCM_DIR/brcmfmac/"
cp "$SRC_DIR/brcmfmac/wcc/brcmfmac-wcc.ko" "$BRCM_DIR/brcmfmac/wcc/"
# 3. depmod 更新元数据
mkdir -p "$WORKDIR/lib/modules"
mv "$WORKDIR/6.18.18-trim" "$WORKDIR/lib/modules/"
depmod -a -b "$WORKDIR" 6.18.18-trim
mv "$WORKDIR/lib/modules/6.18.18-trim" "$WORKDIR/"
# 4. 验证
grep brcmfmac "$WORKDIR/6.18.18-trim/modules.dep"
grep "02D0dA9BF" "$WORKDIR/6.18.18-trim/modules.alias"
# 5. 重新打包
tar -czf "$KERNEL_PKG_DIR/$MODULES_PKG" -C "$WORKDIR" 6.18.18-trim/
# 6. 更新 sha256sums
cd "$KERNEL_PKG_DIR"
sha256sum boot-rockchip-6.18.18-trim.tar.gz \
dtb-rockchip-6.18.18-trim.tar.gz \
header-rockchip-6.18.18-trim.tar.gz \
modules-rockchip-6.18.18-trim.tar.gz > sha256sums
# 7. 清理
rm -rf "$WORKDIR"
# 8. 重新打包固件
cd ~/fnnas/make-fnnas
sudo ./renas -b easepi-r2 -k 6.18.18 -e 17
9.4 场景四:内核升级后恢复 WiFi
适用于:飞牛系统内核升级后,WiFi 驱动模块因 vermagic 不匹配无法加载。
| 升级场景 |
影响 |
恢复方式 |
| 小版本升级 (6.18.x → 6.18.y) |
模块可能不兼容 |
重新编译 brcmfmac 并注入新 modules 包 |
| 大版本升级 (6.18 → 6.19+) |
API 可能变化 |
下载新内核源码 + 重新编译 + 注入 modules 包 |
| 同版本重装 |
模块被覆盖 |
确保 modules 包含 brcmfmac(已集成) |
步骤 1:确认新内核版本
ssh root@<device-ip> 'uname -r'
步骤 2:下载新内核源码和头文件
cd ~/fnnas
# 替换 <version> 为新版本号
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v6.x/linux-<version>.tar.xz
tar xf linux-<version>.tar.xz
wget https://github.com/ophub/fnnas/releases/download/kernel_fnnas/<version>-rockchip.tar.gz
tar xf <version>-rockchip.tar.gz
mv <version>-rockchip/header-rockchip-<version>-trim linux-<version>/
步骤 3:准备编译环境
cd ~/fnnas/linux-<version>
cp -rn header-rockchip-<version>-trim/include/generated include/
cp -rn header-rockchip-<version>-trim/include/config/* include/config/
cp -rn header-rockchip-<version>-trim/arch/arm64/include/generated arch/arm64/include/
cp -n header-rockchip-<version>-trim/Module.symvers .
# 创建 .config + 同步 auto.conf/autoconf.h(内容见第二章 2.2 节)
cat include/config/auto.conf > .config
cat >> .config << 'EOF'
CONFIG_BRCMUTIL=m
CONFIG_BRCMFMAC=m
CONFIG_BRCMFMAC_SDIO=y
CONFIG_BRCMFMAC_USB=y
CONFIG_BRCMFMAC_PCIE=y
CONFIG_BRCMFMAC_PROTO_BCDC=y
CONFIG_BRCMFMAC_PROTO_MSGBUF=y
EOF
步骤 4:编译并精简
cd ~/fnnas/linux-<version>
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
M=drivers/net/wireless/broadcom/brcm80211 modules
aarch64-linux-gnu-strip --strip-unneeded \
drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko \
drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko \
drivers/net/wireless/broadcom/brcm80211/brcmfmac/wcc/brcmfmac-wcc.ko
步骤 5:注入新 modules 包并重打包固件
# 按场景三(9.3 节)步骤操作,替换版本号
# 然后重新打包固件
cd ~/fnnas/make-fnnas
sudo ./renas -b easepi-r2 -k 6.18.18 -e 17
步骤 6:验证
ssh root@<device-ip> 'lsmod | grep brcm; nmcli device wifi list'
9.5 DTS 文件
easepi-r2 的设备树源文件已复制到 linux-6.18.18 中供编译参考:
linux-6.18.18/arch/arm64/boot/dts/rockchip/
**── rk3588-easepi-r2.dts
**── rk3588-rk806-single.dtsi
**── rk3588s-ip.dtsi
**── rk3588s-ip-supply.dtsi
**── rk3588s-vpu.dtsi
**── rk3588s-gpu.dtsi
**── rk3588s-npu.dtsi
**── rk3588s-crypto.dtsi
这些 DTS 文件仅用于外部模块编译时的依赖解析。固件中实际使用的 DTB 来自 dtb-rockchip-6.18.18-trim.tar.gz 和 different-files/easepi-r2/bootfs/dtb/rockchip/rk3588-easepi-r2.dtb。
9.6 故障排查
| 现象 |
可能原因 |
排查命令 |
修复方法 |
modprobe: FATAL: Module brcmfmac not found |
模块未安装或 depmod 未更新 |
find /usr/lib/modules/ -name "brcmfmac.ko" |
安装 .ko 文件并运行 depmod -a |
version magic '6.18.18-trim ...' should be '6.18.20-trim ...' |
内核升级后模块 vermagic 不匹配 |
modinfo brcmfmac | grep vermagic |
用新内核源码重新编译 |
RTNETLINK answers: Operation not possible due to RF-kill |
WiFi 被 rfkill 软阻止 |
rfkill list |
echo 0 > /var/lib/systemd/rfkill/*:wlan |
regulatory.db is malformed or signature is missing |
regulatory.db 签名不匹配 |
readlink /etc/alternatives/regulatory.db |
update-alternatives --set regulatory.db /lib/firmware/regulatory.db-upstream |
brcmf_c_process_txcap_blob: no txcap_blob available |
SDIO 接口无 txcap 支持 |
— |
可忽略,不影响功能 |
wlan0 不出现 |
SDIO 扫描未发现设备 |
cat /sys/bus/sdio/devices/mmc1:0001:1/modalias |
检查设备树中 wifi 模组节点是否启用 |
| WiFi 可连接但无法上网 |
regulatory domain 未设置 |
iw reg get |
iw reg set CN 或等待 regulatory.db 生效 |
nmcli device wifi list 为空 |
WiFi radio 未开启 |
nmcli radio wifi |
nmcli radio wifi on |