u-boot 学习笔记
u-boot 学习笔记 u-boot分类 1.1. api 1.1.1. api.md 1.2. arch 1.2.1. arm 1.2.1.1. arm.md 1.2.1.2. assembly.md 1.2.2. arch.md 1.3. boot 1.3.1. bootm.md 1.3.2. bootretry.md 1.3.3. bootz.md 1.3.4. image.md 1.4. cmd 1.4.1. cmd.md 1.5. common 1.5.1. autoboot.md 1.5.2. board.md 1.5.3. cli.md 1.5.4. command.md 1.5.5. console.md 1.5.6. dmalloc.md 1.5.7. event.md 1.5.8. export.md 1.5.9. log.md 1.5.10. main.md 1.6. dm 1.6.1. adc.md 1.6.2. button.md 1.6.3. clock.md 1.6.4. core.md 1.6.5. dts.md 1....
39-rtthread-lwip-port
教程 39:从 lwip_system_init() 到 tcpip_input()——RT-Thread 如何把 lwIP 接进 RTOS 与 Ethernet Device 摘要:从 RT-Thread 的 lwIP 初始化入口追踪 Kconfig、sys_arch、eth_device、RX/TX 线程与 tcpip_input,建立真实 RTOS Port 的完整桥接流程。 [TOC] Stage 38 已经把 lwIP Port Contract 拆成四块:lwipopts.h 配置、源码构建选择、OS/Arch Port、Network Port。Stage 39 不再重复这些抽象的原理,而是直接拿 RT-Thread 当前源码回答一个问题:RT-Thread 怎样把这些 contract 一项项落成可运行代码,并把一个 Ethernet Driver 最终接到 tcpip_thread。 RT-Thread 的完整 Device Framework、NetDev、SAL、DFS 并不是本篇目标。它们只在当前调用链真正出现时说明接口位置;So...
18-multi-netif-routing
教程 18:从 udp_sendto() 到 etharp_output()——Multi-netif IPv4 路由、Default Netif、Gateway 与下一跳 摘要:从 UDP/TCP 发送入口追踪 IPv4 multi-netif 出口选择、默认接口、源地址与 Gateway 下一跳,厘清 route 与 ARP 的职责边界。 [TOC] Multi-netif 表示同一个 lwIP 实例同时存在多个 struct netif 网络接口。本文标题中的 Default Netif(默认接口) 是没有更具体匹配时的 fallback outgoing interface;Gateway(网关) 是已经选定某张接口以后,在当前二层链路上需要直接发送给的下一跳 IP。两者不是同一个对象,也不等价于“默认路由 = 网关地址”。 Stage 18 只回答 IPv4 发送方向上的一个问题:应用没有显式固定接口时,lwIP 怎样先选择 outgoing netif,然后怎样决定 Ethernet 下一跳是 destination 本身还是该接口的 gat...
16-ipv4-fragmentation-reassembly
教程 16:从 MTU 到 ip4_frag() / ip4_reass()——IPv4 分片、重组、超时与内存压力 摘要:沿 IPv4 发送与接收源码链,理解 MTU 如何触发分片、Offset/MF/ID 如何组织片段,以及 lwIP 怎样排序、重组、超时清理并限制资源占用。 [TOC] IPv4 fragmentation(IPv4 分片)解决的是“一个 IPv4 datagram 比当前可发送路径允许的 packet 更大时,怎样把它拆成多个 fragment”;reassembly(重组)则在最终目的主机把这些 fragment 恢复成原始 datagram。Fragment 不是新的传输层或 ICMP message,每一片仍然携带自己的 IPv4 Header,并通过 Identification、MF(More Fragments)和 Fragment Offset 表明自己属于哪个原始 datagram、位于什么位置、后面是否还有片段。S4S12 MTU(Maximum Transmission Unit,最大传输单元)表示某...
02-netif-tap-first-ping
教程 02:从 main() 到第一次 Ping——netif、TAP、ARP 与 ICMP 的完整源码链 摘要:先建立 IPv4 Ping 的 Ethernet、ARP、IPv4 与 ICMP 交互模型,再从 Unix example_app 入口追到 TAP 接收、协议栈线程、Echo Reply 与二层发送。 [TOC] 这一阶段要回答的不是“Ping 命令怎么用”,而是一个完整的数据路径问题: Linux Host 执行 ping 198.18.0.200 后,为什么会先出现 ARP,再出现 ICMP;这些 Ethernet frame 又怎样从 Linux TAP 进入 lwIP,经过 netif、tcpip_thread、ARP、IPv4、ICMP 后返回 Host? 先把标题里的四个对象说清楚。netif 是 lwIP 的 network interface(网络接口)抽象对象,把协议栈 **Core(核心协议处理代码与执行上下文)**和具体 **Port(面向操作系统/设备的适配层)**连接起来;TAP 是 Linux 提供给 userspa...
00-series-index
lwIP Source Lab 教程索引本系列持续跟踪官方 lwip-tcpip/lwip 的 master。绝大多数源码篇采用 Source-driven 主线:从当前行为的真实入口函数、注册入口或外部 API 开始,沿实际调用、数据与状态变化向下追踪。 Stage 00、15、31、38 与 45 属于 Theory of Operation / Application Note 型总览:先建立系统位置和完整数据流,再解释关键机制;它们不会覆盖后续源码篇“从真实入口开始”的硬约束。 Stage 00~45 Stage 00:从网线上的电信号到 lwIP——PHY、MAC、DMA 与 netif 的完整边界从 Ethernet Frame、PHY/MAC 分层出发,沿 DMA/Driver、pbuf、netif 建立完整软硬件边界,并区分链路、接口、IP 与上层就绪状态。 Stage 01:从 upstream master 到第一条可读源码链——Linux Host、构建树与源码地图沿 submodule、Host 依赖、Debug build ...
01-linux-lwip-lab
教程 01:从 upstream master 到第一条可读源码链——Linux Host、构建树与源码地图 摘要:沿一条可重复的成功路径建立 lwIP Linux Host 学习环境:锁定 upstream revision、生成 Debug build tree 与 compile database,并把 VS Code 带到真实源码入口。 [TOC] 这一篇不先讲 TCP、UDP 或 pbuf。目标只有一个:把仓库准备到“下一篇可以直接从 main() 开始读源码”的状态。 本文把官方 lwip-tcpip/lwip 仓库称为 upstream(上游仓库);master 是当前系列持续跟踪的 upstream 分支。HEAD 表示当前 checkout 指向的 Git commit;**Debug build tree(调试构建树)**是 CMake 为 Debug 配置生成的构建目录;**compile database(编译数据库)**则记录每个 C 源文件真实使用的 compiler、include path、宏和编译选项。后文会在第一次操作这些对象时继续展开。...
00-ethernet-physical-layer-and-network-stack
教程 00:从网线上的电信号到 lwIP——PHY、MAC、DMA 与 netif 的完整边界 摘要:从初学者视角建立 Ethernet 的 PHY、MAC 与 Frame 心智模型,再沿 PHY→MAC→DMA/Driver→pbuf→netif 解释 MCU 与 lwIP 的真实边界。 [TOC] Ethernet(以太网)是局域网里最常见的链路技术之一。Ethernet Frame(以太网帧)是 MAC 在链路上传输和接收的基本二层数据单元。对 MCU 网络开发而言,真正需要同时看懂的是两条边界:一条是 网线上的信号怎样经过 PHY、MAC 和 DMA 变成内存里的 Ethernet Frame,另一条是 这些 Frame 怎样通过 Driver、pbuf 和 netif 进入 lwIP。 本文第一次使用几个后面会反复出现的对象:**PHY(Physical Layer transceiver,物理层收发器)**负责把网线侧的模拟/符号信号与 MAC 侧的数字接口互相转换;**MAC(Media Access Control,介质访问控制器)**...
03-pbuf
教程 03:从 low_level_input() 到 pbuf_free()——pbuf 的数据视图、Chain 与引用计数 摘要:从 TAP 接收路径的 low_level_input 出发,把 pbuf 作为数据视图、Chain 与生命周期来读,沿分配、复制、协议层推进和释放追清整个 packet 的释放责任。 [TOC] Stage 2 已经把一帧 Ethernet 数据从 TAP 带进 lwIP。现在需要回答一个更底层的问题:这些字节进入协议栈后到底放在哪里,为什么同一个 packet 可以跨多块内存,又是谁负责最后释放它? pbuf 是 lwIP 的 packet buffer(数据包缓冲区)对象。它不是单纯的一块 malloc() 内存,而是“当前数据起点 payload + 当前节点长度 len + 整包剩余长度 tot_len + 下一节点 next + 引用计数 ref + 分配/数据属性”的组合。S2 多个 pbuf 节点通过 next 连接起来时称为 pbuf chain(pbuf 链);一条 chain 仍然可以只代表一个 packet...
04-ethernet-arp-ipv4-icmp
教程 04:从 ethernet_input() 到 Echo Reply——Ethernet、ARP、IPv4 与 ICMP 的分层数据通路 摘要:用真实四帧 Ping 抓包建立 Ethernet、ARP、IPv4、ICMP 协议流程,再从 tcpip_input 异步入口桥进入协议栈核心,逐帧映射协议字段、函数分发与数据视图。 [TOC] Stage 2 已经把第一次 Ping 从程序启动一直跑到 Echo Reply。本篇保留为独立的协议分发源码篇:不再讲 TAP 创建、Linux 路由配置和 example 启动,而是专门回答:一份已经进入 lwIP Core 的 packet,怎样按照 Ethernet、ARP、IPv4、ICMP 的字段逐层被解释、分发和重新发送? 为了让本篇可以独立阅读,先恢复必要名词。Ethernet frame 是链路层数据单元;EtherType 是 Ethernet Header 中标识上层 **payload(载荷,即 Header 之后承载的数据)**类型的字段。MAC(Media Access Control)地址是 Ether...








