1.硬件电路
2.软件准备
2.1.驱动代码
1)首先,我们需要获得驱动程序,一般可以找厂家获得,也可以在 Github Gitee 上找到。
2)检查 platform 文件夹内是否有 platform_ARM_SUNxI_sdio.c 这个接口源码。
如果没有,需要适配到 Tina 平台。主要修改的地方是调用Tina平台提供的上下电,扫卡函数,SDIO 驱动等等。工作量较大建议请专业人士进行移植
3)然后将驱动文件复制进 lichee/linux-5.4/drivers/net/wireless 文件夹内,其实就是内核目录下的路径
2.2.修改脚本
1)编辑 lichee/linux-5.4/drivers/net/wireless/rtl8723ds/Makefile 找到 Platform Related 设置区域,将其他选项全部关闭,只保留 CONFIG_PLATFORM_ARM_SUNxI = y 是开启的。
2)同时找到 Interface 区域,只启用 CONFIG_SDIO_HCI
3)接下来编辑 lichee/linux-5.4/drivers/net/wireless/Kconfig ,增加引索
source "drivers/net/wireless/rtl8723ds/Kconfig"
4)再打开 lichee/linux-5.4/drivers/net/wireless/rtl8723ds/Kconfig 查看对应的 config 符号,可以看到是 RTL8723DS
5)就可以在 lichee/linux-5.4/drivers/net/wireless/Makefile 里增加编译文件夹
obj-$(CONFIG_RTL8723DS) += rtl8723ds/
2.3.添加驱动
1)配置完成,就可以在 make kernel_menuconfig 里找到这个选项了,将其编译为模块。
2)Tina 适配对于wifi固件
上面完成了内核驱动方面的配置,接下来是配置 Tina Linux 侧。由于部分 Wi-Fi 驱动需要文件系统挂载提供固件,所以需要在 Tina Linux 配置完成打包上面编译的驱动模块与固件,同时也要配置自动加载驱动的脚本才能使系统正常运行。
在这之前,我们先检查一下是否提供了 RTL8723DS 的固件,可以在 make menuconfig s搜索是否有 8723DS 的固件存在。没有就自己添加。
可以看到,Tina Linux 提供了 RTL8723DS 的固件,名叫 r8723ds-firmware 可以进行下一步了。
3)修改 Tina-Linux/target/allwinner/t113-evb1/modules.mk 文件(这里的路径根据自己的找到就行),增加 RTL8723DS 这个 kmod 选项。注意,DEPENDS 里包含的固件名称就是上面查找得到的名称。
define KernelPackage/net-rtl8723ds
SUBMENU:=$(WIRELESS_MENU)
TITLE:=RTL8723DS support (staging)
DEPENDS:= +r8723ds-firmware +@IPV6 +@USES_REALTEK
FILES:=$(LINUX_DIR)/drivers/net/wireless/rtl8723ds/8723ds.ko
AUTOLOAD:=$(call AutoProbe,8723ds)
endef
define KernelPackage/net-rtl8723ds/description
Kernel modules for RealTek RTL8723DS support
endef
$(eval $(call KernelPackage,net-rtl8723ds))
4)现在 make menuconfig 进入 Tina Linux 的配置界面,就可以在 Kernel modules > Wireless Drivers 中找到 <*> kmod-net-rtl8723ds… RTL8723DS support (staging),勾选他。
6)最后,还需要启用自动加载驱动的功能,位于 Tina-Linux/target/allwinner/t113-evb1/busybox-init-base-files/etc/init.d/rc.modules ,别忘了注释不需要的驱动。
2.4.设备树适配
与上文相同,注意启用 SDC1 节点与 wlan0节点,配置wlan_busnum、wlan_regon、wlan_hostwake 。由于这里使用的是同款开发板所以不做再次说明,这里直接使用下面的内核设备树。
rfkill: rfkill@0 {
compatible = "allwinner,sunxi-rfkill";
chip_en;
power_en;
pinctrl-0 = <&wlan_pins_a>;
pinctrl-names = "default";
status = "okay";
wlan: wlan@0 {
compatible = "allwinner,sunxi-wlan";
clock-names = "32k-fanout1";
clocks = <&ccu CLK_FANOUT1_OUT>;
wlan_busnum = <0x1>;
wlan_regon = <&pio PG 12 GPIO_ACTIVE_HIGH>;
wlan_hostwake = <&pio PG 10 GPIO_ACTIVE_HIGH>;
/*wlan_power = "VCC-3V3";*/
/*wlan_power_vol = <3300000>;*/
/*interrupt-parent = <&pio>;
interrupts = < PG 10 IRQ_TYPE_LEVEL_HIGH>;*/
wakeup-source;
};
最后编译烧录即可。
3、测试wifi
1)使用ifconfig可以看到wlan0
2)这里需要注意一个问题,由于wpa_supplicant.conf这个文件没有我们的路由器名称和密码,所以需要自己添加一下,路径再Tina-Linux/package/allwinner/wifimanager/files/wpa_supplicant.conf
打开wpa_supplicant.conf
ctrl_interface=/etc/wifi/sockets
#disable_scan_offload=1
#update_config=1
#wowlan_triggers=any
#---------------添加这部分,记得把此注释删掉-----------------
ap_scan=1
network={
ssid="xxx"
psk="xxxxxxxxx"
}
3)重启一下即可,然后重启之后,动态分配一下ip,使用以下命令
udhcpc -i wlan0
4)最后可以是ping一下网络,
ping www.baidu.com
5)注意这里内核会打印一些debug信息,这是wifi驱动里面打开的,自己去驱动代码里面关闭即可。我这里就直接放出来,主要是更改Makefile文件里面的宏控制。
6)如果再使用这个wifi模块的过程中出现以下情况,如图所示:
出现这种问题,只要在驱动代码的os_dep/linux/ioctl_cfg80211.c的rtw_cfg80211_ch_switch_notify这个函数中对结构体struct cfg80211_chan_def_chdef进行初始化就可以了。