支持的芯片
Ameba SoC |
RTL8721Dx |
RTL8726E |
RTL8720E |
RTL8730E |
---|---|---|---|---|
支持状态 |
Y |
N |
N |
N |
FullMAC 概述
在 WHC FullMAC 方案中,Ameba 作为网卡通过 UART/SPI/SDIO/USB 与主机 MCU 连接,为 Host 提供网络接入能力。
FullMAC 架构
核心功能特性:
建立 Host 与 Device 之间的 UART/SPI/SDIO/USB 传输通道
兼容 Linux 标准 wpa_supplicant 和 cfg80211 无线框架
传输接口支持 Wi-Fi/BT 指令传输及客制化命令扩展
FullMAC 的架构图如下所示:
备注
Host操作系统支持
Linux
FreeRTOS
Zephyr
备注
蓝牙协议栈适配
Linux HOST:Bluez 协议栈
Zephyr HOST:Zephyr BT 协议栈
FreeRTOS:Realtek BT 协议栈
FullMAC 传输接口规范
Interface |
Wi-Fi |
BT |
---|---|---|
SDIO |
Y |
Y |
SPI |
Y |
Y |
USB |
Y |
X |
UART |
X |
X |
SDIO (Wi-Fi) + UART (BT) |
Y |
Y |
SPI (Wi-Fi) + UART (BT) |
Y |
Y |
USB (Wi-Fi) + UART (BT) |
X |
X |
Interface |
Wi-Fi |
BT |
---|---|---|
SDIO |
Y |
Y |
SPI |
Y |
Y |
USB |
X |
X |
UART |
X |
X |
SDIO (Wi-Fi) + UART (BT) |
Y |
Y |
SPI (Wi-Fi) + UART (BT) |
Y |
Y |
USB (Wi-Fi) + UART (BT) |
X |
X |
Interface |
Wi-Fi |
BT |
---|---|---|
SDIO |
Y |
X |
SPI |
X |
X |
USB |
X |
X |
UART |
X |
X |
SDIO (Wi-Fi) + UART (BT) |
X |
X |
SPI (Wi-Fi) + UART (BT) |
X |
X |
USB (Wi-Fi) + UART (BT) |
X |
X |
FullMAC 功能特性
Features |
Linux host |
FreeRTOS host |
Zephyr host |
---|---|---|---|
Wi-Fi API |
Standard Linux APIs |
FreeRTOS Wi-Fi APIs |
Standard Zephyr APIs |
Wi-Fi mode |
|
|
|
Wi-Fi security |
|
|
|
Wowlan |
Y |
Y |
Y |
Bluetooth features |
|
|
|
FullMAC 文件目录
Wi-Fi
├─ whc
│ ├─ README.md
│ ├─ 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_bridge_sdio_dev.c
│ │ │ ├─ whc_bridge_sdio_dev.h
│ │ │ ├─ whc_fullmac_sdio_dev.c
│ │ │ ├─ whc_fullmac_sdio_dev.h
│ │ │ ├─ whc_sdio_drv.c
│ │ │ └─ whc_sdio_drv.h
│ │ ├─ spi
│ │ │ ├─ whc_bridge_spi_dev.c
│ │ │ ├─ whc_bridge_spi_dev.h
│ │ │ ├─ whc_fullmac_spi_dev.c
│ │ │ ├─ whc_fullmac_spi_dev.h
│ │ │ ├─ whc_spi_dev.c
│ │ │ └─ whc_spi_dev.h
│ │ ├─ usb
│ │ │ ├─ whc_usb_dev.c
│ │ │ └─ whc_usb_dev.h
│ │ ├─ whc_bridge_dev_api.c
│ │ ├─ whc_bridge_dev_api.h
│ │ ├─ whc_dev.h
│ │ ├─ whc_dev_api.c
│ │ ├─ whc_dev_api.h
│ │ ├─ whc_dev_app.c
│ │ ├─ whc_dev_bridge.c
│ │ ├─ whc_dev_bridge.h
│ │ ├─ 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_struct.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
│ │ ├─ whc_host.h
│ │ ├─ whc_host_api.c
│ │ ├─ whc_host_api.h
│ │ ├─ whc_host_api_basic.c
│ │ ├─ whc_host_api_ext.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
│ ├─ 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_event.h
│ │ ├─ whc_host_hci.c
│ │ ├─ whc_host_hci.h
│ │ ├─ whc_host_memory.c
│ │ ├─ 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
Bluetooth
FullMAC 硬件配置
接口连接
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 |
|
UART |
PB4 |
UART_RX |
PB5 |
UART_TX |
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 引脚,如需修改需调整以下文件中
SPDIO_Board_Init()
函数中的 pinmux 配置:component/soc/amebadplus/hal/src/spdio_api.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与树莓派直连示意图
FullMAC Wi-Fi 移植指南
Device 驱动移植
在目录
{SDK}/amebadplus_gcc_project
中执行./menuconfig.py
。找到
,选择 。(Top) -> CONFIG Link Option ----Configuration---- IMG1(Bootloader) running on FLASH or PSRAM? IMG2(Application) running on FLASH or PSRAM? ( ) FLASH (X) PSRAM CONFIG Mass Production ---> ... --->
找到
,选择需要的接口。(Top) -> CONFIG WHC INTF ----Configuration---- WHC MODE (FULLMAC_DEV) ---> HW INTERFACE ---> ( ) WHC_INTF_SDIO ( ) WHC_INTF_USB ( ) WHC_INTF_SPI WPA Lite location (HOST) ---> Debug --->
执行
./build.py
生成km4_boot_all.bin
和km0_km4_app.bin
。使用 image tool 下载固件到开发板。
Host 驱动移植
Ameba 作为 FullMAC Host 使用指南
环境配置
在目录
{SDK}/amebadplus_gcc_project
执行配置工具
./menuconfig.py
导航至
,选择传输接口:(Top) -> CONFIG WHC INTF ----Configuration---- WHC MODE (FULLMAC_HOST) ---> HW INTERFACE (WHC_INTF_SPI) --->
固件编译
生成目标文件:
./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_host_linux
执行以下操作:./fullmac_setup.sh sdio
./fullmac_setup.sh spi
./fullmac_setup.sh usb
将
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
加载成功后,执行
ifconfig
可查看 Wi-Fi 设备信息。输出示例:
Station 模式:设备 MAC 地址前缀为
00:e0:4c
SoftAP 模式:设备 MAC 地址前缀为
00:e1:4c
连接无线网络
备注
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
为 步骤 3 中获取的 Station 模式设备名。获取 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
FullMAC BT 移植指南
Device 驱动移植
Host 驱动移植
FullMAC Wi-Fi 吞吐量
Interface |
Item |
BW 20M (Mbps) |
---|---|---|
SPI [1] |
TCP RX |
8.3 |
TCP TX |
9.9 |
|
UDP RX |
15.8 |
|
UDP TX |
17.6 |
[1] 设备代码运行在 PSRAM 中,主机驱动程序运行 RTL8721Dx上(KM4:260MHz)
Interface |
Wi-Fi driver location |
Item |
BW 20M (Mbps) |
---|---|---|---|
SDIO [1] |
KM0 |
TCP RX |
39 |
TCP TX |
39 |
||
UDP RX |
54 |
||
UDP TX |
62 |
||
KM4 (331MHz) |
TCP RX |
41 |
|
TCP TX |
41 |
||
UDP RX |
56 |
||
UDP TX |
62 |
||
SDIO [2] |
KM0 |
TCP RX |
38 |
TCP TX |
39 |
||
UDP RX |
50 |
||
UDP TX |
57 |
||
KM4 (331MHz) |
TCP RX |
38 |
|
TCP TX |
41 |
||
UDP RX |
51 |
||
UDP TX |
58 |
||
SPI [2] |
KM0 |
TCP RX |
14.5 |
TCP TX |
16 |
||
UDP RX |
17.4 |
||
UDP TX |
17.8 |
||
USB [3] |
TCP RX |
||
TCP TX |
|||
UDP RX |
|||
UDP TX |
[1] 设备代码运行在 PSRAM 中,主机驱动程序运行在戴尔 Optiplex 3080 MT 上(SDIO 时钟频率:50MHz;内核:5.10.25-051025-lowlatency)
[2] 设备代码运行在 PSRAM 中,主机驱动程序运行在树莓派 4B 上(64 位四核 Cortex-A72 处理器;8GB LPDDR4 内存;CPU 时钟频率:1.5GHz;SDIO 时钟频率:41.67MHz;内核:Linux raspberrypi 6.1.0-rpi4-rpi-v8)
[3] 设备代码运行在 PSRAM 中。
FullMAC 内存占用量
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。