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进行初始化就可以了。

在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐