支持的芯片
WHC 概述
在 WHC 方案中,Ameba 作为网卡通过 UART/SPI/SDIO/USB 与主机 MCU 连接,为 Host 提供网络接入能力, WHC 的架构图如下所示:
WHC 架构优势
接口类型丰富:可通过 UART/SPI/SDIO/USB 在 Host 和 Device 间建立传输通道
跨平台兼容性: Linux、 FreeRTOS 以及 Zephyr 均可以作为 Host 进行开发
适配 Linux 平台,兼容 Linux 标准 wpa_supplicant(WPA_STD) 和 cfg80211 无线框架,支持如下增强功能:
SME(由 wpa_supplicant 做 Wi-Fi 的 MLME) 或非 SME 模式
支持 P2P/NAN
Fat Host 与 Slim Host
根据 Host 端是否运行 wpa_supplicant 我们将 WHC 分为 Fat Host 与 Slim Host 两种架构, 而 Linux 的 cfg80211 属于 Fat Host 架构:
WHC 配置选项
可选择的 WPA_SUPPLIANT
WPA_LITE: 为 realtek 优化过的 wpa_supplicant, 通过更小的 code size 和内存占用, 实现最基本的连线功能
WPA_STD: 标准的 Linux wpa_supplicant, 除了基本的连线功能之外, 还提供 P2P/NAN/SME 等高级功能
可选择的 WPA_SUPPLIANT OFFLOAD:
WPA_SUPPLIANT 既可以跑在 Host 端(比如 linux cfg80211), 也可以跑在 Device 端
WPA_SUPPLIANT 跑在 Device 端, 对于非标准的 Linux 系统可以省去移植 wap_supplicant 到 host 平台的烦恼, 缩短项目周期
可选择的 Dual TCPIP
Device 端 LWIP 和 host 端 TCPIP stack 并行运行, Device 端 LWIP 用于提供必要的保活机制, 避免 Host 端被频繁唤醒, 在 IP Camera 等电池场景下大幅提升电池使用时间
Device 端的 LWIP 协议栈可以协助 Host 处理一些数据包交互,实现 Host 流量预过滤
WHC 典型模式
Abbreviation |
wpa_supplicant |
Dual TCPIP(T) |
API PATH |
CMD PATH |
Status |
|
---|---|---|---|---|---|---|
slim host |
S1D |
WPA LITE in DEV |
N |
N |
Y |
Ready |
S1D-T |
WPA LITE in DEV |
Y |
N |
Y |
Ready |
|
fat host (cfg80211) |
S2H |
WPA STD in Host |
N |
Y |
Y |
Ready |
S2H-T |
WPA STD in Host |
Y |
Y |
Y |
Ready |
|
S2H-SME |
WPA STD in Host |
N |
Y |
Y |
Ongoing |
|
S2H-T-SME |
WPA STD in Host |
Y |
Y |
Y |
Ongoing |
Abbreviation |
wpa_supplicant |
Dual TCPIP(T) |
API PATH |
CMD PATH |
Status |
|
---|---|---|---|---|---|---|
slim host |
S1D |
WPA LITE in DEV |
N |
N |
Y |
Ready |
S1D-T |
WPA LITE in DEV |
Y |
N |
Y |
Ready |
|
fat host |
S1H |
WPA LITE in Host |
N |
Y |
Y |
Ready |
S1H-T |
WPA LITE in Host |
Y |
Y |
Y |
Ready |
Abbreviation |
wpa_supplicant |
Dual TCPIP(T) |
API PATH |
CMD PATH |
Status |
|
---|---|---|---|---|---|---|
slim host |
S1D |
WPA LITE in DEV |
N |
N |
Y |
TODO |
S1D-T |
WPA LITE in DEV |
Y |
N |
Y |
Ready |
|
fat host |
S2H |
WPA ZEPHYR in Host |
N |
Y |
Y |
TODO |
S2H-T |
WPA ZEPHYR in Host |
Y |
Y |
Y |
TODO |
备注
缩写词介绍
S1 代表为 realtek 优化过的 wpa_supplicant: WPA_LITE
S1D 代表: wpa_supplicant 使用 WPA_LITE, 并且跑在 Device 端
S2 代表标准的 wpa_supplicant: WPA_STD(支持 P2P/NAN 等高级功能)
S2H 代表: wpa_supplicant 使用 WPA_STD, 并且跑在 Host 端
T 代表运行 Dual TCPIP 协议栈模式,Host 端和 Device 端都运行 TCPIP 协议栈
备注
MENU CONFIG
以上配置选项对应 Menuconfig 中
下面的如下选项:(Top) -> CONFIG WHC INTF -> FULLMAC config
----Configuration----
(X) Support WHC CMD PATH
( ) Support WHC WIFI API PATH
( ) Support WHC SUPPLICANT OFFLOAD
( ) Support WHC DUAL TCPIP
WHC 传输接口
Interface |
SDIO |
SPI |
USB |
UART |
SDIO (Wi-Fi) + UART (BT) |
SPI (Wi-Fi) + UART (BT) |
USB (Wi-Fi) + UART (BT) |
---|---|---|---|---|---|---|---|
Wi-Fi |
Y |
Y |
Y |
X |
Y |
Y |
X |
BT |
Y |
Y |
X |
X |
Y |
Y |
X |
Interface |
SDIO |
SPI |
USB |
UART |
SDIO (Wi-Fi) + UART (BT) |
SPI (Wi-Fi) + UART (BT) |
USB (Wi-Fi) + UART (BT) |
---|---|---|---|---|---|---|---|
Wi-Fi |
Y |
Y |
X |
X |
Y |
Y |
X |
BT |
Y |
Y |
X |
X |
Y |
Y |
X |
Interface |
SDIO |
SPI |
USB |
UART |
SDIO (Wi-Fi) + UART (BT) |
SPI (Wi-Fi) + UART (BT) |
USB (Wi-Fi) + UART (BT) |
---|---|---|---|---|---|---|---|
Wi-Fi |
Y |
X |
X |
X |
X |
X |
X |
BT |
X |
X |
X |
X |
X |
X |
X |
Interface |
SDIO |
SPI |
USB |
UART |
SDIO (Wi-Fi) + UART (BT) |
SPI (Wi-Fi) + UART (BT) |
USB (Wi-Fi) + UART (BT) |
---|---|---|---|---|---|---|---|
Wi-Fi |
Y |
Y |
Y |
X |
Y |
Y |
X |
BT |
Y |
Y |
X |
X |
Y |
Y |
X |
Interface |
SDIO |
SPI |
USB |
UART |
SDIO (Wi-Fi) + UART (BT) |
SPI (Wi-Fi) + UART (BT) |
USB (Wi-Fi) + UART (BT) |
---|---|---|---|---|---|---|---|
Wi-Fi |
Y |
Y |
X |
X |
Y |
Y |
X |
BT |
Y |
Y |
X |
X |
Y |
Y |
X |
Interface |
SDIO |
SPI |
USB |
UART |
SDIO (Wi-Fi) + UART (BT) |
SPI (Wi-Fi) + UART (BT) |
USB (Wi-Fi) + UART (BT) |
---|---|---|---|---|---|---|---|
Wi-Fi |
Y |
X |
X |
X |
X |
X |
X |
BT |
X |
X |
X |
X |
X |
X |
X |
WHC 文件目录
Wi-Fi
├─ whc
│ ├─ README.md
│ ├─ CMakeLists.txt
│ ├─ whc_def.h
│ ├─ whc_dev
│ │ ├─ ipc
│ │ │ ├─ whc_ipc_dev_api.c
│ │ │ ├─ whc_ipc_dev_trx.c
│ │ │ ├─ whc_ipc_dev_trx.h
│ │ │ └─ whc_ipc_device.c
│ │ ├─ sdio
│ │ │ ├─ whc_sdio_dev.c
│ │ │ ├─ whc_sdio_dev.h
│ │ │ ├─ whc_sdio_drv.c
│ │ │ └─ whc_sdio_drv.h
│ │ ├─ spi
│ │ │ ├─ whc_spi_dev.c
│ │ │ ├─ whc_spi_dev.h
│ │ │ ├─ whc_spi_drv.c
│ │ │ └─ whc_spi_drv.h
│ │ ├─ usb
│ │ │ ├─ whc_usb_dev.c
│ │ │ └─ whc_usb_dev.h
│ │ ├─ whc_dev.h
│ │ ├─ whc_dev_api.c
│ │ ├─ whc_dev_api.h
│ │ ├─ whc_dev_api_path.c
│ │ ├─ whc_dev_api_path.h
│ │ ├─ whc_dev_app.c
│ │ ├─ whc_dev_cust_evt.c
│ │ ├─ whc_dev_cust_evt.h
│ │ ├─ whc_dev_msg_queue.c
│ │ ├─ whc_dev_msg_queue.h
│ │ ├─ whc_dev_protocal_offload.c
│ │ ├─ whc_dev_protocal_offload.h
│ │ ├─ whc_dev_tcpip.c
│ │ ├─ whc_dev_tcpip.h
│ │ ├─ whc_dev_trx.c
│ │ └─ whc_dev_trx.h
│ ├─ whc_host_rtos
│ │ ├─ ipc
│ │ │ ├─ whc_ipc_host.c
│ │ │ ├─ whc_ipc_host_api.c
│ │ │ ├─ whc_ipc_host_api.h
│ │ │ ├─ whc_ipc_host_api_basic.c
│ │ │ ├─ whc_ipc_host_api_ext.c
│ │ │ ├─ whc_ipc_host_trx.c
│ │ │ ├─ whc_ipc_host_trx.h
│ │ │ └─ whc_ipc_host_zephyr.c
│ │ ├─ spi
│ │ │ ├─ whc_spi_host.c
│ │ │ ├─ whc_spi_host.h
│ │ │ ├─ whc_spi_host_trx.c
│ │ │ └─ whc_spi_host_trx.h
│ │ ├─ sdio
│ │ │ ├─ rtw_sdio_drvio.c
│ │ │ ├─ rtw_sdio_drvio.h
│ │ │ ├─ whc_sdio_host.c
│ │ │ ├─ whc_sdio_host.h
│ │ │ ├─ whc_sdio_init.c
│ │ │ ├─ whc_sdio_host_trx.c
│ │ │ └─ whc_sdio_host_trx.h
│ │ ├─ whc_host.h
│ │ ├─ whc_host_api.c
│ │ ├─ whc_host_api.h
│ │ ├─ whc_host_api_basic.c
│ │ ├─ whc_host_api_ext.c
│ │ ├─ whc_host_app.c
│ │ ├─ whc_host_app.h
│ │ ├─ whc_host_init.c
│ │ ├─ whc_host_cust_evt.c
│ │ ├─ whc_host_cust_evt.h
│ │ └─ whc_rtos
│ │ ├─ os_wrapper_memory.c
│ │ ├─ os_wrapper_mutex.c
│ │ └─ os_wrapper_semaphore.c
│ ├─ whc_ipc.h
│ ├─ whc_ipc_cfg.h
│ ├─ whc_ipc_msg_queue.c
│ └─ whc_ipc_msg_queue.h
├─ whc_host_linux
│ ├─ Kconfig
│ ├─ Makefile
│ ├─ fullmac_setup.sh
│ ├─ app
│ │ ├─ Makefile
│ │ ├─ whc_host_app_api.c
│ │ ├─ whc_host_app_api.h
│ │ └─ whc_host_app.c
│ ├─ fullmac
│ │ ├─ whc_fullmac_host_wiphy.c
│ │ ├─ whc_fullmac_host_regd.c
│ │ ├─ whc_fullmac_host_regd.h
│ │ ├─ whc_fullmac_host_protocal_offload.c
│ │ ├─ whc_fullmac_host_promisc.c
│ │ ├─ whc_fullmac_host_promisc.h
│ │ ├─ whc_fullmac_host_proc.c
│ │ ├─ whc_fullmac_host_proc.h
│ │ ├─ whc_fullmac_host_pkt_rx.c
│ │ ├─ whc_fullmac_host_ops_p2p.c
│ │ ├─ whc_fullmac_host_ops_nan.c
│ │ ├─ whc_fullmac_host_ops_key.c
│ │ ├─ whc_fullmac_host_ops_ap.c
│ │ ├─ whc_fullmac_host_ops.c
│ │ ├─ whc_fullmac_host_netdev_ops_p2p.c
│ │ ├─ whc_fullmac_host_ioctl.c
│ │ ├─ whc_fullmac_host_ioctl.h
│ │ ├─ whc_fullmac_host_event_tx.c
│ │ ├─ whc_fullmac_host_event_rx.c
│ │ ├─ whc_fullmac_host_cust_evt.c
│ │ ├─ whc_fullmac_host_cust_evt.h
│ │ ├─ whc_fullmac_host_cfgvendor.c
│ │ ├─ whc_fullmac_host_cfgvendor.h
│ │ ├─ whc_fullmac_host_acs.c
│ │ ├─ whc_fullmac_host_acs.h
│ │ ├─ usb
│ │ │ └─ Kbuild
│ │ ├─ spi
│ │ │ └─ Kbuild
│ │ ├─ sdio
│ │ │ └─ Kbuild
│ ├─ common
│ │ ├─ autoconf.h
│ │ ├─ whc_host_cmd_path_api.h
│ │ ├─ whc_host_cmd_path_tx.c
│ │ ├─ whc_host_event.h
│ │ ├─ whc_host_hci.c
│ │ ├─ whc_host_hci.h
│ │ ├─ whc_host_memory.c
│ │ ├─ whc_host_netlink.c
│ │ ├─ whc_host_netlink.h
│ │ ├─ whc_host_ops.c
│ │ ├─ whc_host_pkt_rx.c
│ │ ├─ whc_host_pkt_tx.c
│ │ ├─ whc_host_trx.h
│ │ ├─ netdev
│ │ │ ├─ whc_host_drv_probe.c
│ │ │ ├─ whc_host_drv_probe.h
│ │ │ ├─ whc_host_ethtool_ops.c
│ │ │ ├─ whc_host_ethtool_ops.h
│ │ │ ├─ whc_host_function.h
│ │ │ ├─ whc_host_linux.h
│ │ │ ├─ whc_host_netdev_ops.c
│ │ │ ├─ whc_host_netdev_ops.h
│ │ │ └─ whc_host_wiphy.h
│ │ ├─ sdio
│ │ │ ├─ whc_sdio_host.h
│ │ │ ├─ whc_sdio_host_drvio.c
│ │ │ ├─ whc_sdio_host_drvio.h
│ │ │ ├─ whc_sdio_host_fwdl.c
│ │ │ ├─ whc_sdio_host_init.c
│ │ │ ├─ whc_sdio_host_ops.c
│ │ │ ├─ whc_sdio_host_ops.h
│ │ │ ├─ whc_sdio_host_probe.c
│ │ │ └─ whc_sdio_host_reg.h
│ │ ├─ spi
│ │ │ ├─ whc_spi_host.h
│ │ │ ├─ whc_spi_host_ops.c
│ │ │ ├─ whc_spi_host_probe.c
│ │ │ └─ spidev-overlay.dts
│ │ └─ usb
│ │ ├─ whc_usb_host.h
│ │ ├─ whc_usb_host_ops.c
│ │ └─ whc_usb_host_probe.c
WHC 硬件配置
接口连接
Ameba 与树莓派引脚对应关系如下:
Interface |
SoC pin |
Function |
---|---|---|
SDIO |
PB6 |
SDIO_DAT2 |
PB7 |
SDIO_DAT3 |
|
PB8 |
SDIO_CMD |
|
PB9 |
SDIO_CLK |
|
PB13 |
SDIO_DAT0 |
|
PB14 |
SDIO_DAT1 |
|
SPI |
PB24 |
SPI_MOSI |
PB25 |
SPI_MISO |
|
PB23 |
SPI_CLK |
|
PB26 |
SPI_CS |
|
PB8 |
DEV_TX_REQ |
|
PB9 |
DEV_READY |
Interface |
SoC pin |
Function |
---|---|---|
SDIO |
PA4 |
SDIO_DAT2 |
PA21 |
SDIO_DAT3 |
|
PA19 |
SDIO_CMD |
|
PA18 |
SDIO_CLK |
|
PA5 |
SDIO_DAT0 |
|
PA20 |
SDIO_DAT1 |
|
SPI |
PA30 |
SPI_MOSI |
PA31 |
SPI_MISO |
|
PA29 |
SPI_CLK |
|
PB0 |
SPI_CS |
|
PA19 |
DEV_TX_REQ |
|
PA18 |
DEV_READY |
Interface |
Raspberry Pi |
Function |
---|---|---|
SDIO |
GPIO 26 |
SDIO_DAT2 |
GPIO 27 |
SDIO_DAT3 |
|
GPIO 23 |
SDIO_CMD |
|
GPIO 22 |
SDIO_CLK |
|
GPIO 24 |
SDIO_DAT0 |
|
GPIO 25 |
SDIO_DAT1 |
|
SPI |
GPIO 10 |
SPI_MOSI |
GPIO 9 |
SPI_MISO |
|
GPIO 11 |
SPI_CLK |
|
GPIO 8 |
SPI_CS |
|
GPIO 23 |
DEV_TX_REQ |
|
GPIO 22 |
DEV_READY |
|
UART |
GPIO 14 |
UART_TX |
GPIO 15 |
UART_RX |
备注
SPI DEV_TX_REQ:Ameba 通过此引脚上升沿通知 Host 有数据待发送
SPI DEV_READY:Ameba 状态指示信号
高电平(1):设备就绪,可接收数据
低电平(0):设备繁忙,暂停传输
备注
默认使用 Ameba SDK 预定义 SDIO 引脚,如需修改需调整以下文件中 SDIO_Pin_Grp , 对应 SDIO_PAD 中的 pinmux 的索引:
文件地址:
component/soc/usrcfg/amebadplus/ameba_intfcfg.c
文件地址:
component/soc/usrcfg/amebagreen2/ameba_intfcfg.c
Host 端 SDIO 中断模式要求:
SDIO_DATA1 必须配置为 SDIO 功能(非 GPIO)。
若 Host 不支持 SDIO 中断,可切换为轮询模式。
SDIO 转接板
Realtek 提供了方便对接 mini SD 卡槽的转接板供客户选择,推荐使用专用转接板连接 SDIO 引脚。

FullMAC SDIO 转接板实物图
备注
Realtek 官方转接板即将上市,当前可邮件联系 <claire_wang@realsil.com.cn> 申请样品。
树莓派直连方案
高速传输场景建议直接将 Ameba SDIO 引脚焊接至树莓派 GPIO。

Ameba 与树莓派直连示意图
WHC CONTROL APP
Ameba SDK 提供控制应用程序(Control App) 来实现通过串口对 device 的控制,该应用特性如下:
功能定位:纯演示用途,用于命令交互原型开发
架构设计:独立实用程序,不属于任何功能模块
定制化能力:支持客户深度扩展开发
APP 架构
APP 支援 USER Space 和 Kernel Space 的双向沟通,可以通过两类命令实现双向控制:
内核级配置
setmac
:配置设备 MAC 地址netifon
:激活网络接口载波
设备级控制
getmac
:获取设备 MAC 地址getip
:获取设备 IP 配置setrdy
:通知设备主机就绪且指示设备获取 PMU_FULLMAC_WIFI 锁unrdy
:通知设备主机未就绪且释放设备的 PMU_FULLMAC_WIFI 锁tickps
:Tickless Power Save 指令wifion
:通知设备进行 wifi init
其通信架构如下图所示:
APP 支持的命令
命令格式 |
功能描述 |
init |
初始化内核 Netlink 通信通道 |
getmac <device_idx> |
获取指定设备MAC地址 device_idx:设备端口索引,只能是 0 或 1
|
getip <device_idx> |
获取设备网络层配置 device_idx:设备端口索引,同 getmac 命令 |
setrdy |
通知设备主机就绪且指示设备获取PMU_WHC_WIFI锁 |
unrdy |
通知设备主机未就绪且释放设备的PMU_WHC_WIFI锁 |
setmac <device_idx> <mac> |
配置接口硬件地址
|
netifon <device_idx> |
激活接口物理层载波 device_idx:设备端口索引,同 getmac 命令 |
tickps <subtype> |
Tickless Power Save指令 subtype: ticklessPower Save指令类型
|
wifion |
通知设备初始化WIFI |
connect <ssid> <pw> |
通知设备连线
|
dhcp |
通知设备进行IP协商 |
APP 的编译和执行
# 进入模块目录
cd ${SDK}/component/wifi/whc/whc_host_linux/app
# 编译可执行文件
make
# 以特权模式运行
sudo ./whc_ctrl_app
APP 架构
APP 支援通过串口控制 Device,其通信架构如下图所示:
APP 支持的命令
命令格式 |
功能描述 |
whc hostrtos |
设置Host OS 模式 |
whc getmac <device_idx> |
获取指定设备MAC地址 device_idx:设备端口索引,只能是 0 或 1
|
whc getip <device_idx> |
获取设备网络层配置 device_idx:设备端口索引,同 getmac 命令 |
whc setrdy |
通知设备主机就绪且指示设备获取PMU_WHC_WIFI锁 |
whc unrdy |
通知设备主机未就绪且释放设备的PMU_WHC_WIFI锁 |
whc wifion |
通知设备初始化WIFI |
whc connect <ssid> <pw> |
通知设备连线
|
whc dhcp |
通知设备进行IP协商 |
whc scan |
通知设备进行网络扫描 |
WHC Wi-Fi 移植指南
Device 驱动移植
在目录
{SDK}/amebadxxx_gcc_project
中执行./menuconfig.py
。找到
,选择 。
(Top) -> CONFIG WHC INTF -> WHC_MODE ----Configuration---- ( ) WHC_IPC (X) FULLMAC_DEV ( ) FULLMAC_HOST
找到
,选择想要的接口,比如 。
(Top) -> CONFIG WHC INTF -> HW INTERFACE ----Configuration---- (X) WHC_INTF_SDIO ( ) WHC_INTF_USB ( ) WHC_INTF_SPI
找到
,选择想要的模块。
(Top) -> CONFIG WHC INTF -> FULLMAC config ----Configuration---- ( ) Support WHC CMD PATH ( ) Support WHC WIFI API PATH ( ) Support WHC SUPPLICANT OFFLOAD ( ) Support WHC DUAL TCPIP
若需要使能 Wi-Fi NAN 或 Wi-Fi P2P, 则找到
,选择需要的功能。
(Top) -> CONFIG WIFI ----Configuration---- (X)ENABLE WIFI ---> CONFIG WIFI MODE ---> (X) ENABLE NAN ( ) ENABLE P2P
执行
./build.py
生成km4_boot_all.bin
和km0_km4_app.bin
。使用 image tool 下载固件到开发板。
Host 驱动移植
Ameba 作为 FullMAC Host 使用指南
环境配置
在目录
{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
固件编译
生成目标文件:
./build.py
输出文件:
km4_boot_all.bin
km0_km4_app.bin
固件烧录
使用专用烧录工具将固件写入开发板
第三方平台移植
使用其他 Host 芯片时,需将 component/os/freertos
目录移植至目标系统。
FullMAC 当前基于 Linux 内核 5.4 和 5.10 进行测试和验证,若在其他内核版本遇到编译问题,请联系 <claire_wang@realsil.com.cn>。
备注
SPI 会在 CS 引脚置低并检测到 CLK 后立即进行数据传输。总线繁忙时可能存在边界条件:
测试表明,在 CS 置低与主机推送 CLK 之间增加 7μs 延迟可确保总线繁忙时的数据传输安全。
但部分旧版本系统的 SPI 驱动可能不支持
spi_delay
,此时需直接修改驱动代码以添加延迟。
环境准备
在 Linux 系统安装以下依赖包:
sudo apt-get install build-essential
sudo apt install dhcpcd hostapd dhcpd
使能接口
Linux PC:跳过此步骤
树莓派:
编译驱动
在目录
/component/wifi/whc/whc_host_linux
执行以下操作,nan
和p2p
为可选参数,在需要使能 Wi-Fi NAN 和 Wi-Fi P2P 功能时添加:
./fullmac_setup.sh sdio [nan] [p2p]
./fullmac_setup.sh spi [nan] [p2p]
./fullmac_setup.sh usb [nan] [p2p]
将
whc_host_linux
目录复制到 Linux 内核源码树新终端执行编译
cd {driver_path}/whc_host_linux make
加载驱动
模块路径:
/whc_host_linux/fullmac/sdio/fullmac_sdio.ko
sudo su cp sdio/fullmac_sdio.ko /lib/modules/$(uname -r)/ depmod modprobe fullmac_sdio
模块路径:
/whc_host_linux/fullmac/spi/fullmac_spi.ko
sudo su cp spi/fullmac_spi.ko /lib/modules/$(uname -r)/ depmod modprobe fullmac_spi
模块路径:
/whc_host_linux/fullmac/usb/fullmac_usb.ko
sudo su cp usb/fullmac_usb.ko /lib/modules/$(uname -r)/ depmod modprobe fullmac_usb
WHC Demo
初始化配置
运行控制应用程序
cd ${SDK}/component/wifi/whc/whc_host_linux/app sudo ./whc_ctrl_app
在 Control App 执行初始化序列
> init > wifion > getmac 0 00:0A:35:XX:XX:XX > setmac 0 00:0A:35:11:22:33
连接无线网络
在 control app 执行 WiFi 扫描
> scan
在 control app 建立无线连接
> netifon 0 > connect ap_test 12345678备注
ap_test
为目标 AP 的 ssid,12345678
为目标 AP 的密码,开放网络可省略密码参数。
新建终端,配置网络接口
> dhcpcd wlanX备注
wlanX
为模式设备名,使用ifconfig -a
确认实际接口名称 (如 wlan0/wlan1)
网络测试
ping 192.168.x.x
初始化配置
运行控制应用程序
cd ${SDK}/component/wifi/whc/whc_host_linux/app sudo ./whc_ctrl_app
在 Control App 执行初始化序列
> init > wifion > getmac 0 00:0A:35:XX:XX:XX > setmac 0 00:0A:35:11:22:33
连接无线网络
在 control app 执行 WiFi 扫描
> scan
在 control app 建立无线连接
> netifon 0 > connect ap_test 12345678备注
ap_test
为目标 AP 的 ssid,12345678
为目标 AP 的密码,开放网络可省略密码参数。
在 Ameba 连线结束后,在 control app 输入 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
来获取信息
在网络层配置结束后,在 control app 输入 cmd 开启网络设备的载波状态
> netifon 0
网络测试
ping 192.168.x.x
驱动加载确认
连接无线网络
备注
Ubuntu 系统注意:若需通过命令行连接 AP,需关闭 NetworkManager 和 DHCP 服务以避免冲突。
sudo systemctl stop NetworkManager dhcpcd.service sudo systemctl disable NetworkManager
创建配置文件
/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant network={ ssid="HUAWEI-JX2UX5_HiLink_5G" psk="12345678" }
启动 WPA 连接
wpa_supplicant -D nl80211 -i wlanX -c /etc/wpa_supplicant/wpa_supplicant.conf -dd > /var/wifi_log备注
wlanX
为模式设备名,使用ifconfig -a
确认实际接口名称 (如 wlan0/wlan1)
获取 IP 地址
dhcpcd wlanX
配置 SoftAP
创建配置文件
/etc/hostapd/hostapd.conf
driver=nl80211 logger_syslog=-1 logger_syslog_level=2 hw_mode=g channel=6 ssid=aaa_test wpa=2 wpa_passphrase=12345678 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP
创建 DHCP 配置文件
/etc/udhcpd_wlanX.conf
start 192.168.43.20 end 192.168.43.254 interface wlanX opt dns 192.168.43.1 option subnet 255.255.255.0 opt router 192.168.43.1
启动 SoftAP
hostapd /etc/hostapd/hostapd.conf -i wlanX
设置 AP IP 地址
ifconfig wlanX 192.168.43.1
启动 DHCP 服务
udhcpd -f /etc/udhcpd_wlanX.conf
驱动加载确认
连接无线网络
备注
Ubuntu 系统注意:若需通过命令行连接 AP,需关闭 NetworkManager 和 DHCP 服务以避免冲突。
sudo systemctl stop NetworkManager dhcpcd.service sudo systemctl disable NetworkManager
创建配置文件
/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant network={ ssid="HUAWEI-JX2UX5_HiLink_5G" psk="12345678" }
启动 WPA 连接
wpa_supplicant -D nl80211 -i wlanX -c /etc/wpa_supplicant/wpa_supplicant.conf -dd > /var/wifi_log备注
wlanX
为模式设备名,使用ifconfig -a
确认实际接口名称 (如 wlan0/wlan1)
获取 IP 地址
执行 Control App
cd ${SDK}/component/wifi/whc/whc_host_linux/app sudo ./whc_ctrl_app
在 Control App 进行初始化操作
> init
在 Control App 输入 cmd 通知 Ameba 获取 IP 地址
> dhcp
根据 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
来获取信息
网络测试
ping 192.168.x.x
初始化配置
在 Control App 执行初始化序列
> BRIDGE sethost > BRIDGE wifion > BRIDGE getmac
连接无线网络
在 control app 执行 WiFi 扫描
> BRIDGE scan
在 control app 建立无线连接
> BRIDGE connect ap_test 12345678备注
ap_test
为目标 AP 的 ssid,12345678
为目标 AP 的密码,开放网络可省略密码参数。
网络测试
AT+WLPING=192.168.x.x
连接无线网络
执行 WiFi 扫描
> AT+WLSCAN
建立无线连接
> AT+WLCONN=ssid,ap_test,pw,12345678备注
ap_test
为目标 AP 的 ssid,12345678
为目标 AP 的密码,开放网络可省略密码参数。
网络测试
AT+WLPING=192.168.x.x
WHC 低功耗
Device 端操作
执行
AT+TICKPS=TYPE,CG
来设置 device 的低功耗模式。
Host 端操作
查询无线物理接口名称(观察输出中的 "phy" 字段):
rfkill list
。启用任意数据包唤醒功能:
sudo iw phy <phyname> wowlan enable any
(需替换实际 phyname)。验证 WoWLAN 配置状态:
sudo iw phy wowlan show
。触发系统挂起(内存休眠状态)
echo mem | sudo tee /sys/power/state
。
备注
执行 rmmod 后 phyname 可能变为 phy1/phyN,每次重启无线模块需重新执行步骤 1-3
WHC API
头文件
whc_host_linux/common/whc_host_cmd_path_api.h
whc_host_linux/app/whc_host_app_api.h
component/wifi/whc/whc_host_rtos/whc_host_app.h
component/wifi/whc/whc_dev/whc_dev_api.h
接口定义
int whc_host_buf_rx_to_user(u8 *buf, u16 size);
项目 |
描述 |
---|---|
功能 |
处理设备到主机的数据包传输,默认实现将数据包转发至用户空间 |
参数 |
buf: 数据包缓冲区指针,size: 数据包有效长度(字节) |
返回值 |
0表示成功,非零为错误码 |
备注
此为 RTK SDK 中的弱定义接口,建议用户根据实际场景重载实现。
void whc_host_send_data_to_dev(u8 *pbuf, u32 len, u32 with_txdesc);
项目 |
描述 |
---|---|
功能 |
内核空间到设备的数据包传输接口 |
参数 |
pbuf: 发送数据缓冲区,len: 有效数据长度 , with_txdesc: 1表示缓冲区已包含TX描述符头 |
返回值 |
无 |
int whc_host_api_send_nl_data(uint8_t *buf, uint32_t buf_len);
项目 |
描述 |
---|---|
功能 |
用户空间到设备的Netlink数据传输接口 |
参数 |
buf: 结构化数据缓冲区,buf_len: 数据长度 |
返回值 |
0表示成功,非零为错误码 |
void whc_host_pkt_rx_to_user(u8 *payload, u32 len);
项目 |
描述 |
---|---|
功能 |
设备到主机应用的数据包分发接口 |
参数 |
payload: 有效载荷指针,len: 数据长度 |
返回值 |
无 |
备注
此为 RTK SDK 中的弱定义接口,建议用户根据实际场景重载实现。
void whc_host_send_to_dev(u8 *buf, u32 len);
项目 |
描述 |
---|---|
功能 |
应用层到设备的数据传输接口 |
参数 |
buf: 发送数据缓冲区,len: 数据长度 |
返回值 |
无 |
void whc_dev_api_send_to_host(u8 *buf, u32 len);
项目 |
描述 |
---|---|
功能 |
设备到主机的数据包传输接口 |
参数 |
buf: 数据缓冲区指针,len: 有效数据长度 |
返回值 |
无 |
void whc_dev_pkt_rx_to_user(u8 *rxbuf, u8 *real_buf, u16 size);
项目 |
描述 |
---|---|
功能 |
处理设备接收到的用户数据包,并将其传递至设备端应用程序 |
参数 |
rxbuf: 指向接收到的数据有效载荷 real_buf: 指向数据包最终释放的内存地址 size: 数据包长度(字节) |
返回值 |
无 |
备注
此函数在 RTK SDK 中定义为弱符号接口(weak symbol),开发者可根据实际应用场景重写实现。
WHC Wi-Fi 吞吐量
Interface |
Wi-Fi driver location |
Item |
Slim Host |
Fat Host |
---|---|---|---|---|
SDIO [1] |
KM4 (334MHz) |
TCP RX |
49.7 |
53.5 |
TCP TX |
50.1 |
51.2 |
||
UDP RX |
58.9 |
59.6 |
||
UDP TX |
56.5 |
56.6 |
||
SPI [2] |
KM4 (334MHz) |
TCP RX |
16.8 |
17.1 |
TCP TX |
17.4 |
17.7 |
||
UDP RX |
19.1 |
18.6 |
||
UDP TX |
18.9 |
18.4 |
||
USB [3] |
TCP RX |
|||
TCP TX |
||||
UDP RX |
||||
UDP TX |
[1] Device 代码运行在 Flash 中,主机:Raspberry Pi 5 Model B Rev 1.1,root: Linux raspberrypi 6.6.31+rpt-rpi-2712
[2] Device 代码运行在 Flash 中,主机:Raspberry Pi 5 Model B Rev 1.0,root: Linux raspberrypi 6.6.31+rpt-rpi-2712
Interface |
Wi-Fi driver location |
Item |
Slim Host |
Fat Host |
---|---|---|---|---|
SPI [1] |
KM4 (334MHz) |
TCP RX |
10.9 |
11 |
TCP TX |
10.4 |
10.6 |
||
UDP RX |
16.3 |
15.5 |
||
UDP TX |
17.1 |
17.4 |
[1] Device 代码运行在 Flash 中,主机:Ameba RTL8721Dx, SPI Clk 25M
Interface |
Wi-Fi driver location |
Item |
Slim Host |
Fat Host |
---|---|---|---|---|
SDIO [1] |
KM4 (320MHz) |
TCP RX |
65 |
65.5 |
TCP TX |
73.1 |
74.3 |
||
UDP RX |
81.9 |
83.8 |
||
UDP TX |
86.3 |
88 |
||
SPI [2] |
KM4 (333MHz) |
TCP RX |
17.8 |
17.8 |
TCP TX |
18.4 |
18.2 |
||
UDP RX |
19.1 |
19.0 |
||
UDP TX |
19.5 |
19.3 |
||
USB [3] |
TCP RX |
|||
TCP TX |
||||
UDP RX |
||||
UDP TX |
[1] Device 代码运行在 Flash 中,主机:Raspberry Pi 5 Model B Rev 1.1,root: Linux raspberrypi 6.6.31+rpt-rpi-2712
[2] Device 代码运行在 Flash 中,主机:Raspberry Pi 5 Model B Rev 1.0,root: Linux raspberrypi 6.6.31+rpt-rpi-2712
Interface |
Wi-Fi driver location |
Item |
Slim Host |
Fat Host |
---|---|---|---|---|
SPI [1] |
KM4 (333MHz) |
TCP RX |
13.1 |
13.1 |
TCP TX |
14 |
14.4 |
||
UDP RX |
19.2 |
20.1 |
||
UDP TX |
21.9 |
22.7 |
[1] Device 代码运行在 Flash 中,主机:Ameba RTL8721F, SPI Clk 25M
WHC 内存占用量
Device
以 Wi-Fi 运行在 KM0 上为例:
项目 |
KM0 |
KM4 |
---|---|---|
txt |
270KB |
31KB |
rodata |
51KB |
9KB |
data+bss |
17KB |
4KB |
heap |
~68KB |
~2.5KB |
Host
Host |
Item |
whc |
---|---|---|
SPI |
txt |
4.8KB |
bss |
~3.5KB |
|
heap |
~5KB |
Host |
Item |
fullmac_xxx.ko |
---|---|---|
SDIO |
txt |
88KB |
data |
65KB |
|
bss |
18KB |
|
SPI |
txt |
73KB |
data |
54KB |
|
bss |
18KB |
|
USB |
txt |
|
data |
||
bss |
备注
在 .ko 之前的接口名称由不同的 Host 决定,如:sdio, spi 或 usb。