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

本文详细介绍了在STM32MP157开发板上添加WIFI和蓝牙驱动的步骤,包括增加驱动源码、内核配置、设备树设置、固件拷贝、加载驱动、根文件系统支持、联网测试以及设置热点和蓝牙功能。在过程中,遇到了rootfs挂载失败的问题,分析原因是内核加载驱动与创建/dev路径的时序冲突,并提出了将驱动编译为KO文件后加载的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

背景:

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)测试蓝牙

8、新增wifi驱动导致rootfs挂载失败(于2023.4.26增)

原因:

解决方案:


背景:

开发板是正点原子的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.ko
 insmod 8723ds.ko
 insmod 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=1

network={
  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之后,下文再介绍如何移植测试蓝牙功能   2023.4.15。

8、新增wifi驱动导致rootfs挂载失败(于2023.4.26增)

我不想命令加载cfg80211.ko和8723ds.ko驱动模块,而是直接编译到内核里了,结果根文件系统进不去,起不来。

事情的来龙去脉是这样的:

我在平时开发时,内核通过tftp加载,根文件系统通过nfs挂载,cfg80211.ko和8723ds.ko编辑进内核并没有问题。当我把这样的内核和文件系统通过STM32CubeProgrammer烧录到emmc后,系统便很难进去了。

一开始,我以为是内核有问题,然后我用这样的配置---“tftp加载内核+emmc加载rootfs”,发现根文件系统依然进不去,接着又用这样的配置启动---“emmc加载内核+nfs挂载rootfs”,发现每次都能进入系统。上述所说进不去系统,不是每次都进不去,有一两次成功进去过。

每次进不去的报错有两种:

(1)VFS: Cannot open root device "mmcblk2p3" or unknown-block(179,3): error -6
[    4.264640] Please append a correct "root=" boot option; here are the available partitions:
.............................................
driver: mmcblk
[    4.378045] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,3)

error -6对应 -ENXIO错误  表示No such device or address

(2)VFS: could not find a valid V7 on mmcblk1p3

关于这两种错误,我在网上搜索了很多解决方案,都无用。为了解决问题,我甚至研究了devtmpfs的原理,在结合内核的修改我大致猜到了原因:

原因:

开发板加载内核之时,通过devtmpfs的方式为系统添加了虚拟的/dev路径,为的是引导mount rootfs,但是由于驱动cfg80211和8723ds内置在内核里,导致内核加载驱动和添加/dev路径这两个行为发生冲突,我猜测和时序有关,这两个行为只有某一种先执行才能正确挂载rootfs,而这种情况很少出现,cfg80211和8723ds的加载导致rootfs挂载失败。那么为什么通过nfs挂载rootfs便没有问题。我认为是因为当使用nfs服务挂载rootfs时,devtmpfs的引导作用就不大了,因为内核已经明确知道通过nfs挂载rootfs了。

解决方案:

cfg80211和8723ds都编译成ko文件,不要放到内核中,系统起来后通过自定义脚本加载这两个ko。

<think>好的,用户需要关于全志T113_i芯片在Linux环境下移植蓝牙驱动并进行功能测试的技术总结概要。首先,我需要回顾一下全志T113_i的相关资料已有的驱动移植案例。 根据引用[1],全志T113的RTC驱动移植流程中,提到了内核文档中的设备树绑定说明。这说明在移植外设驱动时,设备树节点的正确配置是关键步骤。同样,蓝牙驱动移植可能也需要类似的步骤,比如修改设备树、配置内核驱动等。 引用[2]中提到,应用开发中可以借鉴成熟的驱动例程,遇到问题应多方求助。因此,在蓝牙驱动移植过程中,参考现有的蓝牙驱动实现,如Linux内核中的标准蓝牙协议栈(如BlueZ)或全志提供的参考代码,会是有效的方法。此外,可能需要依赖社区资源或全志的技术支持来解决潜在问题。 引用[3]提供了全志T113-i的芯片资料链接,这可能是获取硬件相关信息的必要来源,比如芯片的GPIO配置、UART或SDIO接口用于蓝牙模块的连接方式等。需要确认蓝牙模块的硬件接口类型(如UART、USB、SDIO),并在设备树中正确配置对应的引脚控制器。 接下来,思考技术总结的结构。通常应包括硬件环境准备、内核配置与驱动移植、设备树修改、功能测试步骤、问题排查等部分。需要确保每个步骤都符合Linux驱动开发的标准流程,并结合全志芯片的具体情况。 可能的挑战包括:蓝牙模块的兼容性、内核配置选项的依赖关系、设备树节点编写的正确性,以及测试过程中可能出现的协议栈问题。需要参考类似驱动(如RTC驱动)的移植经验,确保驱动加载硬件识别正常。 最后,生成相关问题时要围绕蓝牙驱动移植的扩展内容,如调试工具、协议栈配置、功耗优化多模块共存问题,这些都是实际开发中可能遇到的后续步骤。</think>### 全志T113_i芯片 Linux蓝牙驱动移植测试技术总结概要 #### 1. **硬件环境准备** - **蓝牙模块选型**:确认使用的蓝牙芯片型号(如RTL8723DS、BCM43438等),需与Linux内核驱动兼容[^1]。 - **接口配置**:根据硬件设计,确定蓝牙模块与T113_i的连接方式(如UART、SDIO或USB),并在设备树中配置对应引脚复用时钟。 #### 2. **内核驱动配置** - **启用蓝牙协议栈**:通过`make menuconfig`启用内核蓝牙子系统(`CONFIG_BT`)、协议支持(如`CONFIG_BT_HCIUART`)及芯片专用驱动[^2]。 - **设备树节点添加**:参考内核文档(如`Documentation/devicetree/bindings/net/bluetooth/`)编写节点,示例: ```dts &amp;uart3 { status = "okay"; bluetooth { compatible = "realtek,rtl8723ds-bt"; device-wake-gpio = <&amp;pio PH 5 GPIO_ACTIVE_HIGH>; // 硬件具体引脚 }; }; ``` #### 3. **驱动移植与编译** - **源码适配**:若使用第三方驱动(如厂商提供SDK),需调整代码兼容性(如GPIO操作、时钟频率)。 - **编译与加载**:将驱动编译为模块(`.ko`)或直接内置,通过`insmod`加载后,使用`hciconfig -a`检查设备识别状态[^3]。 #### 4. **功能测试流程** - **基础通信验证**: ```bash hciconfig hci0 up # 启用蓝牙接口 hcitool scan # 扫描周边设备 bluetoothctl # 进入交互模式配对测试 ``` - **数据传输测试**:使用`obexftp`或自定义脚本测试文件传输,验证吞吐量及稳定性。 #### 5. **常见问题与解决** - **驱动加载失败**:检查设备树节点与硬件实际连接的匹配性(如UART编号、GPIO极性)。 - **无法识别设备**:确认内核日志(`dmesg`)中HCI层初始化是否完成,排查供电或中断配置问题。 - **协议栈兼容性**:若BlueZ版本过低,需升级至5.55+以支持BLE等新特性。 #### 6. **优化方向** - **低功耗配置**:通过设备树或运行时参数调整睡眠模式(如`hci0 down`时进入省电状态)。 - **多模块共存**:若WiFi与蓝牙共用SDIO总线,需在驱动中协调资源冲突(如`mmc1`分时复用)。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汉尼拔勇闯天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值