79 lines
2.5 KiB
Markdown
79 lines
2.5 KiB
Markdown
# ESP Nano Hosted
|
|
|
|
## Introduction
|
|
|
|
This project is trying to interface with `esp-hosted` firmware using a MCU-friendly method.
|
|
|
|
## SPI Frame Format
|
|
|
|
* Each SPI transaction is fixed 1600 bytes
|
|
* Each transaction is prefixed by a 12-byte header, defined as follows:
|
|
```c
|
|
struct esp_payload_header {
|
|
uint8_t if_type:4;
|
|
uint8_t if_num:4;
|
|
uint8_t flags;
|
|
uint16_t len;
|
|
uint16_t offset;
|
|
uint16_t checksum;
|
|
uint16_t seq_num;
|
|
uint8_t reserved2;
|
|
union {
|
|
uint8_t reserved3;
|
|
uint8_t hci_pkt_type;
|
|
uint8_t priv_pkt_type;
|
|
};
|
|
} __attribute__((packed));
|
|
```
|
|
|
|
* The `if_type` field is one of the following enum:
|
|
```c
|
|
typedef enum {
|
|
ESP_STA_IF,
|
|
ESP_AP_IF,
|
|
ESP_SERIAL_IF,
|
|
ESP_HCI_IF,
|
|
ESP_PRIV_IF,
|
|
ESP_TEST_IF,
|
|
ESP_MAX_IF,
|
|
} ESP_INTERFACE_TYPE;
|
|
```
|
|
|
|
* Control requests and responses are handled through `ESP_SERIAL_IF`, which has the following TLV structure:
|
|
|
|
```c
|
|
/*
|
|
* TLV (Type - Length - Value) structure is as follows:
|
|
* --------------------------------------------------------------------------------------------
|
|
* Endpoint Type | Endpoint Length | Endpoint Value | Data Type | Data Length | Data Value |
|
|
* --------------------------------------------------------------------------------------------
|
|
*
|
|
* Bytes used per field as follows:
|
|
* --------------------------------------------------------------------------------------------
|
|
* 1 | 2 | Endpoint length | 1 | 2 | Data length |
|
|
* --------------------------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* For type fields: */
|
|
#define PROTO_PSER_TLV_T_EPNAME 0x01
|
|
#define PROTO_PSER_TLV_T_DATA 0x02
|
|
|
|
|
|
/* Some stupid constraints in the original code expects the length should be same... even they don't have to */
|
|
#define CTRL_EP_NAME_RESP "ctrlResp"
|
|
#define CTRL_EP_NAME_EVENT "ctrlEvnt"
|
|
|
|
```
|
|
|
|
* The control messages are encapsulated in protobuf, in the data field of the above TLV.
|
|
* For Host-to-ESP messages, the endpoint name `CTRL_EP_NAME_RESP` is used.
|
|
* For ESP-to-Host messages, the endpoint name `CTRL_EP_NAME_EVENT` or `CTRL_EP_NAME_RESP` are used.
|
|
|
|
## Issues
|
|
|
|
* Only a subset of commands are implemented.
|
|
* Jumbo frames (larger than 1518 bytes) are not supported, since no `realloc` available.
|
|
* Just hope ESP won't send some frame larger than that.
|
|
|
|
## License
|
|
Not decided yet, please be patient. At least not before the project is usable. |