文章目录
- 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、适配流程步骤
- 配置设备树,让SDIO控制器工作。
- 配置设备树,让SDIO控制器可以发现WIFI/BT模组。
- Wi-Fi适配:配置设备树,移植设备驱动。
- 验证Wi-Fi功能。
- 蓝牙适配:配置设备树。
- 验证蓝牙功能。
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、验证
- 查看 log:
dmesg | grep "fe000000"
dmesg | grep "mmc3"
- 查看
/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、传统驱动移植
- 进入内核驱动目录,将驱动文件复制进来:
cd <sdk>/kernel/drivers/net/wireless
cp nxp ./
- 修改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....
- 修改Makefile:
vi Makefile
/* Makefile */...obj-$(CONFIG_MXMWIFIEX) += nxp/...
- 修改defconfig:
- 在sdk根目录执行如下命令编译内核:
./build.sh kernel
至此,驱动已经编译完成。但是驱动的安装需要固件,可以自行通过文件系统overlay的方式将固件放到/lib/firmware/
目录下。
6.2.3、RK SDK WIFI/BT驱动独立编译
RK SDK把wifibt的编译独立了出来,所以这里我们体验一下这种方法。注意!经过实测,要先按照上面将驱动移植进内核,才可以使用下面的独立编译。
- /external/rkwifibt/目录结构说明:
- firmware目录:包含各个厂家WiFiBT的firmware文件
- drivers目录:包含各个厂家的WiFiBT驱动
- bin目录:主要是原厂预置的一些二进制文件
- sh目录:主要是开机的WIFIBT的加载脚本,及测试脚本等
我们暂时只关注firmware和drivers目录。
- 进入drivers目录,创建aw-cm358sm文件夹,将驱动文件复制进来:
cd <sdk>/external/rkwifibt/drivers
mkdir aw-cm358sm
cd aw-cm358sm
cp nxp/* ./
- 进入firmware目录,创建azurewave文件夹。进入azureware目录,继续创建AW-CM358SM文件夹,将固件拷贝到该文件夹。
cd <sdk>/external/rkwifibt/firmware
mkdir azurewave
cd azurewave
mkdir AW-CM358SM
cd AW-CM358SM
cp xxxx ./
- 修改/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...
- 修改板级配置文件,添加
$RK_WIFIBT_CHIP
环境变量:
- 在sdk根目录执行如下命令单独编译wifibt:
./build.sh wifibt
- 编译buildroot,更新rootfs。打包固件。
./build.sh buildroot && ./build.sh firmware
6.3、Wi-Fi 功能验证
6.3.1、加载驱动
- 查看未安装驱动前的ifconfig:
- 进入/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)之间的安全连接。
- 修改wpa_supplicant.conf配置文件,将ssid和psk替换成待连接的wifi名称和密码:
vi /etc/wpa_supplicant.conf
- 开启wpa_supplicant进程:
# 开启wpa_supplicant进程
# -c 后面接的是配置文件的路径
wpa_supplicant -B -i mlan0 -c /etc/wpa_supplicant.conf# 动态获取IP
dhcpcd mlan0
- 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、使能蓝牙设备
- 使能蓝牙设备:
# 还是要先加载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
- 使本设备自身可被发现:
hciconfig hci0 piscan
- 查看蓝牙模块设备名称:
hciconfig hci0 name
- 手机查看蓝牙设备(苹果手机看不到):
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