[WIFI学院] - 总纲 - OpenIPC RTL8812EU 驱动学习路线
OpenIPC RTL8812EU 驱动学习路线
1. 学习目标
本学习路线用于指导 RTL8812EU 驱动的长期源码研究。
研究对象固定为:https://github.com/svpcom/rtl8812eu.git
主要应用背景为:
- OpenIPC
- WFB-NG
- RTL8812EU
- Monitor Mode
- Packet Injection
- FPV 数字图传
学习起点:
对 Linux 下 WiFi 驱动基本没有概念,但具备 C/C++、嵌入式软件和源码阅读能力。
最终目标不是简单做到:
能够在 Linux 下编译和使用 RTL8812EU 驱动。
而是达到:
理解 RTL8812EU 从 Linux 网络接口一直到 USB、Firmware、MAC、Baseband、RF 的完整工作原理,能够独立阅读、修改 RTL8812EU 驱动,并能够将其中与无线收发相关的核心逻辑从 Linux/Realtek Vendor Driver 框架中剥离出来,移植到 MCU、RTOS 或其他非 Linux 平台。
因此整个学习过程需要同时建立四方面能力:
- WiFi / IEEE 802.11 基础
- Linux 网络与 WiFi 驱动基础
- Realtek RTL8812EU 驱动架构理解
- 从 Linux Driver 中抽象出硬件驱动层并移植到其他平台的能力
2. 总体学习路线
整个学习过程划分为以下阶段:
阶段 0:建立 WiFi 驱动整体地图
↓
阶段 1:Linux 驱动基础
↓
阶段 2:Linux 网络设备基础
↓
阶段 3:IEEE 802.11 基础
↓
阶段 4:Linux WiFi 子系统
↓
阶段 5:USB WiFi 设备基础
↓
阶段 6:RTL8812EU 驱动总体架构
↓
阶段 7:RTL8812EU 驱动初始化
↓
阶段 8:Firmware 与硬件初始化
↓
阶段 9:RTL8812EU TX 数据通路
↓
阶段 10:Monitor Mode 与 Packet Injection
↓
阶段 11:RTL8812EU RX 数据通路
↓
阶段 12:MAC / Baseband / RF 控制
↓
阶段 13:OpenIPC / WFB-NG 专用修改
↓
阶段 14:抽离 Linux 依赖
↓
阶段 15:设计 MCU / RTOS RTL8812EU 驱动
↓
阶段 16:完成 RTL8812EU 非 Linux 平台移植
整个过程中始终围绕一个核心问题:
一帧数据究竟如何从应用程序出发,经过 Linux、RTL8812EU 驱动、USB、RTL8812EU 芯片,最后变成天线发射出去的无线信号?
以及它的反方向:
天线收到一个无线信号以后,RTL8812EU 如何经过 RF、Baseband、MAC、USB、驱动,最终把一个 802.11 数据帧交给应用程序?
3. 阶段 0:建立 WiFi 驱动整体地图
这一阶段暂时不深入代码。
目标是先建立一个最粗略的认知地图。
需要理解:
- 什么是网卡
- 什么是 WiFi NIC
- Host 和 WiFi 芯片分别是什么
- Linux WiFi 驱动处于什么位置
- USB WiFi 芯片和普通 USB 外设有什么区别
- WiFi 芯片内部大概有什么模块
- Driver 和 Firmware 有什么区别
- MAC 是什么
- PHY 是什么
- Baseband 是什么
- RF 是什么
- MAC/BB/RF 之间是什么关系
- FullMAC 是什么
- SoftMAC 是什么
- Realtek Vendor Driver 属于什么类型
- RTL8812EU 中 Host、Firmware 和硬件分别负责什么
最终建立如下整体认识:
Application
|
Linux Socket
|
Linux Network Stack
|
Linux WiFi Subsystem
|
RTL8812EU Driver
|
USB
|
RTL8812EU
|
+------------------+
| Firmware / MCU |
+------------------+
| MAC |
+------------------+
| Baseband / PHY |
+------------------+
| RF |
+------------------+
|
Antenna
这一阶段最重要的目标不是掌握细节,而是以后看到任何一个函数时,大概知道它位于整条链路的什么位置。
4. 阶段 1:Linux 驱动基础
这一阶段学习 Linux Device Driver 的最基本概念。
不需要系统学习所有 Linux 驱动,只学习阅读 RTL8812EU 所必需的部分。
需要理解:
- Kernel Space 与 User Space
- Linux Kernel Module
.ko文件是什么- module_init / module_exit
- probe / disconnect
- device / driver
- bus / device / driver 模型
- struct device
- driver_data
- 内核内存分配
- kmalloc / kzalloc / kfree
- DMA 的基本概念
- spinlock
- mutex
- semaphore
- completion
- atomic
- workqueue
- timer
- tasklet
- kernel thread
- interrupt
- wait queue
重点不是背 Linux API。
重点是看到类似代码:
spin_lock_irqsave(...);
能够知道:
这里是在保护一个可能被并发访问的数据结构。
看到:
schedule_work(...);
能够知道:
这里没有立即完成工作,而是把工作交给另一个执行上下文。
达到能够阅读驱动控制流程的程度即可。
5. 阶段 2:Linux 网络设备基础
在学习 WiFi 驱动之前,需要先理解 Linux 如何看待一张普通网卡。
需要理解:
- Network Device
- struct net_device
- network interface
- eth0 / wlan0
- interface up/down
- net_device_ops
- ndo_open
- ndo_stop
- ndo_start_xmit
- sk_buff
- struct sk_buff
- TX queue
- RX packet
- netif_rx
- NAPI 的基本概念
重点研究:
Application
|
Socket
|
TCP/IP
|
struct sk_buff
|
net_device
|
Driver
|
Hardware
需要理解:
Linux 网络驱动的核心工作,本质上就是在 Linux 的 sk_buff 与硬件能够理解的数据格式之间建立桥梁。
这一认识之后会直接帮助理解 RTL8812EU 的 TX/RX 数据路径。
6. 阶段 3:IEEE 802.11 基础
这一阶段开始学习 WiFi 本身。
只学习理解 RTL8812EU 和 WFB-NG 所需要的内容。
首先理解 802.11 Frame:
- Management Frame
- Control Frame
- Data Frame
理解:
- Frame Control
- Duration
- Address1
- Address2
- Address3
- Sequence Control
- Address4
- QoS Control
- Frame Body
- FCS
需要重点理解:
- To DS
- From DS
- BSSID
- STA
- AP
- Infrastructure
- Monitor Mode
然后学习 PHY 基础:
- OFDM
- Subcarrier
- Symbol
- Guard Interval
- Modulation
- BPSK
- QPSK
- 16-QAM
- 64-QAM
- Coding Rate
- MCS
- HT
- VHT
- 802.11n
- 802.11ac
- 20 MHz
- 40 MHz
- 80 MHz
- SGI
- STBC
- LDPC
- Spatial Stream
- MIMO
目标不是成为 RF 工程师。
而是看到:
MCS3
BW40
SGI
STBC
LDPC
NSS=2
能够知道这些参数最终会影响 PHY 如何发送这一帧。
7. 阶段 4:Linux WiFi 子系统
这一阶段研究:
Linux 普通网络驱动和 WiFi 驱动有什么不同?
需要建立以下概念:
- Wireless Extensions
- cfg80211
- nl80211
- mac80211
- Vendor Driver
重点理解:
User Space
|
nl80211
|
cfg80211
|
WiFi Driver
以及:
User Space
|
nl80211
|
cfg80211
|
mac80211
|
SoftMAC Driver
需要弄清楚:
RTL8812EU 为什么不是一个典型的 mac80211 SoftMAC Driver?
以及:
Realtek Vendor Driver 自己实现了哪些本来可能由 mac80211 完成的功能?
这一阶段还需要学习:
- station mode
- AP mode
- monitor mode
- interface type
- channel configuration
- frequency
- regulatory domain
完成这一阶段后,应当能够理解 RTL8812EU 与 Linux WiFi 框架之间的边界。
8. 阶段 5:USB WiFi 设备基础
RTL8812EU 是 USB WiFi 芯片,因此必须理解 USB。
只学习 RTL8812EU 所需要的 USB 内容。
需要理解:
- USB Host
- USB Device
- USB Descriptor
- Configuration
- Interface
- Endpoint
- Control Transfer
- Bulk Transfer
- Interrupt Transfer
- USB IN
- USB OUT
- URB
重点理解:
Host Memory
|
URB
|
USB Host Controller
|
USB
|
RTL8812EU
研究 Linux 中:
- usb_driver
- usb_device_id
- probe
- disconnect
- usb_submit_urb
- bulk endpoint
最终需要回答:
RTL8812EU 的一个 TX 数据包是如何通过 USB 送入芯片的?
以及:
RTL8812EU 收到的数据又是如何通过 USB 返回 Host 的?
9. 阶段 6:RTL8812EU 驱动总体架构
完成前面的基础学习之后,第一次正式进入:
svpcom/rtl8812eu
首先只研究目录结构。
重点目录:
core/
hal/
include/
os_dep/
platform/
建立基本分层:
Linux
|
os_dep
|
core
|
HAL
|
RTL8812E / RTL8822E Hardware
需要弄清楚:
os_dep
主要负责:
Linux 操作系统相关接口。
core
主要负责:
Realtek 驱动核心逻辑。
hal
主要负责:
Hardware Abstraction Layer。
include
主要负责:
公共结构体、宏、接口定义。
platform
主要负责:
不同 Host Platform 的适配。
这一阶段还要认识 RTL8812EU 驱动最重要的数据结构。
尤其是:
struct adapter
需要研究:
为什么 Realtek Driver 中大量函数都围绕 adapter 展开?
最终画出 RTL8812EU 软件架构图。
10. 阶段 7:RTL8812EU 驱动初始化
从 Linux 加载:
8812eu.ko
开始跟踪源码。
研究:
module_init
↓
USB Driver Register
↓
USB Device Match
↓
probe
↓
adapter allocation
↓
USB interface initialization
↓
HAL initialization
↓
Firmware
↓
MAC / BB / RF
↓
net_device
↓
cfg80211
↓
wlan interface
这一阶段要求真正沿着源码调用链走一遍。
最终需要能够回答:
把 RTL8812EU 插入 USB 以后,到 Linux 出现 wlan0,中间究竟发生了什么?
11. 阶段 8:Firmware 与硬件初始化
这是从“Linux Driver”逐渐进入“WiFi 芯片”的关键阶段。
需要研究:
- Firmware 文件
- Firmware 下载
- RTL8812EU 内部 MCU
- Firmware boot
- Firmware command
- Host-to-Controller Command
- C2H
- H2C
理解:
Linux Driver
|
| H2C
v
Firmware
|
| C2H
v
Linux Driver
同时开始研究硬件初始化:
- MAC register
- BB register
- RF register
- register read/write
- USB control transfer
- power sequence
- clock
- RF power
- channel
- bandwidth
这一阶段需要逐渐建立:
Host Driver
Firmware
MAC Hardware
BB Hardware
RF Hardware
五者之间的边界。
12. 阶段 9:RTL8812EU TX 数据通路
这是整个项目最重要的阶段之一。
完整追踪:
Linux
↓
sk_buff
↓
RTL8812EU Driver
↓
xmit_frame
↓
xmit_buf
↓
TX Descriptor
↓
USB Buffer
↓
URB
↓
USB Bulk OUT
↓
RTL8812EU
↓
MAC
↓
Baseband
↓
RF
↓
Antenna
需要重点研究 Realtek Driver 中:
- xmit_priv
- xmit_frame
- xmit_buf
- pkt_attrib
- TX descriptor
- USB aggregation
- TX queue
尤其需要理解:
TX Descriptor 是什么?
这是后续 MCU 移植最重要的知识之一。
因为 Host 并不是简单地:
USB Send(80211_Frame)
而通常是:
TX Descriptor
+
802.11 Frame
TX Descriptor 会告诉 RTL8812EU:
- 数据长度
- Queue
- Rate
- MCS
- Bandwidth
- SGI
- STBC
- LDPC
- Retry
- Aggregation
- Sequence
- PHY 参数
最终目标:
能够手工解释一个 RTL8812EU USB TX Buffer 的结构。
13. 阶段 10:Monitor Mode 与 Packet Injection
这是 OpenIPC/WFB-NG 最核心的阶段。
研究:
wfb_tx
↓
raw socket
↓
monitor interface
↓
Radiotap
↓
802.11 Frame
↓
RTL8812EU Driver
↓
TX Descriptor
↓
USB
↓
RTL8812EU
需要学习 Radiotap:
- Radiotap Header
- Flags
- Rate
- Channel
- MCS
- VHT
- TX Flags
然后研究 svpcom 对 Realtek Driver 做出的修改。
重点回答:
wfb_tx 指定的 MCS 最终在哪里变成 RTL8812EU TX Descriptor 中的 Rate?
继续研究:
- MCS
- BW
- SGI
- STBC
- LDPC
- TX Power
- 10 MHz
- 20 MHz
- 40 MHz
- 80 MHz
尤其研究:
10 MHz 模式为什么可以工作?
以及:
Radiotap 参数、Driver 参数、TX Descriptor、BB 配置之间是什么关系?
这一阶段完成以后,应当基本理解 OpenIPC FPV 的发送核心。
14. 阶段 11:RTL8812EU RX 数据通路
然后研究反方向:
Antenna
↓
RF
↓
Baseband
↓
MAC
↓
RTL8812EU RX Buffer
↓
USB Bulk IN
↓
URB
↓
RX Descriptor
↓
recv_frame
↓
Monitor Mode
↓
Radiotap
↓
Socket
↓
wfb_rx
重点研究:
- recv_priv
- recv_buf
- recv_frame
- RX descriptor
- USB RX aggregation
研究 RX Descriptor 中:
- Packet Length
- CRC
- Rate
- MCS
- Bandwidth
- RSSI
- Signal Strength
- PHY Status
理解:
Driver 是如何知道这个数据包使用什么 MCS 收到的?
以及:
RSSI 是从哪里来的?
最终能够解释:
wfb_rx 看到的 Radiotap Header 是谁生成的,以及其中的信息来自 RTL8812EU 的什么地方。
15. 阶段 12:MAC / Baseband / RF 控制
前面的研究主要是:
Packet Path
这一阶段开始深入:
Hardware Control Path
重点研究:
MAC
- TX/RX Queue
- Retry
- ACK
- Sequence
- Aggregation
- Timing
Baseband
- OFDM
- Modulation
- Coding
- MCS
- Channel Bandwidth
- PHY Status
RF
- Channel
- Frequency
- TX Power
- RF Path
- Antenna
重点学习驱动中的:
read register
write register
set_bb_reg
query_bb_reg
set_rf_reg
query_rf_reg
理解类似:
PHY_SetBBReg(...)
PHY_SetRFReg(...)
这样的函数最终到底在控制什么硬件。
这一阶段开始真正建立:
Driver Register Operation → Hardware Behavior
之间的对应关系。
16. 阶段 13:OpenIPC / WFB-NG 专用修改
完成原始 Realtek Driver 理解后,再研究 svpcom 修改。
不要一开始就研究 patch。
因为如果不知道原始 Driver 在干什么,就无法真正理解修改的意义。
需要通过:
Upstream Realtek Driver
VS
svpcom rtl8812eu
进行比较。
重点寻找:
- Monitor Mode 修改
- Packet Injection 修改
- Radiotap 修改
- MCS 控制
- TX Rate 控制
- Bandwidth 修改
- 10 MHz 支持
- TX Power
- FEC/FPV 相关优化
- Latency 优化
- Queue 优化
- Retry 行为修改
最终建立完整链路:
WFB-NG parameter
↓
Radiotap
↓
RTL8812EU Driver
↓
TX Descriptor
↓
MAC / BB configuration
↓
RF
这一步完成后,OpenIPC 使用 RTL8812EU 进行数字图传的核心原理应该已经基本清晰。
17. 阶段 14:抽离 Linux 依赖
这是从“读懂 Driver”进入“能够移植 Driver”的关键阶段。
开始把 RTL8812EU Driver 分类。
把所有代码划分成:
Linux Specific
Realtek Core
USB Transport
Firmware Interface
Hardware HAL
例如:
Linux Specific:
sk_buff
net_device
cfg80211
spinlock
mutex
workqueue
timer
kmalloc
这些不能直接移植到 MCU。
而:
TX Descriptor
RX Descriptor
Register Definition
Firmware Download
H2C
C2H
MAC Configuration
BB Configuration
RF Configuration
这些才是 RTL8812EU 真正的硬件知识。
逐渐形成:
Linux Driver
|
| 去除
v
OS Independent RTL8812EU Core
这是整个学习路线非常重要的思想转变。
18. 阶段 15:设计 MCU / RTOS RTL8812EU 驱动
完成 Linux Driver 解剖以后,重新设计驱动。
例如:
Application
|
RTL8812EU API
|
+----------------------+
| RTL8812EU Core |
+----------------------+
| TX / RX |
| Firmware |
| MAC |
| BB |
| RF |
+----------------------+
| Platform Abstraction |
+----------------------+
| USB Host Driver |
+----------------------+
设计平台抽象接口,例如:
rtl_malloc();
rtl_free();
rtl_mutex_lock();
rtl_mutex_unlock();
rtl_delay_ms();
rtl_delay_us();
rtl_usb_control_read();
rtl_usb_control_write();
rtl_usb_bulk_read();
rtl_usb_bulk_write();
然后让 RTL8812EU Core 不再依赖:
Linux
net_device
sk_buff
cfg80211
而只依赖:
Platform API
USB API
此时 Driver 才真正具备跨平台能力。
19. 阶段 16:RTL8812EU MCU / RTOS 移植
最终目标平台可能是:
MCU
RTOS
Bare Metal
Other OS
需要实现:
MCU USB Host
↓
RTL8812EU USB Driver
↓
Firmware Download
↓
MAC Initialization
↓
BB Initialization
↓
RF Initialization
↓
Set Channel
↓
Set Bandwidth
↓
TX
↓
RX
第一阶段甚至不需要实现完整 WiFi。
可以只实现 OpenIPC/WFB-NG 所需要的最小功能:
rtl8812_init()
rtl8812_load_firmware()
rtl8812_set_channel()
rtl8812_set_bandwidth()
rtl8812_set_tx_power()
rtl8812_set_rate()
rtl8812_tx_raw_frame()
rtl8812_rx_raw_frame()
也就是说:
不实现 STA。
不实现 AP。
不实现 WPA。
不实现完整 Linux WiFi Stack。
只把 RTL8812EU 当成:
一个可以指定 PHY 参数发送和接收 Raw 802.11 Frame 的无线收发器。
这很可能是将 RTL8812EU 移植到 MCU 用于 WFB 类数字图传时最值得优先实现的架构。
20. 学习过程中始终维护的五张图
整个研究过程中,需要逐渐完善五张图。
第一张:软件架构图
WFB-NG
|
Linux
|
cfg80211
|
RTL8812EU Driver
|
USB
|
RTL8812EU
第二张:TX 数据流图
wfb_tx
↓
Radiotap
↓
Driver
↓
TX Descriptor
↓
USB
↓
MAC
↓
BB
↓
RF
第三张:RX 数据流图
RF
↓
BB
↓
MAC
↓
RX Descriptor
↓
USB
↓
Driver
↓
Radiotap
↓
wfb_rx
第四张:控制路径图
Application
↓
Driver
↓
Register / H2C
↓
Firmware / MAC / BB / RF
第五张:移植分层图
Application
|
RTL8812EU Core
|
Hardware Abstraction
|
USB Host
|
Platform
以后遇到任何代码,都尝试把它放进这五张图中的某个位置。
21. 源码研究原则
整个学习过程中遵循以下原则。
原则一:先原理,后代码
遇到一个完全陌生的机制时,不立即逐行解释代码。
按照:
为什么需要它
↓
它解决什么问题
↓
抽象模型
↓
简单例子
↓
数据结构
↓
源码
的顺序学习。
原则二:沿调用链学习
不要随机阅读文件。
例如 TX:
入口
↓
函数 A
↓
函数 B
↓
函数 C
↓
TX Descriptor
↓
USB
始终沿一条完整路径研究。
原则三:区分“Linux知识”和“RTL8812EU知识”
看到代码时始终问:
这是 Linux 要求这样做,还是 RTL8812EU 硬件要求这样做?
例如:
sk_buff
属于 Linux。
而:
TX Descriptor
属于 RTL8812EU。
这一区分对于最终 MCU 移植极其重要。
原则四:区分 Driver、Firmware 和 Hardware
始终判断一个功能究竟由谁实现:
Host Driver
Firmware
MAC Hardware
Baseband Hardware
RF Hardware
不要笼统地把所有行为都称为“驱动实现”。
原则五:不要被 Realtek Vendor Driver 的复杂度吓住
RTL8812EU Driver 包含大量:
- STA
- AP
- Security
- Power Saving
- Regulatory
- Compatibility
- Different Chip
- Different Bus
- Different Kernel Version
相关代码。
但 OpenIPC FPV 真正关注的核心路径远小于整个 Driver。
最终需要逐渐识别:
必须理解
重要但可以以后理解
OpenIPC基本不用
三类代码。
22. 学习过程中的主线问题
整个研究过程中始终围绕以下问题推进。
问题 1
RTL8812EU 插入 USB 后:
Linux 是如何发现它的?
问题 2
Driver 加载后:
RTL8812EU 是如何完成初始化的?
问题 3
Firmware:
谁把 Firmware 下载进 RTL8812EU?
Firmware 在哪里运行?
Firmware 负责什么?
问题 4
TX:
一帧 802.11 Frame 如何变成 USB 数据?
问题 5
TX Descriptor:
RTL8812EU 怎么知道这一帧应该用什么 MCS、带宽和 PHY 参数发送?
问题 6
USB:
Host 究竟向 RTL8812EU 的哪个 Endpoint 发送什么数据?
问题 7
Hardware:
USB 收到的数据如何进入 MAC → BB → RF?
问题 8
RX:
RF 收到的数据如何最终变成 Host 中的 802.11 Frame?
问题 9
Radiotap:
Radiotap Header 和 RTL8812EU TX/RX Descriptor 是什么关系?
问题 10
WFB-NG:
wfb_tx 设置的 MCS/BW/STBC/LDPC 最终如何影响 RTL8812EU?
问题 11
Linux Dependency:
哪些代码只是为了适配 Linux?
问题 12
Hardware Dependency:
哪些代码是控制 RTL8812EU 必不可少的?
问题 13
Porting:
如果没有 Linux,只给一个 MCU + USB Host,需要保留哪些代码?
23. 最终能力目标
完成整个路线以后,应当能够独立回答:
RTL8812EU Driver 为什么这样设计?
能够打开一个 RTL8812EU 函数判断:
它属于 Linux 层?
Core?
USB?
Firmware?
MAC?
BB?
RF?
能够完整追踪:
wfb_tx
→ Linux
→ RTL8812EU Driver
→ TX Descriptor
→ USB
→ MAC
→ BB
→ RF
→ Antenna
以及:
Antenna
→ RF
→ BB
→ MAC
→ RX Descriptor
→ USB
→ RTL8812EU Driver
→ Linux
→ wfb_rx
最终能够做到:
Linux RTL8812EU Driver
↓
识别 Linux 依赖
↓
识别 Realtek Core
↓
识别 Firmware Interface
↓
识别 USB Transport
↓
识别 MAC/BB/RF HAL
↓
重新设计 Platform Abstraction
↓
MCU / RTOS RTL8812EU Driver
这才是本项目真正的终点。
24. 当前学习进度
当前状态:
[ ] 阶段 0:建立 WiFi 驱动整体地图
[ ] 阶段 1:Linux 驱动基础
[ ] 阶段 2:Linux 网络设备基础
[ ] 阶段 3:IEEE 802.11 基础
[ ] 阶段 4:Linux WiFi 子系统
[ ] 阶段 5:USB WiFi 设备基础
[ ] 阶段 6:RTL8812EU 驱动总体架构
[ ] 阶段 7:RTL8812EU 驱动初始化
[ ] 阶段 8:Firmware 与硬件初始化
[ ] 阶段 9:RTL8812EU TX 数据通路
[ ] 阶段 10:Monitor Mode 与 Packet Injection
[ ] 阶段 11:RTL8812EU RX 数据通路
[ ] 阶段 12:MAC / Baseband / RF 控制
[ ] 阶段 13:OpenIPC / WFB-NG 专用修改
[ ] 阶段 14:抽离 Linux 依赖
[ ] 阶段 15:设计 MCU / RTOS RTL8812EU 驱动
[ ] 阶段 16:完成 RTL8812EU 非 Linux 平台移植
25. 下一步
从:
阶段 0:建立 WiFi 驱动整体地图
正式开始。
第一阶段暂时不阅读 RTL8812EU 具体源码。
首先回答最基础的问题:
一块 USB WiFi 网卡究竟是什么?
然后逐层建立:
Host
Driver
USB
Firmware
MAC
Baseband
RF
Antenna
之间的关系。
在这个整体地图建立完成以后,再进入 Linux Driver 基础。
后续即使研究过程中产生大量分支,只要重新回到本文档,并查看“当前学习进度”,即可继续沿主线推进。
浙公网安备 33010602011771号