作者: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
设置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
从测试结果来看满足我们最初的想法和要求。
如果您在对此实现方案有所疑问,欢迎联系我们来做进一步沟通和讨论: