LS1046网口RCW及网口配置修改示例 本文要解决的问题: 由于LS104x系列开发板引入了【复位控制字】Reset configuration word (RCW)的配置方法,通过这种配置方法客户可以方便的进行引脚的功能定义,也就是实现引脚的PinMUX功能。 LS104x平台所特有的SerDes Module也是要通过RCW来进行配置,从而将不同的SerDes通道选择为不同的功能。以LS1046A为例,可配置的两路SerDes有: 但是这个被称为RCW的配置方法还有很多客户还不是很了解,所以本文以一个LS1046A的实际需求为例,来详细说明一下修改的过程以供客户后续定制参考。
修改需求和修改内容: 飞凌的OK1046A-C开发板提供了两种SerDes配置方案,分别为:1040_5559和1133_5559,与上表功能对应可以看到这两种SerDes的功能分别为:
1040_5559: 可以看到,有一个XFI for MAC 9,一个QSGMII for MAC6,MAC5,MAC10,MAC1,另外有三个PCIe x1接口。
1133_5559: 可以看到,有一个XFI for MAC 9,一个XFI for MAC10,一个SGMII for MAC5,一个SGMII for MAC6,另外有三个PCIe x1接口。 这时,如果我们有一个项目需求,需要5个网口:其中一个是核心板自带的RGMII网口,另外要SerDes引出的四个SGMII网口,这时我们发现上面飞凌提供的两种SerDes配置都不满足我们的要求,然后经过查阅SerDes配置表,发现1333_5a59可以满足我们的要求: 那么接下来我们就以此为例进行配置的修改
代码修改方法: 我们先整理一下我们的项目中PHY与MAC的对应关系:
网络接口
SerDes通道
PHY地址宏定义名称
PHY地址
SGMII.10 PHY (addr:2)
SD1_TX1_P
SGMII_PHY1_ADDR
0x2
SGMII.5 PHY (addr:5)
SD1_TX2_P
SGMII_PHY2_ADDR
0x5
SGMII.6 PHY (addr:3)
SD1_TX3_P
SGMII_PHY3_ADDR
0x3
SGMII.2 PHY (addr:4)
SD2_TX1_P
SGMII_PHY4_ADDR
0x4
RGMII.3 PHY (addr:1)
RGMII_PHY1_ADDR
0x1
首先我们需要知道,飞凌的OK1046A-C的两种RCW的文件在源码中的位置为:
1 2 3 flexbuild/packages/firmware/rcw/ls1046ardb/FORLINX/rcw_1800_qspiboot_1040_5559.rcw flexbuild/packages/firmware/rcw/ls1046ardb/FORLINX/rcw_1800_qspiboot_1133_5559.rcw
我们为了开发便利,在rcw_1800_qspiboot_1133_5559.rcw的基础上进行修改。
第一步:修改RCW配置 首先修改RCW配置为1333_5a59,分别修改SRDS_PRTCL_S1和SRDS_PRTCL_S2的值,此处要将16进制转化为10进制换算,如0x1333的十进制为4915,0x5a59的十进制为23129。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 --- a/flexbuild/packages/firmware/rcw/ls1046ardb/FORLINX/rcw_1800_qspiboot_1133_5559.rcw +++ b/flexbuild/packages/firmware/rcw/ls1046ardb/FORLINX/rcw_1800_qspiboot_1133_5559.rcw @@ -69,8 +69,8 @@ SYS_PLL_RAT=7 MEM_PLL_RAT=21 CGA_PLL1_RAT=18 CGA_PLL2_RAT=16 -SRDS_PRTCL_S1=4403 -SRDS_PRTCL_S2=21849 +SRDS_PRTCL_S1=4915 +SRDS_PRTCL_S2=23129 SRDS_PLL_REF_CLK_SEL_S1=1 SRDS_PLL_REF_CLK_SEL_S2=0 SRDS_DIV_PEX_S1=1 @@ -88,7 +88,7 @@ SPI_EXT=1 SPI_BASE=2
第二步:修改Uboot的网络初始化代码 先在头文件中添加我们所需的PHY地址的定义,该文件在源码中的位置为:
1 flexbuild/packages/firmware/u-boot/include/configs/ls1046ardb.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 --- a/include/configs/ls1046ardb.h +++ b/include/configs/ls1046ardb.h @@ -179 ,7 +179 ,10 @@ #define RGMII_PHY1_ADDR 0x1 #define RGMII_PHY2_ADDR 0x2 -#define SGMII_PHY2_ADDR 0x3 +#define SGMII_PHY1_ADDR 0x2 +#define SGMII_PHY2_ADDR 0x5 +#define SGMII_PHY3_ADDR 0x3 +#define SGMII_PHY4_ADDR 0x4 #define QSGMII_PORT1_PHY_ADDR 8 #define QSGMII_PORT2_PHY_ADDR 9
Uboot的网络初始化代码在源码中的位置为:
1 flexbuild/packages/firmware/u-boot/board/freescale/ls1043ardb/ls1043ardb.c
此时我们要修改网络部分的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 --- a/board/freescale/ls1046ardb/eth.c +++ b/board/freescale/ls1046ardb/eth.c @@ -35 ,28 +35 ,33 @@ int board_eth_init (bd_t *bis) fm_memac_mdio_init (bis, &dtsec_mdio_info) ; + - fm_memac_mdio_init(bis, &tgec_mdio_info); + + fm_info_set_phy_address(FM1_DTSEC3, RGMII_PHY1_ADDR); - fm_info_set_phy_address(FM1_DTSEC4, RGMII_PHY2_ADDR); + + - fm_info_set_phy_address(FM1_10GEC1, FM1_10GEC1_PHY_ADDR); + + switch (srds_s1) { + - case 0x1133 : + case 0x1333 : - fm_disable_port(FM1_DTSEC5); - fm_info_set_phy_address(FM1_DTSEC6, SGMII_PHY2_ADDR); - run_command("setenv serdes1 1133" , 0 ); + fm_disable_port(FM1_DTSEC4); + + fm_info_set_phy_address(FM1_DTSEC10, SGMII_PHY1_ADDR); + fm_info_set_phy_address(FM1_DTSEC5, SGMII_PHY2_ADDR); + fm_info_set_phy_address(FM1_DTSEC6, SGMII_PHY3_ADDR); + fm_info_set_phy_address(FM1_DTSEC2, SGMII_PHY4_ADDR); + + run_command("setenv serdes1 1333" , 0 ); break ; case 0x1040 : @@ -81 ,9 +86 ,11 @@ int board_eth_init (bd_t *bis) fm_info_set_mdio (i, dev) ; + cpu_eth_init(bis); #endif
修改完此部分后则Uboot部分对网络配置的代码修改完成。
第三步:修改设备树的网络初始化代码 首先我们需要知道,飞凌的OK1046A-C的两种RCW配置所对应的设备树文件在源码中的位置为:
1 2 3 flexbuild/packages/linux/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1040-5559.dts flexbuild/packages/linux/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1133-5559.dts
设备树部分我们也可以基于fsl-ls1046a-rdb-sdk-1133-5559.dts进行修改 首先需要修改设备树的Makefile,增加对我们需要的DTS文件的编译
1 2 3 4 5 6 7 8 9 10 --- a/arch/arm64/boot/dts/freescale/Makefile +++ b/arch/arm64/boot/dts/freescale/Makefile @@ -14,6 +14,7 @@ dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-qds-sdk.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb-sdk.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb-sdk-1133-5559.dtb +dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb-sdk-1333-5a59.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb-sdk-1040-5559.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb-usdpaa-1133-5559.dtb dtb-$(CONFIG_ARCH_LAYERSCAPE) += fsl-ls1046a-rdb-usdpaa-1040-5559.dtb
其次我们将dts文件进行复制和重命名,执行命令
1 cp flexbuild/packages/linux/linux/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1133-5559.dts flexbuild/packages/linux/linux/arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1333-5a59.dts
接下来我们修改fsl-ls1046a-rdb-sdk-1333-5a59.dts文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 --- arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1333 -5 a59.dts +++ arch/arm64/boot/dts/freescale/fsl-ls1046a-rdb-sdk-1133 -5559. dts @@ -54 ,8 +54 ,9 @@ }; + ethernet@e2000 { - status = "disabled" ; - }; + phy-handle = <&sgmii_phy4>; + phy-connection-type = "sgmii" ; + }; ethernet@e4000 { phy-handle = <&rgmii_phy1>; @@ -63 ,27 +64 ,26 @@ }; + ethernet@e6000 { - phy-handle = <&rgmii_phy2>; - phy-connection-type = "rgmii-txid" ; + status = "disabled" ; }; + ethernet@e8000 { - status = "disabled" ; - }; + phy-handle = <&sgmii_phy2>; + phy-connection-type = "sgmii" ; + }; + ethernet@ea000 { - phy-handle = <&sgmii_phy2>; + phy-handle = <&sgmii_phy3>; phy-connection-type = "sgmii" ; }; + - ethernet@f0000 { - phy-handle = <&aqr105_phy>; - phy-connection-type = "xgmii" ; + ethernet@f0000 { + status = "disabled" ; }; + - ethernet@f2000 { - fixed-link = <0 1 1000 0 0 >; - phy-connection-type = "xgmii" ; + ethernet@f2000 { + phy-handle = <&sgmii_phy1>; + phy-connection-type = "sgmii" ; }; mdio@fc000 { @@ -91 ,20 +91 ,21 @@ reg = <0x1 >; }; + - rgmii_phy2: ethernet-phy@2 { - reg = <0x2 >; - }; + sgmii_phy1: ethernet-phy@2 { + reg = <0x2 >; + }; - sgmii_phy2: ethernet-phy@3 { - reg = <0x3 >; + sgmii_phy2: ethernet-phy@5 { + reg = <0x5 >; + + sgmii_phy3: ethernet-phy@3 { + reg = <0x3 >; + }; + + sgmii_phy4: ethernet-phy@4 { + reg = <0x4 >; + }; }; + - mdio@fd000 { - aqr105_phy: ethernet-phy@0 { - compatible = "ethernet-phy-ieee802.3-c45" ; - reg = <0x0 >; - }; }; }; @@ -130 ,13 +131 ,15 @@ ethernet@0 { status = "disabled" ; }; + - ethernet@1 { + ethernet@3 { status = "disabled" ; }; - ethernet@4 { - status = "disabled" ; - }; - + ethernet@8 { + status = "disabled" ; + }; ethernet@9 { compatible = "fsl,dpa-ethernet" ; fsl,fman-mac = <&enet7>;
至此,设备树部分代码修改完成
第四步:修改flex-build编译工具,完善修改部分的编译流程 由于我们增加了设备树文件并且修改了RCW部分关于SerDes的配置,所以flex-build编译工具在制作烧写镜像的时候会有一些问题,我们需要进行相应的修改。 这一部分主要是uboot会通过读环境变量中的serdes1参数来选择加载对应的dts设备树文件 涉及到的文件在源码中的位置为:
1 flexbuild/configs/board/ls1046ardb/manifest
修改内容为:
1 2 3 4 5 6 7 8 --- a/flexbuild/configs/board/ls1046ardb/manifest +++ b/flexbuild/configs/board/ls1046ardb/manifest @@ -39 ,7 +39 ,7 @@ securevalidate_enc="setenv secureboot_validate 'load \$devtype \$devnum:2 \$kern securevalidate_dec=" setenv secureboot_validate 'size \$devtype \$devnum:2 /Image;setexpr imgsize \$filesize - 0x30 ;echo Decapsulating linux image; setenv key_addr 0x87000000; mw \$key_addr $key_id_1;setexpr \$key_addr \$key_addr + 0x4; mw \$key_addr $key_id_2;setexpr \$key_addr \$key_addr + 0x4; mw \$key_addr key_id_3;setexpr \$key_addr \$key_addr + 0x4; mw \$key_addr $key_id_4; blob dec \$kernel_addr_r \$load_addr \$imgsize \$key_addr; cp.b \$load_addr \$kernel_addr_r \$filesize ;size \$devtype \$devnum:2 /fsl-ls1046a-rdb-sdk.dtb;setexpr imgsize \$filesize - 0x30 ;echo Decapsulating dtb image; blob dec \$fdt_addr_r \$load_addr \$imgsize \$key_addr; cp.b \$load_addr \$fdt_addr_r \$filesize ; ' " -distroboot='part uuid $devtype $devnum:3 partuuid3; setenv bootargs console=ttyS0,115200 earlycon=uart8250,mmio,0x21c0500 root=PARTUUID=$partuuid3 rw rootwait $othbootargs; if load $devtype $devnum:2 $load_addr /boot/uEnv.txt; then echo Importing environment from uEnv.txt ...; env import -t $load_addr $filesize; fi; load $devtype $devnum:2 $kernel_addr_r /boot/Image;load $devtype $devnum:2 $fdt_addr_r /boot/fsl-ls1046a-rdb-sdk-$serdes1-5559.dtb; env exists secureboot && echo validating secureboot && run secureboot_validate;booti $kernel_addr_r - $fdt_addr_r' +distroboot='part uuid $devtype $devnum:3 partuuid3; setenv bootargs console=ttyS0,115200 earlycon=uart8250,mmio,0x21c0500 root=PARTUUID=$partuuid3 rw rootwait $othbootargs; if load $devtype $devnum:2 $load_addr /boot/uEnv.txt; then echo Importing environment from uEnv.txt ...; env import -t $load_addr $filesize; fi; load $devtype $devnum:2 $kernel_addr_r /boot/Image;load $devtype $devnum:2 $fdt_addr_r /boot/fsl-ls1046a-rdb-sdk-$serdes1-5a59.dtb; env exists secureboot && echo validating secureboot && run secureboot_validate;booti $kernel_addr_r - $fdt_addr_r'
上面的代码修改的内容就在于fsl-ls1046a-rdb-sdk-$serdes1-5559.dtb变为了fsl-ls1046a-rdb-sdk-$serdes1-5a59.dtb,客户可以仔细观察。
至此,网络部分所有的代码修改完成 然后就可以参照软件手册编译章节编译系统,然后使用U盘更新系统即可使用