在rk3399平台移植rtl8723DS(Wi-Fi篇)

目录

1 说明

2 移植说明

2.1 编译内核和驱动

3.2 使用AP模式

3.3 使用STA模式

4 重启wlan0


1 说明

rtl8723DS是Wi-Fi、蓝牙二合一芯片方案。Wi-Fi支持2.4G频段,支持AP与STA共存的工作模式,使用SDIO接口。蓝牙支持4.2协议,使用UART接口。本文内容来源于调试广州眺望电子科技有限公司rk3399开发板的过程中总结的经验。本文涉及的wifi模块和开发包购买自深圳市必联电子有限公司。rtl8723DS开发包可咨询供应商或者从百度网盘获取。

链接:https://pan.baidu.com/s/1wqnxBAqXHUU7IQphmYn8LA

提取码:odw5

2 移植说明

具体的资料包要找供应商获取。下文说明AP和STA共存(也可以只使用一个)使用的移植过程。在使用过程中注意网络节点的对应关系,官方文档推荐wlan0工作在STA模式,wlan1工作在AP模式。

2.1 编译内核和驱动

相关资料

rtl8723DS_WiFi_linux_v5.6.8_34158.20190625_COEX20190530-3030.tar.gz

Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf

修改内核

将驱动包解压之后拷贝KSRC\drivers\net\wireless并改名字为rtl8723ds,KSRC为内核路径。

修改KSRC\drivers\net\wireless\rtl8723ds\Makefile,

CONFIG_PLATFORM_I386_PC = n

增加如下内容:

CONFIG_PLATFORM_RK3399 = y

ifeq ($(CONFIG_PLATFORM_RK3399), y)

EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN -DCONFIG_PLATFORM_HISILICON -DCONFIG_CONCURRENT_MODE

#CONFIG_CONCURRENT_MODE宏支持STA和AP可共存

ARCH := arm

EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT

CROSS_COMPILE = /home/lijun/rk3399-linux/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu-

KSRC := /home/lijun/rk3399-linux/kernel/

#KSRC以实际环境而变

MODULE_NAME := rtl8723ds

#MODULE_NAME可任意命名

endif

修改KSRC\drivers\net\wireless\Makefile,

增加一行内容:obj-$(CONFIG_RTL8723DS) += rtl8723ds/,其中rtl8723ds即为驱动包的名字,CONFIG_RTL8723DS中的RTL8723DS参考于驱动包中的Kconfig文件中的”config RTL8723DS”行。

修改内核根目录\drivers\net\wireless\Kconfig,

增加一行内容:source "drivers/net/wireless/rtl8723ds/Kconfig",其中rtl8723ds即为驱动包的名字。

编译内核和驱动

cd KSRC,KSRC为内核根目录

make menuconfig

确保Device Drivers->Network device support为’*’,Device Drivers->Network device support-> Wireless LAN (NEW)为’*’,Device Drivers->Network device support-> Wireless LAN (NEW)->Realtek 8723D SDIO or SPI WiFi (NEW)为’M’,将cfg80211被编译进内核,

在rk3399平台移植rtl8723DS(Wi-Fi篇)

保存配置。

cd .. && ./build.sh,此命令编译生成多个ko文件,其中有./drivers/net/wireless/rtl8723ds/rtl8723ds.ko(rtl8723ds.ko不能被裁剪,否则会报错),在rockdev目录生成update包。

3.2 使用AP模式

移植libnl

从官网http://www.infradead.org/~tgr/libnl/files/下载libnl-3.2.24.tar.gz。解压libnl压缩包(tar xzf libnl-3.2.24.tar.gz),创建/home/lijun/libnl_install(mkdir libnl_install),进入解压之后的目录,

./configure --prefix=/home/lijun/libnl_install CC=arm-himix100-linux-gcc --host=arm-linux-uclibceabi

make

make install

将/home/lijun/libnl_install/lib下的库文件拷贝到目标板。

cp -d libnl-3.so.200.19.0 /lib/

cp -d libnl-3.so.200 /lib/

cp -d libnl-3.so /lib/

cp -d libnl-cli-3.so.200.19.0 /lib/

cp -d libnl-cli-3.so.200 /lib/

cp -d libnl-cli-3.so /lib/

cp -d libnl-genl-3.so.200.19.0 /lib/

cp -d libnl-genl-3.so.200 /lib/

cp -d libnl-genl-3.so /lib/

cp -d libnl-idiag-3.so.200.19.0 /lib/

cp -d libnl-idiag-3.so.200 /lib/

cp -d libnl-idiag-3.so /lib/

cp -d libnl-nf-3.so.200.19.0 /lib/

cp -d libnl-nf-3.so.200 /lib/

cp -d libnl-nf-3.so /lib/

cp -d libnl-route-3.so.200.19.0 /lib/

cp -d libnl-route-3.so.200 /lib/

cp -d libnl-route-3.so /lib/

移植hostapd

解压wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz并进入hostapd,针对目标板(rk3399)更改Makefile、.config,解决编译报错的问题如:../src/drivers/driver_nl80211.c:19:31: fatal error: netlink/genl/genl.h: No such file or directory。

下列两张图,左边为更改之前的内容片段,右边为更改之后的内容片段。

在rk3399平台移植rtl8723DS(Wi-Fi篇)

在rk3399平台移植rtl8723DS(Wi-Fi篇)

make

生成hostapd、hostapd_cli,可以裁剪(arm-himix100-linux-strip)之后将它们拷贝到目标板。

更改rtl_hostapd_2G.conf并拷贝到目标板,下列一张图,左边为更改之前的内容片段,右边为更改之后的内容片段。

在rk3399平台移植rtl8723DS(Wi-Fi篇)

使用静态IP连接热点

大致过程如下,

板端:

insmod rtl8723ds.ko

ifconfig wlan0 up

ifconfig wlan0 192.168.0.1

./hostapd ./rtl_hostapd_2G.conf -B

手机端:

设置静态IP方式,如IP:192.168.0.11,路由器:192.168.0.1,DNS:8.8.8.8,连接热点(默认密码:87654321)。

动态分配IP地址之busybox

busybox中的udhcpc能实现自动获取IP地址的功能,修改busybox的配置。

cd buildroot

make busybox-menuconfig

确保Networking Utilities->udhcpd (DHCP server)为’*’,保存修改

make busybox-update-config

cd ..

./build.sh buildroot

./build.sh

在rockdev目录生成update包。

动态分配IP地址之内核

cd kernel

make menuconfig,确保Networking support->Networking options->IP: DHCP support为’*’

cd ..

./build.sh

在rockdev目录生成update包。

动态获取IP连接热点

大致过程如下,

板端:

insmod rtl8723ds.ko

ifconfig wlan0 up

ifconfig wlan0 192.168.0.1

udhcpd ./udhcpd.conf

使用ps aux | grep ‘udhcpd’确定udhcpd是否执行成功,如果找不到则执行udhcpd ./udhcpd.conf -f,

udhcpd ./udhcpd.conf -f 可能遇到的问题:

udhcpd: can't open '/var/lib/misc/udhcpd.leases': No such file or directory

创建相应的目录和文件,

mkdir -p /var/lib/misc/

touch /var/lib/misc/udhcpd.leases

udhcpd ./udhcpd.conf -f 可能遇到的问题:

udhcpd: bind: Address already in use

解决办法:

ps aux,找出dnsmasq进程并杀掉(或者直接killall dnsmasq)

./hostapd ./rtl_hostapd_2G.conf -B

手机端:

设置DHCP方式获取IP,连接热点(默认密码:87654321)。

可以从buildroot/package/busybox/examples/udhcp目录下找到udhcpd.conf

udhcpd.conf示例内容如下:

start           192.168.0.20

end             192.168.0.254

interface wlan1

opt     dns     8.8.8.8 192.168.0.1

option  subnet  255.255.255.0

opt     router  192.168.0.1

option  dns     114.114.114.114 # appended to above DNS servers for a total of 3

3.3 使用STA模式

相关资料

wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz

wpa_cli_with_wpa_supplicant.pdf

Wireless_tools_porting_guide.pdf

移植libnl

和使用AP模式->移植libnl的描述一样,如果已经移植则可以忽略。

移植wpa_supplicant

解压wpa_supplicant_8_kk_4.4_rtw_r25669.20171213.tar.gz并进入wpa_supplicant,针对目标板(hi3518ev300)更改.config,解决编译报错的问题如:../src/drivers/driver_nl80211.c:19:31: fatal error: netlink/genl/genl.h: No such file or directory。

下列一张图,左边为更改之前的内容片段,右边为更改之后的内容片段。

在rk3399平台移植rtl8723DS(Wi-Fi篇)

make CC=/home/lijun/rk3399-linux/buildroot/output/rockchip_rk3399/host/bin/aarch64-buildroot-linux-gnu-gcc

生成wpa_supplicant、wpa_passphrase、wpa_cli,可以裁剪(aarch64-buildroot-linux-gnu-strip)之后将它们拷贝到板端。

将wpa_0_8.conf(不需要改动)拷贝到板端。

接入WiFi热点

加载驱动,进入相应可执行文件和配置文件存放目录,

ifconfig wlan0 up

./wpa_supplicant -B -cwpa_0_8.conf -iwlan0,wpa_0_8.conf文件无需更改

./wpa_cli -p/var/run/wpa_supplicant scan,扫描当前环境的无线局域网络热点(确定pairwise、group字段)

./wpa_cli -p/var/run/wpa_supplicant scan_results

在rk3399平台移植rtl8723DS(Wi-Fi篇)

./wpa_cli -iwlan0 add_network

./wpa_cli -iwlan0 set_network 0 ssid '"Wondfo-zhong"',无线路由器的SSID为"Wondfo-zhong"

./wpa_cli -iwlan0 set_network 0 key_mgmt WPA-PSK,可省略

./wpa_cli -iwlan0 set_network 0 psk '"meiyoumima"',无线路由器的连接密码为"meiyoumima"

./wpa_cli -iwlan0 set_network 0 pairwise CCMP,可省略

./wpa_cli -iwlan0 set_network 0 group CCMP,可省略

./wpa_cli -iwlan0 set_network 0 proto WPA,可省略

./wpa_cli -iwlan0 enable_network 0

 在rk3399平台移植rtl8723DS(Wi-Fi篇)

此时WiFi模组已经连上热点,但还未分配有效IP地址,可以先手动指定一个,

ifconfig wlan0 192.168.1.246 netmask 255.255.255.0

route add default gw 192.168.1.1

ping 14.215.177.38,14.215.177.38为www.baidu.com的IP地址

此时可以验证WiFi模块网络功能正常

增加域名解析文件

上述步骤中不能成功执行ping www.baidu.com,需要增加域名解析文件,

echo nameserver 114.114.114.114 > /etc/resolv.conf

此时可以正常执行ping www.baidu.com

动态获取IP地址之busybox

busybox中的udhcpc能实现自动获取IP地址的功能,修改busybox的配置。

cd buildroot

make busybox-menuconfig

确保Networking Utilities->udhcp client (udhcpc)为’*’,保存修改

cd ..

./build.sh buildroot

./build.sh

在rockdev目录生成update包。

在板端创建/usr/share/udhcpc(mkdir /usr/share/udhcpc)文件夹,将buildroot/package/busybox目录下udhcpc.script文件拷贝至板端 /usr/share/udhcpc,重命名为default.script并增加可执行权限。

动态获取IP地址之内核

cd kernel

make menuconfig,确保Networking support->Networking options->IP: DHCP support为’*’。

cd ..

./build.sh

在rockdev目录生成update包。

动态获取IP地址之udhcpc

现在可以使用udhcpc -i wlan0自动获取IP地址并且不用执行手动增加域名解析服务器的操作。

4 重启wlan0

执行ifconfig wlan0 down之后即关闭了wlan0,此时想重新启用wlan0,执行ifconfig wlan0 up之后发现不能ping通www.baidu.com,route命令查看路由信息如下:

在rk3399平台移植rtl8723DS(Wi-Fi篇)

推测是没加默认网关导致的,可以手动添加,route add default gw 192.168.1.1,此时可以ping通www.baidu.com;另外udhcpc程序会自动帮助添加网关,所以可以在down wlan0(ifconfig wlan0 down)之前kill掉udhcpc(ps aux | grep "udhcpc" | grep -v "grep" | awk '{print $1}' | xargs kill -9),在up wlan0(ifconfig wlan0 up)之后再执行udhcpc(udhcpc -i wlan0)。

上一篇:VS-RK3399嵌入式开发板QT下wifi 移植方法


下一篇:__Rockchip专栏文章导航与优秀笔记整理(2021.09.15更新)