南宁市网站建设_网站建设公司_安全防护_seo优化
2025/12/29 19:41:34 网站建设 项目流程

RK3588 U-Boot网络功能深度分析

本文档深入分析RK3588平台上U-Boot的网络功能实现,包括GMAC驱动、TFTP/NFS启动、网络命令以及MAC地址传递到Linux内核的机制。


目录

  1. 网络驱动架构概述
  2. GMAC驱动实现
  3. TFTP启动功能
  4. NFS启动功能
  5. 网络命令实现
  6. 通过网络更新镜像分区
  7. MAC地址传递到Linux Kernel
  8. 关键文件路径索引

1. 网络驱动架构概述

1.1 整体架构

┌─────────────────────────────────────────────────────────────┐ │ U-Boot网络栈 │ ├─────────────────────────────────────────────────────────────┤ │ 网络命令层 (cmd/net.c) │ │ - tftp, nfs, ping, dhcp, bootp, rarpboot, cdp, sntp, dns │ ├─────────────────────────────────────────────────────────────┤ │ 协议层 (net/) │ │ - tftp.c, nfs.c, bootp.c, arp.c, ping.c, dns.c │ ├─────────────────────────────────────────────────────────────┤ │ 网络核心层 (net/net.c, eth-uclass.c) │ │ - 设备管理, 数据包收发, 环境变量管理 │ ├─────────────────────────────────────────────────────────────┤ │ 驱动层 (drivers/net/) │ │ - gmac_rockchip.c (平台驱动) │ │ - dwc_eth_qos.c (DWC ETH QoS驱动) │ │ - phy/, designware.c (PHY和MAC驱动) │ ├─────────────────────────────────────────────────────────────┤ │ 硬件层 │ │ - RK3588 GMAC (Synopsys DWC ETH QoS IP) │ │ - External PHY (Realtek/Broadcom/Marvell) │ └─────────────────────────────────────────────────────────────┘

1.2 RK3588网络特性

RK3588芯片集成了两个千兆以太网MAC控制器(GMAC0和GMAC1),具有以下特性:

  • IP核心: Synopsys DesignWare Cores Ethernet MAC (DWC ETH QoS)
  • 接口类型: RGMII (千兆), RMII (百兆)
  • PHY支持: 外部PHY或内部集成PHY
  • DMA引擎: 支持独立Tx/Rx描述符环形队列
  • 硬件特性:
    • checksum offload
    • VLAN支持
    • 巨型帧支持
    • 多播过滤
    • Magic Packet唤醒

2. GMAC驱动实现

2.1 驱动文件结构

文件说明
drivers/net/gmac_rockchip.cRockchip GMAC平台驱动 (2305行)
drivers/net/dwc_eth_qos.cDWC ETH QoS核心驱动 (2239行)
drivers/net/dwc_eth_qos.hDWC ETH QoS头文件
drivers/net/phy/PHY驱动目录
drivers/net/phy/rk630phy.cRK630专用PHY驱动

2.2 关键数据结构

// 文件: drivers/net/gmac_rockchip.c/* Rockchip以太网设备私有数据 */structrockchip_eth_dev{structeqos_priveqos;// DWC ETH QoS私有数据intphy_interface;// PHY接口类型};/* GMAC平台数据 */structgmac_rockchip_platdata{structeth_pdataeth_pdata;// 以太网平台数据structreset_ctlphy_reset;// PHY复位控制bool integrated_phy;// 集成PHY标志bool clock_input;// 时钟输入方向intphy_interface;// PHY接口模式inttx_delay;// TX延迟配置intrx_delay;// RX延迟配置intbus_id;// 总线ID (用于多GMAC)};

2.3 RK3588专用操作函数集

// 文件: drivers/net/gmac_rockchip.c:2095conststructrk_gmac_opsrk3588_gmac_ops={.fix_mac_speed=rk3588_set_rgmii_speed,// 速度适配.set_to_rgmii=rk3588_set_to_rgmii,// 配置RGMII接口.set_to_rmii=rk3588_set_to_rmii,// 配置RMII接口.set_clock_selection=rk3588_set_clock_selection,// 时钟选择};

2.4 设备树兼容性

// 文件: drivers/net/gmac_rockchip.c:2102staticconststructudevice_idgmac_rockchip_ids[]={{.compatible="rockchip,rk3588-gmac",.data=(ulong)&rk3588_gmac_ops},{}};

2.5 RK3588 GRF寄存器配置

RK3588通过GRF (General Register Files) 来配置GMAC接口和时钟:

// 文件: arch/arm/include/asm/arch-rockchip/grf_rk3588.h/* PHP GRF - GMAC接口控制 */structrk3588_php_grf{uint32_tgmac_con0;// GMAC接口模式控制uint32_tclk_con1;// GMAC时钟控制// ...};/* SYS GRF - GMAC延迟配置 */structrk3588_sys_grf{uint32_tsoc_con7;// GMAC TX/RX延迟使能uint32_tsoc_con8;// GMAC0延迟配置uint32_tsoc_con9;// GMAC1延迟配置// ...};

2.6 驱动初始化流程

gmac_rockchip_probe() │ ├─> ofnode_phy_interface() // 获取PHY接口类型 ├─> dev_read_u32_array(tx_delay) // 读取TX延迟配置 ├─> dev_read_u32_array(rx_delay) // 读取RX延迟配置 │ ├─> eqos_probe() // DWC ETH QoS初始化 │ ├─> eqos_probe_resources() // 获取资源(CSR/PHY/MDIO/时钟/复位) │ ├─> clk_set_rate() // 设置125MHz(RGMII)或50MHz(RMII) │ └─> eqos_start_clks() // 启动时钟 │ ├─> rk3588_set_to_rgmii/rmii() // 配置接口模式 │ ├─> rk_gmac_set_to_rgmii() // GRF寄存器配置 │ └─> rk3588_set_clock_selection() // 时钟选择配置 │ └─> eqos_init() // DMA描述符初始化 ├─> eqos_write_hwaddr() // 写入MAC地址 └─> phy_startup() // 启动PHY

2.7 RGMII速度适配

// 文件: drivers/net/gmac_rockchip.c:1594staticvoidrk3588_set_rgmii_speed(structgmac_rockchip_platdata*pdata,intspeed){structrk3588_php_grf*php_grf=pdata->php_grf;u32 val=0;switch(speed){caseSPEED_10:// 10Mbps: clk-125分频val=RK3588_GMAC_CLK_RX_DIV150|RK3588_GMAC_CLK_TX_DIV150;break;caseSPEED_100:// 100Mbps: clk-25分频val=RK3588_GMAC_CLK_RX_DIV30|RK3588_GMAC_CLK_TX_DIV30;break;caseSPEED_1000:// 1000Mbps: 不分频val=RK3588_GMAC_CLK_RX_DIV1|RK3588_GMAC_CLK_TX_DIV1;break;}// 写入GRF寄存器rk_clrsetreg(&php_grf->clk_con1,RK3588_GMAC_CLK_RX_DIV_MASK|RK3588_GMAC_CLK_TX_DIV_MASK,val);}

2.8 MAC地址配置

// 文件: drivers/net/gmac_rockchip.c:2029staticintgmac_rockchip_eth_write_hwaddr(structudevice*dev){structrockchip_eth_dev*priv=dev_get_priv(dev);// 根据配置选择底层驱动if(priv->eqos.config->ops->eqos_write_hwaddr)returneqos_write_hwaddr(dev);elsereturndesignware_eth_write_hwaddr(dev);}// DWC ETH QoS MAC地址写入实现// 文件: drivers/net/dwc_eth_qos.c:1083inteqos_write_hwaddr(structudevice*dev){structeqos_priv*eqos=dev_get_priv(dev);structeth_pdata*plat=dev_get_platdata(dev);u8*mac_id=plat->enetaddr;// 写入MAC地址高32位寄存器writel((mac_id[0]<<8)|mac_id[1],&eqos->mac_regs->address0_high);// 写入MAC地址低32位寄存器writel((mac_id[2]<<24)|(mac_id[3]<<16)|(mac_id[4]<<8)|mac_id[5],&eqos->mac_regs->address0_low);return0;}

3. TFTP启动功能

3.1 TFTP协议实现

文件位置:net/tftp.c(984行)

3.2 TFTP状态机

// 文件: net/tftp.c#defineSTATE_SEND_RRQ1// 发送读请求#defineSTATE_RECV_WRQ6// 接收写请求(服务器模式)#defineSTATE_SEND_WRQ7// 发送写请求#defineSTATE_DATA2// 数据传输状态#defineSTATE_TOO_LARGE3// 文件过大#defineSTATE_BAD_MAGIC4// 魔数错误#defineSTATE_OACK5// 选项确认/* TFTP操作码 */#defineTFTP_RRQ1// 读请求#defineTFTP_WRQ2// 写请求#defineTFTP_DATA3// 数据包#defineTFTP_ACK4// 确认#defineTFTP_ERROR5// 错误#

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询