国产之路:复旦微zynq调试笔记2--PL网口

简介: PL侧的网口需求相较于PS部分还是有一定区别的,主要需要添加axi ethernet 的移植

引言

 PL侧的网口需求相较于PS部分还是有一定区别的,主要需要添加axi ethernet 的移植

PL 的 PCS/PMA IP 使用说明

 关于xilinx 的Xilinx PCS/PMA PHY 的IP,这个是SGMII 接口,这里PCS/PMA IP 核相当 于PHY,外部通过PCB 连接到光模块,是电口转光口,对应的linux 驱动是xilinx_phy.c ,20200304 版本的内核默认没有移植过来,需要自己从 xilinx 的 release 内核比如 2018.3里移植过来, 20101022 和 20210816 版本的 linux bsp 都已经移植了这个驱动

  ps 网口GMII 从emio 出引脚需要注意的地方:

  1)phy 节点里compatible 属性去掉才行,没有用到。

  2) EMIO GMII RXC 需要增加时钟约束。

create_clock -period 8.000 -name rx_clk waveform {0.000 4.000} [get_ports RGMII_rxc]

  调试通过的设备树节点写法:

&gmac1 {  
           status = "okay";  
           phy-mode = "gmii";    //看硬件,实际是什么接法,确定是GMII 还是SGMII  
           phy-handle = <&phy0>;  
           mdio@0 {  
                compatible= "snps,dwmac-mdio";  
                #address-cells = <1>;  
                #size-cells = <0>;  
                  phy0: eth-phy@6 {  
                  /*compatible = "Xilinx PCS/PMA PHY";*/  
                  xlnx,phy -type = <0x5>; //1000BASEx; sgmii 是4  
                  reg = <6>;      //phy 地址,根据实际硬件调整  
                  };  
             };  
     };  

AXI_Ethernet

2018.3

 Psoc 的 linux 是从 kernel.org 上游 4.14.55-release 版本一致的, xilinx 的驱动是比较老的,这取决 xilinx 在什么时机点往 kernel upstream 推送他们的更新补丁, 基本很少更新, 因为他们自己维护一个 github 仓库,所以 PL 驱动建议从 2018.3 版本(内核版本是 4.14.0)移植驱动, xlnx 的 2018.3-relase 内核链接如下:

 https://github.com/Xilinx/linux-xlnx/releases/tag/xilinx-v2018.3

 驱动路路径是 drivers/net/ethernet/Xilinx, 备份或改名 psoc 内核目录, 把 2018.3 内核里的 drivers/net/ethernet/xilinx 目录替换,另外把 include/linux/xilinx_phy.h 拷贝复旦微目录下。Kconfig 修改:

 Psoc 默认内核配置只有 microblaze 架构下才能看到 axi ethernet 驱动:

config XILINX AXI EMAC
tristate "xilinx 10/100/1000 AXI Ethernet support" depends on MICROBLAZE select PHYLIB ---help---
This driver supports the 10/100/1000 Ethernet from xilinx for the AXI bus interface used in xilinx virtex FPGAs.

 对比 xlnx-2018.3 内核:

5 config NET VENDOR XILINX  
6 bool "xilinx devices" 
default y
depends on PPCPPC32MICROBLAZE I ARCH ZYNO I MIPS II ARCH ZYNOMP I1 ARCH FMSH ---help---
If you have a network (Ethernet) card belonging to this class, say y.
Note that the answer to this question doesn't directly affect the kernel:saying N will just cause the configurator to skip all
the questions about xilinx devices. If you say y, you will be asked for your specific card in the following questions.
if NET VENDOR XILINX8
config XILINX EMACLITE
tristate "xilinx 10/100 Ethernet Lite support"
depends on PPC32MICROBLAZE L ARCH ZYNO II MIPS I1 ARCH ZYNOMP II ARCH FMSH select PHYLIB ---help---
This driver supports the 10/100 Ethernet Lite from xilinx.
config XILINX AXI EMAC  添加fmsh架构支 
tristate "xilinx axi Ethernet support" depends on (MICROBLAZE II ARCH ZYNO II ARCH ZYNOMP II ARCH FMSH)持
9 select PHYLIB 
0 --help--- 
This driver supports the xilinx AXI 1G/2.5G, 10 Gigabit,
10G/25G High Speed and USXGMII Ethernet Subsystem.  Hx--1024  
?

 三种架构都支持,另外注意 axi ethernet 依赖 NET_VENDOR_XILINX,在上面也需要加上ARCH_FMSH 架构支持。然后就可以用 make menuconfig 里看到驱动选项并可以操作使能 axi ethernet 内核选项了。

驱动小修改:

379:  /* Read/Write access  the registers * 
380:#ifndef out be32
381:#if defined(CONFIG ARCHZYNQ) defined(CONFIG ARCH ZYNQMP) defined(CONFIG ARCH FMSH
382:  #define in_be32(offset) raw_readl(offset) 
383:#define out_be32(offset, val) raw_writel(val, offset)
384:  385:  #endif  #endif  增加架构支持

内核编译就基本没有问题了。

 另外 psoc 的 linux bsp 的 sdk 处理中断号脚本有点小 bug,两个中断号写到一对<>里时,第 2 个中断号处理不了, 可以在 procise 生成的 system-top.dts 里手动覆盖一下 pl.dtsi里的 interrupts 属性。

&axi_ethernet_0_dma {
Interrupts = <0 25 4 >, <0 26 4>; //中断号从 29,30 修正到 25,26
};

 或者:在 device-tree/get_pldts.sh 增加一个中断修复函数(只能处理两个,但是能处理两种格式)

fix_interrupt_again() {
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 29\)\(.*\)/\1\2 0 25\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 30\)\(.*\)/\1\2 0 26\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 31\)\(.*\)/\1\2 0 27\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 32\)\(.*\)/\1\2 0 28\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 33\)\(.*\)/\1\2 0 29\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 34\)\(.*\)/\1\2 0 30\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 35\)\(.*\)/\1\2 0 31\4/g" ${DTS_FILES_PATH}/pl.dtsi
sed -i "s/\( *interrupts.*\)\(<0.*\)\(0 36\)\(.*\)/\1\2 0 32\4/g" ${DTS_FILES_PATH}/pl.dtsi
}
97 cat${XLNX_DTS FILES PATH}/dts/pl.dtsi >> ${DTS FILES PATH}/pl.dtsi98 #fix clock
99 fix interrupt
100 fix interrupt_again101

 并在这个脚本里再调用一下这个函数,进行二次处理。

 如果是 20210816 的 bsp 的设备树脚本已经可以处理如下格式的 2 个及以上的中断号了,这样的话,就不用手动修改节点的中断号了。

axi_dma_0:dma@40400000
#dma-cells =<1>;
axistream-connected =<&axi ethernet @>;
axistream-control-connected =<&axi ethernet o>;
clock-names ="s axilite aclk","m axi sg aclk","m axi mm2s aclk", "m axi s2mm aclk". clocks=<&miscclk0>,<&miscclk 0>, <&misc clk e>, <&misc clk e>; compatible ="xlnx,eth-dma";
interrupt-names = "mm2s introut", "s2mm introut":
interrupts =<0 25 4 026 4>; reg = <0x40400000 0x10000>; xlnx,include-dre ;
};
axi_dma_1:dma@40410000  #dma-cells =<1>;  这个格式  
axistream-connected = <&axi ethernet 1>;
axistream-control-connected =<&axi ethernet/1>;
clock-names = "s axi lite aclk", "m axi sg aclk"  "m axi mm2s aclk", "m axi s2mm aclk". 
clocks=<&misc_clk_0>,<&misc_clk_0>, <&isc_clk_0>, <&misc_clk_0>; compatible = "xlnx,eth-dma";
interrupt-names ="mm2s_introut","s2m  introut"; 
04nte
interrupts =<0 27 4 日28 4>; reg = <0x40410000 0X100007
xlnx,include-dre ;  Hx--1024

 根据实际使用的 phy 增加 phy 节点:

&axi dma 0 {
interrupts = <0 25 1>,<0 26 4>;};
手动修改中断的例子
&axi ethernet 0 {
interrupts = <0 29 1>,<0 30 4>; xlnx,phyaddr =<0x3>; phy-handle =<&phy3>;
mdio@0{ - phy节点例子 
#address-cells =<1>;#size-cells =<0>;
device type = "ethernet-phy"; phy3:eth-phy@3{
reg =<0x3>;};};
};  Hx--1024

2018.2

 如果是2018.2版本,找到xilinx_axienet_main是在XILINX_AXI_EMAC的配置项决定,

ll_temac-objs := ll_temac main.o ll_temac mdio.o Ob1-S(CONFIG XILINX LL TEMAC)+= 1l temac.o
Obj-S(CONFIG XILINX EMACLITE) += xilinx emaclite.o obj-$(CONFIG XILINX_TSN)+= xilinx_tsn_ep.o
obj-$(CONFIGXILINXTSN_PTP)+= xilinx tsn ptp xmit.o xilinx tsn ptp clock.a obj-$(CONFIG XILINX TSN OBV) += xilinx tsn shaper.o obj-$(CONFIG XILINX_TSN_QCI) += xilinx_tsn_gci.o obj-$(CONFIG XILINX TSN CB) += xilinx tsn cb.o
obj-$(CONFIG XILINX TSN SWITCH) += xilinx tsn switch.o
xilinx emac-objs:=xilinxaxienet main.o xilinx axienet mdio.o xilinx axienet dma.o Obi-S(CONFIG XILINX AXI EMAC)+= xilinx emac.o
obj-$(CONFIG XILINX_TSN_QBR) += xilinx_tsn_preemption.o
obj-$(CONFIG AXIENET HAS MCDMA)+= xilinx_axienet_mcdma.o  Hx--1024
config  XILINX AXI EMAC 
tristate "xilinx AxI Ethernet support" select PHYLIB ---help--.
This driver supports the xilinx AXI 1G/2.5G, 10 Gigabit,10G/25G High Speed and usxgmII Ethernet Subsystem.
config  XILINX AXI EMAC HWTSTAMP  
bool "Generate hardware packet timestamps" depends on XILINX AXI EMAC select PTP_1588_CLOCK default n ---help--.
Generate hardware packet timestamps. This is to facilitate IEEE 1588. Hx--1024

 那为什么直接在menuconfig中找不到呢,如图位置打开defined 所在的kconfig配置文件,将无关的依赖项depends on去掉就可以显示编译了

irtual-machne=/project/0442/FMQULivux-SOK_20210416,/Unux-4.14.5 5-fmh.conflg -Linux/x86 4.14.55 Kernel Configuration Search (XILINX AXI EMAC)
Soareb cesults
Synbol:XILINX_AXI_EMAC [=n] Type itristate
Prompt: xillmx AxI Ethernet support
Location:
=> Device Drivers
-> Network device support (NETDEVICES [=y])
(1) *> Ethernet driver support (ETHERNET [-y])  => Xilinx devices (NET VENDOR XILINX [=n])  
Defined at drivers/net/ethernet/xilinx/KconfLo:26
Dependson:NETDEVICES[Cy]&& ETHERNET【=Y]&ANETVENDOR XILINX[=n】&&(RICROBLAZE II ARCH ZYNG II ARCH ZYNQMP) Selects:PHYLIB [=y]
Symbol:XILINX_AXI_EMAC_HWTSTAMP [*n] Type :boolean
Prompt: Generate hardware packet timestampi
Location:
-> Devlce Drivers
-> Network device support (NETDEVICES ["y])
(2) -> Ethernet driver support (ETHERNET [=y])  -> xtlinx devices (NET VENPOR XILINX [=n])  
+> Xilinx AxI Ethernet support (XILINX_AXI_EMAC [=n])
Defined at drivers/net/ethernet/xiLinx/Kconfig:34
Dependson:NETDEVICES[y]&B ETHERNET[=y]&& NET_VENDOR_XILINX [=n] && XILINX_AXI_EMAC [=n] Selects: PTP_1588_CLOCK [=y]
Hx--1024

设备树修改

phy-handle = <&phy0>;
                        axi_ethernet_0_mdio: mdio {
                                #address-cells = <1>;
                                #size-cells = <0>;
                                phy0: pl_phy@0 {
                                        reg = <5>;
                                };

测试结果

 实际上在复旦微的设计并不是那么完善的,按照xilinx的经验,在没有其他硬件选型等问题的前提下,截止到目前应该软件部分应该已经设置修改完毕了,可测量结果有显示,即便只是单纯的ping包,也时断时续,打开iperf,也能明显看到只有单向的速率还算稳定,另一个方向惨不忍睹

现象分析

 经过和复旦微测试人员的不断沟通,终于在修改了ddr的频率后有了明显改善。探究原因,本质上是由于时钟的不稳定导致的,造成原因是逻辑的配置是由vivado生成后导入procise的,在导入过程中,原本时钟使用IO的时钟,但是导入后由于procise设置(直接在prosice上配置也不行,因为procise只支持用ddr时钟,应该是设计缺陷),会自动转为ddr时钟,而ddr高速又不稳定,在降速至300m后才可正常使用,暂未对其他功能有影响。


相关文章
|
存储 并行计算 Linux
国产之路:复旦微FMQL调试笔记1:PS网口
FPGA,全程现场可编程门阵列,是指一切通过软件手段更改、配置器件内部连接结构和逻辑单元,完成既定设计功能的数字集成电路。换个简单通俗的介绍方式,就好比一个全能的运动员,FPGA就是这么神奇的可以通过设定而实现各种复杂的功能电路。
1651 0
国产之路:复旦微FMQL调试笔记1:PS网口
|
2月前
【PCB设计秘籍】AutoDesk Eagle轻松驾驭:LMC555CN/NOPB器件库下载与添加全攻略,设计效率飙升!
【8月更文挑战第2天】【PCB设计】AutoDesk Eagle如何下载和添加LMC555CN或LMC555CN/NOPB器件的库
42 11
|
3月前
stm32f407探索者开发板(十三)——JLINK在线调试_软件调试_方法与技巧
stm32f407探索者开发板(十三)——JLINK在线调试_软件调试_方法与技巧
163 0
|
5月前
|
Linux Android开发
全志平台A40I : I2C通讯问题调试笔记
全志平台A40I : I2C通讯问题调试笔记
115 0
|
存储 固态存储 Ubuntu
基于飞腾芯片的设计与调试入门指导
基于飞腾芯片的设计与调试入门指导
585 0
|
vr&ar 网络架构
网络应用基础华为ENSP环境的安装(NETBASE第三课)
网络应用基础华为ENSP环境的安装(NETBASE第三课)
207 0
|
监控 网络协议 安全
【毕设参考】使用ESP32 + HaaS Python 通过 Modbus 控制强电工业设备 实现低碳节能系统
【毕设参考】使用ESP32 + HaaS Python 通过 Modbus 控制强电工业设备 实现低碳节能系统
194 0
|
存储 运维 内存技术
vFW设备开局升级操作指北
vFW设备开局升级操作指北
vFW设备开局升级操作指北
|
安全 测试技术 虚拟化
|
编解码 前端开发 智能网卡
【LC3开源峰会网络技术系列之二】阿里云开发智能网卡的动机、功能框架和软转发程序
摘要 这篇文章介绍了阿里云开发智能网卡的动机、功能框架和软转发程序以及在软转发过程中发现的问题和优化方法。 主讲人陈静 阿里云高级技术专家 主题Zero-copy Optimization for DPDK vhost-user Receiving 分论坛Network & Orchestration 项目背景 在VPC产品部署中虚拟交换Virtual Switch承担着overlay层和underlay层进行网络协议的加解密encap/decap功能在多租户虚拟机或者容器的主机上也需要进行二三层的路由转发、Qos、限流、安全组等。
5471 0
下一篇
无影云桌面