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

引言

  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 驱动:
国产之路:复旦微zynq调试笔记2--PL网口_第1张图片
  对比 xlnx-2018.3 内核:
国产之路:复旦微zynq调试笔记2--PL网口_第2张图片
  三种架构都支持,另外注意 axi ethernet 依赖 NET_VENDOR_XILINX,在上面也需要加上ARCH_FMSH 架构支持。然后就可以用 make menuconfig 里看到驱动选项并可以操作使能 axi ethernet 内核选项了。
驱动小修改:
国产之路:复旦微zynq调试笔记2--PL网口_第3张图片
  内核编译就基本没有问题了。

  另外 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
}

在这里插入图片描述
  并在这个脚本里再调用一下这个函数,进行二次处理。

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

国产之路:复旦微zynq调试笔记2--PL网口_第4张图片
  根据实际使用的 phy 增加 phy 节点:
国产之路:复旦微zynq调试笔记2--PL网口_第5张图片

2018.2

  如果是2018.2版本,找到xilinx_axienet_main是在XILINX_AXI_EMAC的配置项决定,
国产之路:复旦微zynq调试笔记2--PL网口_第6张图片
国产之路:复旦微zynq调试笔记2--PL网口_第7张图片
  那为什么直接在menuconfig中找不到呢,如图位置打开defined 所在的kconfig配置文件,将无关的依赖项depends on去掉就可以显示编译了
国产之路:复旦微zynq调试笔记2--PL网口_第8张图片

设备树修改

    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后才可正常使用,暂未对其他功能有影响。

你可能感兴趣的:(ZYNQ,复旦微FMQL,ZYNQ,Linux,网络接口,嵌入式,设备树,fmql)