> 文章列表 > wifi/BT芯片RTL8723DS驱动移植和测试之一wifi篇

wifi/BT芯片RTL8723DS驱动移植和测试之一wifi篇

wifi/BT芯片RTL8723DS驱动移植和测试之一wifi篇

目录

背景:

1、增加驱动源码:

 2、内核增加配置:

 (1)配置 USB 支持设备  

 (2)配置支持 WIFI 设备    

 (3)配置支持 IEEE 802.11  

 (4)使能 STAGING 配置    

 (5)rtl8723ds 驱动配置    

 (6)rtl8188eus 驱动配置  

3、配置设备树

 4、测试驱动

 (1)固件的拷贝

 (2)加载驱动

5、根文件系统的支持

6、测试联网:

(1)打开 WIFI 网卡:

(2)扫描网络:

(3)联网:

7、设置为热点以及蓝牙的测试(这步是正点教程中没有提到的)

(1)增加buildroot配置,以支持命令 rfkill 和 udhcpd

(2)设置为ap热点模式

(3)测试蓝牙


背景:

开发板是正点原子的STM32MP157,使用buildroot制作的根文件系统。

芯片8723DS的wifi使用sdio接口,蓝牙使用普通串口,但是不是透传的那种,不支持AT指令,而是支持bluez协议栈的。

1、增加驱动源码:

 开发板光盘 A-基础资料→1、程序源码→2、Linux 驱动例程→29_WIFI。这个目录只是存放着 RTL8723DS 这个芯片的wifi驱动源码,RTL8188EUS 是直接使用内核自带的驱动源码即可。
 RTL8723DS是板载wifi驱动,RTL8188EUS是usb外接wifi驱动。
 修改对应的kconfig和makefile。

 2、内核增加配置:

 (1)配置 USB 支持设备
  

  -> Device Drivers -> <*> USB support-> <*> Support for Host-side USB //选中-> <*> EHCI HCD (USB 2.0) support //选中-> <*> OHCI HCD (USB 1.1) support //选中-> <*> ChipIdea Highspeed Dual Role Controller //选中-> [*] ChipIdea device controller-> //选中-> [*] ChipIdea host controller //选中

 (2)配置支持 WIFI 设备
    

-> Device Drivers -> [*] Network device support -> [*] Wireless LAN-> <*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP) //选中 -> [*] Support downloading firmware images with Host AP driver //选中-> [*] Support for non-volatile firmware download //选中

 (3)配置支持 IEEE 802.11
  

 -> Networking support (NET [=y]) -> Wireless (WIRELESS [=y]) -> <M> cfg80211 - wireless configuration API //编译成模块

这里编译进内核也可。

 (4)使能 STAGING 配置
    

-> Device Drivers-> [*] Staging drivers //选中

 (5)rtl8723ds 驱动配置
    

-> Device Drivers -> Network device support (NETDEVICES [=y]) -> Wireless LAN (WLAN [=y]) -> Realtek devices (WLAN_VENDOR_REALTEK [=y])-> <M> Realtek 8723D SDIO or SPI WiFi //编译为模块

这里编译进内核也可。

 (6)rtl8188eus 驱动配置
  

 -> Device Drivers -> Staging drivers (STAGING [=y])-> <M> Realtek RTL8188EU Wireless LAN NIC driver

3、配置设备树

stm32mp157d-atk.dts内追加内容:

&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;};

 4、测试驱动

 (1)固件的拷贝

 有 些 模 块 是 需 要 固 件 配 合 使 用 的 , 比 如 cfg80211.ko 驱 动 模 块 要 读 取/lib/firmware/regulatory.db 文件。
 开发板光盘 A-基础资料→1、程序源码→2、Linux 驱动例程→29_WIFI路径下有文件regulatory.db regulatory.db.p7s和rtl8188wufw.bin
 regulatory.db固件和regulatory.db.p7s固件都是cfg80211.ko模块需要加载的。rtl8188wufw.bin固件是 r8188.ko 模块需要加载的。

 (2)加载驱动

 insmod cfg80211.koinsmod 8723ds.koinsmod r8188eu.ko   //测试无法生成wlan1,和教程不符

此时config -a下生成wlan0网卡。

5、根文件系统的支持

buildroot增加新配置,重新编程生成根文件系统。

→ Target packages → Networking applications→ [*] wireless tools //选中→[*] Install shared library //选中→ [*] wpa_supplicant //选中→ [*] Enable nl80211 support //选中→[*] Enable AP mode //选中→ [*] Enable Wi-Fi Display //选中→ [*] Enable mesh networking //选中→ [*] Enable autoscan //选中→ [*] Enable EAP //选中→ [*] Enable HS20 //选中→ [*] Enable syslog support //选中→ [*] Enable WPS //选中→ [*] Enable WPA3 support //选中→ [*] Install wpa_cli binary //选中→ [*] Install wpa_client shared library //选中→ [*] Install wpa_passphrase binary //选中→ [*] Enable support for the DBus control interface //选中→ [*] Introspection support //选中

6、测试联网:

新的根文件系统会有命令iwlist:
iwlist --help

(1)打开 WIFI 网卡:

 ifconfig wlan0 up

(2)扫描网络:

iwlist wlan0 scanning

(3)联网:

默认情况下,开发板根文件系统/etc 目录下会有一个名为“wpa_supplicant.conf”的配置文件。

ctrl_interface=/var/run/wpa_supplicant
ap_scan=1network={ssid="daring"psk="12345678"
}

ssid是wifi名称,psk是密码
连接wifi:

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

学ip:

udhcpc -i wlan0
ping www.baidu.com

此时可能ping不通,原因是路由不对。用route命令可以看到defualt路由有多条。
先route del default,再重新学习ip,用route看看第一条default是不是wlan0,如果不是,再执行一遍route del,再ping

7、设置为热点以及蓝牙的测试(这步是正点教程中没有提到的)

教程没有提如果测试ap和蓝牙,我用《【正点原子】STM32MP157快速体验V1.6.pdf》中提到了脚本(atk-bluetooth-init.sh、alientek_sdio_wifi_setup.sh)和执行文件(rtk_hciattach),复制到我的根文件系统中。
查看脚本atk-bluetooth-init.sh发现,测试蓝牙需要命令服务管理命令systemctl,查看脚本alientek_sdio_wifi_setup.sh发现wifi设置为热点模式需要命令rfkilludhcpd,幸好这两个命令在buildroot中可以选配。alientek_sdio_wifi_setup.sh还需要支持命令ps -aux,其实当前根文件系统中ps不支持选项u和x,我们可以修改这个脚本alientek_sdio_wifi_setup.sh,将其改为ps -A。执行文件rtk_hciattach是正点提供的,也是wifi设置热点使用的,我直接照搬。

(1)增加buildroot配置,以支持命令 rfkill 和 udhcpd

在buildroot下make busybox-menuconfig:

Networking Utilities-->udhcpd(21 kb)

    

Miscellaneous Utilities-->rfkill (4.4 kb)

(2)设置为ap热点模式

ifconfig wlan0 up
source ./alientek_sdio_wifi_setup.sh -m softap -d wlan0

此时报错: udhcpd: /etc/udhcpd.conf: No such file or directory
busybox中的udhcpd命令确实没有在/etc下生成文件udhcpd.conf,既然如此,我就新建一个同名文件并增加内容:

interface wlan0
lease_file /var/lib/misc/udhcpd.leases
opt subnet 255.255.255.0
opt router 192.168.1.1
opt dns 192.168.1.1 114.114.114.114
opt wins 192.168.1.1
start 192.168.1.2
end 192.168.1.253
max_leases 252
option lease 86400

其中/var/lib/misc/udhcpd.leases就是脚本alientek_sdio_wifi_setup.sh 通过touch命令生成的文件。由于脚本alientek_sdio_wifi_setup.sh指定的wlan0的ip是192.168.1.38,所以上述文件内都是192.168.1的网段。
重启开发板,重复上述操作,果然生成热点了,pc可以连接这个热点,通过ssh登陆到开发板中。

(3)测试蓝牙

./atk-bluetooth-init.sh

报错: ./atk-bluetooth-init.sh: line 25: systemctl: not found
没有命令systemctl怎么办呢?
buildroot中可以选择启动方式,busybox或者是systemd,必须二选一,busybox中有很多常用命令,不可缺少!!
systemctl是systemd其中一个主要的命令,或者使用service命令来代替systemctl,但是这两者都不可得。并且systemctl比service命令更好。
目前有个方案:在buildroot中选择systemd,这样systemctl命令就好了,没有busybox怎么办呢?在生成的根文件系统中编译移植busybox源码,并将生成的执行文件复制到根文件系统中,这样两者都兼得了!!!

所以在修改了buildroot之后,下文再介绍如何移植测试蓝牙功能。