ESP-Hosted-FG 深度解析指南
本指南详细解析 esp-hosted/esp_hosted_fg 目录结构、核心功能、架构设计及使用方法。ESP-Hosted-FG (First Generation) 是一种将 ESP32 系列芯片作为协处理器(Co-processor)的解决方案,为 Linux 或 MCU 主机(Host)提供 Wi-Fi 和蓝牙连接能力。
1. 项目简介
ESP-Hosted-FG 允许主机设备(如 Linux 开发板、MCU)通过标准硬件接口(SDIO/SPI/UART)连接 ESP 芯片,从而获得 Wi-Fi 和蓝牙功能。
- 主机 (Host): 运行业务逻辑的处理器(如 Raspberry Pi, STM32)。
- 从机 (Slave): ESP32 系列芯片,负责处理 Wi-Fi 和蓝牙/BLE 协议栈。
- 通信协议 :
- Wi-Fi: 传输 802.3 (Ethernet) 帧。
- Bluetooth: 传输 HCI (Host Controller Interface) 包。
- 控制命令: 使用 Protobuf 序列化的自定义控制协议,用于配置 Wi-Fi(扫描、连接 AP 等)。
1.1 主要特性
- 标准接口 :
- Linux 主机端呈现为标准网络接口(如
ethsta0,ethap0)。 - Linux 主机端呈现为标准蓝牙 HCI 接口(如
hci0)。
- Linux 主机端呈现为标准网络接口(如
- 灵活性: 支持 SDIO、SPI、UART 多种接口组合。
- 支持芯片: ESP32, ESP32-S2, ESP32-S3, ESP32-C2, ESP32-C3, ESP32-C6 等。
2. 目录结构深度解析
esp_hosted_fg 目录下的主要结构如下:
text
esp_hosted_fg/
├── docs/ # 文档目录
│ ├── Linux_based_host/ # Linux 主机相关文档
│ └── MCU_based_host/ # MCU 主机相关文档
├── esp/ # ESP 侧(从机)固件源码
│ ├── esp_driver/ # ESP 固件驱动核心代码
│ │ ├── network_adapter/ # 网络适配器应用(核心固件工程)
│ │ │ ├── main/ # 固件主入口及逻辑
│ │ │ └── CMakeLists.txt # 构建脚本
│ └── ...
├── host/ # 主机侧(Host)驱动源码
│ ├── linux/ # Linux 主机驱动
│ │ ├── host_control/ # 控制脚本与工具 (rpi_init.sh 等)
│ │ ├── host_driver/ # 内核驱动源码 (esp32_sdio.ko / esp32_spi.ko)
│ │ │ ├── esp32/ # 驱动核心逻辑
│ │ │ └── ...
│ └── mcu/ # MCU 主机驱动 (已废弃,建议使用 esp-hosted-mcu 仓库)
└── ...
关键目录详解
2.1 esp/ (从机固件)
这是运行在 ESP 芯片上的固件代码。
- 核心路径 :
esp/esp_driver/network_adapter/ - 功能: 接收来自 Host 的数据,转发给 Wi-Fi/BT 协议栈;接收空中的 Wi-Fi/BT 数据,转发给 Host。
- 构建: 基于 ESP-IDF 框架开发。
2.2 host/linux/ (Linux 主机驱动)
这是运行在 Linux 主机(如树莓派)上的内核模块。
host_driver/: 包含 Linux 内核模块源码。- 实现了网络设备驱动(对接 Linux 网络栈)。
- 实现了 HCI 驱动(对接 BlueZ)。
- 处理底层的 SDIO/SPI 通信。
host_control/:- 提供 Python/C 的演示应用,用于发送 Protobuf 控制命令(如配置 Wi-Fi SSID/Password)。
- 包含
rpi_init.sh等初始化脚本,用于编译和加载内核模块。
3. 硬件接口与通信模式
ESP-Hosted-FG 支持多种通信接口组合,适用于不同的硬件设计:
| 模式 | Wi-Fi 数据通道 | 蓝牙 数据通道 | 适用场景 | 备注 |
|---|---|---|---|---|
| SDIO Only | SDIO | SDIO | 高吞吐量需求 | 性能最好,需 6 根信号线 |
| SDIO + UART | SDIO | UART | 兼容性需求 | 蓝牙走独立 UART |
| SPI Only | SPI | SPI | 资源受限或无 SDIO | 吞吐量低于 SDIO |
| SPI + UART | SPI | UART | 灵活配置 | 蓝牙走独立 UART |
4. 快速上手 (以 Linux/树莓派为例)
4.1 环境准备
- 硬件: 树莓派 (Host) + ESP32 开发板 (Slave)。
- 连线: 根据选择的模式 (SDIO/SPI) 连接 GPIO。
4.2 主机侧 (Linux) 操作
-
下载源码 :
bashgit clone --recurse-submodules https://github.com/espressif/esp-hosted.git cd esp-hosted/esp_hosted_fg/host/linux/host_control/ -
编译并加载驱动 :
使用辅助脚本rpi_init.sh自动编译并加载内核模块。-
SDIO 模式 :
bash./rpi_init.sh sdio -
SPI 模式 :
bash./rpi_init.sh spi
-
-
验证 :
ifconfig -a: 应能看到ethsta0(Station) 和ethap0(SoftAP) 接口。hciconfig: 应能看到hci0蓝牙接口。
4.3 从机侧 (ESP) 操作
- 获取固件 :
-
方式 A: 从 GitHub Releases 下载预编译固件。
-
方式 B : 源码编译 (需安装 ESP-IDF)。
bashcd esp-hosted/esp_hosted_fg/esp/esp_driver/network_adapter idf.py set-target esp32 # 根据实际芯片型号设置 idf.py menuconfig # 配置传输接口 (SDIO/SPI) idf.py build flash # 编译并烧录
-
5. 核心架构设计
5.1 数据路径 (Data Path)
- Host -> Slave :
- Linux 应用发送 IP 包 -> Linux 内核网络栈 ->
ethsta0接口。 - ESP-Hosted 驱动封装数据 -> 通过 SPI/SDIO 总线发送。
- ESP 固件接收数据 -> 写入 ESP-IDF Wi-Fi 驱动发送。
- Linux 应用发送 IP 包 -> Linux 内核网络栈 ->
- Slave -> Host :
- ESP 接收 Wi-Fi 帧 -> ESP-Hosted 固件捕获。
- 通过 SPI/SDIO 总线发送给 Host。
- Host 驱动解包 -> 注入 Linux 内核网络栈 -> 上层应用接收。
5.2 控制路径 (Control Path)
- 由于 Wi-Fi 配置(如连接路由器的 SSID/密码)无法通过标准以太网帧传输,ESP-Hosted 使用基于 Protobuf 的控制协议。
- Host 端提供用户空间库/工具,通过私有接口向驱动发送 Protobuf 编码的指令。
- ESP 端解析指令并调用 ESP-IDF API 执行相应操作。
6. 常见问题与注意事项
-
MCU 主机支持:
- 虽然
esp_hosted_fg包含 MCU 代码,但官方已将其标记为 Deprecated (废弃)。 - 推荐 : 新的 MCU 项目请使用 esp-hosted-mcu 仓库。
- 虽然
-
蓝牙支持:
- ESP32 仅支持 BLE 4.2 和 BR/EDR。
- ESP32-C3/S3 支持 BLE 5.0。
- 在 Linux 上,蓝牙功能依赖于 BlueZ 协议栈。
-
性能:
- SDIO 模式通常能提供 20Mbps+ 的 TCP 吞吐量(视环境和 Host 性能而定)。
- SPI 模式受限于时钟频率和半双工特性,吞吐量通常较低 (数 Mbps)。