一、示例环境
平台:RK3566 Android11
模组:SKI.WB800D80U.2
二、驱动移植
1、流程
a、将驱动代码放入正确的内核目录(通常是 drivers/net/wireless/)
b、修改 Kconfig
和 Makefile
以包含新驱动
c、配置.config
文件使其编译
2、WiFi驱动移植
2.1、放置驱动代码
将WiFi驱动代码目录放在kernel/drivers/net/wireless/
目录下。这是 Linux 内核源码树中网络驱动的标准位置。
2.2、修改 Makefile 和 Kconfig
在kernel/drivers/net/wireless/
目录中,更新Makefile
和Kconfig
以包含新的驱动
a. Makefile 示例:
obj-$(CONFIG_AIC8800_WLAN_SUPPORT) += aic8800/
b. Kconfig 示例:
source "drivers/net/wireless/aic8800/Kconfig"
3、BT驱动移植
3.1、放置驱动代码
将BT驱动代码目录放在kernel/drivers/bluetooth
目录下
3.2、修改 Makefile 和 Kconfig
在kernel/drivers/bluetooth
目录中,更新Makefile
和Kconfig
以包含新的驱动
a. Makefile 示例:
obj-$(CONFIG_BT_AICBTUSB) += aic_btusb.o
b. Kconfig 示例:
config BT_AICBTUSB
tristate "AIC HCI USB driver"
depends on USB
help
AIC Bluetooth HCI USB driver.
4、设置内核配置
a、方法一:修改内核.config
文件
b、方法二:修改配置源文件
直接修改 kernel/arch/arm64/configs/firefly_defconfig
文件(按实际使用的配置文件来修改),添加:
CONFIG_BT_AICBTUSB=m
CONFIG_AIC_WLAN_SUPPORT=m
CONFIG_AIC8800_WLAN_SUPPORT=m
CONFIG_AIC_LOADFW_SUPPORT=m
这将使驱动被编译为一个内核模块
三、安卓上层适配
1、复制驱动所需固件文件到文件系统中
BOARD_VENDOR_KERNEL_MODULES
:Android 构建系统会使用这个变量来确定哪些内核模块需要被编译和打包到最终的系统镜像中
PRODUCT_COPY_FILES
:Android中,该变量用于指定需要在构建过程中复制到目标设备的文件
2、设置开机需要加载的驱动
3、WiFi部分
1、WiFi识别流程
a、 开机对 wifi 模块上电,并自动进行扫描 sdio 操作。
b、系统启动打开 wifi 操作时,分别对系统 sys/bus/sdio(sdio wifi), sys/bus/usb(usb wifi),sys/bus/pic (pcie wifi )文件系统下的 uevent 进行读取。
c、获取到 wifi 芯片 vid pid 加载相应的 wifi ko 驱动。
d、识别到 wifi 类型后加载不同的 wpa_supplicant 参数启动 wifi。
2、移植
2.1. 添加 wifi 名称和 wifi vid pid
在supported_wifi_devices
添加所要移植模组的vid pid
2.2、添加 wifi 驱动 ko 文件存放路径
在module_list
添加模组对应的驱动和路径
2.3、添加 wpa_supplicant 启动参数
a、在wpa_config.txt
设置参数
b、wpa_supplicant/main.c
中 main
函数中添加芯片类型
4、BT部分
a、设置BOARD_HAVE_BLUETOOTH_AIC
构建系统变量,用于指示设备使用所使用的蓝牙
b、libbt
libbt 负责蓝牙芯片的初始化,不同蓝牙芯片使用不同的 libbt,libbt 一般都由芯片厂家提供。
包含蓝牙对应libbt-vendor
库的mk文件,编译生成对应的库文件
c、根据识别到的wifi,来判断用的是哪一个libbt库
d、为蓝牙设备节点赋权限
Q&A
1、识别不到设备
问题:
lsusb
没有对应的模组的vid,导致WiFi打不开
排查方法:
- 确认硬件是否有问题
- 排查设备树里相关的配置是否正确
2、check_wifi_chip_type_string返回不正确
问题:
logcat中check_wifi_chip_type_string
所返回的模组不正确,导致WiFi打不开
排查方法:
- 主板是否识别到设备
- 安卓上层
supported_wifi_devices
中的vid和did是否与所适配模组相符
3、libbt加载错误
问题:
安卓上层加载libbt库时,加载的不是模组对应的库
排查方法:
check_wifi_chip_type_string
识别是否正确hardware/interfaces/bluetooth/1.0/default/vendor_interface.cc
文件中libbt库相关是否正确设置
4、libbt打不开
libbt正确识别,但是打不开对应的库文件
排查方法:
- 确认该板卡上是否有该库文件
- 库文件是否有编译到,编译出来的库文件是否正确