首页 / 资讯中心 / 文章详情

Zynq平台 AIC8800 WiFi驱动移植全教程|内核编译+模块加载+报错终极解决

Zynq平台 AIC8800 WiFi驱动移植全教程|内核编译+模块加载+报错终极解决 ★ FEATURED ARTICLE
前言近期在Zynq嵌入式Linux平台完成了AIC8800D80 USB WiFi模组的驱动移植与调试过程中踩遍了内核配置、模块编译、加载顺序、符号报错等各类坑点。网上多数教程流程残缺、关键报错无解决方案因此本文整理一套可直接落地、零废话、带完整排错方案的Zynq AIC8800 WiFi驱动移植教程。本文适配Zynq全系列开发板、Linux4.19内核、自定义内核编译环境同时解决Unknown symbol、模块加载失败、固件下载异常、USB枚举报错等经典问题。一、环境与硬件说明1.1 硬件环境主控Xilinx ZynqF6P-7015开发板外设AIC8800D80 USB WiFi/蓝牙二合一模组接口USB2.0 高速接口1.2 软件环境内核版本Linux 4.19-xilinx编译环境Ubuntu 交叉编译环境系统Debian Buster ARMHF二、核心原理必须搞懂的WiFi内核架构很多人驱动加载失败根本原因是分不清内核WiFi子系统层级切记三个核心目录的区别1. kernel/drivers/net/wireless厂商硬件驱动目录存放aic8800、realtek、broadcom等私有驱动2. kernel/net/wireless系统核心子系统存放 cfg80211 源码3. kernel/net/mac80211802.11协议栈核心重中之重AIC8800第三方驱动绝对不能依赖内置内核符号因此 cfg80211 和 mac80211 必须编译为 模块(M)不能编译为内置(*)三、内核关键配置解决90%报错3.1 打开内核配置界面make menuconfig3.2 开启无线子系统模块路径Networking support --- WirelessM cfg80211 - wireless configuration APIM Generic IEEE 802.11 Networking Stack (mac80211)图1 NetworkingWireless配置界面cfg80211无线子系统正确状态M编译为模块错误状态*编译进内核报错根源解释如果设为*内置内核不会生成cfg80211.ko、mac80211.ko且核心符号不会对外导出加载aic8800驱动必然报 Unknown symbol 错误。3.3 开启AIC8800厂商驱动选项必做在内核配置界面同步开启AIC8800厂商驱动、WiFi主驱动与固件加载支持否则编译时不会生成对应的驱动模块路径为路径Device Drivers --- Network device support --- Wireless LANAIC wireless Support (NEW)AIC8800 wlan SupportAIC8800 Load Firmware Support图2 Wireless LAN界面开启AIC8800驱动与固件支持辅助配置建议同时开启RF switch子系统支持RF switch input support选内置、GPIO RFKILL driver选模块避免无线开关控制异常Networking support --- RF switch subsystem support[*] RF switch input supportM GPIO RFKILL driver图3 RF switch辅助配置可选建议开启四、内核模块编译生成ko文件4.1 完整编译命令进入内核源码根目录先加载交叉编译环境再执行编译source scripts/mz7xcf.shmake ARCHarm modules -j$(nproc)make ARCHarm modules_install INSTALL_MOD_PATH../../output图4 加载交叉编译环境制作系统将 fsbl.elf、system_wrapper.bit 及设备树文件拷贝到 output/files 目录覆盖时选择Merge依次执行 move_files.sh、make_uboot.sh、make_kernel.sh、create_image.sh 生成启动镜像制作完成后插入TF卡执行 make_parted.sh格式化分区、deploy_image.sh烧写系统move_files.sh # 移动文件到指定位置make_uboot.sh # 制作 ubootmake_kernel.sh # 制作 Linux 内核create_image.sh # 制作镜像make_parted.sh # 格式化并分区输入盘符 sdbdeploy_image.sh # 烧写启动文件与系统文件输入盘符 sdb图5 拷贝启动文件到output/files目录4.2 查找编译产物很多新手找不到ko文件是因为路径错误正确查找命令find ../../output -name cfg80211.kofind ../../output -name mac80211.kofind ../../output -name aic8800_fdrv.kofind ../../output -name aic_load_fw.ko图6 aic8800_fdrv.ko编译产物位置图7 aic_load_fw.ko编译产物位置4.3 汇总全部驱动ko最终需要4个核心模块缺一不可1. cfg80211.ko无线核心子系统2. mac80211.ko802.11协议栈3. aic_load_fw.ko固件加载驱动4. aic8800_fdrv.koWiFi功能主驱动五、开发板驱动加载严格顺序必看加载顺序绝对不能乱核心子系统 → 固件加载 → 主驱动5.1 清空旧模块rmmod aic8800_fdrv 2/dev/nullrmmod aic_load_fw 2/dev/nullrmmod mac80211 2/dev/nullrmmod cfg80211 2/dev/null5.2 上传并准备驱动与固件将编译好的 aic8800_fdrv.ko、aic_load_fw.ko 及固件文件夹 aic8800D80 上传至开发板用户目录确认文件传输成功ls图8 上传驱动与固件并确认文件创建固件存放目录并将固件芯片文件拷贝到 /vendor/etc/firmware加载固件驱动时会从该目录读取固件binsudo mkdir -p /vendor/etc/firmwaresudo cp -r aic8800D80/* /vendor/etc/firmware/图9 拷贝固件到/vendor/etc/firmware目录5.3 按顺序加载模块insmod cfg80211.koinsmod mac80211.koinsmod aic_load_fw.kosleep 3insmod aic8800_fdrv.ko图10 加载aic_load_fw固件驱动自动下载固件图11 加载aic8800_fdrv主驱动关键细节加载aic_load_fw后必须休眠3秒等待USB设备重新枚举PID切换否则主驱动加载失败。六、加载成功日志与状态验证6.1 正常加载现象aic_load_fw 自动下载全部固件bin文件md5校验通过USB设备PID从 0xA69C:0x8D80 切换为工作态 0xA69C:0x8D81系统自动生成无线网卡设备wlx8c7ab3f817716.2 查看模块加载状态lsmod正常输出四个模块全部挂载无报错依赖aic8800_fdrv 389120 0aic_load_fw 53248 1 aic8800_fdrvmac80211 319488 0cfg80211 237568 2 mac80211,aic8800_fdrv6.3 查看USB设备与网卡lsusbiw devip link图12 ifconfig查看wifi网卡wlx8c7ab3f81689七、关键报错详解与解决方案报错1aic8800_fdrv: Unknown symbol cfg80211_xxx原因cfg80211/mac80211未编译为模块、未加载、编译版本不匹配解决方案内核配置改为M、重新编译模块、严格按顺序加载报错2aic_load_fw: probe failed with error -1原因正常现象固件加载完成后USB设备断开重枚举旧设备探针失效解决方案无需处理等待3秒加载主驱动即可报错3invalid module format .o文件无法加载原因加载了编译中间文件.o而非正式模块.ko解决方案删除.o文件使用output目录下正式ko模块报错4regulatory.db failed with error -2原因缺少无线国家区域数据库文件解决方案不影响WiFi基础扫描、连接功能可忽略需完善功能可拷贝regulatory.db到板子/vendor/etc/firmware/八、WiFi功能测试扫描联网8.1 扫描周边WiFiiw dev wlx8c7ab3f81771 scan | grep SSID8.2 安装wpa_supplicantDebian buster需换源Debian 10(buster)已于2024年6月停止维护(EOL)华为云等镜像仓库已下线apt update会报404导致wpa_supplicant安装失败apt updateapt install wpa_supplicant图13 apt update报404buster仓库已下线更换为阿里云debian-archive镜像源后重新安装cat /etc/apt/sources.list EOFdeb http://mirrors.aliyun.com/debian-archive/debian buster main contrib non-freedeb http://mirrors.aliyun.com/debian-archive/debian buster-updates main contrib non-freedeb http://mirrors.aliyun.com/debian-archive/debian-security buster/updates main contrib non-freeEOFapt updateapt install -y wpa_supplicant iw图14 更换阿里云源并安装wpa_supplicant/iw8.3 连接WiFiwpa_supplicant新建wifi.conf配置文件network{ssid你的WiFi名称psk你的WiFi密码}启动连接并获取IPwpa_supplicant -B -i wlx8c7ab3f81771 -c ./wifi.confudhcpc -i wlx8c7ab3f817718.4 联网测试获取IP成功后执行ping测试网络连通性dhclient wlx8c7ab3f81771ping -c3 www.baidu.com图15 获取IP并ping百度测试成功九、开机自启优化进阶手动insmod重启失效可配置开机自动加载1. 将4个ko模块拷贝至板子 /lib/modules/$(uname -r)/extra2. 执行 depmod -a 更新模块依赖3. 在/etc/modules按顺序写入模块名实现开机自动加载部署示意将 aic8800D80 固件文件夹、aic8800_fdrv.ko、aic_load_fw.ko 一并放置于 rootfs 的 home/uisrc 目录下也可配合startup.sh实现自启动图16 部署驱动与固件到rootfs home/uisrc目录
阅读完成 · 觉得有帮助?
咨询建站