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

发布于:2024-06-17 ⋅ 阅读:(14) ⋅ 点赞:(0)
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 库修改完成。