从零构建:为OpenWrt适配MTK闭源WiFi驱动的完整指南
1. 准备工作与环境搭建当你第一次拿到MTK提供的闭源WiFi驱动压缩包时可能会有点懵。我当初也是这样解压后只看到mt_wifi和mt_wifi_ap两个文件夹完全不知道从何下手。经过多次实践我总结出了这套完整的移植方案。首先需要准备一个干净的OpenWrt编译环境。推荐使用Ubuntu 20.04 LTS系统内存至少8GB硬盘空间建议预留50GB以上。安装基础依赖的命令如下sudo apt update sudo apt install -y build-essential ccache ecj fastjar file g gawk \ gettext git java-propose-classpath libelf-dev libncurses5-dev \ libncursesw5-dev libssl-dev python python2.7-dev python3 unzip wget \ python3-distutils python3-setuptools rsync subversion swig time \ xsltproc zlib1g-dev接下来获取OpenWrt源码。建议使用官方稳定版本比如21.02.3git clone https://git.openwrt.org/openwrt/openwrt.git cd openwrt git checkout v21.02.3提示建议在编译前执行./scripts/feeds update -a ./scripts/feeds install -a更新所有feed源避免后续出现依赖问题。2. 创建驱动包框架在OpenWrt的package目录下新建驱动包目录结构mkdir -p package/mt7615/{files,src} cd package/mt7615 touch Config-mt7615.in Makefile将MTK提供的驱动源码直接拷贝到src目录下cp -r /path/to/mt_wifi package/mt7615/src/ cp -r /path/to/mt_wifi_ap package/mt7615/src/这个阶段最容易犯的错误是文件权限问题。我遇到过几次编译失败都是因为.gitkeep文件权限不对建议执行find package/mt7615 -type f -exec chmod 644 {} \; find package/mt7615 -type d -exec chmod 755 {} \;3. 配置Kconfig与Makefile3.1 编写Config-mt7615.in这个文件决定了驱动在make menuconfig中的配置选项。参考MTK原生的Kconfig结构我们需要将其转换为OpenWrt能识别的格式menuconfig WIFI_MT7615E bool MT7615E WiFi Support default n help This package contains MTKs proprietary MT7615E WiFi driver. if WIFI_MT7615E source src/mt_wifi/embedded/Kconfig endif注意Kconfig的缩进必须使用tab而不是空格否则会导致解析错误。3.2 编写MakefileMakefile是编译的核心这里有个实用技巧先参考开源社区已有的实现比如hanwckf的版本wget https://raw.githubusercontent.com/hanwckf/openwrt-mt7615/master/Makefile -O Makefile然后根据实际情况修改关键参数include $(TOPDIR)/rules.mk PKG_NAME:mt7615 PKG_RELEASE:1 PKG_BUILD_DIR:$(BUILD_DIR)/$(PKG_NAME) include $(INCLUDE_DIR)/package.mk define Package/mt7615 SECTION:kernel CATEGORY:Kernel modules SUBMENU:Wireless Drivers TITLE:MT7615E WiFi Driver DEPENDS:kmod-cfg80211 wireless-tools endef4. 解决编译问题4.1 路径与依赖处理最常见的编译错误是路径问题。在src/mt_wifi/Makefile中需要修改ifeq ($(CONFIG_SUPPORT_OPENWRT),y) WIFI_DRV_PATH : $(src)/.. else WIFI_DRV_PATH : drivers/net/wireless/mtk/mt7615 endif另一个常见问题是内核头文件缺失解决方法是在主Makefile中添加define Build/Prepare $(call Build/Prepare/Default) $(LN) $(PKG_BUILD_DIR)/src/mt_wifi $(PKG_BUILD_DIR)/mt_wifi $(LN) $(PKG_BUILD_DIR)/src/mt_wifi_ap $(PKG_BUILD_DIR)/mt_wifi_ap endef4.2 配置文件处理无线校准文件(.dat)需要放在files目录下mkdir -p package/mt7615/files/etc/Wireless/RT2860 cp RT2860_2G.dat package/mt7615/files/etc/Wireless/RT2860/ cp RT2860_5G.dat package/mt7615/files/etc/Wireless/RT2860/5. 编译与测试执行编译命令make menuconfig # 选择Kernel modules - Wireless Drivers - mt7615 make package/mt7615/compile Vs如果编译成功生成的ipk包会出现在bin目录下。安装测试opkg install kmod-mt7615_*.ipk启动无线接口ifconfig ra0 up iwpriv ra0 set Channel6 iwpriv ra0 set SSIDMyWiFi在实际测试中我发现信号强度可能不如原厂固件这时可以尝试调整发射功率iwpriv ra0 set TxPower1006. 高级调试技巧当遇到驱动崩溃时可以通过dmesg查看详细日志dmesg | grep mt76如果需要更详细的调试信息可以修改Makefile增加调试选项EXTRA_CFLAGS -DDEBUG -DCONFIG_MT76X2_DEBUG对于性能优化建议启用硬件加密加速EXTRA_CFLAGS -DCONFIG_HW_IPSEC -DCONFIG_RALINK_HWCRYPTO经过多次实践我发现驱动稳定性与内核版本密切相关。在OpenWrt 21.02上表现最佳而较新的内核可能需要额外补丁。建议保留完整的编译日志方便后续问题排查。