【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)。
相关推荐
无言听风雨丶20 分钟前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
万联WANFLOW20 分钟前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
OPEN-F35 分钟前
Ubuntu 自动登录后 GNOME 远程桌面连不上?一次登录钥匙环锁定的排查与永久修复
linux·运维·ubuntu
硅基手札1 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位
默|笙1 小时前
【Linux网络】传输层协议TCP(3)滑动窗口、流量控制
linux·网络·tcp/ip
Linux界最忧郁之人3 小时前
华为云ECS&IMS&AS实战|弹性云服务器、私有镜像、弹性伸缩完整实验
linux·运维·服务器·centos·华为云·openstack
whyutianict_vv3 小时前
零基础转 AI 运维:投入清单、技术路线与核对表
linux·运维·人工智能·ai
无言听风雨丶3 小时前
systemd 与信号 / 僵尸进程:Linux 进程管理的底层逻辑与排错
linux·服务器·网络
DevOpenClub3 小时前
高考一分一段 API:分数查位次、科类枚举与历史对照
linux·数据库·高考
世微 如初4 小时前
24V 输入转 9V/0.8A 输出:基于 AP5190 的 LED 降压恒流驱动方案设计与 BOM 清单
驱动开发·芯片·led电源驱动·降压恒流ic