1)实验平台:正点原子ATK-DLRK3568开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
第四十一章 Linux wifi驱动实验
WIFI的使用已经很常见了,手机、平板、汽车等等,虽然可以使用有线网络,但是有时候很多设备存在布线困难的情况,此时WIFI就是一个不错的选择。正点原子ATK-DLRK3568开发板支持SDIO接口的WIFI,本章我们就来学习一下如何在ATK-DLRK3568开发板上使用SDIO接口WIFI。
41.1 硬件原理图分析
正点原子的ATK-DLRK3568开发板板载了SDIO WIFI使用芯片是RTL8852BS 芯片,原理图如下所示:
图41.1 RTL8852BS原理图
从图41.1.1中可以看出,板载的WIFI为SDIO接口,D0~4所对应的硬件引脚为:GPIO3_C6、GPIO3_C7、GPIO3_D0和GPIO3_D1,CMD对应的硬件引脚为GPIO3_D2,CLK所对应的硬件引脚为GPIO3_D3。
41.2 WIFI驱动添加与编译
正点原子的ATK-DLRK3568开发板目前支持SDIO接口的WIFI。WIFI驱动不需要我们编写,因为realtek公司提供了WIFI驱动源码,因此我们只需要将WIFI驱动源码添加到Linux内核中,然后通过图形界面配置,选择将其编译成模块即可。
正点原子的ATK-DLRK3568开发板上有一个板载RTL8852BS WIFI,接口为SDIO。RTL8852BS芯片是WIFI和蓝牙二合一,这一章只讲解WIFI。正点原子ATK-DLRK3568开发板上的RTL8852BS模组的封装形式的,如下图图41.2.1 RTL8852BS板载SDIO WIFI所示:
图41.2.1 RTL8852BS板载SDIO WIFI
41.2.1向Linux内核添加WIFI驱动
在正点原子提供rk3568 linux sdk源码里,就有这个RTL8852BS驱动,不用我们去添加这个驱动,现在我们来看看这个驱动在哪个位置。
RTL8852BS源码不在kernel目录下,而是在SDK顶层目录下的external/rkwifibt/realtek/RTL8852BS,我们可以看到除了RTL8852BS这个驱动还有其他型号的WIFI驱动。详细如下图图41.2.1所示。
图41.2.1.1 RTL8852BS源码目录
那么它不在kernel目录下,我们如何编译它呢?答案就是buildroot。使能环境变量,选择开发板配置后,输入make menuconfig,配置buildroot编译项,默认正点原子已经选上RTL8852BS驱动。Buildroot配置项为Target packages → Rockchip BSP packages → rkwifibt。如下图图41.2.1.2所示。
图41.2.1.2选中RTL8852BS驱动编译
我们知道内核驱动模块编译是依赖内核的,所以配置Buildroot编译项后,需要编译内核,后再编译buildroot才会编译内核驱动模块。默认我们执行build.sh就已经全部编译。并且内核驱动模块已经安装在Builroot根文件系统的/system/lib/modules/8852bs.ko下。开机通过/etc/init.d/S36load_wifi_modules脚本自动加载。
41.2.2设置树配置
1、pinctrl的配置
首先肯定是sdmmc2引脚配置信息,打开rk3568-pinctrl.dtsi,找到如下所示内容:
示例代码41.2.2.1 sdmmc2引脚配置
1 sdmmc2 {
2 /omit-if-no-ref/
3 sdmmc2m0_bus4: sdmmc2m0-bus4 {
4 rockchip,pins =
5 /* sdmmc2_d0m0 */
6 <3 RK_PC6 3 &pcfg_pull_up_drv_level_2>,
7 /* sdmmc2_d1m0 */
8 <3 RK_PC7 3 &pcfg_pull_up_drv_level_2>,
9 /* sdmmc2_d2m0 */
10 <3 RK_PD0 3 &pcfg_pull_up_drv_level_2>,
11 /* sdmmc2_d3m0 */
12 <3 RK_PD1 3 &pcfg_pull_up_drv_level_2>;
13 };
14
15 /omit-if-no-ref/
16 sdmmc2m0_clk: sdmmc2m0-clk {
17 rockchip,pins =
18 /* sdmmc2_clkm0 */
19 <3 RK_PD3 3 &pcfg_pull_up_drv_level_2>;
20 };
21
22 /omit-if-no-ref/
23 sdmmc2m0_cmd: sdmmc2m0-cmd {
24 rockchip,pins =
25 /* sdmmc2_cmdm0 */
26 <3 RK_PD2 3 &pcfg_pull_up_drv_level_2>;
27 };
28
29 /omit-if-no-ref/
30 sdmmc2m0_det: sdmmc2m0-det {
31 rockchip,pins =
32 /* sdmmc2_detm0 */
33 <3 RK_PD4 3 &pcfg_pull_up>;
34 };
35
36 /omit-if-no-ref/
37 sdmmc2m0_pwren: sdmmc2m0-pwren {
38 rockchip,pins =
39 /* sdmmc2m0_pwren */
40 <3 RK_PD5 3 &pcfg_pull_none>;
41 };
......
43 }
示例代码42.2.2.1中就是sdmmc2的默认引脚配置,这个是RK官方根据自己的EVK开发板编写的,和正点原子ATK-DLRK3568开发板上的SDMMC2引脚一样,所以不需要修改!
2、sdmmc2控制器节点信息
打开rk3568.dtsi文件,找到名为“sdmmc2”的节点,内容如下:
示例代码41.2.2.2 sdmmc2节点
1 sdmmc2: dwmmc@fe000000 {
2 compatible = "rockchip,rk3568-dw-mshc",
3 "rockchip,rk3288-dw-mshc";
4 reg = <0x0 0xfe000000 0x0 0x4000>;
5 interrupts = <GIC_SPI 100 IRQ_TYPE_LEVEL_HIGH>;
6 max-frequency = <150000000>;
7 clocks = <&cru HCLK_SDMMC2>, <&cru CLK_SDMMC2>,
8 <&cru SCLK_SDMMC2_DRV>, <&cru SCLK_SDMMC2_SAMPLE>;
9 clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
10 fifo-depth = <0x100>;
11 resets = <&cru SRST_SDMMC2>;
12 reset-names = "reset";
13 status = "disabled";
14 };
示例代码41.2.2.2中的sdmmc2节点不需要我们修改,这里只是告诉大家sdmmc2完整节点信息。从第13行可以看出,sdmmc2设备默认是关闭的。
3、使能sdmmc2节点
打开rk3568-atk-evb1-ddr4-v10.dtsi文件,用追加代码的方式去使能sdmmc2节点,追加的内容如下所示:
示例代码41.2.2.3 要追加的sdmmc3节点
1 &sdmmc2 {
2 max-frequency = <150000000>;
3 supports-sdio;
4 bus-width = <4>;
5 disable-wp;
6 cap-sd-highspeed;
7 cap-sdio-irq;
8 keep-power-in-suspend;
9 mmc-pwrseq = <&sdio_pwrseq>;
10 non-removable;
11 pinctrl-names = "default";
12 pinctrl-0 = <&sdmmc2m0_bus4 &sdmmc2m0_cmd &sdmmc2m0_clk>;
13 sd-uhs-sdr104;
14 status = "okay";
15};
示例代码41.2.2.3给sdmmc2节点追加了pinctrl配置和使能了sdmmc2。
41.3 WIFI联网测试
41.3.1 buildroot WIFI工具配置
首先要给文件系统添加一些操作WIFI的工具。进入buildroot源码目录里,接着运行“make menuconfig”进入图形配置界面,配置如下:
Target packages
Networking applications
[] wireless tools //选中
[] Install shared library //选中
[] wpa_supplicant //选中
[] Enable nl80211 support //选中
[] Enable AP mode //选中
[] Enable autoscan //选中
[] Enable EAP //选中
[] Install wpa_cli binary //选中
[] Install wpa_client shared library //选中
[] Install wpa_passphrase binary //选中
配置完成如图41.3.1.1所示:
图41.3.1.1 buildroot WIFI工具配置
正点原子提供的出厂固件已经默认勾选,所以读者亲自勾选,这里笔者只是演示我们配置了哪些buildroot编译项目。
41.3.2 RTL8852BS SDIO WIFI联网测试
connmanctl 是一个用于管理网络连接的命令行工具,它通常用于 Linux 操作系统中。它是一个与 ConnMan(Connection Manager)守护进程一起工作的客户端工具。ConnMan 是一个轻量级的网络管理器,旨在提供简单而灵活的方式来管理不同类型的网络连接,如有线、Wi-Fi、蓝牙等。本实验我们就使用这个connmanctl来连接我们的SDIO WIFI。connmanctl底层依赖我们上一小节勾选的wpa_supplicant,其他WIFI工具请自行测试。
使用出厂buildroot linux系统开机查看LOG信息,我们可以看到WIFI驱动已经加载,如下图41.3.2.1所示。
图41.3.2.1 WIFI驱动打印信息
查看connmanctl指令用法,输入connmanctl -h。如下图41.3.2.2所示。
图41.3.2.1 WIFI驱动打印信息
我们可以使用下面指令来连接wifi。
connmanctl #进入WIIF操作终端
connmanctl> enable wifi #使能WIFI,默认已经使能
connmanctl> agent on #开启代理
connmanctl> scan wifi #开启WIFI扫描,可以多次扫描
connmanctl> services #列出扫描到的WIFI列表
扫描的WIFI结果如下图。
图41.3.2.2 扫描出的热点信息
从扫描到WIFI列表中,使用connect XXXX进行连接,再输入密码按回车确认。比如笔者要连接“ALIENTEK-YY”,(注意由于IOS手机热点兼容性问题,可能会连接不上IOS手机发出的热点)运行结果如下命令:
connect wifi_58374488c7b4_414c49454e54454b2d5959_managed_psk #连接
exit #退出终端
图41.3.2.3 连上热点
查看wlan0获取的ip地址,输入ifconfig。获取的IP地址如下。
图41.3.2.4 连上热点
可以通过电脑ping一下wlan0的192.168.3.54这个IP地址,如果能ping通就说明RTL8852BS SDIO WIFI 工作正常。也可以直接在开发板上使用 wlan0 来 ping 一下百度网站,输入如下命令:
ping -I 192.168.3.54 www.baidu.com
-I 是指定执行 ping 操作的网卡 IP 地址,我们要使用 wlan0 去 ping 百度网站,因此要通过“-I”指定 wlan0 的 IP 地址。如果 WIFI 工作正常的话就可以 ping 通百度网站,如图 43.3.2.5所示:
图43.3.2.5 百度网站 ping 成功
至此 RTL8852BS SDIO WIFI 我们就完全驱动起来了,大家就可以使用 WIFI 来进行网络通信了。更多WIFI模式,请查看光盘资料\10、用户手册\01、测试文档\01【正点原子】ATK-DLRK3568_Buildroot系统快速体验手册第3.10小节。