天启RK3399平台GMAC移植
准备工作
1. firefly官网下载RK3399相关资料
2. 通过原理图查看GMAC外挂PHY芯片型号 ---- rtl82111e
3. 拆机将串口引出,并再次确认PHY芯片型号 ---- u-boot默认波特率1.5M TTL电平
4. 通过芯片手册查看GMAC架构,DMA描述符类型 ---- 普通DMA描述符
配置GMAC相关时钟和引脚功能
参考u-boot中rk3399设备树
dts不做详述。
配置gmac相关引脚复用功能
PHY芯片rtl82111e只支持rgmii接口,按照u-boot设备树中rgmii_pins进行相印映射配置。参考寄存器手册《Rockchip RK3399TRM V1.3 Part2》中GRF单元中GRF_GPIO3C_IOMUX、GRF_GPIO3B_IOMUX和GRF_GPIO3A_IOMUX中引脚复用功能说明。
rgmii只使用了3A、3B和3C中部分引脚,rmii基本是rgmii的子集,但mac_rxer(3B2)是rmii独自使用的。因为rtl82111e不支持rmii,所以不用配置3B2。
注:u-boot中有完整的rk3399设备树、时钟树和引脚管理相关代码。
RK3399平台在u-boot设备树中对于GMAC设备引脚配置:
gmac { rgmii_pins: rgmii-pins { rockchip,pins = /* mac_txclk */ <3 RK_PC1 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_rxclk */ <3 RK_PB6 RK_FUNC_1 &pcfg_pull_none>, /* mac_mdio */ <3 RK_PB5 RK_FUNC_1 &pcfg_pull_none>, /* mac_txen */ <3 RK_PB4 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_clk */ <3 RK_PB3 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxdv */ <3 RK_PB1 RK_FUNC_1 &pcfg_pull_none>, /* mac_mdc */ <3 RK_PB0 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxd1 */ <3 RK_PA7 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxd0 */ <3 RK_PA6 RK_FUNC_1 &pcfg_pull_none>, /* mac_txd1 */ <3 RK_PA5 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_txd0 */ <3 RK_PA4 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_rxd3 */ <3 RK_PA3 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxd2 */ <3 RK_PA2 RK_FUNC_1 &pcfg_pull_none>, /* mac_txd3 */ <3 RK_PA1 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_txd2 */ <3 RK_PA0 RK_FUNC_1 &pcfg_pull_none_13ma>; }; rmii_pins: rmii-pins { rockchip,pins = /* mac_mdio */ <3 RK_PB5 RK_FUNC_1 &pcfg_pull_none>, /* mac_txen */ <3 RK_PB4 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_clk */ <3 RK_PB3 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxer */ <3 RK_PB2 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxdv */ <3 RK_PB1 RK_FUNC_1 &pcfg_pull_none>, /* mac_mdc */ <3 RK_PB0 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxd1 */ <3 RK_PA7 RK_FUNC_1 &pcfg_pull_none>, /* mac_rxd0 */ <3 RK_PA6 RK_FUNC_1 &pcfg_pull_none>, /* mac_txd1 */ <3 RK_PA5 RK_FUNC_1 &pcfg_pull_none_13ma>, /* mac_txd0 */ <3 RK_PA4 RK_FUNC_1 &pcfg_pull_none_13ma>; }; }; |
配置gmac电源管理
GMAC属于高速设备,具有相对独立的电源管理模块,参考rk3399中PMU单元中相关寄存器功能对GMAC电源进行管理。参考《Rockchip RK3399TRM V1.3 Part1》中PMU相关GMAC电源寄存器单元,配置寄存器PMU_PWRDN_CON、PMU_NOC_AUTO_ENA中相关电源、时钟使能位。
在PMU_PWRDN_CON中配置GMAC电源使能后,通过读取PMU_PWRDN_ST可检测GMAC电源状态。
在PMU_BUS_CLR、PMU_BUS_IDLE_REQ中禁止发送请求到GMAC低功耗接口。电源管理在后期可以逐步优化。
配置gmac时钟
GMAC的时钟配置分布在CRU和PMUCRU单元中,主要包含时钟使能开关和时钟分频系数配置,先将所有GMAC相关时钟使能位都使能,时钟分频系数参考系统上电默认值配置。
时钟配置可参考u-boot设备树中GMAC相关时钟进行配置:
gmac: ethernet@fe300000 { compatible = "rockchip,rk3399-gmac"; reg = <0x0 0xfe300000 0x0 0x10000>; interrupts = <GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH 0>; interrupt-names = "macirq"; clocks = <&cru SCLK_MAC>, <&cru SCLK_MAC_RX>, <&cru SCLK_MAC_TX>, <&cru SCLK_MACREF>, <&cru SCLK_MACREF_OUT>, <&cru ACLK_GMAC>, <&cru PCLK_GMAC>; clock-names = "stmmaceth", "mac_clk_rx", "mac_clk_tx", "clk_mac_ref", "clk_mac_refout", "aclk_mac", "pclk_mac"; power-domains = <&power RK3399_PD_GMAC>; resets = <&cru SRST_A_GMAC>; reset-names = "stmmaceth"; rockchip,grf = <&grf>; status = "disabled"; }; |
GMAC时钟使能位集中在寄存器PMUCRU_GATEDIS_CON0、CRU_CLKGATE_CON5、CRU_CLKGATE_CON6和CRU_CLKGATE_CON32中,参考手册进行配置。
GMAC时钟分配系数寄存器集中在CRU_CLKSEL_CON19和CRU_CLKSEL_CON20,参考手册进行配置。分频系数不影响GMAC正常功能,影响GMAC通信速率,在GMAC能正常进行网络通信时再调教。相反时钟使能位是一定要配置的,否则访问PHY、MAC层寄存器将卡住。
适配PHY层
参考PHY芯片rtl82111e芯片手册,对PHY进行掉电并重启,在PHY完成重启后使能PHY芯片的自协商功能。相关PHY操作集中在PHY层寄存器BMCR中,具rtl82111e芯片手册进行配置。
电源控制位bit11:
重启PHY位bit15:
自协商使能位bit12:
重启自协商位bit9:
具体代码参考u-boot或VxWorks中寄存器操作流程:
GMAC驱动移植
1. 修改DMA描述符使用链表模式
2. 优化调试打印
3. PHY层就绪状态缓慢,修正PHY层链路状态扫描策略
4. 收发时钟延迟线值调整