1 /* 2 * Copyright (c) 2025 Arduino SA 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #ifndef ZEPHYR_DRIVERS_WIFI_ESP_HOSTED_WIFI_H_ 8 #define ZEPHYR_DRIVERS_WIFI_ESP_HOSTED_WIFI_H_ 9 10 #include <zephyr/kernel.h> 11 #include <zephyr/drivers/spi.h> 12 #include <zephyr/drivers/gpio.h> 13 14 #include <zephyr/net/wifi.h> 15 #include <zephyr/net/wifi_mgmt.h> 16 #include <zephyr/net/wifi_nm.h> 17 #include <zephyr/net/conn_mgr/connectivity_wifi_mgmt.h> 18 19 #define DT_DRV_COMPAT espressif_esp_hosted 20 21 #define ESP_HOSTED_MAC_ADDR_LEN (6) 22 #define ESP_HOSTED_MAC_STR_LEN (17) 23 #define ESP_HOSTED_MAX_SSID_LEN (32) 24 #define ESP_HOSTED_MAX_PASS_LEN (64) 25 #define ESP_HOSTED_SYNC_TIMEOUT (5000) 26 #define ESP_HOSTED_SCAN_TIMEOUT (10000) 27 #define ESP_HOSTED_SPI_CONFIG \ 28 (SPI_OP_MODE_MASTER | SPI_TRANSFER_MSB | SPI_WORD_SET(8) | SPI_MODE_CPOL) 29 30 typedef enum { 31 ESP_HOSTED_STA_IF = 0, 32 ESP_HOSTED_SAP_IF, 33 ESP_HOSTED_SERIAL_IF, 34 ESP_HOSTED_HCI_IF, 35 ESP_HOSTED_PRIV_IF, 36 ESP_HOSTED_TEST_IF, 37 ESP_HOSTED_MAX_IF, 38 } esp_hosted_interface_t; 39 40 typedef struct { 41 struct gpio_dt_spec cs_gpio; 42 struct gpio_dt_spec reset_gpio; 43 struct gpio_dt_spec dataready_gpio; 44 struct gpio_dt_spec handshake_gpio; 45 struct spi_dt_spec spi_bus; 46 } esp_hosted_config_t; 47 48 typedef struct { 49 uint16_t seq_num; 50 uint64_t last_hb_ms; 51 struct net_if *iface[2]; 52 uint8_t mac_addr[2][6]; 53 k_tid_t tid; 54 struct k_sem bus_sem; 55 #if defined(CONFIG_NET_STATISTICS_WIFI) 56 struct net_stats_wifi stats; 57 #endif 58 enum wifi_iface_state state[2]; 59 } esp_hosted_data_t; 60 61 #define TLV_HEADER_SIZE (14) 62 #define TLV_HEADER_TYPE_EP (1) 63 #define TLV_HEADER_TYPE_DATA (2) 64 #define TLV_HEADER_EP_RESP "ctrlResp" 65 #define TLV_HEADER_EP_EVENT "ctrlEvnt" 66 67 #define ESP_FRAME_SIZE (1600) 68 #define ESP_FRAME_HEADER_SIZE (12) 69 #define ESP_FRAME_MAX_PAYLOAD (ESP_FRAME_SIZE - ESP_FRAME_HEADER_SIZE) 70 #define ESP_FRAME_FLAGS_FRAGMENT (1 << 0) 71 72 typedef enum { 73 ESP_PACKET_TYPE_EVENT, 74 } esp_hosted_priv_packet_t; 75 76 typedef enum { 77 ESP_PRIV_EVENT_INIT, 78 } esp_hosted_priv_event_t; 79 80 typedef struct __packed { 81 uint8_t if_type: 4; 82 uint8_t if_num: 4; 83 uint8_t flags; 84 uint16_t len; 85 uint16_t offset; 86 uint16_t checksum; 87 uint16_t seq_num; 88 uint8_t reserved2; 89 union { 90 uint8_t hci_pkt_type; 91 uint8_t priv_pkt_type; 92 }; 93 union { 94 struct __packed { 95 uint8_t event_type; 96 uint8_t event_len; 97 uint8_t event_data[]; 98 }; 99 struct __packed { 100 uint8_t ep_type; 101 uint16_t ep_length; 102 uint8_t ep_value[8]; 103 uint8_t data_type; 104 uint16_t data_length; 105 uint8_t data_value[]; 106 }; 107 struct { 108 /* To support fragmented frames, reserve 2x payload size. */ 109 uint8_t payload[ESP_FRAME_MAX_PAYLOAD * 2]; 110 }; 111 }; 112 } esp_frame_t; 113 114 #define ESP_FRAME_CHECK_VALID(frame) \ 115 (frame.len > 0 && frame.len <= ESP_FRAME_MAX_PAYLOAD && \ 116 frame.offset == ESP_FRAME_HEADER_SIZE) 117 118 #define ESP_FRAME_SIZE_ROUND(frame) ((ESP_FRAME_HEADER_SIZE + frame.len + 3) & ~3U) 119 120 #endif /* ZEPHYR_DRIVERS_WIFI_ESP_HOSTED_WIFI_H_ */ 121