RK356x bsp 5 - 海华AW-CM358SM Wi-Fi/Bt模组调试记录

server/2025/1/16 14:45:48/

文章目录

  • 1、环境介绍
  • 2、目标
  • 3、海华AW-CM358SM
    • 3.1、基本信息
    • 3.2、支持SDIO3.0
    • 3.3、电气特性
  • 4、适配流程步骤
  • 5、SDIO控制器适配
    • 5.1、sdio dts配置
    • 5.2、验证
  • 6、Wi-Fi 适配
    • 6.1、wifi dts配置
    • 6.2、驱动移植
      • 6.2.1、kernel menuconfig
      • 6.2.2、传统驱动移植
      • 6.2.3、RK SDK WIFI/BT驱动独立编译
    • 6.3、Wi-Fi 功能验证
      • 6.3.1、加载驱动
      • 6.3.2、STA模式测试
      • 6.3.3、AP测试
  • 7、蓝牙适配
    • 7.1、bt dts配置
    • 7.2、驱动移植
    • 7.3、蓝牙功能验证
      • 7.3.1、使能蓝牙设备
      • 7.3.2、扫描外设
      • 7.3.3、开发板发送文件给安卓手机

1、环境介绍

硬件:飞凌ok3568-c开发板

软件:原厂rk356x sdk

2、目标

调试海华AW-CM358SM WIFI/BT模组,可以正常上网、使用蓝牙。

3、海华AW-CM358SM

3.1、基本信息

  • 主芯片:NXP的88W8987
  • Wi-Fi接口:SDIO
  • BT接口:UART

3.2、支持SDIO3.0

3.3、电气特性

AW-CM358SM的VDDIO为1.8V:

所以,RK3568的SDIO接口的工作电压也要是1.8V,请检查设备树电源域&pmu_io_domains节点vccio6是否配置为1.8v(同时,SDIO3.0模式必须为1.8v):

4、适配流程步骤

  1. 配置设备树,让SDIO控制器工作。
  2. 配置设备树,让SDIO控制器可以发现WIFI/BT模组。
  3. Wi-Fi适配:配置设备树,移植设备驱动。
  4. 验证Wi-Fi功能。
  5. 蓝牙适配:配置设备树。
  6. 验证蓝牙功能。

5、SDIO控制器适配

现在先解决“适配流程步骤”的第1,第2点。即让SDIO控制器工作,且可以扫到WIFI卡。

5.1、sdio dts配置

从下面两幅原理图可以得出:

  • WIFI模组的WIFI_REG_ON引脚接到了RK3568的GPIO3_D4。
  • WIFI模组的SDIO接口接到了RK3568的SDMMC2接口。

设备树配置如下:

/* WL_REG_ON 由 sdio_pwrseq 节点进行管理控制 */
&sdio_pwrseq {compatible = "mmc-pwrseq-simple";pinctrl-names = "default";pinctrl-0 = <&wifi_enable_h>;/** On the module itself this is one of these (depending* on the actual card populated):* - SDIO_RESET_L_WL_REG_ON* - PDN (power down when low)*/post-power-on-delay-ms = <200>;/* 这里配置的是WL_REG_ON引脚	*/reset-gpios = <&gpio3 RK_PD4 GPIO_ACTIVE_LOW>;	
};&pinctrl {sdio-pwrseq {wifi_enable_h: wifi-enable-h {/* 这里配置的是WL_REG_ON引脚	*/rockchip,pins = <3 RK_PD4 RK_FUNC_GPIO &pcfg_pull_none>;	};};
};/* SDIO接口Wi-Fi专用配置:SDIO接口节点 */
&sdmmc2 {max-frequency = <150000000>;	/* sdio接口的最大频率,可调整 */supports-sdio;bus-width = <4>;				/* 4线模式,可调整1线模式 */disable-wp;cap-sd-highspeed;cap-sdio-irq;keep-power-in-suspend;mmc-pwrseq = <&sdio_pwrseq>;	/* WL_REG_ON 管理 */non-removable;pinctrl-names = "default";pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>;sd-uhs-sdr104;					/* 支持SDIO3.0 */status = "okay";
};

5.2、验证

  1. 查看 log:
dmesg | grep "fe000000"

dmesg | grep "mmc3"

  1. 查看/sys/bus/mmc/devices/目录下的sdio设备:
ls /sys/bus/mmc/devices/

mmc3:0001对应的基址是fe000000,可以回到设备树查看,就是sdmmc2接口:

如果没有如上对应的log输出,/sys/bus/mmc/devices/目录下也没出现对应的sdio设备,说明sdio控制器没有扫到wifi卡,请重新检查设备树配置和对应PIN脚的电平状态及CLK频率是否正确。

6、Wi-Fi 适配

现在SDIO控制器可以识别到WiFi卡,但是还没有wlan节点出来,因为还没有驱动。

6.1、wifi dts配置

从下面原理图可以得出:

  • WIFI模组的WIFI_HOST_WAKE_B引脚接到了RK3568的GPIO0_D4。

设备树继续添加wlan节点,同时配置pinctrl节点:

&wireless_wlan {compatible = "wlan-platdata";rockchip,grf = <&grf>;pinctrl-names = "default";pinctrl-0 = <&wifi_host_wake_irq>;/* 注意:如果排查发现Wi-Fi模块没有32.768K波形,且硬件上是由* RK PMU供给的,则打开下面的clock属性,按照实际使用的PMU型号填写,* 否在SDIO/Wi-Fi无法使用.** 海华AW-CM358SM使用的是外部晶振,无需打开clock属性。*///clocks = <&rk809 1>; //如果使用RK809,只能配置一个//clocks = <&hym8563>; //如果使用hym8563,只能配置一个//clock-names = "ext_clock";/* 按实际名字填写(但这里的名字我随便写的,听说海华和正基是兼容的,所以填了这个名字) */wifi_chip_type = "ap6256";/* 这里配置的是WIFI_HOST_WAKE_B引脚	*/WIFI,host_wake_irq = <&gpio0 RK_PD4 GPIO_ACTIVE_HIGH>;status = "okay";
};&pinctrl {...wireless-wlan {wifi_host_wake_irq: wifi-host-wake-irq {/* 这里配置的是WIFI_HOST_WAKE_B引脚	*/rockchip,pins = <0 RK_PD4 RK_FUNC_GPIO &pcfg_pull_down>;};};
};

其实实测发现,对于海华AW-CM358SM来说,不配置这个&wireless_wlan节点最终也会有wifi节点出来。

6.2、驱动移植

6.2.1、kernel menuconfig

6.2.2、传统驱动移植

  1. 进入内核驱动目录,将驱动文件复制进来:
cd <sdk>/kernel/drivers/net/wireless
cp nxp ./

  1. 修改Kconfig:
vi Kconfig
/* Kconfig */...config MXMWIFIEXtristate "NXP MxM WiFi Driver"depends on CFG80211helpThis driver is multi-chip-multi-interface driver(indicating Multi-Chip x Multi-Interface support) based onNXP 802.11n/ac chipsets. If you choose to build it as a module,it will be build 2 modules moal.ko and mlan.ko....

  1. 修改Makefile:
vi Makefile
/* Makefile */...obj-$(CONFIG_MXMWIFIEX)                += nxp/...

  1. 修改defconfig:

  1. 在sdk根目录执行如下命令编译内核:
./build.sh kernel

至此,驱动已经编译完成。但是驱动的安装需要固件,可以自行通过文件系统overlay的方式将固件放到/lib/firmware/目录下。

6.2.3、RK SDK WIFI/BT驱动独立编译

RK SDK把wifibt的编译独立了出来,所以这里我们体验一下这种方法。注意!经过实测,要先按照上面将驱动移植进内核,才可以使用下面的独立编译。

  1. /external/rkwifibt/目录结构说明:

  • firmware目录:包含各个厂家WiFiBT的firmware文件
  • drivers目录:包含各个厂家的WiFiBT驱动
  • bin目录:主要是原厂预置的一些二进制文件
  • sh目录:主要是开机的WIFIBT的加载脚本,及测试脚本等

我们暂时只关注firmware和drivers目录。

  1. 进入drivers目录,创建aw-cm358sm文件夹,将驱动文件复制进来:
cd <sdk>/external/rkwifibt/drivers
mkdir aw-cm358sm
cd aw-cm358sm
cp nxp/* ./

  1. 进入firmware目录,创建azurewave文件夹。进入azureware目录,继续创建AW-CM358SM文件夹,将固件拷贝到该文件夹。
cd <sdk>/external/rkwifibt/firmware
mkdir azurewave
cd azurewave
mkdir AW-CM358SM
cd AW-CM358SM
cp xxxx ./

  1. 修改/device/rockchip/common/scripts/post-wifibt.sh

修改1:增加aw-cm358sm驱动的编译:

/* <sdk>/device/rockchip/common/scripts/post-wifibt.sh */...if [[ "$RK_WIFIBT_CHIP" = "AW-CM358SM" ]];thenecho "building aw-cm358sm driver"$KMAKE M=$RKWIFIBT_DIR/drivers/aw-cm358sm modulesfi...

修改2:将编译好的ko文件和固件拷贝到output目录,以备后面打包进rootfs。

/* <sdk>/device/rockchip/common/scripts/post-wifibt.sh */...if [[ "$RK_WIFIBT_CHIP" == "AW-CM358SM" ]];thenecho "Copy AW-CM358SM file to rootfs"cp $RKWIFIBT_DIR/firmware/azurewave/$RK_WIFIBT_CHIP/* \$TARGET_DIR/lib/firmware/cp $RKWIFIBT_DIR/drivers/aw-cm358sm/*.ko $TARGET_DIR/lib/modules/fi...
  1. 修改板级配置文件,添加$RK_WIFIBT_CHIP环境变量:

  1. 在sdk根目录执行如下命令单独编译wifibt:
./build.sh wifibt

  1. 编译buildroot,更新rootfs。打包固件。
./build.sh buildroot && ./build.sh firmware

6.3、Wi-Fi 功能验证

6.3.1、加载驱动

  1. 查看未安装驱动前的ifconfig:

  1. 进入/lib/modules目录,按顺序安装驱动(该驱动有两个ko文件需要安装):

cd /lib/modules
insmod mlan.ko
insmod moal.ko

驱动加载成功:

6.3.2、STA模式测试

这里使用wpa_supplicant工具测试,需要在buildroot里提前安装。

WPA_SUPPLICANT是一个用于处理 Wi - Fi 连接认证和加密的守护进程(daemon)。它在 Linux、BSD 等操作系统中被广泛使用,用于实现客户端(如笔记本电脑、智能手机等设备)与 Wi - Fi 接入点(AP)之间的安全连接。

  1. 修改wpa_supplicant.conf配置文件,将ssid和psk替换成待连接的wifi名称和密码:
vi /etc/wpa_supplicant.conf

  1. 开启wpa_supplicant进程:
# 开启wpa_supplicant进程
# -c 后面接的是配置文件的路径
wpa_supplicant -B -i mlan0 -c /etc/wpa_supplicant.conf# 动态获取IP
dhcpcd mlan0

  1. ping测试:
ping -I mlan0 baidu.com

6.3.3、AP测试

海华awcm358sm有三个网络节点,其中uap0可用作AP节点:

这里使用hostapd工具测试,需要在buildroot里提前安装。

hostapd是一个用户空间的守护进程,主要用于将支持 Linux 的网络接口转换为一个 IEEE 802.11 无线接入点(AP)。简单来说,它可以让你的设备(如装有 Linux 系统的电脑或开发板)变成一个 Wi - Fi 热点,供其他无线设备连接。

板卡接入有线网络,确保可以上网:

hostapd需要一个配置文件,这里命名为hostapd-2.4g.conf,内容如下:

interface=uap0
driver=nl80211
channel=9
hw_mode=gauth_algs=1
ieee80211n=1
wpa=1ssid=OK3568_WIFI_2.4G_AP
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP

下面是AP模式的测试脚本hostapd.sh:

#!/bin/sh# kill wpa_supplicant
cnt=`ps aux | grep wpa_supplicant | grep -v grep  | wc -l`
if [ "${cnt}" != "0" ];thenkillall wpa_supplicant > /dev/null
fi# kill hostapd
cnt1=`ps aux | grep hostapd | grep -v grep  | wc -l`
if [ "${cnt1}" != "0" ];thenkillall hostapd > /dev/null
fi# stop dnsmasq
/etc/init.d/S80dnsmasq stop# start hostapd
hostapd /etc/hostapd-2.4g.conf &# enable device
sleep 1
ifconfig mlan0 up
ifconfig uap0 up
# 注意,这里的IP不要和eth0的IP在同一个网段
ifconfig uap0 192.168.5.1# start dnsmasq
/etc/init.d/S80dnsmasq start# 开启网络和IP转发
echo "1" > /proc/sys/net/ipv4/ip_forwardiptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -Xiptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROPiptables -t nat -A POSTROUTING -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

hostapd完成了AP热点的创建,现在为AP添加DHCP功能,这里使用dnsmasq工具。dnsmasq的配置文件在/etc/dnsmasq.conf,内容如下,主要规定了接口名和待分配的IP地址范围:

interface=uap0
bind-interfaces
except-interface=lo
dhcp-range=192.168.5.100,192.168.5.254,12h
dhcp-option=3,192.168.5.1
dhcp-option=6,192.168.5.1

一切准备就绪,开始测试,执行AP测试脚本hostapd.sh,需要执行两次:

sh hostapd.sh

手机查看热点:

查看路由表:

route -n

手机连接热点后,打印如下:

但目前是存在问题的,手机连接热点后上不了网。最初是内核没有开启iptables的支持,但后面开启之后,执行hostapd.sh测试脚本,内核直接崩溃,这个问题卡了挺久,暂时放弃了。

7、蓝牙适配

7.1、bt dts配置

配置uart8:

&uart8 {status = "okay";pinctrl-names = "default";pinctrl-0 = <&uart8m0_xfer &uart8m0_ctsn &uart8m0_rtsn>;
};

7.2、驱动移植

kernel menuconfig开启BT_HCIUART

7.3、蓝牙功能验证

buildroot要添加bluez蓝牙工具软件包。

7.3.1、使能蓝牙设备

  1. 使能蓝牙设备:
# 还是要先加载wifi驱动
insmod /lib/modules/mlan.ko
insmod /lib/modules/moal.ko# 使能hci0
hciattach /dev/ttyS8 any -s 115200 115200 flow > /dev/null
hciconfig hci0 up

  1. 使本设备自身可被发现:
hciconfig hci0 piscan
  1. 查看蓝牙模块设备名称:
hciconfig hci0 name

  1. 手机查看蓝牙设备(苹果手机看不到):

7.3.2、扫描外设

hcitool scan

7.3.3、开发板发送文件给安卓手机

进入bluetooth终端:

/usr/libexec/bluetooth/bluetoothd -C -n &
bluetoothctl

打开蓝牙可连接可被发现属性:

discoverable on

扫描蓝牙设备(重新进入bluetooth终端后,需扫描设备才可以连接):

scan on

扫描到目标设备后,关闭扫描:

scan off

配对:

agent NoInputNoOutput
default-agent
pair A4:50:46:A5:9D:08

退出bluetooth终端:

quit

创建文件,用于待会的发送测试:

echo "send" > sendfile.txt

进入obexctl终端:

export $(dbus-launch)
/usr/libexec/bluetooth/obexd -r /tmp -a -n &
obexctl

连接手机:

connect A4:50:46:A5:9D:08

发送文件到手机:

send sendfile.txt

退出obexctl终端:

quit

http://www.ppmy.cn/server/158838.html

相关文章

如何创建表格式布局

文章目录 1. 概念介绍2. 使用方法3. 示例代码4. 经验总结我们在上一章回中介绍了Image Widget,本章回中将介绍GirdView这种Widget,闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 在Flutter中使用GirdView表示网格状的布局,类似日常办公中使用的Excel,它和ListView一样具…

k8s基础(6)—Kubernetes-存储

Kubernetes-存储概述 k8s的持久券简介 Kubernetes的持久卷&#xff08;PersistentVolume, PV&#xff09;和持久卷声明&#xff08;PersistentVolumeClaim, PVC&#xff09;为用户在Kubernetes中使用卷提供了抽象。PV是集群中的一块存储&#xff0c;PVC是对这部分存储的请求。…

ES6的高阶语法特性

一、模板字符串的高级用法 1.1.模板字符串的嵌套 模板字符串的嵌套允许在一个模板字符串内部再嵌入一个或多个模板字符串。这种嵌套结构在处理复杂数据结构或生成具有层级关系的文本时非常有用。 1. 嵌套示例 假设我们有一个包含多个对象的数组&#xff0c;每个对象都有名称、…

Unity【Colliders碰撞器】和【Rigibody刚体】的应用——小球反弹效果

目录 Collider 2D 定义&#xff1a; 类型&#xff1a; Rigidbody 2D 定义&#xff1a; 属性和行为&#xff1a; 运动控制&#xff1a; 碰撞检测&#xff1a; 结合使用 实用检测 延伸拓展 1、在Unity中优化Collider 2D和Rigidbody 2D的性能 2、Unity中Collider 2D…

辅助云运维

为客户提供运维支持&#xff0c;保障业务连续性。 文章目录 一、服务范围二、服务内容三、服务流程四、 服务交付件五、责任分工六、 完成标志 一、服务范围 覆盖范围 云产品使用咨询、问题处理、配置指导等&#xff1b; 云产品相关操作的技术指导&#xff1b; 云相关资源日常…

Kafka权威指南(第2版)读书笔记

目录 Kafka生产者——向Kafka写入数据生产者概览创建Kafka生产者bootstrap.serverskey.serializervalue.serializer 发送消息到Kafka同步发送消息异步发送消息 生产者配置client.idacks消息传递时间max.block.msdelivery.timeout.msrequest.timeout.msretries 和retry.backoff.…

如何修复Android上未安装的应用程序

在Android设备上安装应用程序通常是一个简单的过程。然而&#xff0c;“ Android上未安装应用程序”是一种常见的智能手机错误消息&#xff0c;由于一个或多个原因而经常遇到。发现由于即将出现故障而无法充分利用手机&#xff0c;这当然会非常令人沮丧&#xff0c;但幸运的是&…

结合night compute分析 利用tensor core 优化K值较大的矩阵乘(超过cublas50%)

一 night compute分析 将cublas作为base line和现有的代码分析 图1.1 可以发现计算吞吐量明显偏低,能想到的就是计算单元处于空闲的概率较大,是访存密集型算子,因此可以增大数据的吞吐量,多给计算单元提供数据 二 代码 #include "common.h"//mma计算的基本尺…