WHC Wi-Fi Slim Host 驱动移植

驱动移植

FullMAC 当前基于 Linux 内核 5.4 ,5.10 以及 5.15 进行测试和验证,若在其他内核版本遇到编译问题,请`联系我们 <https://aiot.realmcu.com/contact-us/technical-consult>`__。

备注

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/wifi/whc/whc_host_linux 执行以下操作, nanp2p 为可选参数,在需要使能 Wi-Fi NAN 和 Wi-Fi P2P 功能时添加:

    ./fullmac_setup.sh sdio [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. 加载驱动

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

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

演示程序介绍

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/wifi/whc/whc_host_linux/app

# 编译可执行文件
make

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

功能验证与 Demo 演示

  • 运行应用程序

    cd ${SDK}/component/wifi/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