目录
1 说明
rtl8723DS是Wi-Fi、蓝牙二合一芯片方案。Wi-Fi支持2.4G频段,支持AP与STA共存的工作模式,使用SDIO接口。蓝牙支持4.2协议,使用UART接口。本文内容来源于调试hi3518ev300的过程中总结的经验。rtl8723DS开发包可咨询供应商或者从百度网盘获取。
链接:https://pan.baidu.com/s/1wqnxBAqXHUU7IQphmYn8LA
提取码:odw5
2 管脚复用
确保时钟使能,管脚复用正确,管脚顺序一一对应。我们由于业务需要,将SDIO1的管脚复用为SPI1功能。直接用SDIO0接WiFi没有调通,根据以往的经验,将SDIO0复用为SDIO1的功能调通了WiFi。下面加以说明。具体的资料包要找供应商获取。
参考Hi3516E V200R001C01SPC011\Hi3516E V200R001C01SPC011\ReleaseDoc\zh\00.hardware\chip\Hi3518EV300\《Hi3518EV300_PINOUT_CN.xlsx》->3.管脚控制寄存器
开机默认功能 | 复用功能1 | 复用功能2 | 管脚控制寄存器 |
SDIO0_CARD_DETECT | GPIO4_7 | XXX | 0x100C005C |
SDIO0_CCLK_OUT | GPIO4_0 | SDIO1_CCLK_OUT | 0x100C0040 |
SDIO0_CCMD | GPIO4_1 | SDIO1_CCMD | 0x100C0044 |
SDIO0_CDATA0 | GPIO4_2 | SDIO1_CDATA3 | 0x100C0048 |
SDIO0_CDATA1 | GPIO4_3 | SDIO1_CDATA2 | 0x100C004C |
SDIO0_CDATA2 | GPIO4_4 | SDIO1_CDATA1 | 0x100C0054 |
SDIO0_CDATA3 | GPIO4_5 | SDIO1_CDATA0 | 0x100C0054 |
himm 0x100c0040 0x1a04
himm 0x100c0044 0x1104
himm 0x100c0048 0x1104
himm 0x100c004c 0x1104
himm 0x100c0050 0x1104
himm 0x100c0054 0x1104
insmod rtl8189fs.ko
himm 0x1002002b 0x28
himm 0x1002002b 0x20
至此,如果驱动正常,则会出现wlan0网络节点(ifconfig -a)。
2.1 可能遇到的错误
出现如“RTW: sdio_power_on_check: 0x100 cmd52 and cmd53 is not the same(index:99). RTW: sdio_power_on_check: fail at cmd52, cmd53.”的问题。原因是双方(wifi模组和hi3518ev300)的DATA0~3脚没有一一对应。
3 移植说明
具体的资料包要找供应商获取。
3.1 编译内核和驱动
相关资料
rtl8723DS_WiFi_linux_v5.6.8_34158.20190625_COEX20190530-3030.tar.gz
Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf
修改内核
将驱动包解压之后拷贝到Hi3516EV200(Hi3518EV300与Hi3516EV200共用开源代码集busybox,uboot,kernel,rootfs)KSRC\drivers\net\wireless并改名字为rtl8723ds。
修改KSRC\drivers\net\wireless\rtl8723ds\Makefile,
CONFIG_PLATFORM_I386_PC = n
CONFIG_PLATFORM_HISILICON = y
ifeq ($(CONFIG_PLATFORM_HISILICON), 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 = arm-himix100-linux-
KSRC := /home/lijun/HiSDK/Hi3516EV200_SDK_V1.0.1.1/osdrv/opensource/kernel/linux-4.9.y
#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 distclean
cp arch/arm/configs/hi3518ev300_full_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- 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’,保存配置。
make ARCH=arm CROSS_COMPILE=arm-himix100-linux-,此命令编译生成多个ko文件,其中有./drivers/net/wireless/rtl8723ds/rtl8723ds.ko,rtl8723ds.ko不能被裁剪,否则会报错。
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage,此命令编译生成可烧录的内核文件。
还可以选择性地将cfg80211被编译进内核,
3.2 使用AP模式
相关资料
rtl8723DS_WiFi_linux_v5.6.8_34158.20190625_COEX20190530-3030.tar.gz
Quick_Start_Guide_for_Driver_Compilation_and_Installation.pdf
移植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,针对目标板(hi3518ev300)更改Makefile、.config,解决编译报错的问题如:../src/drivers/driver_nl80211.c:19:31: fatal error: netlink/genl/genl.h: No such file or directory。
下列两张图,左边为更改之前的内容片段,右边为更改之后的内容片段。
make
生成hostapd、hostapd_cli,将它们拷贝到目标板。
更改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的配置。
make menuconfig
确保Networking Utilities->udhcp server (udhcpd)为’*’,Networking Utilities->udhcp client (udhcpd)为’*’,保存修改
make,在根目录下生成可执行文件busybox
将上述生成的busybox拷贝至板端,cd /bin,执行ln -s busybox udhcpd,ln -s busybox udhcpc,
在板端创建/usr/share/udhcpc(mkdir /usr/share/udhcpc)文件夹,将busybox根目录下examples\udhcp\simple.script文件拷贝至板端 /usr/share/udhcpc,重命名为default.script并增加可执行权限。
动态分配IP地址之内核
进入kernel根目录,修改配置,确保Networking support->Networking options->IP: DHCP support为’*’,参考5.3节,重新编译ko文件,重新编译内核,更换ko、内核。
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix100-linux-,此命令编译生成多个ko文件,
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage,此命令编译生成可烧录的内核
动态获取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: can't open '/var/lib/misc/udhcpd.leases': No such file or directory
创建相应的空目录和空文件,
mkdir -p /var/lib/misc/
touch /var/lib/misc/udhcpd.leases
./hostapd ./rtl_hostapd_2G.conf -B
手机端:
设置DHCP方式获取IP,连接热点(默认密码:87654321)。
可以从busybox根目录下examples/udhcp目录下找到udhcpd.conf
udhcpd.conf示例内容如下:
start 192.168.0.20
end 192.168.0.254
interface wlan0
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。
下列一张图,左边为更改之前的内容片段,右边为更改之后的内容片段。
生成wpa_supplicant、wpa_passphrase、wpa_cli,将它们拷贝到板端。
将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的配置。
make menuconfig
确保Networking Utilities->udhcp server (udhcpd)为’*’,Networking Utilities->udhcp client (udhcpc)为’*’,保存修改
make,在根目录下生成可执行文件busybox
将上述生成的busybox拷贝至板端,cd /bin,执行ln -s busybox udhcpd,ln -s busybox udhcpc,
在板端创建/usr/share/udhcpc(mkdir /usr/share/udhcpc)文件夹,将busybox根目录下examples\udhcp\simple.script文件拷贝至板端 /usr/share/udhcpc,重命名为default.script并增加可执行权限。
动态获取IP地址之内核
进入kernel根目录,修改配置,确保Networking support->Networking options->IP: DHCP support为’*’,参考5.3节,重新编译ko文件,重新编译内核,更换ko、内核。
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- menuconfig
make ARCH=arm CROSS_COMPILE=arm-himix100-linux-,此命令编译生成多个ko文件,
make ARCH=arm CROSS_COMPILE=arm-himix100-linux- uImage,此命令编译生成可烧录的内核
动态获取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)。