T536 WIFI&BT 驱动调试

参考
rtl8821CS (artinchip.com)https://www.artinchip.com/knowledge/oxy_ex-1/topics/wifi-rtl8821cs-luban.html

驱动移植

由于现在全志将他们自己的模块驱动都放到 BSP 目录,然后通过创建软链接文件,链接到内核目录中,所以现在把 rtl8821CS 驱动移植到 BSP 目录内。

rtl8821CS 驱动在 T507 移植过来的。

然后在 rtl8821cs 的上级目录的 Kconfig 中添加对该驱动的索引:

source "$(BSP_TOP)drivers/net/wireless/rtl8821cs/Kconfig"

在上级目录的 Makefile 中添加:

obj-$(CONFIG_RTL8821CS) += rtl8821cs/

Kconfig 修改

基于版本的差异,Luban 对 Kconfig 中 help 的字段解析可能和驱动原生的格式有差异, 在 net/wireless/realtek/rtl8821/Kconfig 中调整如下:

config RTL8821CS
    tristate "Realtek 8821C SDIO WiFi"
-    ---help---
+       help

Kconfig 修改正确后,在 make kernel_menuconfig 中应该能看到 rtl8821CS 模块, 勾选后可以进行编译错误的解决。

Makefile 修改

大部分 WiFi 驱动为了增强兼容性,驱动中会有一些存放 .h 文件的目录,而在 Makefile 中会引用这些目录,因为版本的差异, 此类目录的引用方法可能不一样。

出错现象:

fatal error: drv_types.h: No such file or directory
17 | #include <drv_types.h>

解决方案:

在 net/wireless/realtek/rtl8821cs/Makefile 中修改如下:

  • 修改引用方式,添加 srctree 前缀
  • 添加额外的目录

-EXTRA_CFLAGS += -I$(src)/include
+EXTRA_CFLAGS += -I$(srctree)/$(src)/include
+EXTRA_CFLAGS += -I$(srctree)/$(src)/hal/phydm
+EXTRA_CFLAGS += -I$(srctree)/$(src)/hal/btc
+EXTRA_CFLAGS += -I$(srctree)/$(src)/platform

Makefile 编译优化:

在 net/wireless/realtek/rtl8821cs/Makefile 中修改如下:

-EXTRA_CFLAGS += -O1
+EXTRA_CFLAGS += -Os

开启配置

Kernel

8821CS:

CONFIG_RTL8821CS=m

wlan:

CONFIG_CFG80211=y
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
CONFIG_RFKILL_GPIO=y

CONFIG_HOSTAP=y
CONFIG_HOSTAP_FIRMWARE=y
CONFIG_HOSTAP_FIRMWARE_NVRAM=y

BT:

CONFIG_SERIAL_DEV_BUS=y
CONFIG_BT_HCIUART_RTL=y
CONFIG_BT_HCIUART_SERDEV=y
CONFIG_BT_HCIUART_3WIRE=y
CONFIG_RFKILL_GPIO=y

Buildroot

BR2_TOOLCHAIN_GLIBC_GCONV_LIBS_COPY=y
BR2_PACKAGE_BLUEZ5_UTILS_OBEX=y
BR2_PACKAGE_BLUEZ5_UTILS_TOOLS=y

busybox:

CONFIG_UDHCPD=y

DTS 配置

T536 的内核设备树中存在 rfkill 节点,该节点内有 wlan 和 bt 子节点:

&rfkill {
compatible = "allwinner,sunxi-rfkill";
chip_en;
power_en;
pinctrl-0;
pinctrl-names;
status = "okay";

/* wlan session */
wlan {
...
};

/* bt session */
bt {
...
};
};

建议检查 WIFI&BT 模块的引脚复用是否正确,是否与其它固件/外设冲突。

WIFI

以下是 WIFI 在内核设备树中的表示:

&rfkill {
...

/* wlan session */
wlan {
compatible    = "allwinner,sunxi-wlan";
clocks        = <&rtc_ccu CLK_DCXO24M_OUT>, <&rtc_ccu CLK_OSC32K_OUT>;
clock-names   = "dcxo24M-out", "osc32k-out";
wlan_power    = "axp2202-dcdc4", "axp2202-bldo1", "axp2202-bldo2"; /* vcc-wifi/vccio-wifi/vcc-pm */
wlan_power_vol= <3300000>, <1800000>, <1800000>;
wlan_busnum   = <0x1>;
wlan_regon    = <&r_pio PM 1 GPIO_ACTIVE_HIGH>;
wlan_hostwake = <&r_pio PM 0 GPIO_ACTIVE_HIGH>;
wakeup-source;
};

/* bt session */
bt {
...
};
};

注意属性 wlan_regon 和 wlan_hostwake,检查它们两的引脚复用是否正确,是否与其它设备冲突。

BlueTooth

以下是 BT 在内核设备树中的表示:

&rfkill {
...

/* wlan session */
wlan {
...
};

/* bt session */
bt {
compatible    = "allwinner,sunxi-bt";
clocks        = <&rtc_ccu CLK_DCXO24M_OUT>, <&rtc_ccu CLK_OSC32K_OUT>;
clock-names   = "dcxo24M-out", "osc32k-out";
bt_power    = "axp2202-dcdc4", "axp2202-bldo1", "axp2202-bldo2"; /* vcc-wifi/vccio-wifi/vcc-pm */
bt_power_vol= <3300000>, <1800000>, <1800000>;
bt_rst_n      = <&r_pio PM 2 GPIO_ACTIVE_LOW>;
};
};

注意属性 bt_rst_n ,检查它的引脚复用是否正确,是否与其它设备冲突。

模组配置文件

蓝牙需要固件文件还有命令 rtk_hciattach,我是从 T507 移植过来的。

问题

发现在 WIFI AP 模式下,Client 无法获取动态 IP 。Client 使用静态 IP 连接成功,说明 WIFI AP 模式是没有问题的。问题就出在于 DHCP Server 。

仅需在 /test_utils/wifi/ap/send_ap.sh 内添加命令 killall dnsmasq即可:

#!/bin/bash

udhcpd_config=udhcpd.conf

ifconfig wlan0 down

killall hostapd
killall wpa_supplicant
killall udhcpd
+ killall dnsmasq

hostapd -B hostapd.conf -f /var/log/hostap.log

ifconfig wlan0 192.168.1.2

dns=`awk '$1=="nameserver" {print $2}' /etc/resolv.conf |tr -c "[0-9]." " "`
sed -i '/^opt\s*dns/d' $udhcpd_config
echo "opt dns  ${dns}" >> $udhcpd_config

#udhcpd -f udhcpd.conf &
udhcpd $udhcpd_config

dnsmasq 是提供DNS缓存和DHCP服务功能的轻量级工具,它和 udhcpd 冲突了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值