1 WiFi 基础知识
WiFi 是当今使用最广泛的一种无线网络技术之一,广泛应用与广告*,投影仪,智能家居,智能门禁,智能音箱,智能手机等智能联网设备之中,为了加速产品设计,大部分都是以 wifi 模块来应用的。市场上WiFi 模块的型号很多,不同的应用场景对 wifi 模块的功能要求不同,有的只需要点对点数据传输,有的需要在线播放视频,音乐,在线互动,所以通常会从功能上将 wifi 模块分为俩大类:通用型 WIFI 模块,透传型 WIFI 模块。如下图所示:
通用型 wifi 模块:比如手机,笔记本上的 USB 或者 SDIO 接口模块,WiFi 协议栈和驱动是在Android,windows 等系统里面跑的,是需要 CPU 来配合完成应用。
透传型 WiFi 模块通常应用与点对点数据传输场景,模块中内置 wifi 驱动和协议,用户不需要关心 WiFi协议是如何实现的,只需要做的是 A 通过串口发数据,B 通过串口接收数据,WiFi 模块对于开发者来说变成了透明的,这种类型的模块接口一般是 MCU 接口的,如 UART 等。像乐鑫,安信可的 WiFi 模块都是透传型 WiFi 模块。
本文档移植的 wifi 模块是 RTL8822cs 模块,是 SDIO 接口的模块。本次 wifi 移植是在光盘资料【20210702】日期的 Linux 源码的基础上进行移植的。
移植的环境:
1.iTOP-3399 开发板+ RTL8822CS 模块
2.Android 8.1
3.搭建好编译环境的 ubuntu16.04 64Bit 开发环境
本文档配套资料在网盘资料“iTOP-3399 开发板\02_iTOP-3399 开发资料汇总(不含光盘内容)\13_嵌入式 Linux 开发指南(RK3399)手册配套资料\6.Android 底层驱动\Android8wifi 移植\”目录下。如果您移植出现问题,可以对比下修改好的文件。光盘资料【20210927】日期的 Android8 源码是支持 rtl8822cs 模块 wifi 功能的。
2 移植步骤
2.1 设备树配置
输入以下命令修改 Android8 的设备树文件。
vim kernel/arch/arm64/boot/dts/rockchip/itop-3399.dtsi
将下面的 wifi_chip_type 后面的内容修改为 rtl8822cs
查找 sdio,注释掉下面的语句,注释掉这句是因为注册 sdio 设备时,会注册不上。
2.2 修改内核驱动
将厂商提供的源码文件夹放入内核目录 drivers/net/wireless/rockchip_wlan/下,厂商提供的源码文件夹在网盘资料“iTOP-3399 开发板\02_iTOP-3399 开发资料汇总(不含光盘内容)\13_嵌入式 Linux 开发指南(RK3399) 手 册 配 套 资 料 \6.Android 底 层 驱 动 \Android8wifi 移 植 \ 厂 商 提 供 的 驱 动 文 件 ” 路 径 下 的rtl88x2CS_WiFi_linux_v5.12.1.1-0-gf673ce3.20210125_COEX20200922-1e1e.tar.gz。解压并修改文件夹名称为rtl8822cs。
接着修改以下文件:
(6)rtl8822cs 文件夹下的 Makefile,添加以下代码,如下图所示:
obj-$(CONFIG_RTL8822CS) += rtl8822cs/
(7)rtl8822cs 文件夹下的 Kconfig,添加以下代码,如下图所示:
source "drivers/net/wireless/rockchip_wlan/rtl8822cs/Kconfig"
(8)rtl8822cs 下的 Makefile
将文件中的 CONFIG_PLATFORM_I386_PC 的值修改为 n
将文件中的 CONFIG_PLATFORM_ARM_RK3188 的值修改为 y
如下图所示:
然后将以下图一的“wlan”改为“8822cs”,如下图所示:
(4)rtl8822cs 下的 Kconfig
将第一行的 RTL8822BS 修改为 RTL8822CS,这里是厂家的源码写错了,不改正的话不会编译到这个源码目录。
(5)然后在 Android8 内核目录(itop-3399_8.1/kernel)下输入以下命令配置加载驱动。
make ARCH=arm64 menuconfig
Device Drivers --->Network device support --->Wireless LAN --->Rockchip Wireless LAN support --->
Realtek 8822C SDIO WiFi
修改后保存到.config 文件
(6)输入以下命令,将保存好的.config 文件复制替换 defconfig 文件
cp .config arch/arm64/configs/rockchip_defconfig
(7)然后修改 itop-3399_8.1/kernel/net/rfkill/rfkill-wlan.c 文件,添加如下所示内容。
} else if (strcmp(wifi_chip_type_string, "rtl8822cs") == 0) {
type = WIFI_RTL8822CS;
(8)然后修改 include/linux/rfkill-wlan.h 文件,添加如下内容,如下图所示:
WIFI_RTL_8822CS,
3 修改 HAL 层
(1)我们修改 frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp 文件,添加如下所示代码,如下图所示:
{"RTL8822CS", "024c:c822"},
(2)将 strcpy(recoginze_wifi_chip, "APXXX");注释掉,修改为 strcpy(recoginze_wifi_chip, "RTL8822CS");
strcpy(recoginze_wifi_chip, "RTL8822CS");
(3)修改 frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp 文件,添加代码
#define RTL8822CS_DRIVER_MODULE_PATH "/vendor/lib/modules/wifi/8822cs.ko"
(4)添加代码,如下图所示。
#define RTL8822CS_DRIVER_MODULE_NAME "8822cs"
添加代码,如下图所示:
{"RTL8822CS", RTL8822CS_DRIVER_MODULE_NAME, RTL8822CS_DRIVER_MODULE_PATH, UNKKOWN_DRIVER_MODUL
更多内容请关注迅为电子
|