[] 仅支持以下型号: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功能并没有使用蓝牙功能。



引脚 12 (WL_DSI/WL_REG) 上拉。
引脚 13 (WL_HOST_WAKE) 上拉。
提取码均为:jw00
注意:该教程以Luckfox Pico Max为例!
需要修改的内容
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)
cd <sdk>/path
sudo ./build.sh kernelconfig
依次选择:Networking support > Wireless >{M} cfg80211 - wireless configuration API

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

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

修改buildroot可以通过指令./build.sh buildrootconfig,这个是1.3版本的SDK新加入的,其目标是简化嵌入式 Linux 系统的构建过程。通过配置 Buildroot,您可以定制嵌入式系统中包含的软件包和库,以满足特定的需求。
(buildrootconfig使用教程:SDK 环境部署(X86_64平台) | LUCKFOX WIKI)
增加iw(非必选)软件包
依次选择:Target packages > Networking applications > [*] iw

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

经过编译后的wpa_supplicant源程序主要包括两个可执行工具:wpa_supplicant和wpa_cli。
解释:
wpa_supplicant:作为核心服务程序在后台运行,处理网络连接的认证、加密等任务。
wpa_cli:作为wpa_supplicant的客户端工具,用户可以通过wpa_cli发送命令给wpa_supplicant,实现网络配置、扫描、连接等操作。
依次选择:Target packages > Networking applications > [*] wireless tools

解释:
wireless tools:是linux的无线管理软件工具集,通过提供一组简单易用的命令行工具,帮助用户配置和管理支持Wireless Extension的无线设备。
注意:
在配置好了buildroot之后千万不要clean,否则上述配置清零。
如果是用指令./build.sh buildrootconfig的话会自动保存,然后到buildroot文件夹里面make一下就能够把软件包全部下载下来,下载下来之后也能够加快SDK的编译速度。
需要修改的内容
| 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>;
    };
};

| 
 | 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
需要修改的内容
| 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

在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/
指定开发板
luckfox@luckfox:~/luckfox-pico$ ./build.sh lunch
执行编译
luckfox@luckfox:~/Luckfox-Pico/luckfox-pico$ ./build.sh
cd /oem/usr/ko
insmod libarc4.ko
insmod cfg80211.ko
insmod mac80211.ko
insmod r8723bs.ko

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

ifconfig wlan0 up

查看周围的网络
iwlist wlan0 scan
会依次展示周围的网络信息。

注意:这里以ESSID为spotpear-test的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密码

mkdir -p /var/run/wpa_supplicant
创建该文件是为了让 wpa_supplicant (Wi-Fi 认证客户端)能够正常工作。
wpa_supplicant -B -c /etc/wpa_supplicant.conf -i wlan0

udhcpc -i wlan0

或者你也可以选择配置静态IP
ifconfig wlan0 192.168.xxx.xxx netmask 255.255.255.0 up

wpa_cli -iwlan0 status

可以看到上面wpa_state=COMPLETED,意思就是连接成功,并且输出了ip地址。
在固件的/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
重启生效
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。
参考luckfox官方ssh和摄像头教程。ifconfig查找对应WIFI的IP后,除了需要更换WIFI对应的IP,其他的步骤跟官方的教程完全一样