Skip to content

[GSoC 2026] proposal : Add support to ESP Hosted on NuttX #18497

Description

@shvass

Hello,
I would like to propose an implementation approach to add ESP-Hosted support for NuttX.

I've researched the implementation required to support ESP-Hosted on NuttX. I studied the architecture of ESP-Hosted-NG (the Linux kernel module) and the NuttX network stack along with its lower-half network driver interfaces.

Implementation

ESP-Hosted-NG exposes an API compatible with Linux 802.11 drivers. Its internal architecture roughly follows the structure below (this is largely undocumented, so I derived it from the source code).

+------------------------------------------------------------------------------+
|                  ESP-Hosted-NG Linux Kernel Module Architecture              |
|------------------------------------------------------------------------------|
| Linux Networking Interface                                                   |
| cfg80211/mac80211 subsystem hooks and registered driver                      |
|------------------------------------------------------------------------------|
| ESP hosted Core Driver API (esp_api / esp_cmd)                               |
| Provides the primary API used by the driver to communicate with the          |
| ESP32-series co-processor (esp_api.h & esp_cmd.h)                            |
|------------------------------------------------------------------------------|
|                               .    .     .                                   |
|------------------------------------------------------------------------------|
| Transport Abstraction (esp_if_ops)                                           |
|  struct esp_if_ops provides function pointers for transport operations such  |
|  as read(), write(), init(), etc.                                            |
|------------------------------------------------------------------------------|
| Physical Transport Driver implementation (OS specific) (SPI/SDIO)            |
| Populates esp_if_ops with implementation for read, write, init, etc. as per  | 
| communcation medium                                                          |
|------------------------------------------------------------------------------|

  • ESP-Hosted provides the esp_api interface used by the host driver to interact with the ESP co-processor.. (esp_api esp_cmd
  • This API includes functions for device initialization, configuration, and wireless interface management.
  • There is a transport abstraction esp_if_ops which stores function pointers for a communication interface. Transport implementations (e.g., SDIO or SPI) populate this structure to provide read(), write(), init(), and related operations.

esp_hosted nuttx module functionality

  • The module registers as a lower-half network driver with the NuttX network stack and populates the netdev_ops_s (and wireless control operations where applicable) structs with implementations that forward calls to the corresponding esp_api functions.
  • Implementation of an esp_nuttx_spi transport interface that operates on a NuttX spi_dev_s device and populates esp_if_ops, registering itself as a communication interface.
  • During initialization, the driver acquires the SPI device, initializes the esp_adapter, and performs device initialization.

current Progress

  • I've setup esp-hosted on raspi 3B+ connected to ESP32C3 running esp-hosted firmware and acting as a co-processor for the host. The additional wlan interface functions normally (running it in AP mode) .
  • I have also got stm32F107 running nuttX where I plan to carry further development.

upcoming planned tasks

I intend to demonstrate a module interfacing with an ESP32xx device over SPI via esp_api. The initial goal is a basic example that initializes the device and fetches firmware info.

For this I would need to:-

  • Port esp_api from linux to nuttx. (esp_api currently relies on Linux data structures and kernel primitives for threading and synchronisation.)
  • Develop an esp_nuttx_spi transport implementation that operates on a NuttX SPI device and binds it to the esp_api transport abstraction (esp_if_ops).
  • make API calls to initialise the device and interface and get device info via esp_get_hardware_name().

About Me

  • I'm a final-year B.Tech student in Electronics and Telecommunication Engineering at VIIT, Pune.
  • I've previously contributed to linux kernel (IIO subsystem) and micro-ROS
  • I've experience working with various RTOSes such as FreeRTOS, zephyr and ESP-IDF specifically with ESP32xx MCUs.

References

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions