收起左侧

飞牛社区固件中添加EasePi-R2 WiFi (AP6256/BCM43455) 驱动模块支持

0
回复
196
查看
[ 复制链接 ]

0

主题

0

回帖

0

牛值

江湖小虾

需求说明

飞牛社区固件 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 驱动的完整流程:

  1. 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
  2. refactor_rootfs 函数: WiFi/BT 固件优化
    • 自动创建 brcmfmac43455-sdio.linkease,easepi-r2.* 固件链接
    • 生成带随机 MAC 地址的 NVRAM 文件
  3. 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:

  1. 内核启动时检测到 SDIO 设备 mmc1:0001:1
  2. 读取 modalias: sdio:c00v02D0dA9BF
  3. modules.alias 中匹配: alias sdio:c*v02D0dA9BF* brcmfmac
  4. modprobe 自动加载 brcmfmac 及其依赖 (brcmutil, cfg80211)
  5. 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 upRTNETLINK 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 固件刷写后预期行为

  1. 内核启动 → SDIO 扫描发现 BCM43455 → sdio:c*v02D0dA9BF* alias 匹配 → modprobe brcmfmac
  2. brcmfmac 加载 → 自动加载依赖 (cfg80211, brcmutil, rfkill) → fwvid 加载 brcmfmac-wcc
  3. 固件加载 brcmfmac43455-sdio.linkease,easepi-r2.*(renas 自动创建)
  4. 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

说明

  1. rfkill unblock (第 6-15 行):
    • 遍历 /var/lib/systemd/rfkill/*:wlan 匹配 WiFi 设备的 rfkill 状态文件
    • 使用通配符 *:wlan 而非硬编码设备路径,适配不同硬件平台的 rfkill 节点命名
    • 写入 0 解除软阻止,允许 WiFi 接口正常工作
    • 仅处理第一个匹配项(break),避免重复操作
  2. regulatory.db 切换 (第 17-24 行):
    • 检查 update-alternatives 是否可用
    • 验证 upstream 版本的 regulatory.db 和 p7s 签名文件是否存在
    • 切换到 upstream 版本,解决内核签名验证失败问题
    • upstream 版本的 p7s 签名与内核内置的 sforsheewens X.509 证书匹配
  3. 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

说明

  1. check_env: 验证编译环境完整性(内核源码目录、头文件 Module.symvers、交叉编译器)
  2. prepare_kernel: 自动化内核编译环境准备(智能检测避免重复创建,使用 cp -rn 不覆盖已有文件)
  3. compile_modules: 编译 brcm80211 目录(brcmfmac 依赖 brcmutil 符号,必须一起编译)
  4. 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.gzdifferent-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

收藏
送赞 2
分享
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则