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
库修改完成。