当前位置: 首页 > news >正文

【u-boot】u-boot网络系统剖析

本文基于u-boot源码版本:v2017.09

一、网络系统

img

u-boot网络系统分为四类:

(1)网络驱动: 位于drivers/net/目录下,不同平台有不同实现。

(2)网络核心框架:实现了数据包的接收分发机制;实现了网络状态机(通过net_state维护);控制网络的初始化、发送和超时重试。

(3)网络协议层:实现u-boot支持网络的协议,位于net/ 目录 。

(4)网络命令层:实现u-boot网络命令的文件,位于cmd/ 目录 。

(1-1)网络驱动

位于drivers/net/,不同平台有不同实现,每个驱动都要实现一个struct eth_ops,用于描述以太网MAC控制器的操作:

struct eth_ops {/* 准备硬件以便进行数据包的发送和接收。 */int (*start)(struct udevice *dev);/* 将传入的 “packet” 缓冲区中的字节作为一个网络数据包发送出去。 */int (*send)(struct udevice *dev, void *packet, int length);/** 检查硬件是否接收到数据包。如果接收到,则通过参数 packetp* 返回指向数据包缓冲区的指针;如果没有接收到,则返回错误码或0。* 返回0表示硬件接收FIFO为空。若返回0,网络栈不会处理空包,* 但如果定义了free_pkt(),该函数仍会被调用以释放包内存。*/int (*recv)(struct udevice *dev, int flags, uchar **packetp);/** 当网络栈处理完数据包后,驱动可借此机会管理其包缓冲区内存。* 仅当 recv 没有返回错误时才会调用此函数 —— 可选实现。*/int (*free_pkt)(struct udevice *dev, uchar *packet, int length);/* 停止硬件的包检测操作,即使当前状态为PASSIVE时也可能被调用。 */void (*stop)(struct udevice *dev);
#ifdef CONFIG_MCAST_TFTP/*  加入或离开一个多播组(用于 TFTP 等)—— 可选实现 */int (*mcast)(struct udevice *dev, const u8 *enetaddr, int join);
#endif/** 将MAC地址写入硬件(在部分平台如ARM上用于传递给linux)。* 此函数期望eth_pdata::enetaddr字段已被填充。* 若返回-ENOSYS,表示该硬件不支持此功能 —— 可选实现。*/int (*write_hwaddr)(struct udevice *dev);/** 某些设备在板载 ROM 中保存有备用 MAC 地址。* 驱动应通过此函数将该地址提供给网络栈。* 函数应填写eth_pdata::enetaddr字段——可选实现。*/int (*read_rom_hwaddr)(struct udevice *dev);
};

常见驱动有:stmmac.c(Synopsys DesignWare GMAC)、fec_mxc.c(i.MX FEC)、bcm_eth.c(Broadcom)、rtl8169.c(Realtek)

例如xilinx_axi_emac.c文件中的驱动描述,首先创建静态struct eth_ops实例,并指定对应的回调:

img

使用U_BOOT_DRIVER()创建静态驱动实例,并关联对应的.ops操作:

img

(1-2)网络核心框架

net/net.c这个文件是U-Boot网络栈的核心:

  • 实现了数据包的接收分发机制;
  • 实现了网络状态机(通过net_state维护);
  • 控制网络的初始化、发送和超时重试。

主要函数如下:

int net_init(void);
int net_loop(enum proto_t protocol);   		//启动网络通信
void net_receive(uchar *pkt, int len); 		//收包分发
void net_send_packet(uchar *pkt, int len);

net_loop()是网络通信的核心循环,会根据当前协议(如TFTP、DHCP)调度不同处理函数。

(1-3)网络协议层

网络协议层位于net/目录下,常见模块如下:

协议 源文件 功能
ARP arp.c 实现MAC地址与IP地址的映射
BOOTP/DHCP bootp.c, dhcp.c 动态获取IP地址及网络参数
ICMP ping.c 实现ping命令
TFTP tftp.c 通过TFTP下载镜像文件
NFS nfs.c 通过NFS挂载加载文件
DNS dns.c 支持主机名解析
(1-4)网络命令层

网路命令层位于cmd/目录,例如:

命令 源文件 功能
ping cmd/ping.c 测试网络连通性
dhcp cmd/dhcp.c 通过DHCP获取IP
tftpboot cmd/net.c 通过TFTP下载镜像
nfs cmd/nfs.c 从NFS下载镜像

二、初始化

(2-1)网络系统初始化

在u-boot启动路径中,使用initr_net()初始化网络,实现如下(/common/board_r.c):

static int initr_net(void)
{puts("Net:   ");eth_initialize();
#if defined(CONFIG_RESET_PHY_R)debug("Reset Ethernet PHY\n");reset
http://www.dtcms.com/a/536654.html

相关文章:

  • 生物突触功能总结
  • 搭建AI智能翻译器:快速部署Dify,接入AiOnly平台GPT-5模型
  • 树莓派的OpenCV的人脸识别开锁
  • ifnull 和 isnull 的用法 以及其平替方法
  • ROS2系列 (0) : Linux 常用命令
  • 做网站编码如何制作微信链接
  • Nacos配置中心动态刷新全解析:从基础配置到源码级调优(一)
  • 《HTTP 实战:常用调试工具与抓包技巧》
  • Shell编程基本介绍
  • 龙港 网站建设青海建设网站价格低
  • 建设软件资源网站大学生网站开发总结报告
  • 代码随想录 701.二叉搜索树中的插入操作
  • 自定义监控大屏项目实现方案
  • h5游戏免费下载:HTML5拉杆子过关小游戏
  • 电商系统经典陷阱
  • 5.5类的主方法
  • 带后台的php网站模板营销推广是一种什么的促销方式
  • 神经网络进化史:从理论到变革
  • 系统集成项目管理工程师案例分析:整合管理高频考点精要
  • 快速达建网站怎么给餐饮店做网站
  • 国产化Excel开发组件Spire.XLS教程:使用Python将CSV转换为XML(处理现实数据问题)
  • 常用软件下载地址
  • 开网站做外贸东莞市阳光网
  • 面向光学引导热红外无人机图像超分辨率的引导解耦网络
  • Java医院管理系统HIS源码带小程序和安装教程
  • 自监督 YOLO:利用对比学习实现标签高效的目标检测
  • 快速排序(Quick Sort)详解与图解
  • NB-IOT(4) :从媒体接入到数据传输的全链路解析
  • 如何使用Advanced Installer打包C#程序生成安装程序
  • 做网站的开题报告怎么写云服务器