支持的芯片
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无线框架
传输接口支持WiFi/BT指令传输及客制化命令扩展
FullMAC architecture
备注
HOST操作系统支持
Linux
FreeRTOS
Zephyr
备注
蓝牙协议栈适配
Linux HOST:Bluez协议栈
Zephyr HOST:Zephyr BT 协议栈
FreeRTOS:Realtek BT 协议栈
FullMAC传输接口规范
Interface |
Wi-Fi |
BT |
---|---|---|
SDIO |
|
|
SPI |
|
|
USB |
|
X |
UART |
X |
X |
SDIO (Wi-Fi) + UART (BT) |
|
|
SPI (Wi-Fi) + UART (BT) |
|
|
USB (Wi-Fi) + UART (BT) |
X |
X |
Interface |
Wi-Fi |
BT |
---|---|---|
SDIO |
|
|
SPI |
|
|
USB |
X |
X |
UART |
X |
X |
SDIO (Wi-Fi) + UART (BT) |
|
|
SPI (Wi-Fi) + UART (BT) |
|
|
USB (Wi-Fi) + UART (BT) |
X |
X |
Interface |
Wi-Fi |
BT |
---|---|---|
SDIO |
|
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 |
Function |
Description |
---|---|---|---|
SDIO |
PB6 |
SDIO_DAT2 |
SDIO pins |
PB7 |
SDIO_DAT3 |
||
PB8 |
SDIO_CMD |
||
PB9 |
SDIO_CLK |
||
PB13 |
SDIO_DAT0 |
||
PB14 |
SDIO_DAT1 |
||
SPI |
PB24 |
SPI_MOSI |
SPI pins |
PB25 |
SPI_MISO |
||
PB23 |
SPI_CLK |
||
PB26 |
SPI_CS |
||
PB8 |
DEV_TX_REQ |
||
PB9 |
DEV_READY |
||
UART |
PB14 |
SDIO_DAT1 |
SDIO_DAT1 |
PB14 |
SDIO_DAT1 |
SDIO_DAT1 |
Interface |
Raspberry Pi |
Function |
Description |
---|---|---|---|
SDIO |
GPIO 26 |
SDIO_DAT2 |
SDIO pins |
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 |
SPI pins |
GPIO 9 |
SPI_MISO |
||
GPIO 11 |
SPI_CLK |
||
GPIO 8 |
SPI_CS |
||
GPIO 23 |
DEV_TX_REQ |
||
GPIO 22 |
DEV_READY |
||
UART |
GPIO 25 |
SDIO_DAT1 |
SDIO_DAT1 |
GPIO 25 |
SDIO_DAT1 |
SDIO_DAT1 |
备注
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中断,可切换为polling模式
SDIO转接板
为避免飞线信号干扰,推荐使用专用转接板连接SDIO引脚:

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

Ameba与树莓派直连示意图
FullMAC Wi-Fi Device 驱动移植指南
在目录
{SDK}/amebadplus_gcc_project
中执行./menuconfig.py
:找到
,选择 :----General Config---- CONFIG TrustZone ---> CONFIG Link Option ---> (FLASH) MG1(Bootloader) running on FLASH or PSRAM? (PSRAM) MG2(Application) running on FLASH or PSRAM? CONFIG Mass Production ---> ... --->
找到
,选择需要的接口:(Top) -> CONFIG WHC INTF ----Configuration---- WHC MODE (FULLMAC) ---> HW INTERFACE (WHC_INTF_SDIO) ---> WPA Lite location (Host) ---> Debug --->
执行
./build.py
生成km4_boot_all.bin
和km0_km4_app.bin
。使用 image tool 下载固件到开发板。
FullMAC Wi-Fi 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
可查看 WiFi 设备信息。 示例输出: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 驱动移植指南
FullMAC BT 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] 测试条件基于Device code跑在psram上,host driver跑在8721Dx (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中运行的测试结果,主机驱动程序运行在树莓派4型号B上(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 之前的Interface名称由不同的host决定,比如:sdio, spi 或者 usb。