STM32MP157驱动开发——Linux WIFI驱动


参考文章:【正点原子】I.MX6U嵌入式Linux驱动开发——Linux WIFI驱动

一、简介

  有线网络在有些场景下会受到网线等因素限制,所以有时候也需要使用 wifi 连接的方式使设备联网。正点原子 STM32MP1 开发板支持 USB 和 SDIO 这两种接口的 WIFI 设备,本节就学习一下如何使用这两种 wifi。

二、驱动开发

原理图:
在这里插入图片描述
正点原子的 STM32MP157 开发板板载了一个 SDIO WIFI,使用的 wifi 芯片为 RTL8723DS。该芯片通过 SDIO 接口进行连接,D0~4 所对应的硬件引脚为:PF0、PF4、PF5 和 PD7,CMD 对应的硬件引脚为 PF1,CLK 所对应的硬件引脚为 PG15。

1.wifi驱动添加与编译

  除了 SDIO 接口的 wifi 设备以外,开发板还支持 USB 接口的 wifi 设备。USB 接口的 wifi 设备使用的控制芯片为 RTL8188EUS,这两个都是 realtek 公司的产品,已经由 realtek 公司提供了 WIFI 驱动源码,所以只需要将 WIFI 驱动源码添加到 Linux 内核中,然后通过图形界面配置,选择将其编译成模块即可。
  正点原子的源码资料中也已经提供了相关的 wifi 驱动,将资料中的 rtl8723ds 目录整个拷贝到 Linux 内核源码目录下的 drivers/net/wireless/realtek/目录中,此目录下存放了所有 realtek 公司的 WIFI 驱动。
在这里插入图片描述
然后修改该目录下的 Kconfig,用于配置图形化界面。在其中加入以下内容:

source "drivers/net/wireless/realtek/rtl8723ds/Kconfig"

在这里插入图片描述
此外,还需要修改该目录下的 Makefile,将驱动文件加入编译。添加以下内容:

obj-$(CONFIG_RTL8723DS) += rtl8723ds/

在这里插入图片描述

2.配置 USB 支持设备

1)配置 USB 支持设备

USB 配置默认已经选中了,在内核源码 menuconfig 的以下路径:
在这里插入图片描述

2)配置支持的 WIFI 设备

在这里插入图片描述

3)配置支持 IEEE 802.11

注:此部分只编译为模块。
在这里插入图片描述

4)使能 STAGING 配置

在这里插入图片描述
配置完以后就可以编译出新的内核镜像 uImage。

3.设备树配置

STM32MP157 开发板的 sdmmc1 用于连接sdcard,sdmmc2用于连接eMMC,sdmmc3则用于连接这里所用到的的WiFi接口。所以还需要添加一个 sdmmc3 节点。
首先配置 sdmmc3 的引脚信息,在 stm32mp15-pinctrl.dtsi 文件中,存在 sdmmc3 的相关引脚配置:
在这里插入图片描述
本节中使用的 RTL8723DS 引脚与官方配置相同,所以不需要修改。

然后还需要配置 sdmmc3 控制器节点信息,在自己的设备树下追加以下节点:

&sdmmc3 {
    
    
	pinctrl-names = "default", "opendrain", "sleep";
	pinctrl-0 = <&sdmmc3_b4_pins_a>;
	pinctrl-1 = <&sdmmc3_b4_od_pins_a>;
	pinctrl-2 = <&sdmmc3_b4_sleep_pins_a>;
	non-removable;
	st,neg-edge;
	bus-width = <4>;
	vmmc-supply = <&v3v3>;
	status = "okay";
	keep-power-in-suspend;
};

注:STM32MP157 有三个SDMMC接口,物理地址分别为0x58005000~0x58005FFF、0x58007000~0x58007FFF 和 0x48004000~0x480043FF。它们的初始化顺序是根据物理地址的顺序:SDMMC3→SDMMC1→SDMMC2。如果三个接口都使能,那么在 Linux 里所对应的操作文件为: /dev/mmcblk0(SDMMC3)、/dev/mmcblk1 (SDMMC1)和 /dev/mmcblk2 (SDMMC2)。在出厂系统中,启动 EMMC 上的文件系统使用的是 mmcblk2,但是在原子哥教程前面讲解系统移植的时候说挂载 EMMC 里面文件系统的时候使用 mmcblk1,那是因为那个时候还没有使能 SDMMC3 这个接口,所以 mmcblk1 就是 EMMC。这两处并不矛盾。

4.编译 wifi 驱动

在内核源码目录下,进入 menuconfig 界面,将 rtl8723ds 和 rtl8188eus 驱动编译成模块。

1)rtl8723ds 驱动配置

在这里插入图片描述

2)rtl8188eus 驱动配置

在这里插入图片描述
然后重新编译出设备树、uImage、驱动模块,就可以用于开发板启动。

make dtbs 		  #重新编译设备树
make modules	  #编译驱动模块

本节配置了三个模块,分别是:IEEE 802.11、rtl8723ds 和 rtl8188eus。所对应的模块名为:cfg8011.ko、8723ds.ko 和 r8188eu.ko。将其拷贝到nfs的对应目录下:

sudo cp drivers/staging/rtl8188eu/r8188eu.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/
sudo cp net/wireless/cfg80211.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/
sudo cp drivers/net/wireless/realtek/rtl8723ds/8723ds.ko ~/linux/nfs/rootfs/lib/modules/5.4.31/

将新编译的设备树文件和内核镜像也拷贝到相应目录下,启动开发板。

三、测试

1.固件拷贝

有些模块需要和固件配合使用,比如 cfg80211.ko 驱动模块需要读取 /lib/firmware/regulatory.db 文件。这个文件在原子哥的源码包中也提供了,直接拷贝即可。除此之外,regulatory.db固件和regulatory.db.p7s固件都是cfg80211.ko模块需要加载的。rtl8188wufw.bin固件是 r8188.ko 模块需要加载的。
在开发板的根目录下创建存放固件的文件夹,然后将固件拷贝进去。

sudo mkdir ~/linux/nfs/rootfs/lib/firmware/rtlwifi -p

在这里插入图片描述

2.RTL8723 SDIO WIFI 驱动测试

进入目录 /lib/modules/5.4.31 中,挂载 8723ds.ko 这个驱动模块:

depmod 		#第一次加载驱动的时候需要运行此命令
modprobe cfg80211.ko 	#先加载 cfg80211.ko, IEEE 协议
modprobe 8723ds.ko 	#RTL8723DS 模块加载 8723ds.ko 模块

挂载成功会出现以下提示:
在这里插入图片描述
输入ifconfig -a命令,查看 wlanX(X=0….n)网卡是否存在,一般都是 wlan0,有多个wifi模块的话可能会出现多个设备文件。
在这里插入图片描述

3.RTL8188EUS USB WIFI 驱动测试

将 RTL8188 USB WIFI 接到开发板上,使用以下命令进行挂载:

depmod
modprobe r8188eu.ko

4.联网测试

首先要给文件系统添加一些操作 WIFI 的工具,进入 buildroot 的menuconfig 界面,使能以下配置:
在这里插入图片描述
然后编译出新的根文件系统,用于启动开发板。
接着就可以使用以下命令进行测试:
ifconfig wlan0 up:打开 wifi 网卡
iwlist wlan0 scanning:扫描当前存在的无线网络(记得接天线)
由于 RTL8723 只支持 2.4G 频段 WIFI,因此扫描不出来 5G 频段 WIFI。

连接wifi:

默认情况下,开发板根文件系统/etc 目录下会有一个名为“wpa_supplicant.conf”的配置文件,如果没有就自行创建一个。然后在该文件中添加wifi配置信息:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=0
update_config=1

network={
    
    
	ssid="[wifi_name]"
	psk="[password]"
}

注:该文件中的 '=' 前后不能有空格
修改完成后,在开发板根文件系统下创建一个 /var/run/wpa_supplicant 目录。wpa_supplicant 工具要用到此目录:

mkdir /var/run/wpa_supplicant -p

接着使用 wpa_supplicant 工具让 RTL8723 SDIO WIFI 连接到热点上:

wpa_supplicant -Dnl80211 -c /etc/wpa_supplicant.conf -i wlan0 &

最后设置 wlan0 的 IP 地址,这里使用 udhcpc 命令从路由器动态获取:

udhcpc -i wlan0

测试:

ping -I [wlan0_ip] www.baidu.com

-I 是指定执行 ping 操作的网卡 IP 地址,这里指定为 wlan0 的ip。

5.USB WIFI模块测试

与上述内容相似,这里就略过了。

猜你喜欢

转载自blog.csdn.net/weixin_45682654/article/details/128540838