Android下移植WiFi和BT(USB接口)

一、示例环境

平台:RK3566 Android11
模组:SKI.WB800D80U.2

二、驱动移植

1、流程

a、将驱动代码放入正确的内核目录(通常是 drivers/net/wireless/)
b、修改 KconfigMakefile 以包含新驱动
c、配置.config文件使其编译

2、WiFi驱动移植

2.1、放置驱动代码

将WiFi驱动代码目录放在kernel/drivers/net/wireless/目录下。这是 Linux 内核源码树中网络驱动的标准位置。

2.2、修改 Makefile 和 Kconfig

kernel/drivers/net/wireless/目录中,更新MakefileKconfig以包含新的驱动

a. Makefile 示例:

obj-$(CONFIG_AIC8800_WLAN_SUPPORT) += aic8800/

Makefile

b. Kconfig 示例:

source "drivers/net/wireless/aic8800/Kconfig"

Kconfig

3、BT驱动移植

3.1、放置驱动代码

将BT驱动代码目录放在kernel/drivers/bluetooth目录下

3.2、修改 Makefile 和 Kconfig

kernel/drivers/bluetooth目录中,更新MakefileKconfig以包含新的驱动

a. Makefile 示例:

obj-$(CONFIG_BT_AICBTUSB) += aic_btusb.o

bt_Makefile

b. Kconfig 示例:

config BT_AICBTUSB
	tristate "AIC HCI USB driver"
	depends on USB
	help
	  AIC Bluetooth HCI USB driver.

bt_kconfig

4、设置内核配置

a、方法一:修改内核.config文件
b、方法二:修改配置源文件
直接修改 kernel/arch/arm64/configs/firefly_defconfig 文件(按实际使用的配置文件来修改),添加:

CONFIG_BT_AICBTUSB=m
CONFIG_AIC_WLAN_SUPPORT=y
CONFIG_AIC8800_WLAN_SUPPORT=m
CONFIG_AIC_LOADFW_SUPPORT=m

这将使驱动被编译为一个内核模块
内核配置

三、安卓上层适配

1、复制驱动所需固件文件到文件系统中

BOARD_VENDOR_KERNEL_MODULES:Android 构建系统会使用这个变量来确定哪些内核模块需要被编译和打包到最终的系统镜像中
PRODUCT_COPY_FILES:Android中,该变量用于指定需要在构建过程中复制到目标设备的文件
gujianm

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
vid

2.2、添加 wifi 驱动 ko 文件存放路径

module_list添加模组对应的驱动和路径驱动路径

2.3、添加 wpa_supplicant 启动参数

a、在wpa_config.txt设置参数
参数
b、wpa_supplicant/main.cmain 函数中添加芯片类型
芯片类型

4、BT部分

a、设置BOARD_HAVE_BLUETOOTH_AIC构建系统变量,用于指示设备使用所使用的蓝牙
设置蓝牙
b、libbt
libbt 负责蓝牙芯片的初始化,不同蓝牙芯片使用不同的 libbt,libbt 一般都由芯片厂家提供。
包含蓝牙对应libbt-vendor库的mk文件,编译生成对应的库文件
在libbt-vendor
c、根据识别到的wifi,来判断用的是哪一个libbt库识别libbt-vendor
d、为蓝牙设备节点赋权限
节点

Q&A

1、识别不到设备

问题:
lsusb没有对应的模组的vid,导致WiFi打不开
在这里插入图片描述

排查方法:

  • 确认硬件是否有问题
  • 排查设备树里相关的配置是否正确

2、check_wifi_chip_type_string返回不正确

问题:
logcat中check_wifi_chip_type_string所返回的模组不正确,导致WiFi打不开
check_wifi_chip_type_string
排查方法:

  • 主板是否识别到设备
  • 安卓上层supported_wifi_devices中的vid和did是否与所适配模组相符

3、libbt加载错误

问题:
安卓上层加载libbt库时,加载的不是模组对应的库
libbt-vendor
排查方法:

  • check_wifi_chip_type_string识别是否正确
  • hardware/interfaces/bluetooth/1.0/default/vendor_interface.cc文件中libbt库相关是否正确设置

4、libbt打不开

libbt正确识别,但是打不开对应的库文件
打不开
排查方法:

  • 确认该板卡上是否有该库文件
  • 库文件是否有编译到,编译出来的库文件是否正确
### 如何在Ubuntu 22.04上安装或配置aic8800驱动程序 对于特定硬件如aic8800无线网卡,在Ubuntu 22.04上的安装可能涉及几个方面的工作,包括确认系统兼容性、获取合适的驱动以及执行必要的安装步骤。 #### 确认硬件支持情况 首先应当验证aic8800型号的具体版本是否受到Linux内核的支持。较新版本的Linux内核通常已经包含了对许多常见无线网卡的支持。可以通过终端输入`lspci | grep Network`来查看当前已识别的网络控制器列表[^1]。 如果未显示任何有关aic8800的信息,则可能是由于缺少相应的固件文件或者是内核模块未能加载成功造成的。此时可以进一步通过`dmesg | grep iwlwifi`命令查找是否有错误日志输出关于此设备的消息。 #### 获取并编译源码包(如有必要) 当官方并未提供预构建好的.deb二进制包时,可以从制造商处下载最新的Linux驱动源代码压缩包,并按照README中的指示进行解压编译工作: ```bash tar -xf aic8800-driver.tar.gz cd aic8800-driver/ make clean && make all sudo make install ``` 完成上述操作后重启计算机使更改生效[^2]。 #### 使用DKMS动态管理第三方驱动 为了简化后续更新过程中可能出现的问题处理流程,建议采用Dynamic Kernel Module Support (DKMS)工具来进行驱动维护。这样即使将来升级了kernel也不必担心丢失自定义添加过的外设支持功能。 先确保安装好dkms服务端组件: ```bash sudo apt update sudo apt install dkms ``` 接着把之前准备好的驱动加入到dkms体系当中去: ```bash sudo mkdir -p /usr/src/aic8800-1.0 cp -r * /usr/src/aic8800-1.0/ sudo dkms add ./aic8800/1.0 sudo dkms build aic8800/1.0 sudo dkms install aic8800/1.0 ``` 最后再次启动机器测试效果即可[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vis-Lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值