参考
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 冲突了。