基于MPSOC器件实现WiFi6模组通讯

作者:Perry Li,文章来源:Ingdan FPGA

功能模块简介

MPSOC作为ZYNQ 7000的升级版,在接口方面其性能也大大增强;在一些高速数据采集的场合PS-GTR的PCIE Root Complex功能可以方便地外接WiFi模组、NVME等外设,进行数据的传输和保存。例如使用WiFi6和MPSOC EV器件的VCU配合做无线4K编解码应用,可以做到更大的通讯容量和更低的延迟。

MPSOC全系列自带4路6 Gbps的PS-GTR,支持PCIE,SATA,USB3.0和DisplayPort四种协议,可以方便地连接各种高速外设,PS-GTR的结构如下:

可见PS-GTR的结构相比PL的Transceiver在PCS和PMA的基础上多了PCIE,SATA,USB3.0和DisplayPort协议的控制器,以及ICM功能,不同的协议通过ICM切换,其复用关系如下:

其中PS-PCIE可以支持Root Complex模式和End Point模式,在Lane速率上支持且支持1-4Lane的Gen1(2.5Gbps)或者Gen2(5Gbps),这里以手头的一个型号为Intel AX200的WIFI6模组为例,介绍Root Complex模式软硬件设计流程。

硬件模块搭建和要求

硬件结构如下,Si5338可编程时钟作为时钟源,为PS-GTR和AX200提供100M参考时钟,Si5338的频率通过I2C配置进去,AX200通过PCIE x1连接到MPSOC的XCZU4EV器件。

关于时钟需要注意的有下面两点:

1、时钟拓扑结构

上图比较推荐的时钟架构,Tx和Rx共用一个同源的参考时钟,即使Refclk有一定的抖动,由于时钟收发同源,Rx的CDR依然可以正常锁定。有的设计因为EMI的原因需要使用带有SSC功能的参考时钟,这种时钟架构可以满足要求。

有的设计为了使PCIE通讯更稳定,在主板和PCIE卡上分别用了独立时钟,如上图的时钟架构,这样的设计对参考时钟的要求比较高,通常晶振或者时钟芯片会受温度、型号、批次、误差等因素的影响,如果两个参考时钟频偏过大,会造成PCIE无法锁定,两个时钟的的成本也比较高,因此不推荐这种时钟架构。这种时钟架构下,SSC功能必须关闭。

2、时钟电平

时钟信号的电平是容易被忽略的一点,对于PS-GTR来说,只要Vpp大于250mV就可以正常工作,常见的LVDS和LVPECL电平在交流耦合的情况下都可以满足要求,但对于PCIE 卡来说要求时钟电平必须是HCSL电平,关于HCSL电平的细节,PCI Express Card ElectromechanicalSpecification上有讲,需要注意的是,HCSL必须是直流耦合,且在P和N上分别接50Ω的下拉电阻,如下图所示:

Vivado里面设置PS PCIe参数

1、PCIE的复位信号只能用MIO,这里用MIO31,Lane数量选x1。

2、参考时钟按照硬件连接设置为RefClk0,100MHz。

3、勾选Switch To Advanced Mode,可以看到PCIe Configuration选项,Device Port Type设置为Root Port,其他参数默认即可。

4、再根据需要添加串口、SD卡、I2C等外设后,生成bit流,导出xsa文件。

时钟芯片Si5338配置方式

借助Clock Builder Pro工具可以快速配置Si5338的寄存器,给MGTREFCLK0的时钟配置为LVDS电平,给PCIe Slot的时钟配置为HCSL电平,时钟源都用PLL,并且关闭SSC功能,最后生成Si5338-RevB-Registers.h寄存器配置文件后寄存器信息保存在Reg_Data数组下。

参考时钟要在系统一起来就送出,因此这里通过FSBL来初始化Si5338。在Vitis下导入Vivado下生成的xsa,创建硬件Platform工程,在FSBL文件夹里找到xfsbl_initialization.c,在这里要实现以下几个函数:

Intiic_master_init(void) //初始化PS IIC外设

voidsi5338_map(uint8 reg, uint8 val, uint8 num) //解析Reg_Data,写入对应寄存器

voidclk_init(void) //初始化Si8338

调试验证时钟正常后,在Vitis里Commet并Push,创建Patch,方便在Petalinux下调用。也可以直接在Petalinux下直接修改FSBL的源码。

Vitis下还可以对PCIe链路状况做初步判断,在BSP里导入psu_pcie例程运行,正常情况下会提示“Link is UP”,如果提示“PHY never cames up”,需要检查MPSOC的100M参考时钟。如果PHY工作正常,提示“Link is DOWN”,则要检查链路是否有问题,PS-GTR里也集成了EyeScan功能,在Vivado里可以做误码率等测试。

Petalinux配置流程

1、配置kernel
接下来在Petalinux里创建工程,并导入xsa文件

petalinux-create --type project --templatezynqMP --name pcie_host –force

cd pcie_host/

petalinux-config --get-hw-description ../

WiFi模组正常工作需要通过PCIE加载固件,需要把固件存放在EXT4文件系统下,因此修改Root filessystem类型和挂载点。

petalinux-config

Image PackagingConfiguration

Root filesystem type (EXT4 (SD/eMMC/SATA/USB))

(/dev/mmcblk1p2) Device node of SD device

增加802.11的API和协议栈

petalinux-config -c kernel

Networkingsupport

Wireless

cfg80211 - wireless configuration API

Generic IEEE 802.11 Networking Stack(mac80211)

接下来修改kernel配置,添加iwlwifi驱动

petalinux-config -c kernel

DeviceDrivers

Network device support

Wireless LAN

Intel WirelessWiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)

Intel WirelessWiFi MVM Firmware support

设置WiFi固件的加载路径

petalinux-config -c kernel

Device Drivers

Generic Driver Options

Firmware loader

(iwlwifi-cc-a0-46.ucode) Build named firmware blobs into the kernelbinary

(/lib/firmware) Firmware blobs root directory

AX200的WiFi驱动有bug,需要对源码做修改,因此修改Build tool为devtool

petalinux-config

Yocto settings

Build tool (devtool)

把kernel和fsbl源码下载到工程目录

petalinux-build -c kernel -x modify

petalinux-build -c fsbl -x modify

执行完成后pcie_host/components/yocto/workspace/sources目录下可以看到kernel源码,注释掉pcie_host/components/yocto/workspace/sources/linux-xlnx/drivers/net/wireless/intel/iwlwifi/mvm/fw.c文件这一部分:

/*Init RSS configuration */

// if(mvm->trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_22000) {

// ret= iwl_configure_rxq(mvm);

// if (ret) {

// IWL_ERR(mvm, "Failed toconfigure RX queues: %d\n",

// ret);

// goto error;

// }

// }

2、修改FSBL
在pcie_host/components/yocto/workspace/sources/fsbl/lib/sw_apps/

zynqmp_fsbl/srcxfsbl_initialization.c中加入验证好的Si5338初始化代码。

3、配置Rootfs
配置rootfs,加入pciutilsiperf3和wpa-supplicant工具,方便检查PCIE连接、配置WiFi以及测速。

打开pcie_host/project-spec/meta-user/conf/user-rootfsconfig,在文件末尾加上

CONFIG_iperf3

petalinux-config -c rootfs

FilesystemPackages

Console

Utils

[*]Pciutils

Network

wpa-supplicant

[*]wpa-supplicant

User Packages

[*] iperf3

4、部署到SD卡

执行build命令,等待编译完成。

petalinux-build

编译完成后执行以下命令打包

petalinux-package --boot --format BIN--fsbl images/linux/zynqmp_fsbl.elf --u-boot images/linux/u-boot.elf --pmufwimages/linux/pmufw.elf --fpga images/linux/*.bit --force

将image.ub boot.scr BOOT.BIN复制到SD卡分区的FAT32分区,执行以下命令 将rootfs解压到EXT4分区。

sudo tar xvf rootfs.tar.gz -C /media/User/fs/

下载Wifi模组固件以及测试结果

1、下载WiFi模组的固件

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

解压后把iwlwifi-cc-a0开头的文件都复制到SD卡EXT4分区的/lib/firmware下,系统启动后会在这里找到对应的固件,并加载到WiFi模组里。

开发板设置SD卡启动,启动信息里可以看到模组已经正常工作。

[ 5.257568] iwlwifi 0000:01:00.0: enabling device (0000 -> 0002)

[ 5.343040] iwlwifi 0000:01:00.0: TLV_FW_FSEQ_VERSION: FSEQ Version:58.3.35.22

[ 5.350406] iwlwifi 0000:01:00.0: Found debug destination: EXTERNAL_DRAM

[ 5.357153] iwlwifi 0000:01:00.0: Found debug configuration: 0

[ 5.385724] iwlwifi 0000:01:00.0: loaded firmware version 50.3e391d3e.0op_mode iwlmvm

[ 5.438124] iwlwifi 0000:01:00.0: Detected Intel(R) Wi-Fi 6 AX200 160MHz,REV=0x340

[ 5.460292] iwlwifi 0000:01:00.0: Applying debug destination EXTERNAL_DRAM

[ 5.469082] iwlwifi 0000:01:00.0: Allocated 0x00400000 bytes for firmwaremonitor.

2、执行以下命令,配置WiFi账号密码

vi /etc/wpa_supplicant.conf

WiFi配置信息如下:

ctrl_interface=/var/run/wpa_supplicant

ctrl_interface_group=0

update_config=1

network={

ssid="TP-LINK_5G_DF52"

psk="1234567890"

}

3、执行以下命令打开WiFi,稍后即可连到路由器

Ifup wlan0

在局域网内一台电脑上运行.\iperf3.exe –s命令,作为测速服务器,在板上运行iperf3.exe -c 192.168.123.124,可以得到测速结果:

Connecting to host 192.168.123.124, port5201

[ 4]local 192.168.123.166 port 52777 connected to 192.168.123.124 port 5201

[ ID] Interval Transfer Bandwidth

[ 4] 0.00-1.00 sec 55.8 MBytes 467 Mbits/sec

[ 4] 1.00-2.00 sec 54.1 MBytes 455 Mbits/sec

[ 4] 2.00-3.00 sec 52.4 MBytes 439 Mbits/sec

[ 4] 3.00-4.00 sec 53.2 MBytes 447 Mbits/sec

[ 4] 4.00-5.00 sec 48.5 MBytes 407 Mbits/sec

[ 4] 5.00-6.00 sec 53.9 MBytes 452 Mbits/sec

[ 4] 6.00-7.00 sec 52.9 MBytes 443 Mbits/sec

[ 4] 7.00-8.00 sec 50.6 MBytes 425 Mbits/sec

[ 4] 8.00-9.00 sec 50.1 MBytes 420 Mbits/sec

[ 4] 9.00-10.00 sec 52.1 MBytes 437 Mbits/sec

- - - - - - - - - - - - - - - - - - - - - -- - -

[ ID] Interval Transfer Bandwidth

[ 4] 0.00-10.00 sec 524 MBytes 439 Mbits/sec sender

[ 4] 0.00-10.00 sec 524 MBytes 439 Mbits/sec receiver

从测试结果来看满足我们最初的想法和要求。

如果您在对此实现方案有所疑问,欢迎联系我们来做进一步沟通和讨论:

simonyang@comtech.com.cn
charlesxu@comtech.com.cn

最新文章

最新文章