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.cxemacpsif_hw.c两个文件中被使用。用于决定MDIO接口配置外部PHY的方式。显然,作为1000BASEX PHYSGMII 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
增加这段代码的目的是为了在SDKBSP设置里,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 addresssgmii_phy_address表示使用 SGMII模式时的phy address。这两个phy address必须与vivadoIP核的配置完全一致,例如,本例程中phy address6
然后,打开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 库修改完成。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐