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