目录
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被编译进内核,
保存配置。
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。
下列两张图,左边为更改之前的内容片段,右边为更改之后的内容片段。
make
生成hostapd、hostapd_cli,可以裁剪(arm-himix100-linux-strip)之后将它们拷贝到目标板。
更改rtl_hostapd_2G.conf并拷贝到目标板,下列一张图,左边为更改之前的内容片段,右边为更改之后的内容片段。
使用静态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。
下列一张图,左边为更改之前的内容片段,右边为更改之后的内容片段。
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
./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
此时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命令查看路由信息如下:
推测是没加默认网关导致的,可以手动添加,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)。