【Linux驱动开发】ESP-Hosted-FG 深度解析指南

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)。
  • 灵活性: 支持 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 环境准备

  1. 硬件: 树莓派 (Host) + ESP32 开发板 (Slave)。
  2. 连线: 根据选择的模式 (SDIO/SPI) 连接 GPIO。

4.2 主机侧 (Linux) 操作

  1. 下载源码 :

    bash 复制代码
    git clone --recurse-submodules https://github.com/espressif/esp-hosted.git
    cd esp-hosted/esp_hosted_fg/host/linux/host_control/
  2. 编译并加载驱动 :
    使用辅助脚本 rpi_init.sh 自动编译并加载内核模块。

    • SDIO 模式 :

      bash 复制代码
      ./rpi_init.sh sdio
    • SPI 模式 :

      bash 复制代码
      ./rpi_init.sh spi
  3. 验证 :

    • ifconfig -a: 应能看到 ethsta0 (Station) 和 ethap0 (SoftAP) 接口。
    • hciconfig: 应能看到 hci0 蓝牙接口。

4.3 从机侧 (ESP) 操作

  1. 获取固件 :
    • 方式 A: 从 GitHub Releases 下载预编译固件。

    • 方式 B : 源码编译 (需安装 ESP-IDF)。

      bash 复制代码
      cd 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 :
    1. Linux 应用发送 IP 包 -> Linux 内核网络栈 -> ethsta0 接口。
    2. ESP-Hosted 驱动封装数据 -> 通过 SPI/SDIO 总线发送。
    3. ESP 固件接收数据 -> 写入 ESP-IDF Wi-Fi 驱动发送。
  • Slave -> Host :
    1. ESP 接收 Wi-Fi 帧 -> ESP-Hosted 固件捕获。
    2. 通过 SPI/SDIO 总线发送给 Host。
    3. Host 驱动解包 -> 注入 Linux 内核网络栈 -> 上层应用接收。

5.2 控制路径 (Control Path)

  • 由于 Wi-Fi 配置(如连接路由器的 SSID/密码)无法通过标准以太网帧传输,ESP-Hosted 使用基于 Protobuf 的控制协议。
  • Host 端提供用户空间库/工具,通过私有接口向驱动发送 Protobuf 编码的指令。
  • ESP 端解析指令并调用 ESP-IDF API 执行相应操作。

6. 常见问题与注意事项

  1. MCU 主机支持:

    • 虽然 esp_hosted_fg 包含 MCU 代码,但官方已将其标记为 Deprecated (废弃)。
    • 推荐 : 新的 MCU 项目请使用 esp-hosted-mcu 仓库。
  2. 蓝牙支持:

    • ESP32 仅支持 BLE 4.2 和 BR/EDR。
    • ESP32-C3/S3 支持 BLE 5.0。
    • 在 Linux 上,蓝牙功能依赖于 BlueZ 协议栈。
  3. 性能:

    • SDIO 模式通常能提供 20Mbps+ 的 TCP 吞吐量(视环境和 Host 性能而定)。
    • SPI 模式受限于时钟频率和半双工特性,吞吐量通常较低 (数 Mbps)。
相关推荐
福尔摩斯张18 小时前
插件式架构:解耦与扩展的艺术与实践(超详细)
linux·服务器·网络·网络协议·tcp/ip
txzz888819 小时前
CentOS-Stream-10 搭建YUM源Web服务器
linux·运维·centos·yum源·linux系统更新·centos系统更新·自建web yum源
Molesidy19 小时前
【Linux】基于Imx6ull Pro开发板和platform_device+platform_driver框架的LED驱动设计以及上机测试
linux·驱动开发
我科绝伦(Huanhuan Zhou)19 小时前
Linux系统硬件时钟与系统时钟深度解析及同步实操指南
linux·运维·服务器
k***921619 小时前
【Linux】进程概念(六):地址空间核心机制
linux·运维·算法
李白同学19 小时前
Linux:调试器-gdb/cgdb使用
linux·服务器·c语言·c++
保持低旋律节奏19 小时前
linux——进程调度(时间片+优先级轮转调度算法O(1))
linux·运维·算法
少年、潜行20 小时前
F1C100/200S学习笔记(3)-- 裸机开发
linux·笔记·学习·驱动·裸机·f1c200s
老王熬夜敲代码20 小时前
网路编程--协议
linux·网络·笔记
虾..20 小时前
Linux 进程池小程序
linux·c++·小程序