先将WiFi模组厂商提供的驱动源码拷贝到kenerl对应的目录,比如:
sdk\kernel\drivers\net\wireless\rockchip_wlan\rtl8733bu
第 1 步:注册 Kconfig
文件:kernel/drivers/net/wireless/rockchip_wlan/Kconfig
在 if RTL_WIRELESS_SOLUTION 块内(第 44~50 行,参照已有条目)加一行:
source "drivers/net/wireless/rockchip_wlan/rtl8733bu/Kconfig"
建议加在第 46 行 rtl8189fs 之后,保持排序。
说明:rtl8733bu/Kconfig 已自带 config RTL8733BU(tristate),不用新建。里面有一句 depends on MMC 是 Realtek 模板残留(8733BU 是 USB 接口,与 MMC 无关),RK3288 内核 MMC 本来就开着,不改也能编过;练习时可以顺手把这行删掉,更规范。
第 2 步:注册目录 Makefile
文件:kernel/drivers/net/wireless/rockchip_wlan/Makefile
参照已有条目加一行(建议加在第 5 行 rtl8189fs 之后):
obj-$(CONFIG_RTL8733BU) += rtl8733bu/
第 3 步:修改驱动自身 Makefile
文件:kernel/drivers/net/wireless/rockchip_wlan/rtl8733bu/Makefile
共 4 处(行号以你这份未改动的文件为准):
3.1 第 141 行,设置 Android 版本:
CONFIG_RTW_ANDROID = 11 # 原值 0
3.2 第 193 行,关掉 PC 平台:
CONFIG_PLATFORM_I386_PC = n # 原值 y
3.3 第 218 行,启用 Rockchip 平台(RK 官方对树内 Realtek 驱动就是复用这个开关,见 rtl8723ds/Makefile 第 158 行):
CONFIG_PLATFORM_ARM_RK3188 = y # 原值 n
3.4 第 1857~1872 行,调整 CONFIG_PLATFORM_ARM_RK3188 的设置段:
ifeq ($(CONFIG_PLATFORM_ARM_RK3188), y)
EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_ANDROID -DCONFIG_PLATFORM_ROCKCHIPS
EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT
EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE
EXTRA_CFLAGS += -DCONFIG_SEL_P2P_IFACE=1 # ← 新增:WiFi5 IC 指定 p2p0 走 P2P
EXTRA_CFLAGS += -DRTW_ENABLE_WIFI_CONTROL_FUNC # ← 第1863行:注释掉,USB 接口不需要平台供电回调
ifeq ($(CONFIG_SDIO_HCI), y)
EXTRA_CFLAGS += -DRTW_SUPPORT_PLATFORM_SHUTDOWN
endif
ARCH := arm
CROSS_COMPILE := ... # 保持原样即可,树内编译不会用到
KSRC := ... # 同上
MODULE_NAME := 8733bu # ← 第1871行:原值 wlan,改成 8733bu
endif
要点:
- 树内编译时工具链由内核 kbuild 统一提供,本段里的
CROSS_COMPILE、KSRC不生效,不用改。 MODULE_NAME决定输出的 ko 文件名;RK 自带的树内驱动都用芯片名(如8723ds),这里改成8733bu,最终输出8733bu.ko。如果你后续框架侧约定用wlan.ko,保留wlan也可以,两边一致即可。RTW_ENABLE_WIFI_CONTROL_FUNC是平台总线供电回调(SDIO 模组用),USB 方案注释掉;RK 自带的rtl8723ds里这一行也是注释状态。
第 4 步:内核配置开启模块编译
文件:kernel/arch/arm/configs/rockchip_defconfig
你这份 SDK 没有 rk3288.config 片段,WiFi 配置直接在 defconfig 里。在第 366~367 行附近(CONFIG_RTL8723CS=m、CONFIG_RTL8723DS=m 旁边)加:
CONFIG_RTL8733BU=m
=m 即按你的要求输出 ko 文件,不编进 zImage。
第 5 步:编译验证(Linux 服务器上)
cd <SDK>/kernel
make ARCH=arm rockchip_defconfig # 重新生成 .config(如有 android-11.config 片段按你原命令叠加)
grep RTL8733BU .config # 应输出 CONFIG_RTL8733BU=m
make ARCH=arm modules -j8 # 编译模块
成功后 ko 输出在:
kernel/drivers/net/wireless/rockchip_wlan/rtl8733bu/8733bu.ko
快速上板验证:
adb push 8733bu.ko /data/local/tmp/
adb shell
insmod /data/local/tmp/8733bu.ko ifname=wlan0 if2name=p2p0
dmesg | grep -i rtw # 看加载日志
ifconfig -a # 应出现 wlan0 和 p2p0
第 6 步:接入 Android 整机编译
先交代机制:
vendor/rockchip/common/wifi/wifi.mk第 1~6 行会自动收集kernel/drivers/net/wireless/rockchip_wlan下所有*.ko进BOARD_VENDOR_KERNEL_MODULES,最终装到/vendor/lib/modules/。所以第 5 步编出的8733bu.ko会被自动打包,不用改任何打包规则。- 开 WiFi 时,
frameworks/opt/net/wifi/libwifi_hal里 RK 定制的逻辑:rk_wifi_ctrl.cpp扫描/sys/bus/usb/devices按 VID:PID 查表识别芯片 →wifi_hal_common.cpp的module_list[]找到对应 ko 路径 → 自动 insmod。两个表里目前都没有 8733BU,这就是要改的全部内容。
6.1 添加芯片识别条目
文件:frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp
在 supported_wifi_devices[] 数组中(第 49~78 行),参照第 52 行 RTL8723BU 的格式,加两行:
{"RTL8733BU", "0bda:b733"},
{"RTL8733BU", "0bda:f72b"},
说明:b733 是 WiFi+BT 多功能接口的 PID,f72b 是纯 WiFi 单功能的 PID(这两个值取自驱动源码 os_dep/linux/usb_intf.c 第 311~312 行的设备表),两个都加上保险。
6.2 添加 ko 路径映射
文件:frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
三处,都是仿照 8723BU 现有写法:
(1) 第 36 行附近(RTL8723BU_DRIVER_MODULE_PATH 旁)加:
#define RTL8733BU_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8733bu.ko"
(2) 第 63 行附近(RTL8723BU_DRIVER_MODULE_NAME 旁)加:
#define RTL8733BU_DRIVER_MODULE_NAME "8733bu"
(3) module_list[] 数组中(第 140~172 行,建议加在第 142 行 RTL8723BU 那条后面):
{"RTL8733BU", RTL8733BU_DRIVER_MODULE_NAME, RTL8733BU_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODULE_ARG},
模块参数留空即可:驱动默认接口名就是 wlan0/p2p0,不需要额外 insmod 参数。
注意:这里的 "8733bu" 必须与你第 3.4 步在驱动 Makefile 里设置的 MODULE_NAME := 8733bu 一致(ko 文件名 = 模块名)。
6.3 BoardConfig / supplicant 无需改动
device/rockchip/common/wifi_bt_common.mk 虽然默认 BOARD_CONNECTIVITY_VENDOR := Broadcom,但表里已有的 RTL8723DS/8723BU 等就是在这套配置下跑的(RK 是一套镜像运行时识别多芯片的方案),Realtek 芯片走 nl80211 标准路径即可工作,不要去改它,否则会影响其他模组的兼容。
6.4 编译验证
cd /home/chw/rk3288_android11/rk3288_sdk
source build/envsetup.sh
lunch <你的rk3288 lunch项>
make -j16 # 或按你们平时的 build.sh 流程
注意顺序:必须先编内核(生成 8733bu.ko)再编 Android,wifi.mk 的 find 是在 make 时执行的,ko 不存在就不会打包(且不报错)。用你们的 build.sh 整编一般已保证此顺序。
烧录前可先确认 ko 进了 vendor 镜像:
ls out/target/product/*/vendor/lib/modules/ | grep 8733
6.5 上板验证
adb shell
ls -lZ /vendor/lib/modules/8733bu.ko # 存在且 label 为 vendor_file
lsusb # 应有 0bda:b733(或 f72b)
logcat -c
然后在 Settings 中打开 WLAN,另开窗口:
logcat | grep -Ei "wifi_hal|found device|matched ko|wlan"
预期 logcat 顺序:found device pid:vid : 0bda:b733 → matched ko file path /vendor/lib/modules/8733bu.ko → 驱动加载、wlan0 出现 → 界面能扫描到 AP。
如果识别表打印了 falied to find wifi driver for type=...,说明 6.1/6.2 两个表没对上;如果 found device 正常但 insmod 失败,用 dmesg | grep -i rtw 看驱动侧报错