联系管理员

开通文章发布权限

扫码 添加微信
微信图片
电话: QQ:1602036736

基于debian的deb包适配ubuntu22时WIFI无法使用问题

平台信息

  • 硬件:LCKFB TaiShanPi V10 (RK3566)

  • WiFi 模块:AP6212A (Broadcom BCM43430A1, SDIO 接口)

  • 内核版本:6.1.141

  • 参考正常系统:Debian Bookworm (同一硬件,WiFi 正常)

ubuntu22编译脚本来自:LaoGuaiGe/ubuntu22.04-rootfs: 适用于泰山派1-RK3566开发板的ubuntu22 文件系统镜像构建脚本

问题现象

烧录 Ubuntu 22.04 rootfs 后,ifconfig 无法看到 wlan0 接口,WiFi 完全不可用。

内核日志报错:

mmc2: error -110 whilst initialising SDIO card
[dhd] failed to power up DHD generic adapter, max retry reached
[dhd] _dhd_module_init: Failed to load driver max retry reached

根因分析

对比 Debian 与 Ubuntu 的差异

项目Debian (正常)Ubuntu (异常)
bcmdhd 驱动内核内置 (built-in)通过 modules-load.d 作为模块加载
加载时机内核启动时自动初始化systemd 早期阶段强制加载
/lib/modules/bcmdhd.ko不存在(内置无需模块文件)存在但被过早加载
wifibt-init.service正确时机加载驱动模块路径不匹配导致跳过

问题链路

  1. mk-ubuntu-rootfs.shlinux-image deb 包安装后提供了 bcmdhd.ko 模块文件

  2. 脚本创建了 /etc/modules-load.d/bcmdhd.conf,导致 systemd 在启动早期加载 bcmdhd 模块

  3. 此时 WiFi 芯片(AP6212A)尚未通过 sdio_pwrseq 完成上电,SDIO 总线超时(error -110)

  4. 驱动初始化失败后直接放弃,不再重试

  5. 后续 wifibt-init.service 尝试通过 wifibt-util.sh module 获取模块名

  6. wifibt_module() 函数检查 /lib/modules/bcmdhd.ko 是否存在

  7. 实际模块文件在 /system/lib/modules/bcmdhd.ko,路径不匹配返回空

  8. wifibt-init.shinit_wifi() 因模块名为空而跳过加载

修复方案

修改文件:mk-ubuntu-rootfs.sh

1. 阻止模块过早加载

# 修改前:
echo "bcmdhd" | tee /etc/modules-load.d/bcmdhd.conf

# 修改后:
# bcmdhd is loaded by wifibt-init.service at the right time, do not load early
# echo "bcmdhd" | tee /etc/modules-load.d/bcmdhd.conf
echo "blacklist bcmdhd" > /etc/modprobe.d/blacklist-bcmdhd.conf

说明:

  • 注释掉 modules-load.d 配置,防止 systemd 在启动早期加载模块

  • 添加 blacklist 防止 udev 等其他途径自动加载

  • blacklist 不影响 insmod 直接加载(wifibt-init.sh 使用 insmod)

2. 创建模块符号链接

# 在 blacklist 之后添加:
ln -sf /system/lib/modules/bcmdhd.ko /lib/modules/bcmdhd.ko

说明:

  • wifibt-util.shwifibt_module() 检查 /lib/modules/${module} 是否存在

  • wifibt-init.sh 执行 cd /lib/modules && insmod bcmdhd.ko

  • 符号链接确保两者都能找到模块文件

3. 取消注释 WiFi 固件复制(原脚本中被注释)

# 修改前:
# sudo find $WIFI_BT_FIRMWARE_PATCH/ -type f -exec cp {} "$TARGET_ROOTFS_DIR/system/etc/firmware/" \;
# sudo find $WIFI_BT_TOOL_PATCH/ -type f -executable -exec cp -avf {} $TARGET_ROOTFS_DIR/usr/bin/ \;

# 修改后:
sudo find $WIFI_BT_FIRMWARE_PATCH/ -type f -exec cp {} "$TARGET_ROOTFS_DIR/system/etc/firmware/" \;
sudo find $WIFI_BT_TOOL_PATCH/ -type f -executable -exec cp -avf {} $TARGET_ROOTFS_DIR/usr/bin/ \;

验证方法

烧录后通过串口或 ADB 执行:

# 确认模块未被自动加载
lsmod | grep bcmdhd
# 应该为空

# 确认符号链接存在
ls -la /lib/modules/bcmdhd.ko
# 应指向 /system/lib/modules/bcmdhd.ko

# 确认 wifibt-init.service 正常
systemctl status wifibt-init.service

# 确认 WiFi 接口存在
ifconfig wlan0

# 扫描 WiFi 热点
iwlist wlan0 scan

工作原理(正确流程)

系统启动
  → sdio_pwrseq 通过 GPIO2_PB1AP6212A 上电
SDIO 控制器探测到 WiFi 芯片 (mmc2: new high speed SDIO card)
  → wifibt-init.service 启动(有 5 秒延迟)
  → wifibt-util.sh module 返回 "bcmdhd.ko"
  → wifibt-init.sh 执行 insmod /lib/modules/bcmdhd.ko
  → bcmdhd 驱动初始化成功,创建 wlan0 接口
NetworkManager 管理 wlan0

其他相关修复

本次调试过程中还修复了以下问题:

问题修复
/oem, /userdata 挂载失败fstab 中 ext2 改为 ext4
/boot 挂载失败FIT 方案下 boot 是 raw 分区,从 fstab 移除
ADB 无法通信从 Debian overlay 复制 usbdevice 脚本和 profile

日期

2026-05-20

评论

快捷导航

把好文章收藏到微信

打开微信,扫码查看

关闭

还没有账号?立即注册