一.安卓wifi框架
要使用一个wifi功能需要涉及的部分有内核部分wifi驱动,应用部分wpa_supplicant服务。其中wifi驱动又包含很多部分,分为通讯接口的驱动SDIO、USB、PCIE等,还有上下电部分的驱动,wifi模组提供部分的驱动。应用部分不管是Android还是linux平台都是使用wpa_supplicant这个开源项目,这个应用主要的作用为对下和驱动和芯片进行通讯,对上提供接口给用户配网等操作,对于Android系统更上层还有通过JNI接口对上的JAVA层。
二.WIFI的启动流程
rockchip平台实现了一套兼容多款wifi模块的自适应框架,简单来说就是将多款wifi模块的驱动编译成xxx.ok文件,比如常用的wifi芯片厂商瑞昱、博通的wifi芯片的驱动统一编译成不同的xxx.ko文件,然后打包成固件放置在文件夹/vendor/lib/modules下面。
上图为多款wifi的ko文件,比如8188eu.ko、8189es.ko。
android系统启动之后,系统启动一个服务,读取usb接口的wifi或者sdio接口的wifi的pid和vid。然后和代码里面写死的pid和vid进行比较,确认是那款wifi,比如我们这里是rtl8821cu,所以识别出来rtl8821cu然后调用insmod加载8821cu.ko的wifi驱动。
三.移植USB wifi RTL8821CU
RTL8821CU简介
RTL8821CU是瑞昱半导体推出的usb接口的wifi,下面的教程将介绍如何将RTL8821CU移植到rk3588的平台上。
移植usb wifi需要修改的文件
Android hal层需要修改的文件
frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp
frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
//kernel需要修改的文件
kernel/arch/arm64/boot/dts/rockchip/rk3399-tve1030g.dtsi //除去板上的sdio的wifi
kernel/arch/arm64/configs/rockchip_defconfig //添加rtl8822CU的驱动生成模块的方式,生成rtl8822cu.ko
kernel/drivers/net/wireless/rockchip_wlan/Kconfig //将wifi驱动放置到kernel/drivers/net/wireless/rockchip_wlan这个目录下,需要修改Kconfig和Makefile
kernel/drivers/net/wireless/rockchip_wlan/Makefile
kernel/drivers/net/wireless/rockchip_wlan/rtl8821CU/ //rtl8821CU的驱动,一般这部分驱动由原厂,或者wifi模组供应商提供.。
rfkill-wlan.c的作用
wifi驱动分为两部分,一部分是厂家提供的wifi驱动部分,这部分是标准的基本不用修改,不管是NXP,ROCKCHIP,全志等平台都是使用这一套代码,比如kernel/drivers/net/wireless/rockchip_wlan/rtl8822CU/。另一部分是和平台SOC有差异的,这部分一般是SOC厂家提供,这部分的功能是给WIFI模组上下电使用,比如配置唤醒引脚配置,当数据来的时候用来唤醒系统,比如上下电配置,用户可以使用节点给bt进行上电,这部分的功能就集成在rfkill-wlan.c。
如何获取pid 和 vid
通过和没插入usb wifi之前输入的lsusb对比,插入后多了上图红色圈出来的设备,所以我们可以知道的usb wifi rtl8821cu的pid为0bda,vid为c811,我们将这两个pid和vid记下来到到后面使用。
修改hal层
我们前面说了系统启动后会扫描usb wifi的pid和vid然后在代码里找到是那款wifi芯片,然后找到wifi芯片的.ko文件的路径,这一部分的代码在
frameworks/opt/net/wifi/libwifi_hal/rk_wifi_ctrl.cpp
frameworks/opt/net/wifi/libwifi_hal/wifi_hal_common.cpp
我们在rk_wifi_ctrl.cpp添加rtl8821cu的pid和vid(红色方框为需要添加的)。
在wifi_hal_common.cpp添加rtl8821cu.ko文件的路径,系统启动的时候通过获取到pid和vip匹配之后,根据数组static wifi_device supported_wifi_devices找到"RTL8821CU"这个名字,然后用这个名字从数组wifi_ko_file_name module_list里面获取到RTL8821CU_DRIVER_MODULE_PATH这个宏,这个宏就是指定rtl8821的wifi驱动ko的位置。
#define RTL8821CU_DRIVER_MODULE_PATH WIFI_MODULE_PATH"8821cu.ko" //指定rtl8821的wifi驱动ko的位置
#define WIFI_MODULE_PATH "/vendor/lib/modules/"
修改dts除去sdio wifi
因为为的板子上有sdio接口的wifi,如果不除去,同时有usb wifi和sdio wifi可能会产生冲突,所以我们先disable sdio的接口的wifi。
我们将rtl8821CU wifi驱动复制到kernel/drivers/net/wireless/rockchip_wlan/这个目录下面,同时修改当前目录下的Kconfig文件和Makefile文件。
修改Makefile将rtl8821CU添加进去(红色方框为需要添加的)。
新编译内核
我们修改完成全部的需要修改的文件后,需要从新编译内核和安卓系统,编译成功后确认确认rtl8821.ko文件是否打包到了vendor.img。我们可以在\vendor\lib\modules目录下查看是否有8821cu.ko这个文件,如果有这个文件就证明已经打包完成。
烧录
全部工作完成后,就可以烧录全部的img,烧录完成后等待开机,然后在Android界面设置选项wifi设置那里可以搜索到wifi信号,然后就可以像正常的使用Android手机一样使用wifi上网了。