[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析

VIP[Linux外设驱动详解]RK3588 U-Boot网络功能深度分析
本文深入分析了RK3588平台上U-Boot的网络功能实现,主要内容包括: 网络架构:详细剖析了从硬件层到协议层的完整网络栈架构,包括GMAC驱动、TFTP/NFS启动、网络命令等关键组件。 驱动实现:重点介绍了RK3588 GMAC驱动结构,包含关键数据结构、专用操作函数集、设备树兼容性配置和GRF寄存器设置。 功能实现:详细说明了驱动初始化流程、RGMII速度适配机制以及PHY接口配置过程。 高级特性:涵盖了网络启动功能、镜像更新和MAC地址传递到Linux内核的机制。 文档通过代码片段和流程图清晰展示
开通可读全文 ·1.1k 人阅读
最低0.47元/天 解锁文章

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.c Rockchip GMAC平台驱动 (2305行)
drivers/net/dwc_eth_qos.c DWC ETH QoS核心驱动 (2239行)
drivers/net/dwc_eth_qos.h DWC ETH QoS头文件
drivers/net/phy/ PHY驱动目录
drivers/net/phy/rk630phy.c RK630专用PHY驱动

2.2 关键数据结构

// 文件: drivers/net/gmac_rockchip.c

/* Rockchip以太网设备私有数据 */
struct rockchip_eth_dev {
   
   
    struct eqos_priv eqos;          // DWC ETH QoS私有数据
    int phy_interface;              // PHY接口类型
};

/* GMAC平台数据 */
struct gmac_rockchip_platdata {
   
   
    struct eth_pdata eth_pdata;     // 以太网平台数据
    struct reset_ctl phy_reset;     // PHY复位控制
    bool integrated_phy;            // 集成PHY标志
    bool clock_input;               // 时钟输入方向
    int phy_interface;              // PHY接口模式
    int tx_delay;                   // TX延迟配置
    int rx_delay;                   // RX延迟配置
    int bus_id;                     // 总线ID (用于多GMAC)
};

2.3 RK3588专用操作函数集

// 文件: drivers/net/gmac_rockchip.c:2095

const struct rk_gmac_ops rk3588_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:2102

static const struct udevice_id gmac_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接口控制 */
struct rk3588_php_grf {
   
   
    uint32_t gmac_con0;    // GMAC接口模式控制
    uint32_t clk_con1;     // GMAC时钟控制
    // ...
};

/* SYS GRF - GMAC延迟配置 */
struct rk3588_sys_grf {
   
   
    uint32_t soc_con7;     // GMAC TX/RX延迟使能
    uint32_t soc_con8;     // GMAC0延迟配置
    uint32_t soc_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:1594

static void rk3588_set_rgmii_speed(struct gmac_rockchip_platdata *pdata,
                                   int speed)
{
   
   
    struct rk3588_php_grf *php_grf = pdata->php_grf;
    u32 val = 0;

    switch (speed) {
   
   
    case SPEED_10:       // 10Mbps: clk-125分频
        val = RK3588_GMAC_CLK_RX_DIV150 | RK3588_GMAC_CLK_TX_DIV150;
        break;
    case SPEED_100:      // 100Mbps: clk-25分频
        val = RK3588_GMAC_CLK_RX_DIV30 | RK3588_GMAC_CLK_TX_DIV30;
        break;
    case SPEED_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:2029

static int gmac_rockchip_eth_write_hwaddr(struct udevice *dev)
{
   
   
    struct rockchip_eth_dev *priv = dev_get_priv(dev);

    // 根据配置选择底层驱动
    if (priv->eqos.config->ops->eqos_write_hwaddr)
        return eqos_write_hwaddr(dev);
    else
        return designware_eth_write_hwaddr(dev);
}

// DWC ETH QoS MAC地址写入实现
// 文件: drivers/net/dwc_eth_qos.c:1083

int eqos_write_hwaddr(struct udevice *dev)
{
   
   
    struct eqos_priv *eqos = dev_get_priv(dev);
    struct eth_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);

    return 0;
}

3. TFTP启动功能

3.1 TFTP协议实现

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

3.2 TFTP状态机

// 文件: net/tftp.c

#define STATE_SEND_RRQ   1    // 发送读请求
#define STATE_RECV_WRQ   6    // 接收写请求(服务器模式)
#define STATE_SEND_WRQ   7    // 发送写请求
#define STATE_DATA       2    // 数据传输状态
#define STATE_TOO_LARGE  3    // 文件过大
#define STATE_BAD_MAGIC  4    // 魔数错误
#define STATE_OACK       5    // 选项确认

/* TFTP操作码 */
#define TFTP_RRQ   1    // 读请求
#define TFTP_WRQ   2    // 写请求
#define TFTP_DATA  3    // 数据包
#define TFTP_ACK   4    // 确认
#define TFTP_ERROR 5    // 错误
#
VIP RK3588平台Linux启动优化:从BL1到用户空间的1秒挑战 本文深入探讨RK3588平台Linux启动耗时优化,从BL1到用户空间实现1秒快速启动。通过分析ARM Trust Firmware配置、UBOOT裁剪和Linux内核初始化优化等关键技术,大幅缩短启动时间,为实时应用提供解决方案。 开通可读全文·759 阅读·27 点赞·11 收藏 阅读全文

相关推荐

RK3588以太网调试全栈指南:从U-Boot链路初始化到2.5G稳定跑通

以太网接口是嵌入式系统中最基础也最易出错的外设之一,其本质是MAC与PHY通过RGMII/SGMII等物理层协议协同工作的结果。理解时序约束(如RGMII skew±0.2ns)、驱动分层机制(U-Boot PHY初始化→内核设备树匹配→用户态性能调优)及硬件-固件-软件三者耦合关系,是解决千兆/2.5G协商失败、Link无法Up、吞吐骤降等典型问题的技术前提。尤其在RK3588平台,双路2.5G Ethernet对PCB布局、时钟树配置和device tree编写提出严苛要求,任何环节偏差都会导致dmes

weixin_30872577的博客 167

ARM平台Ubuntu桌面系统移植实战:从内核编译到镜像制作

嵌入式Linux系统开发中,交叉编译是连接x86开发主机与ARM目标板的关键技术,它允许开发者在高性能主机上生成适用于低功耗ARM架构的可执行代码。其核心原理在于使用特定的工具链,将源代码编译为目标平台指令集的二进制文件。这项技术的价值在于极大提升了嵌入式产品的开发效率,使得复杂操作系统的定制成为可能。在物联网设备、工业控制、智能硬件等应用场景中,开发者常需为特定ARM板卡定制完整的Linux桌面系统,以解决通用发行版驱动缺失、内核版本锁定等问题。本文以树莓派4B为例,详细解析了Ubuntu Desktop

weixin_28692153的博客 306

RK3588平台开发系列讲解(GMAC开发篇)

snps,reset-delays-us:PHY的复位时序,三个时间分别表示PHY的不同阶段的复位时序,不同的PHY的复位时序是不一样的,如果是snps,reset-active-low属性,则表示三个时间分别表示Reset pin脚拉高,拉低,再拉高的时间;如果出现了Link问题,有个排除法,即将MDC/MDIO与主控断开,与电脑直连,查看电脑端是否有同样的问题,以此排除软件上的干扰,那么需要重点排查下硬件上的影响,先测试TXN/P以及RXN/P是否有Link波形。

whm128的博客 3094

赛灵思fpga使用的xdma驱动源码

适合于广大fpga以及嵌入式开发人员,便于调试fpga,可以直接在linux系统下编译使用

WRF所需气象数据的下载方法

#数据下载是个大问题,巧妇难为无米之炊,没有数据就无法模拟啦,疫情期间国外服务器响应慢,打开网页慢都很正常啦~ WRF数据所需要的外部数据分为两种:静态地理数据,grib格式的气象数据(NAM、GFS、RUC、AGRMET等)。静态地理数据可以从WRF官网获得,比较简单,这里不做介绍。所以这篇日志重点介绍的是气象数据的获取。 提前说明,WRF官网不提供气象数据,但WRF官网提供各类气象数据的下载网址链接,所以我们下载一般还是从WRF官网开始。首先进入WRF官网,然后点击WRF ARW Uusres’ .

六出的博客 1万+

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 723

银河麒麟(ky10)x86与arm双架构下编译zlmediakit的实战指南

本文提供了在银河麒麟(ky10)操作系统上,针对x86与arm双架构编译部署流媒体服务器zlmediakit的完整实战指南。文章详细阐述了从环境准备、依赖安装、代码获取到编译构建与测试的全过程,重点解析了两种CPU架构下的关键差异与注意事项,帮助开发者高效完成国产化平台上的流媒体服务搭建。

weixin_29306875的博客 95

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 5999

单细胞分析进阶:sctransform标准化在Seurat中的实战解析

本文深入解析了sctransform标准化方法在Seurat单细胞分析中的实战应用。通过对比传统对数标准化,sctransform能更有效地建模并剔除技术噪音,提升数据质量。文章提供了从环境配置、数据准备、核心参数解析到完整流程整合的详细指南,并针对常见问题给出解决方案,帮助研究者获得更清晰的细胞分群和更可靠的差异表达结果。

weixin_29248313的博客 139

如何解除Uniaccess管控??

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 2349

基于YOLOv13+CBAM注意力机制

本教程详细介绍了CBAM注意力机制的原理及其在YOLOv13中的集成方法。CBAM通过通道注意力和空间注意力两个模块,动态调整特征权重以增强模型性能。通道模块利用池化操作和共享MLP生成通道权重,空间模块则通过池化和卷积生成空间权重。教程提供了在YOLOv13中实现CBAM的具体步骤,包括模块代码定义、模型配置修改等关键环节,帮助开发者在目标检测任务中提升模型表现。

FJN110的博客 300

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: [Linux外设驱动详解]RK3588 U-Boot Recovery 功能详解
下一篇: [Linux外设驱动详解]RK3588 SPI Flash驱动实现分析

双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —
JustaUncle
博客等级 码龄24年 7粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JustaUncle

一杯咖啡,换我肝到天亮!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值