• PS通过GTX实现SFP网络通信2


    PS 程序设计
    LWIP 库修改
      修改原因
    SDK 2017.4 自带的 LWIP 1.4.1 库的版本为 2.0 ,直接使用该库将无法通过 SFP 实现网络通信。
    因此需要进行修改。 修改的原因有 2 个,第 1 个原因是由于 2017.4 版本产生的新 bug 。在 2015.4 版本中,若 PL 部分使用了 1G/2.5G Ethernet PCS/PMA or SGMII IP 核,在 vivado 中编译完成 export 导入 SDK 后 在工程 bsp xparameters.h 头文件中会包含一些与 1G/2.5G Ethernet PCS/PMA or SGMII IP 核相关 的宏定义。例如,使用 1000BASEX 模式时,产生的宏定义为:
    #define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1
    #define XPAR_PCSPMA_1000BASEX_PHYADDR 6
    或者,使用 SGMII 模式时,产生的宏定义为:
    #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1
    #define XPAR_PCSPMA_SGMII_PHYADDR 6
    通过分析 lwip 库底层驱动代码,发现这些宏定义是 lwip 库底层代码的编译选项。在 lwip 库的
    lwip141_v2_0\src\contrib\ports\xilinx\netif\xemacpsif_physpeed.c xemacpsif_hw.c 两个文件中被使用。用于决定MDIO 接口配置外部 PHY 的方式。显然,作为 1000BASEX PHY SGMII PHY 或通常的PHY 芯片的寄存器定义和配置方式是存在区别的,不能相互兼容。所以上述的宏定义对于使用
    1G/2.5G Ethernet PCS/PMA or SGMII IP 核时至关重要。
    而这些宏定义在 2017.4 版本中却不再出现。因而导致无法使用 LWIP 库对 1G/2.5G Ethernet PCS/PMA or SGMII IP 核进行正常配置使用。
    2 个原因是由于 lwip 底层驱动自身存在的设计瑕疵。只要在 PL 部分使用 1G/2.5G Ethernet
    PCS/PMA or SGMII IP 核,即 SDK 工程的 bsp 里存在宏定义
    #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1
    或者
    #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1
    那么, lwip 底层驱动将只能通过 MDIO 接口采用对 1G/2.5G Ethernet PCS/PMA or SGMII IP 核进
    行的配置方式。也就是说,只要使用了 1G/2.5G Ethernet PCS/PMA or SGMII IP 核,那么与 PS 连接的RGMII 接口的 PHY 芯片将不能被正常检测和配置,此时 lwip 将无法使用直接与 PS 连接的网口。这就对设计产生了限制。 为此,我们需要修改lwip 库。
      修改方法
    首先,找到 SDK 安装目录下的 LWIP 库的路径,例如
    C:\Xilinx\SDK\2017.4\data\embeddedsw\ThirdParty\sw_servic
    lwip141_v2_0 文件夹复制一份到工程目录下的 sdk_repo\bsp 文件夹下将其重新命名为
    lwip141_v2_05
    第一步,修改 lwip141_v2_05\data\lwip141.mld 文件(可用 Notapad++ 等编辑器打开),
    将其中的版本编号
    OPTION VERSION = 2.0;
    修改为
    OPTION VERSION = 2.05;
    然后, 在其中增加如下字段 :
    BEGIN CATEGORY pcs_pma_core_options
    PARAM name = pcs_pma_core_options, desc = "Options setting the pcs pma core related parameters"
    PARAM name = use_pcs_pma_core_on_zynq, desc = "Option if set to 1 ensures emacps is used as emio, and connect to pcs_pma_core
    in pl. Valid only for Zynq", type = bool, default = false;
    PARAM name = use_1000basex, desc = "Option if set to 1 to ensures pcs_pma_core is using 1000basex mode", type = bool, default =
    false;
    PARAM name = use_sgmii, desc = "Option if set to 1 to ensures pcs_pma_core is using sgmii mode", type = bool, default = false;
    PARAM name = 1000basex_phy_address, desc = "Option to define the phy address corresponding to the set in pcs_pma_core in
    1000basex mode", type = int, default = 0;
    PARAM name = sgmii_phy_address, desc = "Option to define the phy address corresponding to the set in pcs_pma_core in sgmii
    mode", type = int, default = 0;
    END CATEGORY
    增加这段代码的目的是为了在 SDK BSP 设置里, lwip 参数设置窗口中增加一栏选项
    pcs_pma_core_options ,其中包含 5 个子选项。如下图所示。
    其中, use_pcs_pma_core_on_zynq 表示 PL 端是否使用了 1G/2.5G Ethernet PCS/PMA or SGMII IP核;use_1000basex 表示 IP 核是否配置为 1000BASEX 模式; use_sgmii 表示 IP 核是否配置为 SGMII 模式;1000basex_phy_address 表示使用 1000BASEX 模式时的 phy address sgmii_phy_address 表示使用 SGMII模式时的 phy address 。这两个 phy address 必须与 vivado IP 核的配置完全一致,例如,本例程中phy address 6
    然后,打开 lwip141_v2_05\data\lwip141.tcl 文件,增加如下字段:
    # PCS PMA CORE options
    set use_pcs_pma_core_on_zynq [common::get_property CONFIG.use_pcs_pma_core_on_zynq $libhandle]
    set use_1000basex [common::get_property CONFIG.use_1000basex $libhandle]
    set use_sgmii [common::get_property CONFIG.use_sgmii $libhandle]
    set 1000basex_phy_address [common::get_property CONFIG.1000basex_phy_address $libhandle]
    set sgmii_phy_address [common::get_property CONFIG.sgmii_phy_address $libhandle]
    if { $use_pcs_pma_core_on_zynq == true } {
    puts $lwipopts_fd "\#define USE_PCS_PMA_CORE 1"
    }
    if { $use_1000basex == true } {
    puts $lwipopts_fd "\#define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1"
    puts $lwipopts_fd "\#define XPAR_PCSPMA_1000BASEX_PHYADDR $1000basex_phy_address"
    }
    if { $use_sgmii == true } {
    puts $lwipopts_fd "\#define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1"
    puts $lwipopts_fd "\#define XPAR_PCSPMA_SGMII_PHYADDR $sgmii_phy_address"
    }
    puts $lwipopts_fd ""
    增加这段代码的目的是为了在工程所对应的 bsp 中的 lwipopts.h 头文件里,如下所示。
    如下:
    #define USE_PCS_PMA_CORE 1
    以及:
    #define XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT 1
    #define XPAR_PCSPMA_1000BASEX_PHYADDR 6
    或者:
    #define XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT 1
    #define XPAR_PCSPMA_SGMII_PHYADDR 6
    的宏定义。
    这弥补了 2017.4 中的 bug ,可以通过 lwip 库增加所需的宏定义。
    接 下 来 , 需 要 解 决 底 层 驱 动 使 用 限 制 , 为 此 要 修 改
    lwip141_v2_05\src\contrib\ports\xilinx\netif\xemacpsif_physpeed.c xemacpsif_hw.c 两个文件。两个文件的修改之处相同。在两个文件中,都将:
    #if XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1 || \
    XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1
    #define PCM_PMA_CORE_PRESENT
    改为:
    #if USE_PCS_PMA_CORE == 1 && (XPAR_GIGE_PCS_PMA_1000BASEX_CORE_PRESENT == 1 || \
    XPAR_GIGE_PCS_PMA_SGMII_CORE_PRESENT == 1)
    #define PCM_PMA_CORE_PRESENT
    这样就解决了 MDIO 接口配置的限制,只有当 USE_PCS_PMA_CORE 1 ,即将 use_pcs_pma_core_on_zynq
    设 为 1 时 。 MDIO 接 口 才 会 采 用 1G/2.5G Ethernet PCS/PMA or SGMII IP 核 的 配 置 策 略 。 将use_pcs_pma_core_on_zynq 设为 0 时,仍可以正常使用与 PS 连接的网口。
    至此, LWIP 库修改完成。
  • 相关阅读:
    滑动窗口延申题:最小覆盖子串
    未登录拦截和登陆后直接跳转到当时想要跳的页面去
    Bracket Sequence ——卡特兰数
    nesp实验八 路由器RIP协议路由实验
    51单片机蓝牙APP食物卡路里热量称重HX711电子秤蓝牙手机APP
    Springboot多数据源配置详解
    OS | 【三 内存管理】存储管理及大题解构
    我的保研故事
    Python-入门-列表(四)
    springboot+高校失物招领系统 毕业设计-附源码121441
  • 原文地址:https://blog.csdn.net/cckkppll/article/details/139703029