WHC Wi-Fi Slim Host 驱动移植

Linux Host 驱动移植

驱动移植

FullMAC 当前基于 Linux 内核 5.4 ,5.10 以及 5.15 进行测试和验证,若在其他内核版本遇到编译问题,请 联系我们

备注

SPI 会在 CS 引脚置低并检测到 CLK 后立即进行数据传输。总线繁忙时可能存在边界条件:

  • 测试表明,在 CS 置低与主机推送 CLK 之间增加 7μs 延迟可确保总线繁忙时的数据传输安全。

  • 但部分旧版本系统的 SPI 驱动可能不支持 spi_delay,此时需直接修改驱动代码以添加延迟。

环境准备

在 Linux 系统安装以下依赖包:

sudo apt-get install build-essential
sudo apt install dhcpcd hostapd dhcpd
  1. 使能接口

    • Linux PC:跳过此步骤

    • 树莓派

    通过 dtoverlay 配置 SDIO。

    树莓派 4 专用指令为:

    sudo dtoverlay sdio poll_once=off
    

    树莓派 5 指令为:

    sudo dtoverlay sdio
    
  2. 在目录 /component/whc/whc_host_linux 执行以下操作, nanp2p 为可选参数,在需要使能 Wi-Fi NAN 和 Wi-Fi P2P 功能时添加:

    SDIO

    ./fullmac_setup.sh sdio [nan] [p2p]
    

    SPI

    ./fullmac_setup.sh spi [nan] [p2p]
    

    USB

    USB: ./fullmac_setup.sh usb [nan] [p2p]
    
  3. 根据主机运行模式选择输入 1 或 2

    choose target host mode:
    1) Fat host with cfg80211
    2) Slim host without cfg80211
    choose target host mode:
    
  4. whc_host_linux 目录复制到 Linux 内核源码树

  5. 新终端执行编译

    cd {driver_path}/whc_host_linux
    make
    
  1. 加载驱动

    SDIO

    模块路径: /whc_host_linux/fullmac/sdio/fullmac_sdio.ko

    sudo su
    cp sdio/fullmac_sdio.ko /lib/modules/$(uname -r)/
    depmod
    modprobe fullmac_sdio
    

    SPI

    模块路径: /whc_host_linux/fullmac/spi/fullmac_spi.ko

    sudo su
    cp spi/fullmac_spi.ko /lib/modules/$(uname -r)/
    depmod
    modprobe fullmac_spi
    

    USB

    模块路径: /whc_host_linux/fullmac/usb/fullmac_usb.ko

    sudo su
    cp usb/fullmac_usb.ko /lib/modules/$(uname -r)/
    depmod
    modprobe fullmac_usb
    

演示程序

Slim Host 模式下,Wi-Fi 无法使用标准的 Wi-Fi API,此时一定会使用 CUST_PATH 。 所以我们需要开发一个非标准的 Demo 程序来进行演示。

Demo 程序支援 USER Space 和 Kernel Space 的双向沟通,可以通过两类命令实现双向控制:

  1. 内核级配置

    • setmac:配置设备 MAC 地址

    • netifon:激活网络接口载波

  2. 设备级控制

    • getmac:获取设备 MAC 地址

    • getip:获取设备 IP 配置

    • setrdy:通知设备主机状态

    • tickps:Tickless Power Save 指令, 通知设备可以进入低功耗模式

    • wifion:通知设备进行 wifi init

其通信架构如下图所示:

../../_images/fullmac_crtlapp_control_flow_cn.svg

Demo 程序支持的命令

命令格式

功能描述

init

初始化内核 Netlink 通信通道

getmac <device_idx>

获取指定设备MAC地址

device_idx:设备端口索引,只能是 0 或 1

  • 0:对应 wlan0(设备端的STA)

  • 1:对应 wlan1(设备端的SoftAP)

getip <device_idx>

获取设备网络层配置

device_idx:设备端口索引,同 getmac 命令

setrdy <state>

通知设备主机状态

state:主机状态, ready 或者 unready

setmac <device_idx> <mac>

配置接口硬件地址

  • device_idx:设备端口索引,同 getmac 命令

  • mac:MAC格式(xx:xx:xx:xx:xx:xx)

netifon <device_idx>

激活接口物理层载波

device_idx:设备端口索引,同 getmac 命令

tickps <subtype>

Tickless Power Save指令

subtype: ticklessPower Save指令类型

  • cg:设置设备的休眠类型为clock gating

  • pg:设置设备的休眠类型为power gating

  • r:通知设备可以进入低功耗模式

wifion

通知设备初始化Wi-Fi

connect <ssid> <pw>

通知设备连线

  • ssid:目标AP的ssid

  • pw:目标AP的密码,如果没有输入默认为open AP

dhcp

通知设备进行IP协商

Demo 程序的编译和执行

# 进入模块目录
cd ${SDK}/component/whc/whc_host_linux/app

# 编译可执行文件
make

# 以特权模式运行
sudo ./whc_slim_host_demo

普通模式验证

  • 运行应用程序

    cd ${SDK}/component/whc/whc_host_linux/app
    sudo ./whc_slim_host_demo
    
  • 在 demo 执行初始化序列

    > init
    > wifion
    > getmac 0
    00:E0:4C:XX:XX:XX
    > setmac 0 00:E0:4C:XX:XX:XX
    
  • 在 demo 执行 WiFi 扫描

    > scan
    
  • 在 demo 建立无线连接

    > netifon 0
    > connect ap_test 12345678
    

    备注

    ap_test 为目标 AP 的 ssid,12345678 为目标 AP 的密码,开放网络可省略密码参数。

  • 在终端中执行以下命令,通过 dhcpcd 动态获取 IP 地址

    > dhcpcd wlanX
    

    备注

    wlanX 为模式设备名,可在终端执行 ifconfig -a 来获取信息

  • 网络测试

    ping 192.168.x.x
    

双 TCPIP 模式验证

  • 运行应用程序

    cd ${SDK}/component/whc/whc_host_linux/app
    sudo ./whc_slim_host_demo
    
  • 在 demo 执行初始化序列

    > init
    > wifion
    > getmac 0
    00:E0:4C:XX:XX:XX
    > setmac 0 00:E0:4C:XX:XX:XX
    
  • 在 demo 执行 WiFi 扫描

    > scan
    
  • 在 demo 建立无线连接

    > netifon 0
    > connect ap_test 12345678
    

    备注

    ap_test 为目标 AP 的 ssid,12345678 为目标 AP 的密码,开放网络可省略密码参数。

  • 在 Ameba 连线结束后,在 demo 输入 cmd 获取 IP 地址

    > getip 0
    
  • 根据 Ameba 回传的 IP 地址信息,在终端配置 IP 地址以及网关

    sudo ip addr add 192.168.x.x/24 dev wlanX
    sudo ip link set wlanX up
    sudo ip route add default via 192.168.x.x dev wlanX
    

    备注

    wlanX 为模式设备名,可在终端执行 ifconfig -a 来获取信息

  • 在网络层配置结束后,在 demo 输入 cmd 开启网络设备的载波状态

    > netifon 0
    
  • 网络测试

    ping 192.168.x.x
    

RTOS Host 驱动移植

驱动移植

Ameba 作为 FullMAC Host 使用指南

  1. 环境配置

    1. 在目录 {SDK}/amebaxxx_gcc_project 执行配置工具

    (Top) -> CONFIG WHC INTF -> WHC_MODE
    ----Configuration----
          ( ) WHC_IPC
          ( ) FULLMAC_DEV
          (X) FULLMAC_HOST
    
    (Top) -> CONFIG WHC INTF -> FULLMAC HOST config
    ----Configuration----
          (X) Support WHC CMD PATH
          (X) Support WHC WIFI API PATH
    
  2. 固件编译

    生成目标文件:

    ./build.py
    

    输出文件

    • km4_boot_all.bin

    • km0_km4_app.bin

  3. 固件烧录

    使用专用烧录工具将固件写入开发板

第三方平台移植

使用其他 Host 芯片时,需将 component/os/freertos 目录移植至目标系统。

演示程序

Slim Host 模式下,Wi-Fi 无法使用标准的 Wi-Fi API,此时一定会使用 CUST_PATH 。 所以我们需要开发一个非标准的 Demo 程序来进行演示。

Demo 程序通信架构如下图所示:

../../_images/rtos_crtlapp_control_flow_cn.svg

Demo 程序支持的命令

命令格式

功能描述

whc hostrtos

设置Host OS 模式

whc getmac <device_idx>

获取指定设备MAC地址

device_idx:设备端口索引,只能是 0 或 1

  • 0:对应设备端的STA

  • 1:对应设备端的SoftAP

whc getip <device_idx>

获取设备网络层配置

device_idx:设备端口索引,同 getmac 命令

whc setrdy <state>

通知设备主机就绪 state:主机状态, ready 或者 unready

whc wifion

通知设备初始化WIFI

whc connect <ssid> <pw>

通知设备连线

  • ssid:目标AP的ssid

  • pw:目标AP的密码,如果没有输入默认为open AP

whc dhcp

通知设备进行IP协商

whc scan

通知设备进行网络扫描

Demo 程序的编译和执行

Demo 程序已预编译并嵌入固件中,无需手动编译即可直接运行。

双 TCPIP 模式验证

  • 初始化配置

    在串口输入 Cmd, 执行初始化序列

    > whc hostrtos
    > whc wifion
    > whc getmac
    
  • 在串口输入指令执行 WiFi 扫描

    > whc scan
    
  • 在串口输入指令建立无线连接

    > whc connect ap_test 12345678
    

    备注

    ap_test 为目标 AP 的 ssid,12345678 为目标 AP 的密码,开放网络可省略密码参数。

  • 网络测试

    AT+WLPING=192.168.x.x