LuckFox Pico SDK1.4配置RTL8723BS WIFI网卡教程

【基础资料】

[] 仅支持以下型号:Luckfox Pico Mini B /Luckfox Pico Plus /Luckfox Pico Pro /Luckfox Pico Max

[] 不支持:Luckfox Pico系列其他型号

[] 模块型号:由斑梨电子基于RTL8723BS进行二次开发的LF-WIFI(A)模块

[] 使用SDK: 幸狐Luckfox的SDK V1.4

[] 源码地址:https://gitee.com/LuckfoxTECH/luckfox-pico.git


】硬件介绍

[] RTL8723BS是一个集成了蓝牙和WIFI的模块。

[] LF-WIFI(A)模块:是一个基于RTL8723BS进行二次开发的模块具有TF卡插槽形状,使用SDIO接口驱动,由于SDIO的接口限制该模块只应用了RTL8723BSWIFI功能并没有使用蓝牙功能。


】TF卡接口硬件原理图




】LF-WIFI(A)原理图


引脚 12 (WL_DSI/WL_REG) 上拉。

引脚 13 (WL_HOST_WAKE) 上拉。


【预配置镜像】

Luckfox Pico Mini B

Luckfox Pico Plus

Luckfox Pico Pro

Luckfox Pico Max

提取码均为:jw00


【自己安装驱动(基于SDK1.4)】

注意:该教程以Luckfox Pico Max为例!


Step1 修改内核


需要修改的内容

Type :Kernel WiFi Driver Support

File Path:  <SDK Directory>/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig

配置WIFI需要修改内核,瑞芯微可以直接在内核中修改支持WIFI功能,可以在SDK根目录直接通过指令./build.sh kernelconfig直接打开内核配置界面。

[] 注意

"M" 表示以模块的方式加载进系统内核

" * " 表示直接编译进内核

(kernelconfig使用教程:SDK 环境部署(X86_64平台) | LUCKFOX WIKI)

[] kernelconfig指令配置内核

cd <sdk>/path 

sudo ./build.sh kernelconfig

[] 内核配置开启cfg80211

依次选择:Networking support > Wireless >{M} cfg80211 - wireless configuration API 


[] 内核配置开启build wifi ko modules

依次选择:Device Drivers > Network device support > Wireless LAN > Rockchip Wireless LAN support > [*] build wifi ko modules


[] 内核配置开启RTL8723BS SDIO驱动

依次选择:Device Drivers > Staging drivers >  <M>Realtek RTL8723BS SDIO Wireless LAN NIC driver



Step2 增加buildroot软件包


修改buildroot可以通过指令./build.sh buildrootconfig,这个是1.3版本的SDK新加入的,其目标是简化嵌入式 Linux 系统的构建过程。通过配置 Buildroot,您可以定制嵌入式系统中包含的软件包和库,以满足特定的需求。

(buildrootconfig使用教程SDK 环境部署(X86_64平台) | LUCKFOX WIKI)

增加iw(非必选)软件包

依次选择:Target packages > Networking applications > [*] iw


[] 增加wpa_supplicant软件包

依次选择:Target packages > Networking applications > wpa_supplicant > 勾选wpa_supplicant下所有的选项


经过编译后的wpa_supplicant源程序主要包括两个可执行工具:wpa_supplicant和wpa_cli。

解释:

wpa_supplicant:作为核心服务程序在后台运行,处理网络连接的认证、加密等任务。

wpa_cli:作为wpa_supplicant的客户端工具,用户可以通过wpa_cli发送命令给wpa_supplicant,实现网络配置、扫描、连接等操作。

[] 增加wireless tools软件包

依次选择:Target packages > Networking applications > [*] wireless tools



解释:

wireless tools:是linux的无线管理软件工具集,通过提供一组简单易用的命令行工具,帮助用户配置和管理支持Wireless Extension的无线设备。


注意:

在配置好了buildroot之后千万不要clean,否则上述配置清零。

如果是用指令./build.sh buildrootconfig的话会自动保存,然后到buildroot文件夹里面make一下就能够把软件包全部下载下来,下载下来之后也能够加快SDK的编译速度。


Step3 修改设备树

需要修改的内容

Device

Type

File Path

Luckfox Pico Max

Main Device Tree

<SDK Directory>/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-max.dts

Luckfox Pico Pro

<SDK Directory>/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pro.dts

Luckfox Pico Plus

<SDK Directory>/sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico-plus.dts

Luckfox Pico Mini B

<SDK Directory>./sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico-mini.dts

 




Device

Type

File Path

Luckfox Pico Max

Include Device Tree

<SDK Directory>/sysdrv/source/kernel/arch/arm/boot/dts/rv1106-luckfox-pico-pro-max-ipc.dtsi

Luckfox Pico Pro

Luckfox Pico Plus

<SDK Directory>/sysdrv/source/kernel/arch/arm/boot/dts/rv1103-luckfox-pico-ipc.dtsi

Luckfox Pico Mini B

 修改设备树

编辑rv1106g-luckfox-pico-max.dts设备树

sudo nano <SDK>/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-max.dts

添加代码

  vcc_1v8: vcc-1v8 {

        compatible = "regulator-fixed";

        regulator-name = "vcc_1v8";

        regulator-always-on;

        regulator-boot-on;

        regulator-min-microvolt = <1800000>;

        regulator-max-microvolt = <1800000>;

    };

 

    vcc_3v3: vcc-3v3 {

        compatible = "regulator-fixed";

        regulator-name = "vcc_3v3";

        regulator-always-on;

        regulator-boot-on;

        regulator-min-microvolt = <3300000>;

        regulator-max-microvolt = <3300000>;

    };


将"&sdmmc"改为

&sdmmc {

    max-frequency = <50000000>;

    bus-width = <4>;          

    cap-sd-highspeed;          

    cap-sdio-irq;              

    keep-power-in-suspend;      

    non-removable;              

    sd-uhs-sdr50;        

    no-1-8-v;

    supports-sdio;        

    pinctrl-names = "default";

    pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_det &sdmmc0_bus4>;

    status = "okay";

};


将“&gmac”改为

&gmac {

    status = "disabled";

};

编辑rv1106-luckfox-pico-pro-max-ipc.dtsi设备树

sudo nano <SDK>/sysdrv/source/kernel/arch/arm/boot/dts/rv1106-luckfox-pico-pro-max-ipc.dtsi

添加"&sfc"代码

&sfc {

    status = "okay";

 

    flash@0 {

        compatible = "spi-nand";

        reg = <0>;

        spi-max-frequency = <80000000>;

        spi-rx-bus-width = <4>;

        spi-tx-bus-width = <1>;

    };

};



Step4 使能WIFI

[] 需要修改的内容

 

Type

File Path

Luckfox Pico Max

SDK Global Configuration

<SDK Directory>/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Max-IPC.mk

Luckfox Pico Pro

<SDK Directory>/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Pro-IPC.mk

Luckfox Pico Plus

<SDK Directory>/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Plus-IPC.mk

Luckfox Pico Mini B

<SDK Directory>/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1103_Luckfox_Pico_Mini_B-IPC.mk

编辑rv1106-luckfox-pico-pro-max-ipc.dtsi设备树

sudo nano <SDK>/project/cfg/BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Max-IPC.mk

添加以下内容

#enable wifi

export RK_ENABLE_WIFI=y


Step5 修改全局构建脚本

需要修改的内容

Type

File Path

Global Build Script

<SDK Directory>/project/build.sh

生成WiFi驱动(rtl8723bs)的固件配置

sudo nano <SDK>/project/build.sh

在function build_app()函数里新增(或取消注释)以下内容

build_meta --export --media_dir $RK_PROJECT_PATH_MEDIA # for rtl8723bs


将SDK中的external目录内容复制到根文件系统(rootfs)的构建目录中

在function __PACKAGE_ROOTFS()函数里新增(或取消注释)以下内容

__COPY_FILES $SDK_ROOT_DIR/external $RK_PROJECT_PACKAGE_ROOTFS_DIR


Step6 添加rtl8723bs固件到SDK


在SDK根目录创建文件夹

mkdir -p external/lib/firmware/rtlwifi/

下载rtl8723bs wifi固件

wge thttps://raw.githubusercontent.com/wkennington/linux-firmware/master/rtlwifi/rtl8723bs_nic.bin

拷贝rtl8723bs固件到sdk/external/lib/firmware/rtlwifi/目录下

cp rtl8723bs_nic.bin sdk/external/lib/firmware/rtlwifi/


Step7 编译SDK


指定开发板

luckfox@luckfox:~/luckfox-pico$ ./build.sh lunch

执行编译

luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ./build.sh


【Step8 WiFi测试】


手动测试wifi


[] 安装驱动模块

cd /oem/usr/ko

insmod libarc4.ko

insmod cfg80211.ko

insmod mac80211.ko

insmod r8723bs.ko


正常情况下使用ifconfig -a可以看到wlan0设备

ifconfig -a


开启wifi

ifconfig wlan0 up

查看周围的网络

iwlist wlan0 scan

会依次展示周围的网络信息。


注意:这里以ESSID为spotpear-test的wifi为例!


配置wifi文件

编辑wpa_supplicant.conf文件

vi /etc/wpa_supplicant.conf

按需修改为自己的wifi设置

ctrl_interface=/var/run/wpa_supplicant

ctrl_interface_group=0

ap_scan=1

network={

    ssid="YOUR_SSID"

    key_mgmt=WPA-PSK

    pairwise=CCMP TKIP

    group=TKIP CCMP

    psk="YOUR_PWD"

}

解释:

ssid="YOUR_SSID"  是用户的WIFI名称

psk="YOUR_PWD"  是用户的WiFi密码


创建一个socket文件

mkdir -p /var/run/wpa_supplicant

创建该文件是为了让  wpa_supplicant (Wi-Fi 认证客户端)能够正常工作。


连接WIFI

wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0


配置动态IP

udhcpc -i wlan0


配置静态IP

或者你也可以选择配置静态IP

ifconfig wlan0 192.168.xxx.xxx netmask 255.255.255.0 up



查看连接状态

wpa_cli -iwlan0 status


可以看到上面wpa_state=COMPLETED,意思就是连接成功,并且输出了ip地址。


【自动测试WIFI】


方法一 在固件新增自启动脚本

在固件的/etc/init.d/目录下新增S98wifi_auto_connect脚本文件

nano /etc/init.d/S98wifi_auto_connect

添加以下内容:

#!/bin/sh

 

### BEGIN INIT INFO

# Provides:          wifi_auto_connect

# Required-Start:    $network

# Default-Start:     S

# Default-Stop:      0 6

### END INIT INFO

 

WLAN_IF="wlan0"

 

load_wifi_modules() {

    echo "Loading Wi-Fi driver modules..."

    cd /oem/usr/ko || exit 1

    insmod libarc4.ko

    insmod cfg80211.ko

    insmod mac80211.ko

    insmod r8723bs.ko

}

 

start_wifi() {

    sleep 4

    echo "Bringing up Wi-Fi interface..."

    ifconfig $WLAN_IF up

    mkdir -p /var/run/wpa_supplicant

    wpa_supplicant -B -c /etc/wpa_supplicant.conf -i $WLAN_IF

}

 

get_ip_address() {

    echo "Requesting IP address via DHCP..."

    #udhcpc -i $WLAN_IF

#ifconfig $WLAN_IF 192.168.xxx.xxx netmask 255.255.255.0 up

 

}

 

case "$1" in

    start)

        echo "Starting Wi-Fi auto-connect..."

        load_wifi_modules

 

        # 检查 wlan0 是否存在

        if ip link show $WLAN_IF >/dev/null 2>&1; then

            start_wifi

            sleep 5  # 给 wpa_supplicant 时间连接

            get_ip_address

        else

            echo "Error: $WLAN_IF not found"

        fi

        ;;

    stop)

        echo "Stopping Wi-Fi..."

        killall wpa_supplicant

        ifconfig $WLAN_IF down

        ;;

    *)

        echo "Usage: $0 {start|stop}"

        exit 1

        ;;

esac

Ctrl+O保存、Ctrl+X退出

赋予S98wifi_auto_connect脚本权限

chmod 775 /etc/init.d/S98wifi_auto_connect

重启生效


方法二 在SDK新增自启动脚本

sudo nano <SDK>project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-buildroot-init/etc/init.d/S98wifi_auto_connect

添加以下内容:

#!/bin/sh

 

### BEGIN INIT INFO

# Provides:          wifi_auto_connect

# Required-Start:    $network

# Default-Start:     S

# Default-Stop:      0 6

### END INIT INFO

 

WLAN_IF="wlan0"

 

load_wifi_modules() {

    echo "Loading Wi-Fi driver modules..."

    cd /oem/usr/ko || exit 1

    insmod libarc4.ko

    insmod cfg80211.ko

    insmod mac80211.ko

    insmod r8723bs.ko

}

 

start_wifi() {

    sleep 4

    echo "Bringing up Wi-Fi interface..."

    ifconfig $WLAN_IF up

    mkdir -p /var/run/wpa_supplicant

    wpa_supplicant -B -c /etc/wpa_supplicant.conf -i $WLAN_IF

}

 

get_ip_address() {

    echo "Requesting IP address via DHCP..."

    #udhcpc -i $WLAN_IF

#ifconfig $WLAN_IF 192.168.xxx.xxx netmask 255.255.255.0 up

 

}

 

case "$1" in

    start)

        echo "Starting Wi-Fi auto-connect..."

        load_wifi_modules

 

        # 检查 wlan0 是否存在

        if ip link show $WLAN_IF >/dev/null 2>&1; then

            start_wifi

            sleep 5  # 给 wpa_supplicant 时间连接

            get_ip_address

        else

            echo "Error: $WLAN_IF not found"

        fi

        ;;

    stop)

        echo "Stopping Wi-Fi..."

        killall wpa_supplicant

        ifconfig $WLAN_IF down

        ;;

    *)

        echo "Usage: $0 {start|stop}"

        exit 1

        ;;

esac

重启编译SDK

sudo <SDK>/build.sh lunch

sudo <SDK>/build.sh


注意

由于在S98wifi_auto_connect脚本配置动态IP,重启后在网络异常的情况下会导致用户在串口终端无法进入系统所以在S98wifi_auto_connect脚本中屏蔽了配置动态IP的功能。

又由于不明确用户的网关地址具体是多少所以把配置静态IP的功能也屏蔽了。 用户需自行配置动态IP或静态IP。


【WIFI连接SSH和摄像头】


参考luckfox官方ssh和摄像头教程。ifconfig查找对应WIFI的IP后,除了需要更换WIFI对应的IP,其他的步骤跟官方的教程完全一样

https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-Plus-Mini/Luckfox-Pico-pinout/CSI-Camera/

https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-RV1103/Luckfox-Pico-Plus-Mini/SSH-Telnet-Login/