Przeglądaj źródła

update esp-hosted firmware to FG-0.0.6.0.0

Evlers 1 rok temu
rodzic
commit
1e997ec3bb
55 zmienionych plików z 5297 dodań i 1156 usunięć
  1. 7 7
      Kconfig
  2. 781 29
      common/esp_hosted_config.pb-c.c
  3. 10 2
      common/include/adapter.h
  4. 14 0
      common/include/esp_fw_version.h
  5. 280 14
      common/include/esp_hosted_config.pb-c.h
  6. 18 0
      common/proto/build_proto.sh
  7. 345 265
      common/proto/esp_hosted_config.proto
  8. 2 0
      docs/Linux_based_host/Linux_based_readme.md
  9. 8 13
      docs/Linux_based_host/SDIO_setup.md
  10. 19 8
      docs/Linux_based_host/SPI_setup.md
  11. 20 0
      docs/Linux_based_host/Troubleshoot.md
  12. 4 2
      docs/Linux_based_host/UART_setup.md
  13. 28 7
      docs/Linux_based_host/porting_guide.md
  14. 2 0
      docs/MCU_based_host/SDIO_setup.md
  15. 2 0
      docs/MCU_based_host/SPI_setup.md
  16. 0 273
      docs/README.md
  17. 9 1
      docs/common/c_demo.md
  18. 49 0
      docs/common/ctrl_apis.md
  19. 26 2
      docs/common/python_demo.md
  20. BIN
      docs/esp_hosted_performance.png
  21. 20 6
      esp/esp_driver/network_adapter/CMakeLists.txt
  22. 1 4
      esp/esp_driver/network_adapter/main/CMakeLists.txt
  23. 195 136
      esp/esp_driver/network_adapter/main/Kconfig.projbuild
  24. 32 13
      esp/esp_driver/network_adapter/main/app_main.c
  25. 2 2
      esp/esp_driver/network_adapter/main/mempool.c
  26. 25 0
      esp/esp_driver/network_adapter/main/sdio_slave_api.c
  27. 53 19
      esp/esp_driver/network_adapter/main/slave_bt.c
  28. 6 4
      esp/esp_driver/network_adapter/main/slave_bt.h
  29. 540 58
      esp/esp_driver/network_adapter/main/slave_control.c
  30. 16 4
      esp/esp_driver/network_adapter/main/slave_control.h
  31. 143 57
      esp/esp_driver/network_adapter/main/spi_slave_api.c
  32. 7 0
      esp/esp_driver/network_adapter/partitions.esp32.csv
  33. 7 0
      esp/esp_driver/network_adapter/partitions.esp32c6.csv
  34. 6 7
      esp/esp_driver/network_adapter/sdkconfig.defaults
  35. 12 4
      esp/esp_driver/network_adapter/sdkconfig.defaults.esp32
  36. 1 6
      esp/esp_driver/network_adapter/sdkconfig.defaults.esp32c2
  37. 1 6
      esp/esp_driver/network_adapter/sdkconfig.defaults.esp32c3
  38. 14 5
      esp/esp_driver/network_adapter/sdkconfig.defaults.esp32c6
  39. 1 6
      esp/esp_driver/network_adapter/sdkconfig.defaults.esp32s3
  40. 2135 0
      esp/esp_driver/network_adapter/sdkconfig.old
  41. 19 0
      esp/esp_driver/setup.ps1
  42. 27 0
      esp/esp_driver/setup_windows11.md
  43. 5 0
      host/components/src/esp_queue.c
  44. 92 15
      host/control_lib/include/ctrl_api.h
  45. 12 0
      host/control_lib/src/ctrl_api.c
  46. 242 103
      host/control_lib/src/ctrl_core.c
  47. 5 1
      host/driver/network/netdev_api.c
  48. 1 1
      host/driver/serial/serial_ll_if.c
  49. 32 25
      host/driver/transport/spi/spi_drv.c
  50. 0 42
      host/driver/transport/spi/spi_drv.h
  51. 11 3
      host/driver/transport/transport_drv.c
  52. 0 1
      host/driver/transport/transport_drv.h
  53. 5 0
      host/port/include/platform_wrapper.h
  54. 2 1
      host/port/src/platform_wrapper.c
  55. 3 4
      wlan/esp_wlan.c

+ 7 - 7
Kconfig

@@ -15,7 +15,7 @@ menuconfig RT_USING_ESP_HOSTED
         config ESP_HOSTED_THREAD_STACK_SIZE
             int "The stack size of the esp-hosted thread"
             range 0 8192
-            default 4096
+            default 5120
 
         config ESP_HOSTED_SPI_THREAD_PRIORITY
             int "The priority of the esp-hosted SPI thread"
@@ -25,7 +25,7 @@ menuconfig RT_USING_ESP_HOSTED
         config ESP_HOSTED_SPI_THREAD_STACK_SIZE
             int "The stack size of the esp-hosted SPI thread"
             range 0 4096
-            default 512
+            default 1024
 
         config ESP_HOSTED_SPI_QUEUE_SIZE
             int "The size for esp-hosted SPI queue"
@@ -43,7 +43,7 @@ menuconfig RT_USING_ESP_HOSTED
 
             config ESP_HOSTED_SPI_CS_PIN
                 int "Set the SPI CS pin"
-                default 15
+                default -1
         endif
 
         config ESP_HOSTED_SPI_DEVICE_NAME
@@ -52,19 +52,19 @@ menuconfig RT_USING_ESP_HOSTED
 
         config ESP_HOSTED_SPI_MAX_HZ
             int "Set the maximum spi frequency(Hz)"
-            default 25000000
+            default 30000000
 
         config ESP_HOSTED_DATA_READY_PIN
             int "Set the data ready pin"
-            default 39
+            default -1
 
         config ESP_HOSTED_HANDSHAKE_PIN
             int "Set the handshake pin"
-            default 40
+            default -1
 
         config ESP_HOSTED_RESET_PIN
                 int "Set the reset pin"
-                default 22
+                default -1
 
         config ESP_HOSTED_THREAD_INIT
             bool "Use thread initialization"

Plik diff jest za duży
+ 781 - 29
common/esp_hosted_config.pb-c.c


+ 10 - 2
common/include/adapter.h

@@ -40,7 +40,6 @@ struct esp_payload_header {
 } __attribute__((packed));
 
 typedef enum {
-	ESP_INVALID_IF,
 	ESP_STA_IF,
 	ESP_AP_IF,
 	ESP_SERIAL_IF,
@@ -86,7 +85,8 @@ typedef enum {
 	ESP_PRIV_CAPABILITY,
 	ESP_PRIV_SPI_CLK_MHZ,
 	ESP_PRIV_FIRMWARE_CHIP_ID,
-	ESP_PRIV_TEST_RAW_TP
+	ESP_PRIV_TEST_RAW_TP,
+	ESP_PRIV_FW_DATA,
 } ESP_PRIV_TAG_TYPE;
 
 struct esp_priv_event {
@@ -95,6 +95,14 @@ struct esp_priv_event {
 	uint8_t		event_data[0];
 }__attribute__((packed));
 
+struct fw_version {
+	char		project_name[3];
+	uint8_t		major1;
+	uint8_t		major2;
+	uint8_t		minor;
+	uint8_t		revision_patch_1;
+	uint8_t		revision_patch_2;
+}__attribute__((packed));
 
 static inline uint16_t compute_checksum(uint8_t *buf, uint16_t len)
 {

+ 14 - 0
common/include/esp_fw_version.h

@@ -0,0 +1,14 @@
+// Copyright 2024 Espressif Systems (Shanghai) PTE LTD
+/* SPDX-License-Identifier: GPL-2.0-only OR Apache-2.0 */
+
+#ifndef __ESP_FW_VERSION__H
+#define __ESP_FW_VERSION__H
+
+#define PROJECT_NAME              "FG"
+#define PROJECT_VERSION_MAJOR_1   0
+#define PROJECT_VERSION_MAJOR_2   0
+#define PROJECT_VERSION_MINOR     6
+#define PROJECT_REVISION_PATCH_1  0
+#define PROJECT_REVISION_PATCH_2  0
+
+#endif

+ 280 - 14
common/include/esp_hosted_config.pb-c.h

@@ -10,7 +10,7 @@ PROTOBUF_C__BEGIN_DECLS
 
 #if PROTOBUF_C_VERSION_NUMBER < 1003000
 # error This file was generated by a newer version of protoc-c which is incompatible with your libprotobuf-c headers. Please update your headers.
-#elif 1004000 < PROTOBUF_C_MIN_COMPILER_VERSION
+#elif 1004001 < PROTOBUF_C_MIN_COMPILER_VERSION
 # error This file was generated by an older version of protoc-c which is incompatible with your libprotobuf-c headers. Please regenerate this file with a newer version of protoc-c.
 #endif
 
@@ -54,10 +54,16 @@ typedef struct CtrlMsgReqGetWifiCurrTxPower CtrlMsgReqGetWifiCurrTxPower;
 typedef struct CtrlMsgRespGetWifiCurrTxPower CtrlMsgRespGetWifiCurrTxPower;
 typedef struct CtrlMsgReqConfigHeartbeat CtrlMsgReqConfigHeartbeat;
 typedef struct CtrlMsgRespConfigHeartbeat CtrlMsgRespConfigHeartbeat;
+typedef struct CtrlMsgReqEnableDisable CtrlMsgReqEnableDisable;
+typedef struct CtrlMsgRespEnableDisable CtrlMsgRespEnableDisable;
+typedef struct CtrlMsgReqGetFwVersion CtrlMsgReqGetFwVersion;
+typedef struct CtrlMsgRespGetFwVersion CtrlMsgRespGetFwVersion;
 typedef struct CtrlMsgEventESPInit CtrlMsgEventESPInit;
 typedef struct CtrlMsgEventHeartbeat CtrlMsgEventHeartbeat;
 typedef struct CtrlMsgEventStationDisconnectFromAP CtrlMsgEventStationDisconnectFromAP;
+typedef struct CtrlMsgEventStationConnectedToAP CtrlMsgEventStationConnectedToAP;
 typedef struct CtrlMsgEventStationDisconnectFromESPSoftAP CtrlMsgEventStationDisconnectFromESPSoftAP;
+typedef struct CtrlMsgEventStationConnectedToESPSoftAP CtrlMsgEventStationConnectedToESPSoftAP;
 typedef struct CtrlMsg CtrlMsg;
 
 
@@ -156,11 +162,13 @@ typedef enum _CtrlMsgId {
   CTRL_MSG_ID__Req_SetWifiMaxTxPower = 119,
   CTRL_MSG_ID__Req_GetWifiCurrTxPower = 120,
   CTRL_MSG_ID__Req_ConfigHeartbeat = 121,
+  CTRL_MSG_ID__Req_EnableDisable = 122,
+  CTRL_MSG_ID__Req_GetFwVersion = 123,
   /*
    * Add new control path command response before Req_Max
    * and update Req_Max 
    */
-  CTRL_MSG_ID__Req_Max = 122,
+  CTRL_MSG_ID__Req_Max = 124,
   /*
    ** Response Msgs *
    */
@@ -186,11 +194,13 @@ typedef enum _CtrlMsgId {
   CTRL_MSG_ID__Resp_SetWifiMaxTxPower = 219,
   CTRL_MSG_ID__Resp_GetWifiCurrTxPower = 220,
   CTRL_MSG_ID__Resp_ConfigHeartbeat = 221,
+  CTRL_MSG_ID__Resp_EnableDisable = 222,
+  CTRL_MSG_ID__Resp_GetFwVersion = 223,
   /*
    * Add new control path command response before Resp_Max
    * and update Resp_Max 
    */
-  CTRL_MSG_ID__Resp_Max = 222,
+  CTRL_MSG_ID__Resp_Max = 224,
   /*
    ** Event Msgs *
    */
@@ -199,13 +209,21 @@ typedef enum _CtrlMsgId {
   CTRL_MSG_ID__Event_Heartbeat = 302,
   CTRL_MSG_ID__Event_StationDisconnectFromAP = 303,
   CTRL_MSG_ID__Event_StationDisconnectFromESPSoftAP = 304,
+  CTRL_MSG_ID__Event_StationConnectedToAP = 305,
+  CTRL_MSG_ID__Event_StationConnectedToESPSoftAP = 306,
   /*
    * Add new control path command notification before Event_Max
    * and update Event_Max 
    */
-  CTRL_MSG_ID__Event_Max = 305
+  CTRL_MSG_ID__Event_Max = 307
     PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(CTRL_MSG_ID)
 } CtrlMsgId;
+typedef enum _HostedFeature {
+  HOSTED_FEATURE__Hosted_InvalidFeature = 0,
+  HOSTED_FEATURE__Hosted_Wifi = 1,
+  HOSTED_FEATURE__Hosted_Bluetooth = 2
+    PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(HOSTED_FEATURE)
+} HostedFeature;
 
 /* --- messages --- */
 
@@ -359,10 +377,11 @@ struct  CtrlMsgRespGetAPConfig
   int32_t chnl;
   CtrlWifiSecProt sec_prot;
   int32_t resp;
+  int32_t band_mode;
 };
 #define CTRL_MSG__RESP__GET_APCONFIG__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__resp__get_apconfig__descriptor) \
-    , {0,NULL}, {0,NULL}, 0, 0, CTRL__WIFI_SEC_PROT__Open, 0 }
+    , {0,NULL}, {0,NULL}, 0, 0, CTRL__WIFI_SEC_PROT__Open, 0, 0 }
 
 
 struct  CtrlMsgReqConnectAP
@@ -373,10 +392,11 @@ struct  CtrlMsgReqConnectAP
   char *bssid;
   protobuf_c_boolean is_wpa3_supported;
   int32_t listen_interval;
+  int32_t band_mode;
 };
 #define CTRL_MSG__REQ__CONNECT_AP__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__req__connect_ap__descriptor) \
-    , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, 0, 0 }
+    , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, 0, 0, 0 }
 
 
 struct  CtrlMsgRespConnectAP
@@ -384,10 +404,11 @@ struct  CtrlMsgRespConnectAP
   ProtobufCMessage base;
   int32_t resp;
   ProtobufCBinaryData mac;
+  int32_t band_mode;
 };
 #define CTRL_MSG__RESP__CONNECT_AP__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__resp__connect_ap__descriptor) \
-    , 0, {0,NULL} }
+    , 0, {0,NULL}, 0 }
 
 
 struct  CtrlMsgReqGetSoftAPConfig
@@ -410,10 +431,11 @@ struct  CtrlMsgRespGetSoftAPConfig
   protobuf_c_boolean ssid_hidden;
   int32_t bw;
   int32_t resp;
+  int32_t band_mode;
 };
 #define CTRL_MSG__RESP__GET_SOFT_APCONFIG__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__resp__get_soft_apconfig__descriptor) \
-    , {0,NULL}, {0,NULL}, 0, CTRL__WIFI_SEC_PROT__Open, 0, 0, 0, 0 }
+    , {0,NULL}, {0,NULL}, 0, CTRL__WIFI_SEC_PROT__Open, 0, 0, 0, 0, 0 }
 
 
 struct  CtrlMsgReqStartSoftAP
@@ -426,10 +448,11 @@ struct  CtrlMsgReqStartSoftAP
   int32_t max_conn;
   protobuf_c_boolean ssid_hidden;
   int32_t bw;
+  int32_t band_mode;
 };
 #define CTRL_MSG__REQ__START_SOFT_AP__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__req__start_soft_ap__descriptor) \
-    , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, 0, CTRL__WIFI_SEC_PROT__Open, 0, 0, 0 }
+    , (char *)protobuf_c_empty_string, (char *)protobuf_c_empty_string, 0, CTRL__WIFI_SEC_PROT__Open, 0, 0, 0, 0 }
 
 
 struct  CtrlMsgRespStartSoftAP
@@ -437,10 +460,11 @@ struct  CtrlMsgRespStartSoftAP
   ProtobufCMessage base;
   int32_t resp;
   ProtobufCBinaryData mac;
+  int32_t band_mode;
 };
 #define CTRL_MSG__RESP__START_SOFT_AP__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__resp__start_soft_ap__descriptor) \
-    , 0, {0,NULL} }
+    , 0, {0,NULL}, 0 }
 
 
 struct  CtrlMsgReqScanResult
@@ -643,6 +667,52 @@ struct  CtrlMsgRespConfigHeartbeat
     , 0 }
 
 
+struct  CtrlMsgReqEnableDisable
+{
+  ProtobufCMessage base;
+  uint32_t feature;
+  protobuf_c_boolean enable;
+};
+#define CTRL_MSG__REQ__ENABLE_DISABLE__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__req__enable_disable__descriptor) \
+    , 0, 0 }
+
+
+struct  CtrlMsgRespEnableDisable
+{
+  ProtobufCMessage base;
+  int32_t resp;
+};
+#define CTRL_MSG__RESP__ENABLE_DISABLE__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__resp__enable_disable__descriptor) \
+    , 0 }
+
+
+struct  CtrlMsgReqGetFwVersion
+{
+  ProtobufCMessage base;
+};
+#define CTRL_MSG__REQ__GET_FW_VERSION__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__req__get_fw_version__descriptor) \
+     }
+
+
+struct  CtrlMsgRespGetFwVersion
+{
+  ProtobufCMessage base;
+  int32_t resp;
+  char *name;
+  uint32_t major1;
+  uint32_t major2;
+  uint32_t minor;
+  uint32_t rev_patch1;
+  uint32_t rev_patch2;
+};
+#define CTRL_MSG__RESP__GET_FW_VERSION__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__resp__get_fw_version__descriptor) \
+    , 0, (char *)protobuf_c_empty_string, 0, 0, 0, 0, 0 }
+
+
 /*
  ** Event structure *
  */
@@ -670,10 +740,31 @@ struct  CtrlMsgEventStationDisconnectFromAP
 {
   ProtobufCMessage base;
   int32_t resp;
+  ProtobufCBinaryData ssid;
+  uint32_t ssid_len;
+  ProtobufCBinaryData bssid;
+  uint32_t reason;
+  int32_t rssi;
 };
 #define CTRL_MSG__EVENT__STATION_DISCONNECT_FROM_AP__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__event__station_disconnect_from_ap__descriptor) \
-    , 0 }
+    , 0, {0,NULL}, 0, {0,NULL}, 0, 0 }
+
+
+struct  CtrlMsgEventStationConnectedToAP
+{
+  ProtobufCMessage base;
+  int32_t resp;
+  ProtobufCBinaryData ssid;
+  uint32_t ssid_len;
+  ProtobufCBinaryData bssid;
+  uint32_t channel;
+  int32_t authmode;
+  int32_t aid;
+};
+#define CTRL_MSG__EVENT__STATION_CONNECTED_TO_AP__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__event__station_connected_to_ap__descriptor) \
+    , 0, {0,NULL}, 0, {0,NULL}, 0, 0, 0 }
 
 
 struct  CtrlMsgEventStationDisconnectFromESPSoftAP
@@ -681,10 +772,26 @@ struct  CtrlMsgEventStationDisconnectFromESPSoftAP
   ProtobufCMessage base;
   int32_t resp;
   ProtobufCBinaryData mac;
+  uint32_t aid;
+  protobuf_c_boolean is_mesh_child;
+  uint32_t reason;
 };
 #define CTRL_MSG__EVENT__STATION_DISCONNECT_FROM_ESPSOFT_AP__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__event__station_disconnect_from_espsoft_ap__descriptor) \
-    , 0, {0,NULL} }
+    , 0, {0,NULL}, 0, 0, 0 }
+
+
+struct  CtrlMsgEventStationConnectedToESPSoftAP
+{
+  ProtobufCMessage base;
+  int32_t resp;
+  ProtobufCBinaryData mac;
+  uint32_t aid;
+  protobuf_c_boolean is_mesh_child;
+};
+#define CTRL_MSG__EVENT__STATION_CONNECTED_TO_ESPSOFT_AP__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__event__station_connected_to_espsoft_ap__descriptor) \
+    , 0, {0,NULL}, 0, 0 }
 
 
 typedef enum {
@@ -710,6 +817,8 @@ typedef enum {
   CTRL_MSG__PAYLOAD_REQ_SET_WIFI_MAX_TX_POWER = 119,
   CTRL_MSG__PAYLOAD_REQ_GET_WIFI_CURR_TX_POWER = 120,
   CTRL_MSG__PAYLOAD_REQ_CONFIG_HEARTBEAT = 121,
+  CTRL_MSG__PAYLOAD_REQ_ENABLE_DISABLE_FEAT = 122,
+  CTRL_MSG__PAYLOAD_REQ_GET_FW_VERSION = 123,
   CTRL_MSG__PAYLOAD_RESP_GET_MAC_ADDRESS = 201,
   CTRL_MSG__PAYLOAD_RESP_SET_MAC_ADDRESS = 202,
   CTRL_MSG__PAYLOAD_RESP_GET_WIFI_MODE = 203,
@@ -731,10 +840,14 @@ typedef enum {
   CTRL_MSG__PAYLOAD_RESP_SET_WIFI_MAX_TX_POWER = 219,
   CTRL_MSG__PAYLOAD_RESP_GET_WIFI_CURR_TX_POWER = 220,
   CTRL_MSG__PAYLOAD_RESP_CONFIG_HEARTBEAT = 221,
+  CTRL_MSG__PAYLOAD_RESP_ENABLE_DISABLE_FEAT = 222,
+  CTRL_MSG__PAYLOAD_RESP_GET_FW_VERSION = 223,
   CTRL_MSG__PAYLOAD_EVENT_ESP_INIT = 301,
   CTRL_MSG__PAYLOAD_EVENT_HEARTBEAT = 302,
   CTRL_MSG__PAYLOAD_EVENT_STATION_DISCONNECT_FROM__AP = 303,
-  CTRL_MSG__PAYLOAD_EVENT_STATION_DISCONNECT_FROM__ESP__SOFT_AP = 304
+  CTRL_MSG__PAYLOAD_EVENT_STATION_DISCONNECT_FROM__ESP__SOFT_AP = 304,
+  CTRL_MSG__PAYLOAD_EVENT_STATION_CONNECTED_TO__AP = 305,
+  CTRL_MSG__PAYLOAD_EVENT_STATION_CONNECTED_TO__ESP__SOFT_AP = 306
     PROTOBUF_C__FORCE_ENUM_TO_BE_INT_SIZE(CTRL_MSG__PAYLOAD__CASE)
 } CtrlMsg__PayloadCase;
 
@@ -749,6 +862,14 @@ struct  CtrlMsg
    * msg id 
    */
   CtrlMsgId msg_id;
+  /*
+   * UID of message 
+   */
+  int32_t uid;
+  /*
+   * Request/response type: sync or async 
+   */
+  uint32_t req_resp_type;
   CtrlMsg__PayloadCase payload_case;
   union {
     /*
@@ -775,6 +896,8 @@ struct  CtrlMsg
     CtrlMsgReqSetWifiMaxTxPower *req_set_wifi_max_tx_power;
     CtrlMsgReqGetWifiCurrTxPower *req_get_wifi_curr_tx_power;
     CtrlMsgReqConfigHeartbeat *req_config_heartbeat;
+    CtrlMsgReqEnableDisable *req_enable_disable_feat;
+    CtrlMsgReqGetFwVersion *req_get_fw_version;
     /*
      ** Responses *
      */
@@ -799,6 +922,8 @@ struct  CtrlMsg
     CtrlMsgRespSetWifiMaxTxPower *resp_set_wifi_max_tx_power;
     CtrlMsgRespGetWifiCurrTxPower *resp_get_wifi_curr_tx_power;
     CtrlMsgRespConfigHeartbeat *resp_config_heartbeat;
+    CtrlMsgRespEnableDisable *resp_enable_disable_feat;
+    CtrlMsgRespGetFwVersion *resp_get_fw_version;
     /*
      ** Notifications *
      */
@@ -806,11 +931,13 @@ struct  CtrlMsg
     CtrlMsgEventHeartbeat *event_heartbeat;
     CtrlMsgEventStationDisconnectFromAP *event_station_disconnect_from_ap;
     CtrlMsgEventStationDisconnectFromESPSoftAP *event_station_disconnect_from_esp_softap;
+    CtrlMsgEventStationConnectedToAP *event_station_connected_to_ap;
+    CtrlMsgEventStationConnectedToESPSoftAP *event_station_connected_to_esp_softap;
   };
 };
 #define CTRL_MSG__INIT \
  { PROTOBUF_C_MESSAGE_INIT (&ctrl_msg__descriptor) \
-    , CTRL_MSG_TYPE__MsgType_Invalid, CTRL_MSG_ID__MsgId_Invalid, CTRL_MSG__PAYLOAD__NOT_SET, {0} }
+    , CTRL_MSG_TYPE__MsgType_Invalid, CTRL_MSG_ID__MsgId_Invalid, 0, 0, CTRL_MSG__PAYLOAD__NOT_SET, {0} }
 
 
 /* ScanResult methods */
@@ -1554,6 +1681,82 @@ CtrlMsgRespConfigHeartbeat *
 void   ctrl_msg__resp__config_heartbeat__free_unpacked
                      (CtrlMsgRespConfigHeartbeat *message,
                       ProtobufCAllocator *allocator);
+/* CtrlMsgReqEnableDisable methods */
+void   ctrl_msg__req__enable_disable__init
+                     (CtrlMsgReqEnableDisable         *message);
+size_t ctrl_msg__req__enable_disable__get_packed_size
+                     (const CtrlMsgReqEnableDisable   *message);
+size_t ctrl_msg__req__enable_disable__pack
+                     (const CtrlMsgReqEnableDisable   *message,
+                      uint8_t             *out);
+size_t ctrl_msg__req__enable_disable__pack_to_buffer
+                     (const CtrlMsgReqEnableDisable   *message,
+                      ProtobufCBuffer     *buffer);
+CtrlMsgReqEnableDisable *
+       ctrl_msg__req__enable_disable__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   ctrl_msg__req__enable_disable__free_unpacked
+                     (CtrlMsgReqEnableDisable *message,
+                      ProtobufCAllocator *allocator);
+/* CtrlMsgRespEnableDisable methods */
+void   ctrl_msg__resp__enable_disable__init
+                     (CtrlMsgRespEnableDisable         *message);
+size_t ctrl_msg__resp__enable_disable__get_packed_size
+                     (const CtrlMsgRespEnableDisable   *message);
+size_t ctrl_msg__resp__enable_disable__pack
+                     (const CtrlMsgRespEnableDisable   *message,
+                      uint8_t             *out);
+size_t ctrl_msg__resp__enable_disable__pack_to_buffer
+                     (const CtrlMsgRespEnableDisable   *message,
+                      ProtobufCBuffer     *buffer);
+CtrlMsgRespEnableDisable *
+       ctrl_msg__resp__enable_disable__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   ctrl_msg__resp__enable_disable__free_unpacked
+                     (CtrlMsgRespEnableDisable *message,
+                      ProtobufCAllocator *allocator);
+/* CtrlMsgReqGetFwVersion methods */
+void   ctrl_msg__req__get_fw_version__init
+                     (CtrlMsgReqGetFwVersion         *message);
+size_t ctrl_msg__req__get_fw_version__get_packed_size
+                     (const CtrlMsgReqGetFwVersion   *message);
+size_t ctrl_msg__req__get_fw_version__pack
+                     (const CtrlMsgReqGetFwVersion   *message,
+                      uint8_t             *out);
+size_t ctrl_msg__req__get_fw_version__pack_to_buffer
+                     (const CtrlMsgReqGetFwVersion   *message,
+                      ProtobufCBuffer     *buffer);
+CtrlMsgReqGetFwVersion *
+       ctrl_msg__req__get_fw_version__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   ctrl_msg__req__get_fw_version__free_unpacked
+                     (CtrlMsgReqGetFwVersion *message,
+                      ProtobufCAllocator *allocator);
+/* CtrlMsgRespGetFwVersion methods */
+void   ctrl_msg__resp__get_fw_version__init
+                     (CtrlMsgRespGetFwVersion         *message);
+size_t ctrl_msg__resp__get_fw_version__get_packed_size
+                     (const CtrlMsgRespGetFwVersion   *message);
+size_t ctrl_msg__resp__get_fw_version__pack
+                     (const CtrlMsgRespGetFwVersion   *message,
+                      uint8_t             *out);
+size_t ctrl_msg__resp__get_fw_version__pack_to_buffer
+                     (const CtrlMsgRespGetFwVersion   *message,
+                      ProtobufCBuffer     *buffer);
+CtrlMsgRespGetFwVersion *
+       ctrl_msg__resp__get_fw_version__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   ctrl_msg__resp__get_fw_version__free_unpacked
+                     (CtrlMsgRespGetFwVersion *message,
+                      ProtobufCAllocator *allocator);
 /* CtrlMsgEventESPInit methods */
 void   ctrl_msg__event__espinit__init
                      (CtrlMsgEventESPInit         *message);
@@ -1611,6 +1814,25 @@ CtrlMsgEventStationDisconnectFromAP *
 void   ctrl_msg__event__station_disconnect_from_ap__free_unpacked
                      (CtrlMsgEventStationDisconnectFromAP *message,
                       ProtobufCAllocator *allocator);
+/* CtrlMsgEventStationConnectedToAP methods */
+void   ctrl_msg__event__station_connected_to_ap__init
+                     (CtrlMsgEventStationConnectedToAP         *message);
+size_t ctrl_msg__event__station_connected_to_ap__get_packed_size
+                     (const CtrlMsgEventStationConnectedToAP   *message);
+size_t ctrl_msg__event__station_connected_to_ap__pack
+                     (const CtrlMsgEventStationConnectedToAP   *message,
+                      uint8_t             *out);
+size_t ctrl_msg__event__station_connected_to_ap__pack_to_buffer
+                     (const CtrlMsgEventStationConnectedToAP   *message,
+                      ProtobufCBuffer     *buffer);
+CtrlMsgEventStationConnectedToAP *
+       ctrl_msg__event__station_connected_to_ap__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   ctrl_msg__event__station_connected_to_ap__free_unpacked
+                     (CtrlMsgEventStationConnectedToAP *message,
+                      ProtobufCAllocator *allocator);
 /* CtrlMsgEventStationDisconnectFromESPSoftAP methods */
 void   ctrl_msg__event__station_disconnect_from_espsoft_ap__init
                      (CtrlMsgEventStationDisconnectFromESPSoftAP         *message);
@@ -1630,6 +1852,25 @@ CtrlMsgEventStationDisconnectFromESPSoftAP *
 void   ctrl_msg__event__station_disconnect_from_espsoft_ap__free_unpacked
                      (CtrlMsgEventStationDisconnectFromESPSoftAP *message,
                       ProtobufCAllocator *allocator);
+/* CtrlMsgEventStationConnectedToESPSoftAP methods */
+void   ctrl_msg__event__station_connected_to_espsoft_ap__init
+                     (CtrlMsgEventStationConnectedToESPSoftAP         *message);
+size_t ctrl_msg__event__station_connected_to_espsoft_ap__get_packed_size
+                     (const CtrlMsgEventStationConnectedToESPSoftAP   *message);
+size_t ctrl_msg__event__station_connected_to_espsoft_ap__pack
+                     (const CtrlMsgEventStationConnectedToESPSoftAP   *message,
+                      uint8_t             *out);
+size_t ctrl_msg__event__station_connected_to_espsoft_ap__pack_to_buffer
+                     (const CtrlMsgEventStationConnectedToESPSoftAP   *message,
+                      ProtobufCBuffer     *buffer);
+CtrlMsgEventStationConnectedToESPSoftAP *
+       ctrl_msg__event__station_connected_to_espsoft_ap__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   ctrl_msg__event__station_connected_to_espsoft_ap__free_unpacked
+                     (CtrlMsgEventStationConnectedToESPSoftAP *message,
+                      ProtobufCAllocator *allocator);
 /* CtrlMsg methods */
 void   ctrl_msg__init
                      (CtrlMsg         *message);
@@ -1768,6 +2009,18 @@ typedef void (*CtrlMsgReqConfigHeartbeat_Closure)
 typedef void (*CtrlMsgRespConfigHeartbeat_Closure)
                  (const CtrlMsgRespConfigHeartbeat *message,
                   void *closure_data);
+typedef void (*CtrlMsgReqEnableDisable_Closure)
+                 (const CtrlMsgReqEnableDisable *message,
+                  void *closure_data);
+typedef void (*CtrlMsgRespEnableDisable_Closure)
+                 (const CtrlMsgRespEnableDisable *message,
+                  void *closure_data);
+typedef void (*CtrlMsgReqGetFwVersion_Closure)
+                 (const CtrlMsgReqGetFwVersion *message,
+                  void *closure_data);
+typedef void (*CtrlMsgRespGetFwVersion_Closure)
+                 (const CtrlMsgRespGetFwVersion *message,
+                  void *closure_data);
 typedef void (*CtrlMsgEventESPInit_Closure)
                  (const CtrlMsgEventESPInit *message,
                   void *closure_data);
@@ -1777,9 +2030,15 @@ typedef void (*CtrlMsgEventHeartbeat_Closure)
 typedef void (*CtrlMsgEventStationDisconnectFromAP_Closure)
                  (const CtrlMsgEventStationDisconnectFromAP *message,
                   void *closure_data);
+typedef void (*CtrlMsgEventStationConnectedToAP_Closure)
+                 (const CtrlMsgEventStationConnectedToAP *message,
+                  void *closure_data);
 typedef void (*CtrlMsgEventStationDisconnectFromESPSoftAP_Closure)
                  (const CtrlMsgEventStationDisconnectFromESPSoftAP *message,
                   void *closure_data);
+typedef void (*CtrlMsgEventStationConnectedToESPSoftAP_Closure)
+                 (const CtrlMsgEventStationConnectedToESPSoftAP *message,
+                  void *closure_data);
 typedef void (*CtrlMsg_Closure)
                  (const CtrlMsg *message,
                   void *closure_data);
@@ -1798,6 +2057,7 @@ extern const ProtobufCEnumDescriptor    ctrl__wifi_sec_prot__descriptor;
 extern const ProtobufCEnumDescriptor    ctrl__status__descriptor;
 extern const ProtobufCEnumDescriptor    ctrl_msg_type__descriptor;
 extern const ProtobufCEnumDescriptor    ctrl_msg_id__descriptor;
+extern const ProtobufCEnumDescriptor    hosted_feature__descriptor;
 extern const ProtobufCMessageDescriptor scan_result__descriptor;
 extern const ProtobufCMessageDescriptor connected_stalist__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__req__get_mac_address__descriptor;
@@ -1837,10 +2097,16 @@ extern const ProtobufCMessageDescriptor ctrl_msg__req__get_wifi_curr_tx_power__d
 extern const ProtobufCMessageDescriptor ctrl_msg__resp__get_wifi_curr_tx_power__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__req__config_heartbeat__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__resp__config_heartbeat__descriptor;
+extern const ProtobufCMessageDescriptor ctrl_msg__req__enable_disable__descriptor;
+extern const ProtobufCMessageDescriptor ctrl_msg__resp__enable_disable__descriptor;
+extern const ProtobufCMessageDescriptor ctrl_msg__req__get_fw_version__descriptor;
+extern const ProtobufCMessageDescriptor ctrl_msg__resp__get_fw_version__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__event__espinit__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__event__heartbeat__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__event__station_disconnect_from_ap__descriptor;
+extern const ProtobufCMessageDescriptor ctrl_msg__event__station_connected_to_ap__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__event__station_disconnect_from_espsoft_ap__descriptor;
+extern const ProtobufCMessageDescriptor ctrl_msg__event__station_connected_to_espsoft_ap__descriptor;
 extern const ProtobufCMessageDescriptor ctrl_msg__descriptor;
 
 PROTOBUF_C__END_DECLS

+ 18 - 0
common/proto/build_proto.sh

@@ -0,0 +1,18 @@
+#!/usr/bin/env bash
+
+which protoc-c > /dev/null
+if [ $? -ne 0 ]; then
+	echo "Please install protoc-c"
+	exit 1
+fi
+
+protoc-c ./esp_hosted_config.proto --c_out=.
+if [ $? -ne 0 ]; then
+	echo "Build failed, Please review esp_hosted_config.proto"
+	exit 1
+fi
+
+mv esp_hosted_config.pb-c.h ../include/esp_hosted_config.pb-c.h
+mv esp_hosted_config.pb-c.c ../esp_hosted_config.pb-c.c
+
+echo "Generated protobuf definitions successfully"

+ 345 - 265
common/proto/esp_hosted_config.proto

@@ -1,435 +1,515 @@
-/* Copyright (C) 2015-2023 Espressif Systems (Shanghai) PTE LTD */
+/* Copyright (C) 2015-2024 Espressif Systems (Shanghai) PTE LTD */
 /* SPDX-License-Identifier: GPL-2.0-only OR Apache-2.0 */
 
 syntax = "proto3";
 
 /* Enums similar to ESP IDF */
 enum Ctrl_VendorIEType {
-    Beacon = 0;
-    Probe_req = 1;
-    Probe_resp = 2;
-    Assoc_req = 3;
-    Assoc_resp = 4;
+	Beacon = 0;
+	Probe_req = 1;
+	Probe_resp = 2;
+	Assoc_req = 3;
+	Assoc_resp = 4;
 }
 
 enum Ctrl_VendorIEID {
-    ID_0 = 0;
-    ID_1 = 1;
+	ID_0 = 0;
+	ID_1 = 1;
 }
 
 enum Ctrl_WifiMode {
-    NONE = 0;
-    STA = 1;
-    AP = 2;
-    APSTA = 3;
+	NONE = 0;
+	STA = 1;
+	AP = 2;
+	APSTA = 3;
 }
 
 enum Ctrl_WifiBw {
-    BW_Invalid = 0;
-    HT20 = 1;
-    HT40 = 2;
+	BW_Invalid = 0;
+	HT20 = 1;
+	HT40 = 2;
 }
 
 enum Ctrl_WifiPowerSave {
-    PS_Invalid = 0;
-    MIN_MODEM = 1;
-    MAX_MODEM = 2;
+	PS_Invalid = 0;
+	MIN_MODEM = 1;
+	MAX_MODEM = 2;
 }
 
 enum Ctrl_WifiSecProt {
-    Open = 0;
-    WEP = 1;
-    WPA_PSK = 2;
-    WPA2_PSK = 3;
-    WPA_WPA2_PSK = 4;
-    WPA2_ENTERPRISE = 5;
-    WPA3_PSK = 6;
-    WPA2_WPA3_PSK = 7;
+	Open = 0;
+	WEP = 1;
+	WPA_PSK = 2;
+	WPA2_PSK = 3;
+	WPA_WPA2_PSK = 4;
+	WPA2_ENTERPRISE = 5;
+	WPA3_PSK = 6;
+	WPA2_WPA3_PSK = 7;
 }
 
 /* enums for Control path */
 enum Ctrl_Status {
-    Connected = 0;
-    Not_Connected = 1;
-    No_AP_Found = 2;
-    Connection_Fail = 3;
-    Invalid_Argument = 4;
-    Out_Of_Range = 5;
+	Connected = 0;
+	Not_Connected = 1;
+	No_AP_Found = 2;
+	Connection_Fail = 3;
+	Invalid_Argument = 4;
+	Out_Of_Range = 5;
 }
 
 
 enum CtrlMsgType {
-    MsgType_Invalid = 0;
-    Req = 1;
-    Resp = 2;
-    Event = 3;
-    MsgType_Max = 4;
+	MsgType_Invalid = 0;
+	Req = 1;
+	Resp = 2;
+	Event = 3;
+	MsgType_Max = 4;
 }
 
 enum CtrlMsgId {
-    MsgId_Invalid = 0;
-
-    /** Request Msgs **/
-    Req_Base = 100;
-
-    Req_GetMACAddress = 101;
-    Req_SetMacAddress = 102;
-    Req_GetWifiMode = 103;
-    Req_SetWifiMode = 104;
-
-    Req_GetAPScanList = 105;
-    Req_GetAPConfig = 106;
-    Req_ConnectAP = 107;
-    Req_DisconnectAP = 108;
-
-    Req_GetSoftAPConfig = 109;
-    Req_SetSoftAPVendorSpecificIE = 110;
-    Req_StartSoftAP = 111;
-    Req_GetSoftAPConnectedSTAList = 112;
-    Req_StopSoftAP = 113;
-
-    Req_SetPowerSaveMode = 114;
-    Req_GetPowerSaveMode = 115;
-
-    Req_OTABegin = 116;
-    Req_OTAWrite = 117;
-    Req_OTAEnd = 118;
-
-    Req_SetWifiMaxTxPower = 119;
-    Req_GetWifiCurrTxPower = 120;
-
-    Req_ConfigHeartbeat = 121;
-    /* Add new control path command response before Req_Max
-     * and update Req_Max */
-    Req_Max = 122;
-
-    /** Response Msgs **/
-    Resp_Base = 200;
-
-    Resp_GetMACAddress = 201;
-    Resp_SetMacAddress = 202;
-    Resp_GetWifiMode = 203;
-    Resp_SetWifiMode = 204;
-
-    Resp_GetAPScanList = 205;
-    Resp_GetAPConfig = 206;
-    Resp_ConnectAP = 207;
-    Resp_DisconnectAP = 208;
-
-    Resp_GetSoftAPConfig = 209;
-    Resp_SetSoftAPVendorSpecificIE = 210;
-    Resp_StartSoftAP = 211;
-    Resp_GetSoftAPConnectedSTAList = 212;
-    Resp_StopSoftAP = 213;
-
-    Resp_SetPowerSaveMode = 214;
-    Resp_GetPowerSaveMode = 215;
-
-    Resp_OTABegin = 216;
-    Resp_OTAWrite = 217;
-    Resp_OTAEnd = 218;
-
-    Resp_SetWifiMaxTxPower = 219;
-    Resp_GetWifiCurrTxPower = 220;
-
-    Resp_ConfigHeartbeat = 221;
-    /* Add new control path command response before Resp_Max
-     * and update Resp_Max */
-    Resp_Max = 222;
-
-    /** Event Msgs **/
-    Event_Base = 300;
-    Event_ESPInit = 301;
-    Event_Heartbeat = 302;
-    Event_StationDisconnectFromAP = 303;
-    Event_StationDisconnectFromESPSoftAP = 304;
-    /* Add new control path command notification before Event_Max
-     * and update Event_Max */
-    Event_Max = 305;
+	MsgId_Invalid = 0;
+
+	/** Request Msgs **/
+	Req_Base = 100;
+
+	Req_GetMACAddress = 101;
+	Req_SetMacAddress = 102;
+	Req_GetWifiMode = 103;
+	Req_SetWifiMode = 104;
+
+	Req_GetAPScanList = 105;
+	Req_GetAPConfig = 106;
+	Req_ConnectAP = 107;
+	Req_DisconnectAP = 108;
+
+	Req_GetSoftAPConfig = 109;
+	Req_SetSoftAPVendorSpecificIE = 110;
+	Req_StartSoftAP = 111;
+	Req_GetSoftAPConnectedSTAList = 112;
+	Req_StopSoftAP = 113;
+
+	Req_SetPowerSaveMode = 114;
+	Req_GetPowerSaveMode = 115;
+
+	Req_OTABegin = 116;
+	Req_OTAWrite = 117;
+	Req_OTAEnd = 118;
+
+	Req_SetWifiMaxTxPower = 119;
+	Req_GetWifiCurrTxPower = 120;
+
+	Req_ConfigHeartbeat = 121;
+	Req_EnableDisable = 122;
+	Req_GetFwVersion = 123;
+	/* Add new control path command response before Req_Max
+	 * and update Req_Max */
+	Req_Max = 124;
+
+	/** Response Msgs **/
+	Resp_Base = 200;
+
+	Resp_GetMACAddress = 201;
+	Resp_SetMacAddress = 202;
+	Resp_GetWifiMode = 203;
+	Resp_SetWifiMode = 204;
+
+	Resp_GetAPScanList = 205;
+	Resp_GetAPConfig = 206;
+	Resp_ConnectAP = 207;
+	Resp_DisconnectAP = 208;
+
+	Resp_GetSoftAPConfig = 209;
+	Resp_SetSoftAPVendorSpecificIE = 210;
+	Resp_StartSoftAP = 211;
+	Resp_GetSoftAPConnectedSTAList = 212;
+	Resp_StopSoftAP = 213;
+
+	Resp_SetPowerSaveMode = 214;
+	Resp_GetPowerSaveMode = 215;
+
+	Resp_OTABegin = 216;
+	Resp_OTAWrite = 217;
+	Resp_OTAEnd = 218;
+
+	Resp_SetWifiMaxTxPower = 219;
+	Resp_GetWifiCurrTxPower = 220;
+
+	Resp_ConfigHeartbeat = 221;
+	Resp_EnableDisable = 222;
+	Resp_GetFwVersion = 223;
+	/* Add new control path command response before Resp_Max
+	 * and update Resp_Max */
+	Resp_Max = 224;
+
+	/** Event Msgs **/
+	Event_Base = 300;
+	Event_ESPInit = 301;
+	Event_Heartbeat = 302;
+	Event_StationDisconnectFromAP = 303;
+	Event_StationDisconnectFromESPSoftAP = 304;
+	Event_StationConnectedToAP = 305;
+	Event_StationConnectedToESPSoftAP = 306;
+	/* Add new control path command notification before Event_Max
+	 * and update Event_Max */
+	Event_Max = 307;
+}
+
+enum HostedFeature {
+	Hosted_InvalidFeature = 0;
+	Hosted_Wifi = 1;
+	Hosted_Bluetooth = 2;
+
+	/* Add your new features here and re-build prot using build_proto.sh */
 }
 
 /* internal supporting structures for CtrlMsg */
 message ScanResult {
-    bytes ssid = 1;
-    uint32 chnl = 2;
-    int32 rssi = 3;
-    bytes bssid = 4;
-    Ctrl_WifiSecProt sec_prot = 5;
+	bytes ssid = 1;
+	uint32 chnl = 2;
+	int32 rssi = 3;
+	bytes bssid = 4;
+	Ctrl_WifiSecProt sec_prot = 5;
 }
 
 message ConnectedSTAList {
-    bytes mac = 1;
-    int32 rssi = 2;
+	bytes mac = 1;
+	int32 rssi = 2;
 }
 
 
 /* Control path structures */
 /** Req/Resp structure **/
 message CtrlMsg_Req_GetMacAddress {
-    int32 mode = 1;
+	int32 mode = 1;
 }
 
 message CtrlMsg_Resp_GetMacAddress {
-    bytes mac = 1;
-    int32 resp = 2;
+	bytes mac = 1;
+	int32 resp = 2;
 }
 
 message CtrlMsg_Req_GetMode {
 }
 
 message CtrlMsg_Resp_GetMode {
-    int32 mode = 1;
-    int32 resp = 2;
+	int32 mode = 1;
+	int32 resp = 2;
 }
 
 message CtrlMsg_Req_SetMode {
-    int32 mode = 1;
+	int32 mode = 1;
 }
 
 message CtrlMsg_Resp_SetMode {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_GetStatus {
 }
 
 message CtrlMsg_Resp_GetStatus {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_SetMacAddress {
-    bytes mac = 1;
-    int32 mode = 2;
+	bytes mac = 1;
+	int32 mode = 2;
 }
 
 message CtrlMsg_Resp_SetMacAddress {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_GetAPConfig {
 }
 
 message CtrlMsg_Resp_GetAPConfig {
-    bytes ssid = 1;
-    bytes bssid = 2;
-    int32 rssi = 3;
-    int32 chnl = 4;
-    Ctrl_WifiSecProt sec_prot = 5;
-    int32 resp = 6;
+	bytes ssid = 1;
+	bytes bssid = 2;
+	int32 rssi = 3;
+	int32 chnl = 4;
+	Ctrl_WifiSecProt sec_prot = 5;
+	int32 resp = 6;
+	int32 band_mode = 7;
 }
 
 message CtrlMsg_Req_ConnectAP {
-    string ssid = 1;
-    string pwd = 2;
-    string bssid = 3;
-    bool is_wpa3_supported = 4;
-    int32 listen_interval = 5;
+	string ssid = 1;
+	string pwd = 2;
+	string bssid = 3;
+	bool is_wpa3_supported = 4;
+	int32 listen_interval = 5;
+	int32 band_mode = 6;
 }
 
 message  CtrlMsg_Resp_ConnectAP {
-    int32 resp = 1;
-    bytes mac = 2;
+	int32 resp = 1;
+	bytes mac = 2;
+	int32 band_mode = 3;
 }
 
 message CtrlMsg_Req_GetSoftAPConfig {
 }
 
 message CtrlMsg_Resp_GetSoftAPConfig {
-    bytes ssid = 1;
-    bytes pwd = 2;
-    int32 chnl = 3;
-    Ctrl_WifiSecProt sec_prot = 4;
-    int32 max_conn = 5;
-    bool ssid_hidden = 6;
-    int32 bw = 7;
-    int32 resp = 8;
+	bytes ssid = 1;
+	bytes pwd = 2;
+	int32 chnl = 3;
+	Ctrl_WifiSecProt sec_prot = 4;
+	int32 max_conn = 5;
+	bool ssid_hidden = 6;
+	int32 bw = 7;
+	int32 resp = 8;
+	int32 band_mode = 9;
 }
 
 message CtrlMsg_Req_StartSoftAP {
-    string ssid = 1;
-    string pwd = 2;
-    int32 chnl = 3;
-    Ctrl_WifiSecProt sec_prot = 4;
-    int32 max_conn = 5;
-    bool ssid_hidden = 6;
-    int32 bw = 7;
+	string ssid = 1;
+	string pwd = 2;
+	int32 chnl = 3;
+	Ctrl_WifiSecProt sec_prot = 4;
+	int32 max_conn = 5;
+	bool ssid_hidden = 6;
+	int32 bw = 7;
+	int32 band_mode = 8;
 }
 
 message CtrlMsg_Resp_StartSoftAP {
-    int32 resp = 1;
-    bytes mac = 2;
+	int32 resp = 1;
+	bytes mac = 2;
+	int32 band_mode = 3;
 }
 
 message CtrlMsg_Req_ScanResult {
 }
 
 message CtrlMsg_Resp_ScanResult {
-    uint32 count = 1;
-    repeated ScanResult entries = 2;
-    int32 resp = 3;
+	uint32 count = 1;
+	repeated ScanResult entries = 2;
+	int32 resp = 3;
 }
 
 message CtrlMsg_Req_SoftAPConnectedSTA {
 }
 
 message CtrlMsg_Resp_SoftAPConnectedSTA {
-    uint32 num = 1;
-    repeated ConnectedSTAList stations = 2;
-    int32 resp = 3;
+	uint32 num = 1;
+	repeated ConnectedSTAList stations = 2;
+	int32 resp = 3;
 }
 
 message CtrlMsg_Req_OTABegin {
 }
 
 message CtrlMsg_Resp_OTABegin {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_OTAWrite {
-    bytes ota_data = 1;
+	bytes ota_data = 1;
 }
 
 message CtrlMsg_Resp_OTAWrite {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_OTAEnd {
 }
 
 message CtrlMsg_Resp_OTAEnd {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_VendorIEData {
-    int32 element_id = 1;
-    int32 length = 2;
-    bytes vendor_oui = 3;
-    int32 vendor_oui_type = 4;
-    bytes payload = 5; 
+	int32 element_id = 1;
+	int32 length = 2;
+	bytes vendor_oui = 3;
+	int32 vendor_oui_type = 4;
+	bytes payload = 5;
 }
 
 message CtrlMsg_Req_SetSoftAPVendorSpecificIE {
-    bool enable = 1;
-    Ctrl_VendorIEType type = 2;
-    Ctrl_VendorIEID idx = 3;
-    CtrlMsg_Req_VendorIEData vendor_ie_data = 4;
+	bool enable = 1;
+	Ctrl_VendorIEType type = 2;
+	Ctrl_VendorIEID idx = 3;
+	CtrlMsg_Req_VendorIEData vendor_ie_data = 4;
 }
 
 message CtrlMsg_Resp_SetSoftAPVendorSpecificIE {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_SetWifiMaxTxPower {
-    int32 wifi_max_tx_power = 1;
+	int32 wifi_max_tx_power = 1;
 }
 
 message CtrlMsg_Resp_SetWifiMaxTxPower {
-    int32 resp = 1;
+	int32 resp = 1;
 }
 
 message CtrlMsg_Req_GetWifiCurrTxPower {
 }
 
 message CtrlMsg_Resp_GetWifiCurrTxPower {
-    int32 wifi_curr_tx_power = 1;
-    int32 resp = 2;
+	int32 wifi_curr_tx_power = 1;
+	int32 resp = 2;
 }
 
 message CtrlMsg_Req_ConfigHeartbeat {
-    bool enable = 1;
-    int32 duration = 2;
+	bool enable = 1;
+	int32 duration = 2;
 }
 
 message CtrlMsg_Resp_ConfigHeartbeat {
-    int32 resp = 1;
+	int32 resp = 1;
+}
+
+message CtrlMsg_Req_EnableDisable {
+	uint32 feature = 1;
+	bool enable = 2;
+}
+
+message CtrlMsg_Resp_EnableDisable {
+	int32 resp = 1;
+}
+
+message CtrlMsg_Req_GetFwVersion {
+}
+
+message CtrlMsg_Resp_GetFwVersion {
+	int32 resp = 1;
+	string name = 2;
+	uint32 major1 = 3;
+	uint32 major2 = 4;
+	uint32 minor = 5;
+	uint32 rev_patch1 = 6;
+	uint32 rev_patch2 = 7;
 }
 
 /** Event structure **/
 message CtrlMsg_Event_ESPInit {
-    bytes init_data = 1;
+	bytes init_data = 1;
 }
 
 message CtrlMsg_Event_Heartbeat {
-    int32 hb_num = 1;
+	int32 hb_num = 1;
 }
 
 message CtrlMsg_Event_StationDisconnectFromAP {
-    int32 resp = 1;
+	int32 resp = 1;
+	bytes ssid = 2;
+	uint32 ssid_len = 3;
+	bytes bssid = 4;
+	uint32 reason = 5;
+	int32 rssi = 6;
+}
+
+message CtrlMsg_Event_StationConnectedToAP {
+	int32 resp = 1;
+	bytes ssid = 2;
+	uint32 ssid_len = 3;
+	bytes bssid = 4;
+	uint32 channel = 5;
+	int32 authmode = 6;
+	int32 aid = 7;
 }
 
+
 message CtrlMsg_Event_StationDisconnectFromESPSoftAP {
-    int32 resp = 1;
-    bytes mac = 2;
+	int32 resp = 1;
+	bytes mac = 2;
+	uint32 aid = 3;
+	bool is_mesh_child = 4;
+	uint32 reason = 5;
+}
+
+message CtrlMsg_Event_StationConnectedToESPSoftAP {
+	int32 resp = 1;
+	bytes mac = 2;
+	uint32 aid = 3;
+	bool is_mesh_child = 4;
 }
 
 message CtrlMsg {
-    /* msg_type could be req, resp or Event */
-    CtrlMsgType msg_type = 1;
-
-    /* msg id */
-    CtrlMsgId msg_id = 2;
-
-    /* union of all msg ids */
-    oneof payload {
-        /** Requests **/
-        CtrlMsg_Req_GetMacAddress req_get_mac_address = 101;
-        CtrlMsg_Req_SetMacAddress req_set_mac_address = 102;
-        CtrlMsg_Req_GetMode req_get_wifi_mode = 103;
-        CtrlMsg_Req_SetMode req_set_wifi_mode = 104;
-
-        CtrlMsg_Req_ScanResult req_scan_ap_list = 105;
-        CtrlMsg_Req_GetAPConfig req_get_ap_config = 106;
-        CtrlMsg_Req_ConnectAP req_connect_ap = 107;
-        CtrlMsg_Req_GetStatus req_disconnect_ap = 108;
-
-        CtrlMsg_Req_GetSoftAPConfig req_get_softap_config = 109;
-        CtrlMsg_Req_SetSoftAPVendorSpecificIE req_set_softap_vendor_specific_ie = 110;
-        CtrlMsg_Req_StartSoftAP req_start_softap = 111;
-        CtrlMsg_Req_SoftAPConnectedSTA req_softap_connected_stas_list = 112;
-        CtrlMsg_Req_GetStatus req_stop_softap = 113;
-
-        CtrlMsg_Req_SetMode req_set_power_save_mode = 114;
-        CtrlMsg_Req_GetMode req_get_power_save_mode = 115;
-
-        CtrlMsg_Req_OTABegin req_ota_begin = 116;
-        CtrlMsg_Req_OTAWrite req_ota_write = 117;
-        CtrlMsg_Req_OTAEnd req_ota_end = 118;
-
-        CtrlMsg_Req_SetWifiMaxTxPower req_set_wifi_max_tx_power = 119;
-        CtrlMsg_Req_GetWifiCurrTxPower req_get_wifi_curr_tx_power = 120;
-        CtrlMsg_Req_ConfigHeartbeat req_config_heartbeat = 121;
-
-        /** Responses **/
-        CtrlMsg_Resp_GetMacAddress resp_get_mac_address = 201;
-        CtrlMsg_Resp_SetMacAddress resp_set_mac_address = 202;
-        CtrlMsg_Resp_GetMode resp_get_wifi_mode = 203;
-        CtrlMsg_Resp_SetMode resp_set_wifi_mode = 204;
-
-        CtrlMsg_Resp_ScanResult resp_scan_ap_list = 205;
-        CtrlMsg_Resp_GetAPConfig resp_get_ap_config = 206;
-        CtrlMsg_Resp_ConnectAP resp_connect_ap = 207;
-        CtrlMsg_Resp_GetStatus resp_disconnect_ap = 208;
-
-        CtrlMsg_Resp_GetSoftAPConfig resp_get_softap_config = 209;
-        CtrlMsg_Resp_SetSoftAPVendorSpecificIE resp_set_softap_vendor_specific_ie = 210;
-        CtrlMsg_Resp_StartSoftAP resp_start_softap = 211;
-        CtrlMsg_Resp_SoftAPConnectedSTA resp_softap_connected_stas_list = 212;
-        CtrlMsg_Resp_GetStatus resp_stop_softap = 213;
-
-        CtrlMsg_Resp_SetMode resp_set_power_save_mode = 214;
-        CtrlMsg_Resp_GetMode resp_get_power_save_mode = 215;
-
-        CtrlMsg_Resp_OTABegin resp_ota_begin = 216;
-        CtrlMsg_Resp_OTAWrite resp_ota_write = 217;
-        CtrlMsg_Resp_OTAEnd resp_ota_end = 218;
-        CtrlMsg_Resp_SetWifiMaxTxPower resp_set_wifi_max_tx_power = 219;
-        CtrlMsg_Resp_GetWifiCurrTxPower resp_get_wifi_curr_tx_power = 220;
-        CtrlMsg_Resp_ConfigHeartbeat resp_config_heartbeat = 221;
-
-        /** Notifications **/
-        CtrlMsg_Event_ESPInit event_esp_init = 301;
-        CtrlMsg_Event_Heartbeat event_heartbeat = 302;
-        CtrlMsg_Event_StationDisconnectFromAP event_station_disconnect_from_AP = 303;
-        CtrlMsg_Event_StationDisconnectFromESPSoftAP event_station_disconnect_from_ESP_SoftAP = 304;
-    }
+	/* msg_type could be req, resp or Event */
+	CtrlMsgType msg_type = 1;
+
+	/* msg id */
+	CtrlMsgId msg_id = 2;
+
+	/* UID of message */
+	int32 uid = 3;
+
+	/* Request/response type: sync or async */
+	uint32 req_resp_type = 4;
+
+	/* union of all msg ids */
+	oneof payload {
+		/** Requests **/
+		CtrlMsg_Req_GetMacAddress req_get_mac_address = 101;
+		CtrlMsg_Req_SetMacAddress req_set_mac_address = 102;
+		CtrlMsg_Req_GetMode req_get_wifi_mode = 103;
+		CtrlMsg_Req_SetMode req_set_wifi_mode = 104;
+
+		CtrlMsg_Req_ScanResult req_scan_ap_list = 105;
+		CtrlMsg_Req_GetAPConfig req_get_ap_config = 106;
+		CtrlMsg_Req_ConnectAP req_connect_ap = 107;
+		CtrlMsg_Req_GetStatus req_disconnect_ap = 108;
+
+		CtrlMsg_Req_GetSoftAPConfig req_get_softap_config = 109;
+		CtrlMsg_Req_SetSoftAPVendorSpecificIE req_set_softap_vendor_specific_ie = 110;
+		CtrlMsg_Req_StartSoftAP req_start_softap = 111;
+		CtrlMsg_Req_SoftAPConnectedSTA req_softap_connected_stas_list = 112;
+		CtrlMsg_Req_GetStatus req_stop_softap = 113;
+
+		CtrlMsg_Req_SetMode req_set_power_save_mode = 114;
+		CtrlMsg_Req_GetMode req_get_power_save_mode = 115;
+
+		CtrlMsg_Req_OTABegin req_ota_begin = 116;
+		CtrlMsg_Req_OTAWrite req_ota_write = 117;
+		CtrlMsg_Req_OTAEnd req_ota_end = 118;
+
+		CtrlMsg_Req_SetWifiMaxTxPower req_set_wifi_max_tx_power = 119;
+		CtrlMsg_Req_GetWifiCurrTxPower req_get_wifi_curr_tx_power = 120;
+		CtrlMsg_Req_ConfigHeartbeat req_config_heartbeat = 121;
+		CtrlMsg_Req_EnableDisable req_enable_disable_feat = 122;
+		CtrlMsg_Req_GetFwVersion req_get_fw_version = 123;
+
+		/** Responses **/
+		CtrlMsg_Resp_GetMacAddress resp_get_mac_address = 201;
+		CtrlMsg_Resp_SetMacAddress resp_set_mac_address = 202;
+		CtrlMsg_Resp_GetMode resp_get_wifi_mode = 203;
+		CtrlMsg_Resp_SetMode resp_set_wifi_mode = 204;
+
+		CtrlMsg_Resp_ScanResult resp_scan_ap_list = 205;
+		CtrlMsg_Resp_GetAPConfig resp_get_ap_config = 206;
+		CtrlMsg_Resp_ConnectAP resp_connect_ap = 207;
+		CtrlMsg_Resp_GetStatus resp_disconnect_ap = 208;
+
+		CtrlMsg_Resp_GetSoftAPConfig resp_get_softap_config = 209;
+		CtrlMsg_Resp_SetSoftAPVendorSpecificIE resp_set_softap_vendor_specific_ie = 210;
+		CtrlMsg_Resp_StartSoftAP resp_start_softap = 211;
+		CtrlMsg_Resp_SoftAPConnectedSTA resp_softap_connected_stas_list = 212;
+		CtrlMsg_Resp_GetStatus resp_stop_softap = 213;
+
+		CtrlMsg_Resp_SetMode resp_set_power_save_mode = 214;
+		CtrlMsg_Resp_GetMode resp_get_power_save_mode = 215;
+
+		CtrlMsg_Resp_OTABegin resp_ota_begin = 216;
+		CtrlMsg_Resp_OTAWrite resp_ota_write = 217;
+		CtrlMsg_Resp_OTAEnd resp_ota_end = 218;
+		CtrlMsg_Resp_SetWifiMaxTxPower resp_set_wifi_max_tx_power = 219;
+		CtrlMsg_Resp_GetWifiCurrTxPower resp_get_wifi_curr_tx_power = 220;
+		CtrlMsg_Resp_ConfigHeartbeat resp_config_heartbeat = 221;
+		CtrlMsg_Resp_EnableDisable resp_enable_disable_feat = 222;
+		CtrlMsg_Resp_GetFwVersion resp_get_fw_version = 223;
+
+		/** Notifications **/
+		CtrlMsg_Event_ESPInit event_esp_init = 301;
+		CtrlMsg_Event_Heartbeat event_heartbeat = 302;
+		CtrlMsg_Event_StationDisconnectFromAP event_station_disconnect_from_AP = 303;
+		CtrlMsg_Event_StationDisconnectFromESPSoftAP event_station_disconnect_from_ESP_SoftAP = 304;
+		CtrlMsg_Event_StationConnectedToAP event_station_connected_to_AP = 305;
+		CtrlMsg_Event_StationConnectedToESPSoftAP event_station_connected_to_ESP_SoftAP = 306;
+	}
 }

+ 2 - 0
docs/Linux_based_host/Linux_based_readme.md

@@ -193,6 +193,8 @@ This section identifies Raspberry-Pi specific setup requirements.
 ### 2.2 ESP-IDF Setup
 - If you are going to use released firmware binaries, ESP-IDF setup is not required, please continue with `2.3 ESP-Hosted Code Repository` below.
 - Follow steps hereon on your **native machine** (your Windows/Linux/Mac desktop/laptop)
+- **Note on Windows 11**: you can follow [these instructions](/esp_hosted_fg/esp/esp_driver/setup_windows11.md),
+instead of the following, to setup ESP-IDF and build the esp firmware.
 - :warning: Following command is dangerous. It will revert all your local changes. Stash if need to keep them.
 - Install the ESP-IDF using script
 ```sh

+ 8 - 13
docs/Linux_based_host/SDIO_setup.md

@@ -27,7 +27,7 @@ Sample setup image of ESP32 SDIO with RPi looks like:
 ![alt text](rpi_esp_sdio_setup.jpeg "setup of Raspberry-Pi as host and ESP32 as peripheral")
 
 :warning: Note:
-As SDIO faces signal integrity issues over jumper wires, we strongly recommend to **Design PCB boards with above connections**
+As SDIO faces signal integrity issues over jumper wires, we strongly recommend to **Design PCB boards with above connections.**
 If that is not possible
  - Use good quality extremely small (smaller than 5cm) jumper wires, all equal length
  - Join all possible grounds interconnected to lower noise
@@ -35,26 +35,19 @@ If that is not possible
 
 
 ### 1.2 Raspberry-Pi Software Setup
-By default, the SDIO pins of Raspberry-pi are not configured and are internally used for built-in Wi-Fi interface. Please enable SDIO pins by appending following line to _/boot/config.txt_ file
+By default, the SDIO pins of Raspberry-pi are not configured and are internally used for the built-in Wi-Fi interface. Please enable SDIO pins by appending the following line to the _/boot/firmware/config.txt_ file (prior to _Bookworm_, the file is at _/boot/config.txt_):
 ```
 dtoverlay=sdio,poll_once=off
 dtoverlay=disable-bt
 ```
 Please reboot Raspberry-Pi after changing this file.
-Please note, that the default Wi-Fi on your Raspberry Pi will be disabled on reboot. This is because the SDIO used in ESP-Hosted is going to use this SDIO port here on.
-If you are not using desktop variant of Raspberry Pi, It would be good to set up static IP SSH with ethernet cable .
-Also, it is recommended to download (any) software needed (like iperf etc) before rebooting, so that losing wlan0 is not issue
+
+Note that the default Wi-Fi on your Raspberry Pi will be disabled on reboot. This is because the SDIO used in ESP-Hosted is going to use this SDIO port here on. If you are not using desktop variant of Raspberry Pi, It would be good to set up static IP SSH with ethernet cable.
+
+Also, it is recommended to download (any) software needed (like iperf etc) before rebooting, so that losing Wi-Fi is not an issue.
 
 ## 2. Load ESP-Hosted Solution
 ### 2.1 Host Software
-* As ESP32 & ESP32C6, both support SDIO, Let host know which slave chipset is being used by changing `esp_hosted_fg/host/linux/host_control/rpi_init.sh` as:
-```sh
-  ESP_SLAVE_CHIPSET="esp32"
-```
-or
-```sh
-  ESP_SLAVE_CHIPSET="esp32c6"
-```
 * Execute following commands in root directory of cloned ESP-Hosted repository on Raspberry-Pi
 ```sh
 $ cd esp_hosted_fg/host/linux/host_control/
@@ -83,6 +76,8 @@ serial_port is device where ESP chipset is detected. For example, /dev/ttyUSB0
 Make sure that same code base (same git commit) is checked-out/copied at both, ESP and Host
 
 ##### Set-up ESP-IDF
+- **Note on Windows 11**: you can follow [these instructions](/esp_hosted_fg/esp/esp_driver/setup_windows11.md),
+instead of the following, to setup ESP-IDF and build the esp firmware.
 - :warning: Following command is dangerous. It will revert all your local changes. Stash if need to keep them.
 - Install the ESP-IDF using script
 ```sh

+ 19 - 8
docs/Linux_based_host/SPI_setup.md

@@ -1,7 +1,7 @@
 # Wi-Fi and BT/BLE connectivity Setup over SPI
 
-| Supported Targets | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C2 | ESP32-C3 | ESP32-C6 |
-| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- |
+| Supported Targets | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 |
+| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- | -------- |
 
 ## 1. Setup
 ### 1.1 Hardware Setup
@@ -13,7 +13,7 @@ ESP can be powered through PC using micro-USB/USB-C cable.
 Raspberry-Pi pinout can be found [here!](https://pinout.xyz/pinout/spi)
 
 #### 1.1.1 Pin connections
-| Raspberry-Pi Pin | ESP32 | ESP32-S2/S3 | ESP32-C2/C3/C6 | Function |
+| Raspberry-Pi Pin | ESP32 | ESP32-S2/S3 | ESP32-C2/C3/C5/C6 | Function |
 |:-------:|:---------:|:--------:|:--------:|:--------:|
 | 24 | IO15 | IO10 | IO10 | CS0 |
 | 23 | IO14 | IO12 | IO6 | SCLK |
@@ -33,18 +33,27 @@ Sample SPI setup with ESP32-C6 as slave and RaspberryPi as Host looks like:
 - In case of ESP32-S3, For avoidance of doubt, You can power using [UART port](https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html#description-of-components)
 
 ### 1.2 Raspberry-Pi Software Setup
-The SPI master driver is disabled by default on Raspberry-Pi OS. To enable it add following commands in  _/boot/config.txt_ file
+The SPI master driver is disabled by default on Raspberry-Pi OS. To enable it add following commands in the _/boot/firmware/config.txt_ file (prior to _Bookworm_, the file is at _/boot/config.txt_):
 ```
 dtparam=spi=on
 dtoverlay=disable-bt
 ```
-In addition, below options are set as the SPI clock frequency in analyzer is observed to be smaller than expected clock. This is RaspberryPi specific [issue](https://github.com/raspberrypi/linux/issues/2286).
+
+#### 1.2.1 Setting the correct SPI Clock on Raspberry-Pi
+By default, the Raspberry Pi sets the CPU scaling governor to `ondemand` (`cat /sys/devices/system/cpu/cpufreq/policy0/scaling_governor` to see the scaling governor currently in use). This causes the SPI clock frequency used to be lower than the requested one.
+
+Setting the scaling governor to `performance` ensure the SPI clock frequency used is close to the requested one.
+
+To change this, edit `/etc/default/cpu_governor` and add this line:
 ```
-core_freq=250
-core_freq_min=250
+CPU_DEFAULT_GOVERNOR="performance"
 ```
 Please reboot Raspberry-Pi after changing this file.
-Also, please disable the default Wi-Fi network interface (e.g `wlan0`) using networking configuration on your Linux host so that we will be sure that Wi-Fi is only provided with ESP-Hosted. Every packet would be passed through the ESP-Hosted Wi-Fi interface and not the native onboard Wi-Fi.
+
+#### 1.2.2. Disable default Wi-Fi interface
+Disable the default Wi-Fi network interface (e.g `wlan0`) using networking configuration on your Linux host so that we will be sure that Wi-Fi is only provided with ESP-Hosted.
+
+Every packet would be passed through the ESP-Hosted Wi-Fi interface and not the native onboard Wi-Fi.
 
 ## 2. Load ESP-Hosted Solution
 ### 2.1 Host Software
@@ -75,6 +84,8 @@ serial_port is device where ESP chipset is detected. For example, /dev/ttyUSB0
 Make sure that same code base (same git commit) is checked-out/copied at both, ESP and Host
 
 ##### Set-up ESP-IDF
+- **Note on Windows 11**: you can follow [these instructions](/esp_hosted_fg/esp/esp_driver/setup_windows11.md),
+instead of the following, to setup ESP-IDF and build the esp firmware.
 - :warning: Following command is dangerous. It will revert all your local changes. Stash if need to keep them.
 - Install the ESP-IDF using script
 ```sh

+ 20 - 0
docs/Linux_based_host/Troubleshoot.md

@@ -153,3 +153,23 @@ coming continuously, Please verify your 'uart' baud_rate is correct and restart
 $ sudo killall hciattach
 $ sudo hciattach -s <baud_rate> /dev/serial0 any <baud_rate> flow
 ```
+
+## 4. SPI
+
+### 4.1 SPI Clock is lower than expected on Raspberry Pi
+
+This issue has been reported for [Raspberry Pi 3](https://github.com/raspberrypi/linux/issues/2286) and [Raspberry Pi 4](https://github.com/raspberrypi/linux/issues/3381).
+
+For Raspberry Pi OS prior to _Bookworm_, edit the _/boot/config.txt_ file and add these lines:
+```
+core_freq=250
+core_freq_min=250
+```
+
+For _Bookworm_, see [Setting the correct SPI Clock on Raspberry-Pi](SPI_setup.md#121-setting-the-correct-spi-clock-on-raspberry-pi).
+
+### 4.2 Reset Pin and SPI GPIO numbering
+
+On older Raspberry Pi OS (before March 2024), the GPIO numbers used for the `resetpin` parameter in `rpi_init.sh` and assigned to `HANDSHAKE_PIN` and `SPI_DATA_READY_PIN` in `esp_spi.h` should match the actual Raspberry Pi GPIOs on the header.
+
+On newer Raspberry Pi OS (after March 2024), the GPIO numbers have been remapped. See the [Porting Guide](porting_guide.md#241-gpio-numbering-in-raspberry-pi-os) for more information.

+ 4 - 2
docs/Linux_based_host/UART_setup.md

@@ -52,7 +52,7 @@ Note:
 
 ### 1.2 Raspberry-Pi Software Setup
 By default, the UART pins on Raspberry-Pi are in disabled state. In order to enable UART and setup it for bluetooth connection, follow below steps.
-1. Enable UART pins and disable in built bluetooth on Raspberry-Pi by appending following lines to _/boot/config.txt_ file
+1. Enable UART pins and disable in built bluetooth on Raspberry-Pi by appending following lines to the _/boot/firmware/config.txt_ file (prior to _Bookworm_, the file is at _/boot/config.txt_):
 ```
 enable_uart=1
 dtoverlay=disable-bt
@@ -113,6 +113,8 @@ Make sure that same code base (same git commit) is checked-out/copied at both, E
 
 ##### Set-up ESP-IDF
 - :warning: Omit this & move to `Configure, Build & Flash ESP firmware` step if IDF is already setup while SPI/SDIO setup
+- **Note on Windows 11**: you can follow [these instructions](/esp_hosted_fg/esp/esp_driver/setup_windows11.md),
+instead of the following, to setup ESP-IDF and build the esp firmware.
 - :warning: Following command is dangerous. It will revert all your local changes. Stash if need to keep them.
 - Install the ESP-IDF using script
 ```sh
@@ -185,7 +187,7 @@ $ idf.py -p <serial_port> build flash
 ## 3. Post Setup
 - After setting up host and loading ESP firmware, execute below command to create `hci0` interface
 	```sh
-	$ sudo hciattach -s <baud_rate> <serial_device_name> /dev/serial0 any <baud_rate> flow
+	$ sudo hciattach -s <baud_rate> <serial_device_name> any <baud_rate> flow
 	```
 - <serial_device_name>
   - RPi with Kernels < 6.2.21 => `/dev/serial0`

+ 28 - 7
docs/Linux_based_host/porting_guide.md

@@ -72,10 +72,11 @@ Driver underlies heavily over underlying kernel. ESP-Hosted is tested over Linux
 * Reset Pin
 	* Reset pin could be chosen over unused GPIO.
 	* Input parameter to script, `resetpin=X` to be changed accordingly. This is used to reset ESP on loading the kernel module.
+	- **Note:** See [Section 2.4.1](#241-gpio-numbering-in-raspberry-pi-os) for changes in Raspberry Pi OS GPIO mappings.
 * UART configuration
 	* `bt_init()` lists `raspi-gpio` commands.
 	* `rapi-gpio` are simple utilities used to configure GPIO pins for their levels, alternate functions and pull up values.
-	* As per raspberry Pi documentation, these UART pins are configured.
+	* As per Raspberry Pi documentation, these UART pins are configured.
 	* These pins and any other peripheral pins which are not already taken care in their drivers, need to be configured.
 * spidev_disabler
 	* This is applicable for SPI peripheral configuration and explained in next section.
@@ -112,7 +113,27 @@ make CROSS_COMPILE=/home/user1/arm64_toolchain/bin/aarch64-linux-gnu-
 
 ## 2.4 Peripheral configurations
 
-### 2.4.1 SPI
+### 2.4.1 GPIO numbering in Raspberry Pi OS
+The GPIO numbering for Raspberry Pi OS has changed since 2024. See [this](https://forums.raspberrypi.com/viewtopic.php?t=368018#p2206621) for more info.
+
+To discover the current GPIO mapping, do `cat /sys/kernel/debug/gpio`. You will see lines similar to this:
+```
+gpiochip0: GPIOs 512-569, parent: platform/fe200000.gpio, pinctrl-bcm2711:
+ gpio-512 (ID_SDA              )
+ gpio-513 (ID_SCL              )
+ gpio-514 (GPIO2               )
+ gpio-515 (GPIO3               )
+ gpio-516 (GPIO4               )
+ gpio-517 (GPIO5               )
+ gpio-518 (GPIO6               )
+```
+| Function       | Old GPIO | New GPIO |
+| :------------- | :------: | :------: |
+| Reset          |     6    |    518   |
+| SPI Handshake  |    22    |    534   |
+| SPI Data Ready |    27    |    539   |
+
+### 2.4.2 SPI
 
 * Verify user space SPI driver
 	- If the user space drivers like spidev works as expected in Tx & Rx, then we would be assured that the SPI Linux drivers for your SoCs are working fine & SPI bus is correctly configured
@@ -124,7 +145,7 @@ make CROSS_COMPILE=/home/user1/arm64_toolchain/bin/aarch64-linux-gnu-
 	dtc spidev_disabler.dts -O dtb > spidev_disabler.dtbo
 	sudo dtoverlay -d . spidev_disabler
 	```
-		While porting, equivalent commands or steps need to be run to disable default SPI driver through the Device Tree for expected SoC.
+	- While porting, equivalent commands or steps need to be run to disable default SPI driver through the Device Tree for expected SoC.
 * Verify disabling of spidev
 	- Default spidev when not disabled, create a device file, /dev/spidevX.Y where X refers SPI bus and Y refers to Chip Select to be used.
 	- For example, Say User disables SPI bus 1 and Chip select 0 through Device Tree, then verify after loading Device Tree changes, /dev/spidev1.0 is no more listed
@@ -132,6 +153,7 @@ make CROSS_COMPILE=/home/user1/arm64_toolchain/bin/aarch64-linux-gnu-
 	- Apart from regular MOSI, MISO, CLK and Chip select, there are two additional GPIO pins used for SPI implementation.
 	- These pins should be selected such that they would not interfere other any peripheral work.
 	- Alter `HANDSHAKE_PIN` and `SPI_DATA_READY_PIN` in [esp_spi.h](../../host/linux/host_driver/esp32/spi/esp_spi.h).
+	- **Note:** See [Section 2.4.1](#241-gpio-numbering-in-raspberry-pi-os) for changes in Raspberry Pi OS GPIO mappings.
 	- Additional pins functionality details mentioned in [1.1.1 additional pin setup](../spi_protocol.md#111-additional-pin-setup) of [spi protocol documentation](../spi_protocol.md).
 * cs_change
 	- Reason why this setting was enabled is, SPI transfer was loosing first byte in transfer. Although this issue is only observed while testing with Raspberry Pi. Enabling cs_change=1 makes CS always de-assert after each transfer request. While porting, you may want to remove line, `trans.cs_change = 1;`.
@@ -147,10 +169,9 @@ make CROSS_COMPILE=/home/user1/arm64_toolchain/bin/aarch64-linux-gnu-
 	- Higher the frequency set, better the throughput would be.
 	- SPI clock frequency could be changed from macro `SPI_CLK_MHZ` in `esp/esp_driver/network_adapter/main/spi_slave_api.c`
 * Identify peripheral limitations
-	- For Raspberry Pi, Please use
+	- For Raspberry Pi, add this line to `/etc/default/cpu_governor`
 	  ```
-	  core_freq=250
-	  core_freq_min=250
+	  CPU_DEFAULT_GOVERNOR="performance"
 	  ```
 	  as mentioned in [SPI setup](SPI_setup.md#12-raspberry-pi-software-setup)
 	- Raspberry Pi could not perform reliably when the SPI clock was set higher frequency than 30MHz
@@ -201,7 +222,7 @@ you can suspect SPI timings mismatch. In such case, tuning might be required
 ###### Option 2 - Mismatch the slave and Host SPI modes
 * Set different SPI modes at Slave and Host and test again
 
-### 2.4.2 SDIO
+### 2.4.3 SDIO
 
 * File: *esp/esp_driver/network_adapter/main/sdio_slave_api.c*
 * If first event is not received at SDIO, you can tune `SDIO Timing`

+ 2 - 0
docs/MCU_based_host/SDIO_setup.md

@@ -58,6 +58,8 @@ serial_port is device where ESP chipset is detected. For example, /dev/ttyUSB0
 Make sure that same code base (same git commit) is checked-out/copied at both, ESP and Host
 
 ##### Set-up ESP-IDF
+- **Note on Windows 11**: you can follow [these instructions](/esp_hosted_fg/esp/esp_driver/setup_windows11.md),
+instead of the following, to setup ESP-IDF and build the esp firmware.
 - :warning: Following command is dangerous. It will revert all your local changes. Stash if need to keep them.
 - Install the ESP-IDF using script
 ```sh

+ 2 - 0
docs/MCU_based_host/SPI_setup.md

@@ -50,6 +50,8 @@ serial_port is device where ESP chipset is detected. For example, /dev/ttyUSB0
 Make sure that same code base (same git commit) is checked-out/copied at both, ESP and Host
 
 ##### Set-up ESP-IDF
+- **Note on Windows 11**: you can follow [these instructions](/esp_hosted_fg/esp/esp_driver/setup_windows11.md),
+instead of the following, to setup ESP-IDF and build the esp firmware.
 - :warning: Following command is dangerous. It will revert all your local changes. Stash if need to keep them.
 - Install the ESP-IDF using script
 ```sh

+ 0 - 273
docs/README.md

@@ -1,273 +0,0 @@
-# ESP-Hosted-FG
-
-# Index
-* [**1. Introduction**](#1-introduction)  
-	* [Connectivity Feature](#11-connectivity-features)  
-	* [Supported ESP boards](#12-supported-esp-boards)  
-	* [Supported Hosts](#13-supported-hosts)  
-	* [Supported Transports](#14-supported-transports)  
-	* [Feature Matrix](#15-feature-matrix)  
-* [**2. Hardware and Software setup**](#2-hardware-and-software-setup)  
-	* [Setup With Linux Host](#21-setup-with-linux-host)  
-	* [Setup With MCU host](#22-setup-with-mcu-host)  
-* [**3. Control Path**](#3-control-path)
-	* [Control Path APIs](#31-control-path-apis)
-	* [Demo Apps](#32-demo-apps)
-* [**4. Design**](#4-design)  
-	* [System Architecture](#41-system-architecture)  
-	* [Transport layer communication protocol](#42-transport-layer-communication-protocol)  
-	* [Integration Guide](#43-integration-guide)  
-* [**5. Throughput performance**](#5-throughput-performance)
-
----
-
-
-# 1. Introduction
-
-This version of ESP-Hosted provides:
-* A standard 802.3 network interface for transmitting and receiving 802.3 frames
-* A standard HCI interface over which Bluetooth/BLE is supported
-* A control interface to configure and control Wi-Fi on ESP board
-
-ESP-Hosted-FG solution makes use of host's existing `TCP/IP and/or Bluetooth/BLE software stack` and `hardware peripheral like SPI/SDIO/UART` to connect to ESP firmware with very thin layer of software.
-
-Although the project doesn't provide a standard 802.11 interface to the host, it provides a easy way, *i.e.* [control path](common/contrl_path.md), to configure Wi-Fi. For the control path between the host and ESP board, ESP-Hosted-FG makes use of [Protobuf](https://developers.google.com/protocol-buffers), which is a language independent data serialization mechanism.
-
-### 1.1 Connectivity Features
-
-ESP-Hosted-FG solution provides following WLAN and BT/BLE features to the host:
-- WLAN Features:
-	- 802.11b/g/n
-	- WLAN Station
-	- WLAN Soft AP
-- BT/BLE Features:
-	- ESP32 supports BR/EDR and BLE with v4.2
-	- ESP32-C2/C3/S3 supports BLE v4.2 and v5.0
-	- ESP32-C6 supports BLE 5.3
-
-### 1.2 Supported ESP boards
-
-ESP-Hosted-FG solution is supported on following ESP boards:
-
-| Supported Targets | ESP32 | ESP32-S2 | ESP32-S3 | ESP32-C2 | ESP32-C3 | ESP32-C6 |
-| ----------------- | ----- | -------- | -------- | -------- | -------- | -------- |
-
-
-### 1.3 Supported Hosts
-
-* As mentioned earlier, this version of the solution is primarily targeted to work with MCU based hosts.
-* Though this solution works with Linux hosts, we recommend other [ESP_Hosted-NG](../esp_hosted_ng) flavour for Linux hosts.
-* ESP-Hosted-FG solution showcase examples for following Linux based and MCU based hosts out of the box.
-	* MCU Based Hosts
-	  * STM32 Discovery Board (STM32F469I-DISCO)
-	  * STM32F412ZGT6-Nucleo 144
-	* Linux Based Hosts
-		* Raspberry-Pi 3 Model B
-		* Raspberry-Pi 3 Model B+
-		* Raspberry-Pi 4 Model B
-* You can port this solution to other Linux and MCU platforms using [porting guide](Linux_based_host/porting_guide.md)
-
-### 1.4 Supported Transports
-
-* SDIO Only
-    * Wi-Fi and Bluetooth, traffic for both runs over SDIO
-* SDIO+UART
-    * Wi-Fi runs over SDIO and Bluetooth runs over UART
-* SPI Only
-    * Wi-Fi and Bluetooth, traffic for both runs over SPI
-* SPI+UART
-    * Wi-Fi runs over SPI and Bluetooth runs over UART
-
-Different ESP chipset support different set of peripherals. Below is features supported matrix for Linux & MCU.
-In this matrix, Each feature is by default enabled & supported with every trasport in left.
-Any Unwanted feature can be turned off with config change.
-
-### 1.5 Feature Matrix
-##### 1.5.1 Linux Host
-The below table explains which feature is supported on which transport interface for Linux based host.
-
-| ESP Chipset | Transport options | Linux Features supported |
-| -------: | :-------: | :-------: |
-| <a>![ESP32](icons/esp32.svg)</a> | <a>![sdio_only](icons/sdio_only.svg)</a><br/><a>![sdio_uart](icons/sdio_uart.svg)</a><br/><a>![spi_only](icons/spi_only.svg)</a><br/><a>![spi_uart](icons/spi_uart.svg)</a> | <a>![Wi-Fi](icons/wifi.svg)</a><br/><a>![Classic_BT](icons/ClassicBT.svg)</a><br/><a>![BLE4.2](icons/BLE4.2.svg)</a> |
-| <a>![ESP32-C6](icons/esp32c6.svg)</a> | <a>![sdio_only](icons/sdio_only.svg)</a><br/><a>![sdio_uart](icons/sdio_uart.svg)</a><br/><a>![spi_only](icons/spi_only.svg)</a><br/><a>![spi_uart](icons/spi_uart.svg)</a> | <a>![Wi-Fi-6](icons/wifi_6.svg)</a><br/><a>![BLE5.0](icons/BLE5.3.svg)</a> |
-| <a>![ESP32-S2](icons/esp32s2.svg)</a> | <a>![spi_only](icons/spi_only.svg)</a> | <a>![Wi-Fi](icons/wifi.svg)</a> |
-| <a>![ESP32-C3](icons/esp32c3.svg)</a><br/><a>![ESP32-C2](icons/esp32c2.svg)</a><br/><a>![ESP32-S3](icons/esp32s3.svg)</a> | <a>![spi_only](icons/spi_only.svg)</a><br/><a>![spi_uart](icons/spi_uart.svg)</a> | <a>![Wi-Fi](icons/wifi.svg)</a><br/><a>![BLE5.0](icons/BLE5.0.svg)</a> |
-
-
-Note:
-- ESP-Hosted-FG related BR/EDR 4.2 and BLE 4.2 functionalities are tested with bluez 5.43+. Whereas, BLE 5.0 functionalities are tested with bluez 5.45+.
-- We suggest the latest stable bluez version to be used. Any other Bluetooth stack instead of bluez also could be used.
-- bluez 5.45 on-wards BLE 5.0 HCI commands are supported.
-- BLE 5.0 has backward compatibility of BLE 4.2.
-
-##### 1.5.2 MCU Host
-The below table explains which feature is supported on which transport interface for MCU based host.
-
-| ESP Chipset | Transport options | MCU Features supported |
-| -------: | :-------: | :-------: |
-| <a>![ESP32](icons/esp32.svg)</a> | <a>![sdio_only](icons/sdio_only.svg)</a><br/><a>![sdio_uart](icons/sdio_uart.svg)</a><br/><a>![spi_only](icons/spi_only.svg)</a><br/><a>![spi_uart](icons/spi_uart.svg)</a> | <a>![Wi-Fi](icons/wifi.svg)</a><br/><a>![Classic_BT](icons/ClassicBT.svg)</a><br/><a>![BLE4.2](icons/BLE4.2.svg)</a> |
-| <a>![ESP32-C6](icons/esp32c6.svg)</a> | <a>![spi_only](icons/spi_only.svg)</a><br/><a>![spi_uart](icons/spi_uart.svg)</a> | <a>![Wi-Fi-6](icons/wifi_6.svg)</a><br/><a>![BLE5.0](icons/BLE5.3.svg)</a> |
-| <a>![ESP32-S2](icons/esp32s2.svg)</a> | <a>![spi_only](icons/spi_only.svg)</a> | <a>![Wi-Fi](icons/wifi.svg)</a> |
-| <a>![ESP32-C3](icons/esp32c3.svg)</a><br/><a>![ESP32-C2](icons/esp32c2.svg)</a><br/><a>![ESP32-S3](icons/esp32s3.svg)</a> | <a>![spi_only](icons/spi_only.svg)</a><br/><a>![spi_uart](icons/spi_uart.svg)</a> | <a>![Wi-Fi](icons/wifi.svg)</a><br/><a>![BLE5.0](icons/BLE5.0.svg)</a> |
-
-
-Note:
--  Bluetooth at MCU
-  - UART is supported from ESP slave side. But not verified from MCU as Host (Works fine with Linux as host)
-  - If you have ported Bluetooth host stack on MCU, you can use ESP32 bluetooth controller in slave mode.
-  - BT/BLE over SPI/SDIO
-    - BT/BLE support over SPI/SDIO is not readily available. In order to implement it, one needs to:
-    - Port BT/BLE stack to MCU
-    - Add a new virtual serial interface using the serial interface API's provided in host driver of ESP-Hosted-FG solution.
-    - HCI implementation in Linux Driver `host/linux/host_driver/esp32` could be used as reference. Search keyword: `ESP_HCI_IF`
-    - Register this serial interface with BT/BLE stack as a HCI interface.
-  - BT/BLE over UART
-    - BT/BLE support over UART is not readily available. In order to implement this, one needs to:
-    - Port BT/BLE stack to MCU
-    - Register the UART serial interface as a HCI interface with BT/BLE stack
-    - With the help of this UART interface, BT/BLE stack can directly interact with BT controller present on ESP bypassing host driver and firmware
-    - ESP Hosted host driver and a firmware plays no role in this communication
-- OTA
-  - Linux hosts support OTA update (Over The Air ESP firmware update) in C and python
-  - MCU hosts can refer to the same for their development
-  - For detailed documentation, please read [ota_update.md](Linux_based_host/ota_update.md).
-- Features awaiting:
-  - ESP32-C6 support for MCU
-  - SDIO support with MCU host
-  - LWIP integration at MCU host
-  - Bluetooth stack at MCU host
-  - ESP chipsets acting as MCU host (ESP as slave <----> ESP as host)
-
-
----
-
-# 2. Hardware and Software setup
-This section describes how to set up and use ESP-Hosted-FG solution. Since ESP-Hosted-FG solution supports two distinct platforms, the procedure to use it vastly differs.
-
-### 2.1 Setup With Linux Host
-Please refer to the [Setup Guide](Linux_based_host/Linux_based_readme.md) for Linux host.
-
-### 2.2 Setup With MCU Host
-Please refer to the [Setup Guide](MCU_based_host/MCU_based_readme.md) for MCU host.
-In addition to [Control path APIs](#31-control-path-apis) listed below, APIs for MCU specific solution are explained [here](MCU_based_host/mcu_api.md)
-
----
-
-# 3. Control Path
-- Once ESP-Hosted-FG transport is set up, getting control path working is the first step to verify if the transport is set up correctly
-- Control path works over ESP-Hosted-FG transport *i.e.* SPI or SDIO and leverages a way to control and manage ESP from host
-- The detailed design and procedure to get control path working is explained [here](common/contrl_path.md)
-- Impatient to evaluate? Please follow our beautiful and intuitive [Python based CLI](common/python_demo.md#modes-supported) to easily set up the control path
-
-### 3.1 Control Path APIs
-- As [control path design](common/contrl_path.md#3-design) details, demo application works over control path library using control path APIs.
-- These APIs are exhaustive list. User can use specific APIs which are of interest.
-- Each API is explained in a detailed way to kickstart its use.
-- These Control APIs are common for **MPU** and **MCU** based solution.
-- User can easily integrate ESP-Hosted-FG solution with own project using these APIs and demo application, which implements these APIs.
-- Control APIs are detailed below.
-  - [Control path APIs](common/ctrl_apis.md)
-
-### 3.2 Demo apps
-Demo applications are provided in python and C. Python app makes use of [ctypes](https://docs.python.org/3/library/ctypes.html) to implement control APIs.
-
-* [C demo app](common/c_demo.md)
-* [Python demo app](common/python_demo.md)
-
----
-
-# 4. Design
-This section describes the overall design of ESP-Hosted-FG solution. There are 3 aspects to it:
-* System Architecture
-* Transport layer communication protocol
-* Integration Guide
-
-### 4.1 System Architecture
-
-This section discusses building blocks of the ESP-Hosted-FG solution for the supported host platforms.
-
-![ESP-Hosted-FG design](ESP-Hosted-FG.jpg)
-
-Following are the key building blocks of the system:
-
-- ESP-Hosted-FG Driver and Custom Control Path
-
-- ESP-Hosted-FG Firmware
-
-- Third party components
-
-
-##### 4.1.1 ESP-Hosted-FG Driver
-
-The components of ESP-Hosted-FG driver are dependent on host platform that is being used. Please refer to the following documents:
-
-1. [System Architecture: Linux based host](Linux_based_host/Linux_based_architecture.md)
-2. [System Architecture: MCU based host](MCU_based_host/MCU_based_architecture.md)
-
-
-##### 4.1.2 ESP-Hosted-FG Firmware
-This implements ESP-Hosted-FG solution part that runs on ESP boards. ESP-Hosted-FG firmware is agnostic of the host platform. It consists of the following.
-
-* ESP Application  
-	This implements:
-	* SDIO transport layer
-	* SPI transport layer
-	* Virtual serial interface driver
-	* Control interface command implementation
-	* Bridges data path between Wi-Fi, HCI controller driver of ESP and Host platform
-* ESP-IDF Components  
-	ESP firmware mainly uses following components from ESP-IDF. Please check [ESP-IDF documentation](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/index.html) for more details.
-	* SDIO Slave driver
-	* SPI Slave driver
-	* Wi-Fi driver
-	* HCI controller driver
-	* Protocomm Layer
-
-
-##### 4.1.3 Third Party Components
-Third components such as following are essential for end to end working of ESP-Hosted-FG Solution. Implementation or porting of these third party component is not in scope of this project.
-* TCP/IP and TLS stack
-* BT/BLE stack
-* UART driver
-* Protobuf
-
-
-### 4.2 Transport layer communication protocol
-This section describes the data communication protocol used at the transport layer. This protocol is agnostic of host platforms that is being used. Please refer to the following links to get more information on communication protocol per transport interface type.
-* [SDIO Communication Protocol](sdio_protocol.md)
-* [SPI Communication Protocol](spi_protocol.md)
-
-##### 4.2.1 Payload Format
-This section explains the payload format used for data transfer on SDIO and SPI interfaces.
-
-* Host and peripheral makes use of 12 byte payload header which precedes every data packet.
-* This payload header provides additional information about the data packet. Based on this header, host/peripheral consumes the transmitted data packet.
-* Payload format is as below
-
-| Field | Length | Description |
-|:-------:|:---------:|:--------|
-| Interface type | 4 bits | Possible values: STA(0), SoftAP(1), Serial interface(2), HCI (3), Priv interface(4). Rest all values are reserved |
-| Interface number | 4 bits | Unused |
-| Flags | 1 byte | Additional flags like `MORE_FRAGMENT` in fragmentation |
-| Packet length | 2 bytes | Actual length of data packet |
-| Offset to packet | 2 bytes | Offset of actual data packet |
-| Checksum | 2 bytes | checksum for complete packet (Includes header and payload) |
-| Reserved2 | 1 byte | Not in use |
-| seq_num | 2 bytes | Sequence number for serial interface |
-| Packet type | 1 byte | reserved when interface type is 0, 1 and 2. Applicable only for interface type 3 and 4 |
-
-### 4.3 Integration Guide
-
-##### 4.3.1 Porting
-Porting for MPU *i.e.* Linux based hosts is explained [here](Linux_based_host/porting_guide.md)
-
-##### 4.3.3 APIs for MCU Based ESP-Hosted-FG Solution
-Below document explains the APIs provided for MCU based ESP-Hosted-FG solution
-* [API's for MCU based host](MCU_based_host/mcu_api.md)
-
-# 5. Throughput performance
-* Station & Soft-AP both the Wi-Fi modes support both, 20 MHz & 40 MHz bandwidth
-* Throughput performace is measured with iperf inside the RF shielded box
-* Following are ESP-Hosted-FG iperf throughput numbers for Wi-Fi (station mode - 20MHz), considering common use-case
-
-![alt text](esp_hosted_performance.png "ESP Hosted performance matrix")

+ 9 - 1
docs/common/c_demo.md

@@ -42,6 +42,13 @@
 | get_wifi_curr_tx_power | Get Wi-Fi current transmitting power |
 |||
 | ota </path/to/ota_image.bin> | performs OTA operation using local OTA binary file |
+|||
+| get_fw_version | Get firmware version |
+| enable_wifi | Enable Wi-Fi driver |
+| disable_wifi | Disable Wi-Fi driver |
+| enable_bt | Enable Bluetooth driver |
+| disable_bt | Disable Bluetooth driver |
+
 
 
 ### How to run
@@ -59,7 +66,8 @@ $ sudo ./test.out \
 	  softap_start          || get_softap_config       || softap_connected_sta_list || \
 	  softap_stop           || set_wifi_powersave_mode || get_wifi_powersave_mode   || \
 	  set_wifi_max_tx_power || get_wifi_curr_tx_power  || \
-	  ota </path/to/esp_firmware_network_adapter.bin> \
+	  ota </path/to/esp_firmware_network_adapter.bin> || \
+      enable_wifi || disable_wifi || enable_bt || disable_bt || get_fw_version
 	]
 ```
 For example,

+ 49 - 0
docs/common/ctrl_apis.md

@@ -1251,6 +1251,55 @@ This specifies the file descriptor of the endpoint/socket to be closed
 - This API is only applicable in Unix based systems
 - Set ethernet interface MAC address `mac` to interface `iface`
 
+---
+
+### 1.29 [ctrl_cmd_t](#416-struct-ctrl_cmd_t) * feature_config([ctrl_cmd_t](#416-struct-ctrl_cmd_t) req)
+
+- Enable or Disable the feature
+- feature is integer as per `feature_t`
+
+#### Parameters
+
+- `ctrl_cmd_t req` :
+Control request as input with following
+  - **`req.u.feat_ena_disable.feature`** :
+    - `feature_t` featture to be enabled or disable
+  - **`req.u.feat_ena_disable.enable`** :
+    - 1: enable
+    - 0: disable
+  - `req.ctrl_resp_cb` : optional
+    - `NULL` :
+      - Treat as synchronous procedure
+      - Application would be blocked till response is received from hosted control library
+    - `Non-NULL` :
+      - Treat as asynchronous procedure
+      - Callback function of type [ctrl_resp_cb_t](#31-typedef-int-ctrl_resp_cb_t-ctrl_cmd_t-resp) is registered
+      - Application would be will **not** be blocked for response and API is returned immediately
+      - Response from ESP when received by hosted control library, this callback would be called
+  - `req.cmd_timeout_sec` : optional
+    - Timeout duration to wait for response in sync or async procedure
+    - Default value is 30 sec
+    - In case of async procedure, response callback function with error control response would be called to wait for response
+
+#### Return
+
+- `ctrl_cmd_t *app_resp` :
+dynamically allocated response pointer of type struct `ctrl_cmd_t *`
+  - **`resp->resp_event_status`** :
+    - 0 : `SUCCESS`
+    - != 0 : `FAILURE`
+      - Failure should be considered as complete OTA procedure failure
+- `NULL` :
+  - Synchronous procedure: Failure
+  - Asynchronous procedure:
+    - Expected as NULL return value as response is processed in callback function
+    - In callback function, parameter `ctrl_cmd_t *app_resp` behaves same as above
+
+#### Note
+- Application is expected to free `ctrl_cmd_t *app_resp`
+
+
+
 #### Parameters
 
 - `sockfd` :

+ 26 - 2
docs/common/python_demo.md

@@ -19,9 +19,22 @@
 - [commands_lib.py](../../host/linux/host_control/python_support/commands_lib.py) is a supporting file for Demo APP, where methods are implemented. User can adapt as per their need.
 - [commands_map_py_to_c.py](../../host/linux/host_control/python_support/commands_map_py_to_c.py) is mapper file for `ctypes` library
 - Installation
-  - Install the dependency libraries, `prompt_toolkit`, `docstring_parser` and `fire`. Below command could be used to install:
+  - Install the dependency libraries, `prompt_toolkit`, `docstring_parser`,`fire` and `requests`. Below command could be used to install:
   ```sh
-  $ sudo python3 -m pip install prompt_toolkit fire argparse docstring_parser
+  $ sudo python3 -m pip install prompt_toolkit fire argparse docstring_parser requests
+  ```
+  On Raspberry Pi or other linux distributions, you may see this error when running that command:
+  ```
+  error: externally-managed-environment
+  ```
+  If you get that error, you can try this alternative method, which is to setup a python virtual environment (venv) to install the packages:
+  ```sh
+  $ python -m venv my-venv
+  $ my-venv/bin/pip install prompt_toolkit fire argparse docstring_parser requests
+  ```
+  To run the demo app in a venv (see below section):
+  ```sh
+  $ sudo my-venv/bin/python ./test.py
   ```
 
 ### Modes supported
@@ -125,6 +138,17 @@
     - Subscribe event to get notifications
   - `unsubscribe_event`
     - Unsubscribe event to get notifications
+  - `disable_wifi`
+    - Deinit Wi-Fi driver in slave
+  - `enable_wifi`
+    - Init and start Wi-Fi driver in slave
+  - `disable_bt`
+    - Deinit Bluetooth driver in slave
+  - `enable_bt`
+    - Init and start Bluetooth driver in slave
+  - `get_fw_version`
+    - Fetch firmware version at slave
+
 - Note:
   - Positional arguments are supported in case of `Shell mode`
   - In both, `CLI mode` and `Shell mode`, a single command is supported at a time.

BIN
docs/esp_hosted_performance.png


+ 20 - 6
esp/esp_driver/network_adapter/CMakeLists.txt

@@ -2,13 +2,27 @@
 # in this exact order for cmake to work correctly
 cmake_minimum_required(VERSION 3.5)
 
-set(PROJECT_VERSION_MAJOR_1 "0")
-set(PROJECT_VERSION_MAJOR_2 "0")
-set(PROJECT_VERSION_MINOR "5")
-message(*************************************************************************************)
-message("                    Building ESP-Hosted-FG Firmware version :: ${PROJECT_VERSION_MAJOR_1}.${PROJECT_VERSION_MAJOR_2}.${PROJECT_VERSION_MINOR} ")
-message(*************************************************************************************)
+file(READ "../../../common/include/esp_fw_version.h" HEADER_CONTENTS)
+set(PROJECT_VERSION_REGEX "#define[ \t]+PROJECT_NAME[ \t]+\"([A-Z]+)\"[ \t\n]+#define[ \t]+PROJECT_VERSION_MAJOR_1[ \t]+([0-9]+)[ \t\n]+#define[ \t]+PROJECT_VERSION_MAJOR_2[ \t]+([0-9]+)[ \t\n]+#define[ \t]+PROJECT_VERSION_MINOR[ \t]+([0-9]+)[ \t\n]+#define[ \t]+PROJECT_REVISION_PATCH_1[ \t]+([0-9]+)[ \t\n]+#define[ \t]+PROJECT_REVISION_PATCH_2[ \t]+([0-9]+)")
+string(REGEX MATCH "${PROJECT_VERSION_REGEX}" PROJECT_VERSION_MATCH "${HEADER_CONTENTS}")
 
+if(PROJECT_VERSION_MATCH)
+    set(PROJECT_NAME "${CMAKE_MATCH_1}")
+    set(PROJECT_VERSION_MAJOR_1 "${CMAKE_MATCH_2}")
+    set(PROJECT_VERSION_MAJOR_2 "${CMAKE_MATCH_3}")
+    set(PROJECT_VERSION_MINOR "${CMAKE_MATCH_4}")
+    set(PROJECT_REVISION_PATCH_1 "${CMAKE_MATCH_5}")
+    set(PROJECT_REVISION_PATCH_2 "${CMAKE_MATCH_6}")
+
+    # Construct project version
+    set(PROJECT_VER "${PROJECT_NAME}-${PROJECT_VERSION_MAJOR_1}.${PROJECT_VERSION_MAJOR_2}.${PROJECT_VERSION_MINOR}.${PROJECT_REVISION_PATCH_1}.${PROJECT_REVISION_PATCH_2}")
+
+    message(*************************************************************************************)
+    message("                    Building ESP-Hosted Firmware version :: ${PROJECT_VER} ")
+    message(*************************************************************************************)
+endif()
+
+set(PROJECT_VER "${PROJECT_VER}")
 include($ENV{IDF_PATH}/tools/cmake/project.cmake)
 project(network_adapter)
 idf_build_set_property(COMPILE_OPTIONS "-fdiagnostics-color=always" APPEND)

+ 1 - 4
esp/esp_driver/network_adapter/main/CMakeLists.txt

@@ -9,10 +9,7 @@ endif()
 
 
 register_component()
-set(PROJECT_VERSION_MAJOR_1 "-DPROJECT_VERSION_MAJOR_1=0")
-set(PROJECT_VERSION_MAJOR_2 "-DPROJECT_VERSION_MAJOR_2=0")
-set(PROJECT_VERSION_MINOR "-DPROJECT_VERSION_MINOR=5")
-target_compile_definitions(${COMPONENT_LIB} PRIVATE ${PROJECT_VERSION_MAJOR_1} ${PROJECT_VERSION_MAJOR_2} ${PROJECT_VERSION_MINOR})
+target_compile_definitions(${COMPONENT_LIB} PRIVATE)
 
 # Add directory of protocomm_priv.h to include paths
 idf_component_get_property(protocomm_dir protocomm COMPONENT_DIR)

+ 195 - 136
esp/esp_driver/network_adapter/main/Kconfig.projbuild

@@ -1,140 +1,199 @@
 menu "Example Configuration"
 
-    choice ESP_HOST_INTERFACE
-        bool "Transport layer"
-        default ESP_SDIO_HOST_INTERFACE if IDF_TARGET_ESP32
-        default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32S2
-        default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32S3
-        default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C2
-        default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C3
-        default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C6
-        help
-            Bus interface to be used for communication with the host
-
-        config ESP_SDIO_HOST_INTERFACE
-            bool "SDIO interface"
-            depends on IDF_TARGET_ESP32 || IDF_TARGET_ESP32C6
-            help
-                Enable/Disable SDIO host interface
-
-        config ESP_SPI_HOST_INTERFACE
-            bool "SPI interface"
-            help
-                Enable/Disable SPI host interface
-    endchoice
-
-    menu "SPI Configuration"
-        depends on ESP_SPI_HOST_INTERFACE
-
-    config ESP_SPI_CONTROLLER
-        int "SPI controller to use"
-        depends on IDF_TARGET_ESP32 && ESP_SPI_HOST_INTERFACE
-        default 2
-        range 2 3
-        help
-            SPI controller to be used. HSPI->2, VSPI->3
-
-    config ESP_SPI_GPIO_HANDSHAKE
-        int "GPIO pin for handshake"
-        default 3 if IDF_TARGET_ESP32C2
-        default 3 if IDF_TARGET_ESP32C3
-        default 3 if IDF_TARGET_ESP32C6
-        default 2
-        help
-            GPIO pin to use for handshake with other spi controller
-
-    config ESP_SPI_GPIO_DATA_READY
-        int "GPIO pin for data ready interrupt"
-        default 4
-        help
-            GPIO pin for indicating host that SPI slave has data to be read by host
-
-    config ESP_SPI_TX_Q_SIZE
-        int "ESP to Host SPI queue size"
-        default 10 if IDF_TARGET_ESP32
-        default 20
-        help
-            Very small tx queue will lower ESP == SPI ==> Host data rate
-
-    config ESP_SPI_RX_Q_SIZE
-        int "Host to ESP SPI queue size"
-        default 10 if IDF_TARGET_ESP32
-        default 20
-        help
-            Very small RX queue will lower ESP <== SPI == Host data rate
-
-    config ESP_SPI_CHECKSUM
-        bool "SPI checksum ENABLE/DISABLE"
-        default y
-        help
-            ENABLE/DISABLE software SPI checksum
-    endmenu
-
-    menu "SDIO Configuration"
-        depends on ESP_SDIO_HOST_INTERFACE
-
-    config ESP_SDIO_CHECKSUM
-        bool "SDIO checksum ENABLE/DISABLE"
-		default n
-        help
-            ENABLE/DISABLE software SDIO checksum
-
-    endmenu
-
-    config EXAMPLE_HCI_UART_BAUDRATE
-        int "UART Baudrate for HCI: Only applicable for ESP32-C3/ESP32-S3"
-        range 115200 921600
-        depends on IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32C6
-        depends on BT_CTRL_HCI_MODE_UART_H4
-        default 921600
-        help
-            UART Baudrate for HCI over ESP32C2/C3/C6/S3. Please use standard baudrate.
-
-    config ESP_DEFAULT_TASK_STACK_SIZE
-        int "ESP-Hosted task stack size"
-        default 4096
-        help
-            Default task size of ESP-Hosted tasks
-
-    config ESP_DEFAULT_TASK_PRIO
-        int "ESP-Hosted task priority"
-        default 22
-        help
-            Default task priority of ESP-Hosted tasks
-
-    config ESP_CACHE_MALLOC
-        bool "Cache allocated memory like mempool - helps to reduce malloc calls"
-        default n if IDF_TARGET_ESP32C2
-        default y
-        help
-            Cache allocated memory - reduces number of malloc calls
-
-    config ESP_OTA_WORKAROUND
-        bool "OTA workaround - Add sleeps while OTA write"
-        default y
-        help
-            Enable/disable sleeps while OTA operations
-
-    menu "Enable Debug logs"
-
-    config ESP_SERIAL_DEBUG
-        bool "Debug Serial driver data path"
-        default 0
-        help
-            Enable/disable debug prints in serial driver data path
-
-    config ESP_WLAN_DEBUG
-        bool "Debug Wlan driver data path"
-        default 0
-        help
-            Enable/disable debug prints in wlan driver data path
-
-    config ESP_BT_DEBUG
-        bool "Debug Bluetooth driver data path"
-        default 0
-        help
-            Enable/disable debug prints in Bluetooth driver data path
-
-    endmenu
+	choice ESP_HOST_INTERFACE
+		bool "Transport layer"
+		default ESP_SDIO_HOST_INTERFACE if IDF_TARGET_ESP32
+		default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32S2
+		default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32S3
+		default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C2
+		default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C3
+		default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C5
+		default ESP_SPI_HOST_INTERFACE if IDF_TARGET_ESP32C6
+		help
+			Bus interface to be used for communication with the host
+
+		config ESP_SDIO_HOST_INTERFACE
+			bool "SDIO interface"
+			depends on IDF_TARGET_ESP32 || IDF_TARGET_ESP32C6
+			help
+				Enable/Disable SDIO host interface
+
+		config ESP_SPI_HOST_INTERFACE
+			bool "SPI interface"
+			help
+				Enable/Disable SPI host interface
+	endchoice
+
+	menu "SPI Configuration"
+		depends on ESP_SPI_HOST_INTERFACE
+
+		config ESP_SPI_CONTROLLER
+			int "SPI controller to use"
+			depends on IDF_TARGET_ESP32 && ESP_SPI_HOST_INTERFACE
+			default 2
+			range 2 3
+			help
+				SPI controller to be used. HSPI->2, VSPI->3
+
+		config ESP_SPI_GPIO_HANDSHAKE
+			int "GPIO pin for handshake"
+			default 3 if IDF_TARGET_ESP32C2
+			default 3 if IDF_TARGET_ESP32C3
+			default 3 if IDF_TARGET_ESP32C5
+			default 3 if IDF_TARGET_ESP32C6
+			default 2
+			help
+				GPIO pin to use for handshake with other spi controller
+
+		config ESP_SPI_GPIO_DATA_READY
+			int "GPIO pin for data ready interrupt"
+			default 4
+			help
+				GPIO pin for indicating host that SPI slave has data to be read by host
+
+		config ESP_ENABLE_TX_PRIORITY_QUEUES
+			bool "Process Tx packets with priority"
+			default n
+
+		config ESP_SPI_TX_Q_SIZE
+			depends on !ESP_ENABLE_TX_PRIORITY_QUEUES
+			int "ESP to host queue size"
+			default 10
+
+		menu "Tx Priority Queues"
+			depends on ESP_ENABLE_TX_PRIORITY_QUEUES
+
+			config ESP_SPI_TX_WIFI_Q_SIZE
+				int "ESP to Host SPI queue size"
+				default 10 if IDF_TARGET_ESP32C2
+				default 20
+				help
+			Very small tx queue will lower ESP == SPI ==> Host data rate
+
+			config ESP_SPI_TX_BT_Q_SIZE
+				int "ESP to Host SPI queue size"
+				default 3
+
+			config ESP_SPI_TX_SERIAL_Q_SIZE
+				int "ESP to Host serial SPI queue size"
+				default 2
+		endmenu
+
+		config ESP_ENABLE_RX_PRIORITY_QUEUES
+			bool "Process Rx packets with priority"
+			default n
+
+		config ESP_SPI_RX_Q_SIZE
+			int "Host to ESP SPI queue size"
+			depends on !ESP_ENABLE_RX_PRIORITY_QUEUES
+			default 10
+			help
+				Very small RX queue will lower ESP <== SPI == Host data rate
+
+		menu "Rx Priority Queues"
+			depends on ESP_ENABLE_RX_PRIORITY_QUEUES
+			config ESP_SPI_RX_WIFI_Q_SIZE
+				int "Host to ESP SPI queue size"
+				default 10 if IDF_TARGET_ESP32C2
+				default 20
+				help
+					Very small rx queue will lower ESP <== SPI == Host data rate
+
+			config ESP_SPI_RX_BT_Q_SIZE
+				int "Host to ESP SPI queue size"
+				default 3
+
+			config ESP_SPI_RX_SERIAL_Q_SIZE
+				int "Host to ESP serial SPI queue size"
+				default 2
+		endmenu
+
+		config ESP_SPI_CHECKSUM
+			bool "SPI checksum ENABLE/DISABLE"
+			default y
+			help
+				ENABLE/DISABLE software SPI checksum
+	endmenu
+
+	menu "SDIO Configuration"
+		depends on ESP_SDIO_HOST_INTERFACE
+
+		choice
+			prompt "SDIO Bus Speed"
+			default ESP_SDIO_HIGH_SPEED
+			help
+				Select the SDIO Slave Bus Speed. Actual speed in use depends on SDIO bus speed the SDIO Master can support
+
+			config ESP_SDIO_DEFAULT_SPEED
+				bool "Default Speed (20 MHz)"
+
+			config ESP_SDIO_HIGH_SPEED
+				bool "High Speed (40 MHz)"
+
+		endchoice
+
+		config ESP_SDIO_CHECKSUM
+			bool "SDIO checksum ENABLE/DISABLE"
+			default n
+			help
+				ENABLE/DISABLE software SDIO checksum
+	endmenu
+
+
+	config EXAMPLE_HCI_UART_BAUDRATE
+		int "UART Baudrate for HCI: Only applicable for ESP32-C3/ESP32-S3"
+		range 115200 921600
+		depends on IDF_TARGET_ESP32C3 || IDF_TARGET_ESP32S3 || IDF_TARGET_ESP32C2 || IDF_TARGET_ESP32C6
+		depends on BT_CTRL_HCI_MODE_UART_H4
+		default 921600
+		help
+			UART Baudrate for HCI over ESP32C2/C3/C6/S3. Please use standard baudrate.
+
+	config ESP_DEFAULT_TASK_STACK_SIZE
+		int "ESP-Hosted task stack size"
+		default 4096
+		help
+			Default task size of ESP-Hosted tasks
+
+	config ESP_DEFAULT_TASK_PRIO
+		int "ESP-Hosted task priority"
+		default 22
+		help
+			Default task priority of ESP-Hosted tasks
+
+	config ESP_CACHE_MALLOC
+		bool "Cache allocated memory like mempool - helps to reduce malloc calls"
+		default n if IDF_TARGET_ESP32C2
+		default y
+		help
+			Cache allocated memory - reduces number of malloc calls
+
+	config ESP_OTA_WORKAROUND
+		bool "OTA workaround - Add sleeps while OTA write"
+		default y
+		help
+			Enable/disable sleeps while OTA operations
+
+	menu "Enable Debug logs"
+
+		config ESP_SERIAL_DEBUG
+			bool "Debug Serial driver data path"
+			default 0
+			help
+				Enable/disable debug prints in serial driver data path
+
+		config ESP_WLAN_DEBUG
+			bool "Debug Wlan driver data path"
+			default 0
+			help
+				Enable/disable debug prints in wlan driver data path
+
+		config ESP_BT_DEBUG
+			bool "Debug Bluetooth driver data path"
+			default 0
+			help
+				Enable/disable debug prints in Bluetooth driver data path
+
+	endmenu
 
 endmenu

+ 32 - 13
esp/esp_driver/network_adapter/main/app_main.c

@@ -46,6 +46,7 @@
 #include "slave_control.h"
 #include "slave_bt.c"
 #include "stats.h"
+#include "esp_fw_version.h"
 
 static const char TAG[] = "NETWORK_ADAPTER";
 
@@ -104,8 +105,8 @@ uint8_t ap_mac[MAC_LEN] = {0};
 static void print_firmware_version()
 {
 	ESP_LOGI(TAG, "*********************************************************************");
-	ESP_LOGI(TAG, "                ESP-Hosted-FG Firmware version :: %d.%d.%d                        ",
-			PROJECT_VERSION_MAJOR_1, PROJECT_VERSION_MAJOR_2, PROJECT_VERSION_MINOR);
+	ESP_LOGI(TAG, "                ESP-Hosted Firmware version :: %s-%d.%d.%d.%d.%d",
+			PROJECT_NAME, PROJECT_VERSION_MAJOR_1, PROJECT_VERSION_MAJOR_2, PROJECT_VERSION_MINOR, PROJECT_REVISION_PATCH_1, PROJECT_REVISION_PATCH_2);
 #if CONFIG_ESP_SPI_HOST_INTERFACE
   #if BLUETOOTH_UART
 	ESP_LOGI(TAG, "                Transport used :: SPI + UART                    ");
@@ -212,7 +213,6 @@ void esp_update_ap_mac(void)
 esp_err_t wlan_ap_rx_callback(void *buffer, uint16_t len, void *eb)
 {
 	interface_buffer_handle_t buf_handle = {0};
-	uint8_t * ap_buf = buffer;
 
 	if (!buffer || !eb || !datapath || ota_ongoing) {
 		if (eb) {
@@ -221,13 +221,6 @@ esp_err_t wlan_ap_rx_callback(void *buffer, uint16_t len, void *eb)
 		return ESP_OK;
 	}
 
-	/* Check destination address against self address */
-	if (memcmp(ap_buf, ap_mac, MAC_LEN)) {
-		/* Check for multicast or broadcast address */
-		if (!(ap_buf[0] & 1))
-			goto DONE;
-	}
-
 	buf_handle.if_type = ESP_AP_IF;
 	buf_handle.if_num = 0;
 	buf_handle.payload_len = len;
@@ -326,7 +319,7 @@ void send_event_to_host(int event_id)
 	protocomm_pserial_data_ready(pc_pserial, NULL, 0, event_id);
 }
 
-void send_event_data_to_host(int event_id, uint8_t *data, int size)
+void send_event_data_to_host(int event_id, void *data, int size)
 {
 	protocomm_pserial_data_ready(pc_pserial, data, size, event_id);
 }
@@ -381,6 +374,7 @@ void process_rx_pkt(interface_buffer_handle_t *buf_handle)
 	struct esp_payload_header *header = NULL;
 	uint8_t *payload = NULL;
 	uint16_t payload_len = 0;
+	int ret = 0;
 
 	header = (struct esp_payload_header *) buf_handle->payload;
 	payload = buf_handle->payload + le16toh(header->offset);
@@ -391,11 +385,36 @@ void process_rx_pkt(interface_buffer_handle_t *buf_handle)
 
 	if ((buf_handle->if_type == ESP_STA_IF) && station_connected) {
 		/* Forward data to wlan driver */
-		esp_wifi_internal_tx(ESP_IF_WIFI_STA, payload, payload_len);
+		int retry = 6;
+
+		do {
+			ret = esp_wifi_internal_tx(ESP_IF_WIFI_STA, payload, payload_len);
+			retry--;
+
+			if (ret) {
+				if (retry % 3)
+					usleep(600);
+				else
+					vTaskDelay(1);
+			}
+
+		} while (ret && retry);
 		/*ESP_LOG_BUFFER_HEXDUMP("spi_sta_rx", payload, payload_len, ESP_LOG_INFO);*/
 	} else if (buf_handle->if_type == ESP_AP_IF && softap_started) {
+		int retry = 6;
 		/* Forward data to wlan driver */
-		esp_wifi_internal_tx(ESP_IF_WIFI_AP, payload, payload_len);
+		do {
+			ret = esp_wifi_internal_tx(ESP_IF_WIFI_AP, payload, payload_len);
+			retry--;
+
+			if (ret) {
+				if (retry % 3)
+					usleep(600);
+				else
+					vTaskDelay(1);
+			}
+
+		} while (ret && retry);
 	} else if (buf_handle->if_type == ESP_SERIAL_IF) {
 		process_serial_rx_pkt(buf_handle->payload);
 	}

+ 2 - 2
esp/esp_driver/network_adapter/main/mempool.c

@@ -53,8 +53,8 @@ struct hosted_mempool * hosted_mempool_create(void *pre_allocated_mem,
 		}
 	}
 
-	new = (struct hosted_mempool*)CALLOC(sizeof(struct hosted_mempool), 1);
-	pool = (struct os_mempool *)CALLOC(sizeof(struct os_mempool), 1);
+	new = (struct hosted_mempool*)CALLOC(1, sizeof(struct hosted_mempool));
+	pool = (struct os_mempool *)CALLOC(1, sizeof(struct os_mempool));
 
 	if(!new || !pool) {
 		goto free_buffs;

+ 25 - 0
esp/esp_driver/network_adapter/main/sdio_slave_api.c

@@ -26,6 +26,7 @@
 #include "endian.h"
 #include "mempool.h"
 #include "stats.h"
+#include "esp_fw_version.h"
 
 #define SDIO_SLAVE_QUEUE_SIZE   20
 #define BUFFER_SIZE     	1536 /* 512*3 */
@@ -113,6 +114,7 @@ void generate_startup_event(uint8_t cap)
 	uint16_t len = 0;
 	uint8_t raw_tp_cap = 0;
 	esp_err_t ret = ESP_OK;
+	struct fw_version fw_ver = { 0 };
 
 	raw_tp_cap = debug_get_raw_tp_conf();
 
@@ -151,6 +153,23 @@ void generate_startup_event(uint8_t cap)
 	*pos = ESP_PRIV_TEST_RAW_TP;        pos++;len++;
 	*pos = LENGTH_1_BYTE;               pos++;len++;
 	*pos = raw_tp_cap;                  pos++;len++;
+
+	/* fill structure with fw info */
+	strncpy(fw_ver.project_name, PROJECT_NAME, sizeof(fw_ver.project_name) - 1);
+	fw_ver.project_name[sizeof(fw_ver.project_name) - 1] = '\0';
+	fw_ver.major1 = PROJECT_VERSION_MAJOR_1;
+	fw_ver.major2 = PROJECT_VERSION_MAJOR_2;
+	fw_ver.minor  = PROJECT_VERSION_MINOR;
+	fw_ver.revision_patch_1 = PROJECT_REVISION_PATCH_1;
+	fw_ver.revision_patch_2 = PROJECT_REVISION_PATCH_2;
+
+	/* TLV - Firmware Version */
+	*pos = ESP_PRIV_FW_DATA;            pos++;len++;
+	*pos = sizeof(fw_ver);              pos++;len++;
+	memcpy(pos, &fw_ver, sizeof(fw_ver));
+	pos += sizeof(fw_ver);
+	len += sizeof(fw_ver);
+
 	/* TLVs end */
 
 	event->event_len = len;
@@ -207,7 +226,13 @@ static interface_handle_t * sdio_init(void)
 		.timing             = SDIO_SLAVE_TIMING_NSEND_PSAMPLE,
 #endif
 	};
+#if CONFIG_ESP_SDIO_DEFAULT_SPEED
 	config.flags |= SDIO_SLAVE_FLAG_DEFAULT_SPEED;
+#elif CONFIG_ESP_SDIO_HIGH_SPEED
+	config.flags |= SDIO_SLAVE_FLAG_HIGH_SPEED;
+#else
+#error Invalid SDIO bus speed selection
+#endif
 
 #if defined(CONFIG_IDF_TARGET_ESP32C6)
 	ESP_LOGI(TAG, "%s: ESP32-C6 SDIO timing: %u\n", __func__, config.timing);

+ 53 - 19
esp/esp_driver/network_adapter/main/slave_bt.c

@@ -36,7 +36,17 @@
 
 static const char BT_TAG[] = "ESP_BT";
 
+static bool bt_available(void)
+{
+	return esp_bt_controller_get_status() >= ESP_BT_CONTROLLER_STATUS_INITED;
+}
+
 #if BLUETOOTH_HCI
+
+static bool bt_running(void)
+{
+	return esp_bt_controller_get_status() > ESP_BT_CONTROLLER_STATUS_INITED;
+}
 /* ***** HCI specific part ***** */
 
 #define VHCI_MAX_TIMEOUT_MS 	2000
@@ -84,11 +94,15 @@ static int host_rcv_pkt(uint8_t *data, uint16_t len)
 }
 
 static esp_vhci_host_callback_t vhci_host_cb = {
-	controller_rcv_pkt_ready,
-	host_rcv_pkt
+	.notify_host_send_available = controller_rcv_pkt_ready,
+	.notify_host_recv = host_rcv_pkt
 };
 
 void process_hci_rx_pkt(uint8_t *payload, uint16_t payload_len) {
+
+	if (!bt_running())
+		return;
+
 	/* VHCI needs one extra byte at the start of payload */
 	/* that is accomodated in esp_payload_header */
 #if CONFIG_ESP_BT_DEBUG
@@ -408,6 +422,7 @@ void init_uart(void)
 
 #if BLUETOOTH_HCI
 #if SOC_ESP_NIMBLE_CONTROLLER
+#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0)
 #include "nimble/ble_hci_trans.h"
 
 typedef enum {
@@ -420,24 +435,35 @@ typedef enum {
 /* Host-to-controller command. */
 #define BLE_HCI_TRANS_BUF_CMD       3
 
-/* ACL_DATA_MBUF_LEADINGSPCAE: The leadingspace in user info header for ACL data */
-#define ACL_DATA_MBUF_LEADINGSPCAE    4
+/* ACL_DATA_MBUF_LEADINGSPACE: The leadingspace in user info header for ACL data */
+#define ACL_DATA_MBUF_LEADINGSPACE    4
+
+#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
+void ble_transport_ll_init(void)
+{
+}
+#endif
 
 void esp_vhci_host_send_packet(uint8_t *data, uint16_t len)
 {
-    if (*(data) == DATA_TYPE_COMMAND) {
-        struct ble_hci_cmd *cmd = NULL;
-        cmd = (struct ble_hci_cmd *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD);
-        memcpy((uint8_t *)cmd, data + 1, len - 1);
-        ble_hci_trans_hs_cmd_tx((uint8_t *)cmd);
-    }
-
-    if (*(data) == DATA_TYPE_ACL) {
-        struct os_mbuf *om = os_msys_get_pkthdr(len, ACL_DATA_MBUF_LEADINGSPCAE);
-        assert(om);
-        os_mbuf_append(om, &data[1], len - 1);
-        ble_hci_trans_hs_acl_tx(om);
-    }
+	if (*(data) == DATA_TYPE_COMMAND) {
+		struct ble_hci_cmd *cmd = NULL;
+		cmd = (struct ble_hci_cmd *) ble_hci_trans_buf_alloc(BLE_HCI_TRANS_BUF_CMD);
+		if (!cmd) {
+			ESP_LOGE(BT_TAG, "Failed to allocate memory for HCI transport buffer");
+			return;
+		}
+
+		memcpy((uint8_t *)cmd, data + 1, len - 1);
+		ble_hci_trans_hs_cmd_tx((uint8_t *)cmd);
+	}
+
+	if (*(data) == DATA_TYPE_ACL) {
+		struct os_mbuf *om = os_msys_get_pkthdr(len, ACL_DATA_MBUF_LEADINGSPACE);
+		assert(om);
+		os_mbuf_append(om, &data[1], len - 1);
+		ble_hci_trans_hs_acl_tx(om);
+	}
 
 }
 
@@ -473,6 +499,7 @@ ble_hs_rx_data(struct os_mbuf *om, void *arg)
     return 0;
 }
 
+#endif
 #endif
 #endif
 
@@ -480,6 +507,10 @@ esp_err_t initialise_bluetooth(void)
 {
 	esp_bt_controller_config_t bt_cfg = BT_CONTROLLER_INIT_CONFIG_DEFAULT();
 
+	if (bt_available()) {
+		ESP_LOGI(BT_TAG, "BT is already configured earlier, ignoring");
+		return 0;
+	}
 
 #ifdef BLUETOOTH_UART
   #if BT_OVER_C3_S3
@@ -500,7 +531,7 @@ esp_err_t initialise_bluetooth(void)
 #if BLUETOOTH_HCI
 	esp_err_t ret = ESP_OK;
 
-#if SOC_ESP_NIMBLE_CONTROLLER
+#if SOC_ESP_NIMBLE_CONTROLLER && (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 3, 0))
     ble_hci_trans_cfg_hs((ble_hci_trans_rx_cmd_fn *)ble_hs_hci_rx_evt,NULL,
                          (ble_hci_trans_rx_acl_fn *)ble_hs_rx_data,NULL);
 #else
@@ -526,6 +557,9 @@ esp_err_t initialise_bluetooth(void)
 
 void deinitialize_bluetooth(void)
 {
+	if (!bt_available())
+		return;
+
 #if BLUETOOTH_HCI
 	if (vhci_send_sem) {
 		/* Dummy take and give sema before deleting it */
@@ -534,9 +568,9 @@ void deinitialize_bluetooth(void)
 		vSemaphoreDelete(vhci_send_sem);
 		vhci_send_sem = NULL;
 	}
+#endif
 	esp_bt_controller_disable();
 	esp_bt_controller_deinit();
-#endif
 }
 
 uint8_t get_bluetooth_capabilities(void)

+ 6 - 4
esp/esp_driver/network_adapter/main/slave_bt.h

@@ -94,10 +94,12 @@
 
   #elif defined(CONFIG_IDF_TARGET_ESP32C6)
 
-      #define BT_TX_PIN         5
-      #define BT_RX_PIN         12
-      //#define BT_RTS_PIN        9
-      //#define BT_CTS_PIN        13
+      #define BT_TX_PIN         CONFIG_BT_LE_HCI_UART_TX_PIN
+      #define BT_RX_PIN         CONFIG_BT_LE_HCI_UART_RX_PIN
+#ifdef CONFIG_BT_LE_HCI_UART_FLOWCTRL
+      #define BT_RTS_PIN        CONFIG_BT_LE_HCI_UART_RTS_PIN
+      #define BT_CTS_PIN        CONFIG_BT_LE_HCI_UART_CTS_PIN
+#endif
 
   #elif BT_OVER_C3_S3
 

Plik diff jest za duży
+ 540 - 58
esp/esp_driver/network_adapter/main/slave_control.c


+ 16 - 4
esp/esp_driver/network_adapter/main/slave_control.h

@@ -18,16 +18,28 @@
 #include <esp_err.h>
 #define min(X, Y)               (((X) < (Y)) ? (X) : (Y))
 
-#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0) 
+#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
   #define TIMEOUT_IN_SEC          (1000 / portTICK_PERIOD_MS)
 #else
   #define TIMEOUT_IN_SEC          (1000 / portTICK_RATE_MS)
 #endif
 
+#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 4, 0)
+// 5G band support only available in ESP-IDF 5.4 or later
 
-#define SSID_LENGTH             32
+#if CONFIG_SOC_WIFI_HE_SUPPORT_5G
+  #define WIFI_DUALBAND_SUPPORT 1
+#else
+  #define WIFI_DUALBAND_SUPPORT 0
+#endif // CONFIG_SOC_WIFI_HE_SUPPORT_5G
+
+#else
+  #define WIFI_DUALBAND_SUPPORT 0
+#endif
+
+#define SSID_LENGTH             33
 #define PASSWORD_LENGTH         64
-#define BSSID_LENGTH            19
+#define BSSID_LENGTH            18
 #define MAC_LEN                 6
 #define VENDOR_OUI_BUF          3
 
@@ -49,6 +61,6 @@ esp_err_t data_transfer_handler(uint32_t session_id,const uint8_t *inbuf,
 esp_err_t ctrl_notify_handler(uint32_t session_id,const uint8_t *inbuf,
 		ssize_t inlen, uint8_t **outbuf, ssize_t *outlen, void *priv_data);
 void send_event_to_host(int event_id);
-void send_event_data_to_host(int event_id, uint8_t *data, int size);
+void send_event_data_to_host(int event_id, void *data, int size);
 
 #endif /*__SLAVE_CONTROL__H__*/

+ 143 - 57
esp/esp_driver/network_adapter/main/spi_slave_api.c

@@ -29,6 +29,7 @@
 #include "mempool.h"
 #include "stats.h"
 #include "esp_timer.h"
+#include "esp_fw_version.h"
 
 static const char TAG[] = "SPI_DRIVER";
 /* SPI settings */
@@ -66,8 +67,6 @@ static const char TAG[] = "SPI_DRIVER";
 
     #define DMA_CHAN               ESP_SPI_CONTROLLER
 
-    #define SPI_CLK_MHZ            10
-
 #elif defined CONFIG_IDF_TARGET_ESP32S2
 
     #define ESP_SPI_CONTROLLER     1
@@ -77,8 +76,6 @@ static const char TAG[] = "SPI_DRIVER";
     #define GPIO_CS                10
     #define DMA_CHAN               ESP_SPI_CONTROLLER
 
-    #define SPI_CLK_MHZ            30
-
 #elif defined CONFIG_IDF_TARGET_ESP32C2
 
     #define ESP_SPI_CONTROLLER     1
@@ -88,8 +85,6 @@ static const char TAG[] = "SPI_DRIVER";
     #define GPIO_CS                10
     #define DMA_CHAN               SPI_DMA_CH_AUTO
 
-    #define SPI_CLK_MHZ            30
-
 #elif defined CONFIG_IDF_TARGET_ESP32C3
 
     #define ESP_SPI_CONTROLLER     1
@@ -99,8 +94,6 @@ static const char TAG[] = "SPI_DRIVER";
     #define GPIO_CS                10
     #define DMA_CHAN               SPI_DMA_CH_AUTO
 
-    #define SPI_CLK_MHZ            30
-
 #elif defined CONFIG_IDF_TARGET_ESP32S3
 
     #define ESP_SPI_CONTROLLER     1
@@ -110,7 +103,14 @@ static const char TAG[] = "SPI_DRIVER";
     #define GPIO_CS                10
     #define DMA_CHAN               SPI_DMA_CH_AUTO
 
-    #define SPI_CLK_MHZ            30
+#elif defined CONFIG_IDF_TARGET_ESP32C5
+
+    #define ESP_SPI_CONTROLLER     1
+    #define GPIO_MOSI              7
+    #define GPIO_MISO              2
+    #define GPIO_SCLK              6
+    #define GPIO_CS                10
+    #define DMA_CHAN               SPI_DMA_CH_AUTO
 
 #elif defined CONFIG_IDF_TARGET_ESP32C6
 
@@ -121,8 +121,6 @@ static const char TAG[] = "SPI_DRIVER";
     #define GPIO_CS                10
     #define DMA_CHAN               SPI_DMA_CH_AUTO
 
-    #define SPI_CLK_MHZ            26
-
 #endif
 /* Max SPI slave CLK in IO_MUX tested in IDF:
  * ESP32: 10MHz
@@ -140,17 +138,45 @@ static const char TAG[] = "SPI_DRIVER";
 
 /* SPI internal configs */
 #define SPI_BUFFER_SIZE            1600
-#define SPI_QUEUE_SIZE             3
+#define SPI_DRIVER_QUEUE_SIZE      3
+
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
+    #define SPI_TX_WIFI_QUEUE_SIZE     CONFIG_ESP_SPI_TX_WIFI_Q_SIZE
+    #define SPI_TX_BT_QUEUE_SIZE       CONFIG_ESP_SPI_TX_BT_Q_SIZE
+    #define SPI_TX_SERIAL_QUEUE_SIZE   CONFIG_ESP_SPI_TX_SERIAL_Q_SIZE
+    #define SPI_TX_TOTAL_QUEUE_SIZE (SPI_TX_WIFI_QUEUE_SIZE+SPI_TX_BT_QUEUE_SIZE+SPI_TX_SERIAL_QUEUE_SIZE)
+#else
+    #define SPI_TX_QUEUE_SIZE          CONFIG_ESP_SPI_TX_Q_SIZE
+    #define SPI_TX_TOTAL_QUEUE_SIZE    SPI_TX_QUEUE_SIZE
+#endif
+
+#ifdef CONFIG_ESP_ENABLE_RX_PRIORITY_QUEUES
+    #define SPI_RX_WIFI_QUEUE_SIZE     CONFIG_ESP_SPI_RX_WIFI_Q_SIZE
+    #define SPI_RX_BT_QUEUE_SIZE       CONFIG_ESP_SPI_RX_BT_Q_SIZE
+    #define SPI_RX_SERIAL_QUEUE_SIZE   CONFIG_ESP_SPI_RX_SERIAL_Q_SIZE
+    #define SPI_RX_TOTAL_QUEUE_SIZE (SPI_RX_WIFI_QUEUE_SIZE+SPI_RX_BT_QUEUE_SIZE+SPI_RX_SERIAL_QUEUE_SIZE)
+#else
+    #define SPI_RX_QUEUE_SIZE          CONFIG_ESP_SPI_RX_Q_SIZE
+    #define SPI_RX_TOTAL_QUEUE_SIZE    SPI_RX_QUEUE_SIZE
+#endif
 
-#define SPI_RX_QUEUE_SIZE      CONFIG_ESP_SPI_RX_Q_SIZE
-#define SPI_TX_QUEUE_SIZE      CONFIG_ESP_SPI_TX_Q_SIZE
 
 static interface_context_t context;
 static interface_handle_t if_handle_g;
-static SemaphoreHandle_t spi_tx_sem;
-static SemaphoreHandle_t spi_rx_sem;
-static QueueHandle_t spi_rx_queue[MAX_PRIORITY_QUEUES];
-static QueueHandle_t spi_tx_queue[MAX_PRIORITY_QUEUES];
+
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
+  static QueueHandle_t spi_tx_queue[MAX_PRIORITY_QUEUES];
+  static SemaphoreHandle_t spi_tx_sem;
+#else
+  static QueueHandle_t spi_tx_queue;
+#endif
+
+#ifdef CONFIG_ESP_ENABLE_RX_PRIORITY_QUEUES
+  static QueueHandle_t spi_rx_queue[MAX_PRIORITY_QUEUES];
+  static SemaphoreHandle_t spi_rx_sem;
+#else
+  static QueueHandle_t spi_rx_queue;
+#endif
 
 static interface_handle_t * esp_spi_init(void);
 static int32_t esp_spi_write(interface_handle_t *handle,
@@ -169,7 +195,7 @@ if_ops_t if_ops = {
 	.deinit = esp_spi_deinit,
 };
 
-#define SPI_MEMPOOL_NUM_BLOCKS     ((SPI_TX_QUEUE_SIZE+SPI_RX_QUEUE_SIZE))
+#define SPI_MEMPOOL_NUM_BLOCKS     ((SPI_TX_TOTAL_QUEUE_SIZE+SPI_DRIVER_QUEUE_SIZE*2+SPI_RX_TOTAL_QUEUE_SIZE))
 static struct hosted_mempool * buf_mp_tx_g;
 static struct hosted_mempool * buf_mp_rx_g;
 static struct hosted_mempool * trans_mp_g;
@@ -272,6 +298,7 @@ void generate_startup_event(uint8_t cap)
 	uint16_t len = 0;
 	uint8_t raw_tp_cap = 0;
 	uint32_t total_len = 0;
+	struct fw_version fw_ver = { 0 };
 
 	buf_handle.payload = spi_buffer_tx_alloc(MEMSET_REQUIRED);
 
@@ -300,11 +327,6 @@ void generate_startup_event(uint8_t cap)
 	*pos = LENGTH_1_BYTE;               pos++;len++;
 	*pos = CONFIG_IDF_FIRMWARE_CHIP_ID; pos++;len++;
 
-	/* TLV - Peripheral clock in MHz */
-	*pos = ESP_PRIV_SPI_CLK_MHZ;        pos++;len++;
-	*pos = LENGTH_1_BYTE;               pos++;len++;
-	*pos = SPI_CLK_MHZ;                 pos++;len++;
-
 	/* TLV - Capability */
 	*pos = ESP_PRIV_CAPABILITY;         pos++;len++;
 	*pos = LENGTH_1_BYTE;               pos++;len++;
@@ -314,6 +336,22 @@ void generate_startup_event(uint8_t cap)
 	*pos = LENGTH_1_BYTE;               pos++;len++;
 	*pos = raw_tp_cap;                  pos++;len++;
 
+	/* fill structure with fw info */
+	strncpy(fw_ver.project_name, PROJECT_NAME, sizeof(fw_ver.project_name) - 1);
+	fw_ver.project_name[sizeof(fw_ver.project_name) - 1] = '\0';
+	fw_ver.major1 = PROJECT_VERSION_MAJOR_1;
+	fw_ver.major2 = PROJECT_VERSION_MAJOR_2;
+	fw_ver.minor  = PROJECT_VERSION_MINOR;
+	fw_ver.revision_patch_1 = PROJECT_REVISION_PATCH_1;
+	fw_ver.revision_patch_2 = PROJECT_REVISION_PATCH_2;
+
+	/* TLV - Firmware Version */
+	*pos = ESP_PRIV_FW_DATA;            pos++;len++;
+	*pos = sizeof(fw_ver);              pos++;len++;
+	memcpy(pos, &fw_ver, sizeof(fw_ver));
+	pos += sizeof(fw_ver);
+	len += sizeof(fw_ver);
+
 	/* TLVs end */
 
 	event->event_len = len;
@@ -334,8 +372,12 @@ void generate_startup_event(uint8_t cap)
 	header->checksum = htole16(compute_checksum(buf_handle.payload, len + sizeof(struct esp_payload_header)));
 #endif
 
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
 	xQueueSend(spi_tx_queue[PRIO_Q_OTHERS], &buf_handle, portMAX_DELAY);
 	xSemaphoreGive(spi_tx_sem);
+#else
+	xQueueSend(spi_tx_queue, &buf_handle, portMAX_DELAY);
+#endif
 
 	set_dataready_gpio();
 	/* process first data packet here to start transactions */
@@ -370,12 +412,16 @@ static uint8_t * get_next_tx_buffer(uint32_t *len)
 	 *	2. Create a new empty tx buffer and return */
 
 	/* Get buffer from SPI Tx queue */
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
 	ret = xSemaphoreTake(spi_tx_sem, 0);
 	if (pdTRUE == ret)
 		if (pdFALSE == xQueueReceive(spi_tx_queue[PRIO_Q_SERIAL], &buf_handle, 0))
 			if (pdFALSE == xQueueReceive(spi_tx_queue[PRIO_Q_BT], &buf_handle, 0))
 				if (pdFALSE == xQueueReceive(spi_tx_queue[PRIO_Q_OTHERS], &buf_handle, 0))
 					ret = pdFALSE;
+#else
+	ret = xQueueReceive(spi_tx_queue, &buf_handle, 0);
+#endif
 
 	if (ret == pdTRUE && buf_handle.payload) {
 		if (len)
@@ -432,9 +478,8 @@ static int process_spi_rx(interface_buffer_handle_t *buf_handle)
 	if (!len)
 		return -1;
 
-	if (len > SPI_BUFFER_SIZE) {
-		ESP_LOGE(TAG, "rx_pkt len[%u]>max[%u], dropping it", len, SPI_BUFFER_SIZE);
-
+	if (len+offset > SPI_BUFFER_SIZE) {
+		ESP_LOGE(TAG, "rx_pkt len+offset[%u]>max[%u], dropping it", len+offset, SPI_BUFFER_SIZE);
 		return -1;
 	}
 
@@ -462,6 +507,7 @@ static int process_spi_rx(interface_buffer_handle_t *buf_handle)
 	if (buf_handle->if_type == ESP_STA_IF)
 		pkt_stats.sta_rx_in++;
 #endif
+#ifdef CONFIG_ESP_ENABLE_RX_PRIORITY_QUEUES
 	if (header->if_type == ESP_SERIAL_IF) {
 		xQueueSend(spi_rx_queue[PRIO_Q_SERIAL], buf_handle, portMAX_DELAY);
 	} else if (header->if_type == ESP_HCI_IF) {
@@ -471,6 +517,9 @@ static int process_spi_rx(interface_buffer_handle_t *buf_handle)
 	}
 
 	xSemaphoreGive(spi_rx_sem);
+#else
+	xQueueSend(spi_rx_queue, buf_handle, portMAX_DELAY);
+#endif
 	return 0;
 }
 
@@ -549,27 +598,26 @@ static void IRAM_ATTR gpio_disable_hs_isr_handler(void* arg)
 
 static void register_hs_disable_pin(uint32_t gpio_num)
 {
-    if (gpio_num != -1) {
-    gpio_reset_pin(gpio_num);
-
-    gpio_config_t slave_disable_hs_pin_conf={
-        .intr_type=GPIO_INTR_DISABLE,
-        .mode=GPIO_MODE_INPUT,
-        .pull_up_en=1,
-        .pin_bit_mask=(1<<gpio_num)
-    };
-
-    gpio_config(&slave_disable_hs_pin_conf);
-    gpio_set_intr_type(gpio_num, GPIO_INTR_NEGEDGE);
-    gpio_install_isr_service(0);
-    gpio_isr_handler_add(gpio_num, gpio_disable_hs_isr_handler, NULL);
-    }
+	if (gpio_num != -1) {
+		gpio_reset_pin(gpio_num);
+
+		gpio_config_t slave_disable_hs_pin_conf={
+			.intr_type=GPIO_INTR_DISABLE,
+			.mode=GPIO_MODE_INPUT,
+			.pull_up_en=1,
+			.pin_bit_mask=(1<<gpio_num)
+		};
+
+		gpio_config(&slave_disable_hs_pin_conf);
+		gpio_set_intr_type(gpio_num, GPIO_INTR_NEGEDGE);
+		gpio_install_isr_service(0);
+		gpio_isr_handler_add(gpio_num, gpio_disable_hs_isr_handler, NULL);
+	}
 }
 
 static interface_handle_t * esp_spi_init(void)
 {
 	esp_err_t ret = ESP_OK;
-	uint16_t prio_q_idx = 0;
 
 	/* Configuration for the SPI bus */
 	spi_bus_config_t buscfg={
@@ -592,7 +640,7 @@ static interface_handle_t * esp_spi_init(void)
 	spi_slave_interface_config_t slvcfg={
 		.mode=SPI_MODE_2,
 		.spics_io_num=GPIO_CS,
-		.queue_size=SPI_QUEUE_SIZE,
+		.queue_size=SPI_DRIVER_QUEUE_SIZE,
 		.flags=0,
 		.post_setup_cb=spi_post_setup_cb,
 		.post_trans_cb=spi_post_trans_cb
@@ -629,11 +677,23 @@ static interface_handle_t * esp_spi_init(void)
 	gpio_set_pull_mode(GPIO_SCLK, GPIO_PULLUP_ONLY);
 	gpio_set_pull_mode(GPIO_CS, GPIO_PULLUP_ONLY);
 
-	ESP_LOGI(TAG, "SPI Ctrl:%u mode: %u, InitFreq: 10MHz, ReqFreq: %uMHz\nGPIOs: MOSI: %u, MISO: %u, CS: %u, CLK: %u HS: %u DR: %u\n",
-			ESP_SPI_CONTROLLER, slvcfg.mode, SPI_CLK_MHZ,
+	ESP_LOGI(TAG, "SPI Ctrl:%u mode: %u, GPIOs: MOSI: %u, MISO: %u, CS: %u, CLK: %u HS: %u DR: %u\n",
+			ESP_SPI_CONTROLLER, slvcfg.mode,
 			GPIO_MOSI, GPIO_MISO, GPIO_CS, GPIO_SCLK, GPIO_HS, GPIO_DR);
 
-	ESP_LOGI(TAG, "Hosted SPI queue size: Tx:%u Rx:%u", SPI_TX_QUEUE_SIZE, SPI_RX_QUEUE_SIZE);
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
+	ESP_LOGI(TAG, "TX Queues :Wifi[%u] bt[%u] serial[%u]",
+			SPI_TX_WIFI_QUEUE_SIZE, SPI_TX_BT_QUEUE_SIZE, SPI_TX_SERIAL_QUEUE_SIZE);
+#else
+	ESP_LOGI(TAG, "TX Queues:%u", SPI_TX_QUEUE_SIZE);
+#endif
+
+#ifdef CONFIG_ESP_ENABLE_RX_PRIORITY_QUEUES
+	ESP_LOGI(TAG, "RX Queues :Wifi[%u] bt[%u] serial[%u]",
+			SPI_RX_WIFI_QUEUE_SIZE, SPI_RX_BT_QUEUE_SIZE, SPI_RX_SERIAL_QUEUE_SIZE);
+#else
+	ESP_LOGI(TAG, "RX Queues:%u", SPI_RX_QUEUE_SIZE);
+#endif
 	register_hs_disable_pin(GPIO_CS);
 
 	/* Initialize SPI slave interface */
@@ -650,18 +710,36 @@ static interface_handle_t * esp_spi_init(void)
 	memset(&if_handle_g, 0, sizeof(if_handle_g));
 	if_handle_g.state = INIT;
 
-	spi_tx_sem = xSemaphoreCreateCounting(SPI_TX_QUEUE_SIZE*3, 0);
-	assert(spi_tx_sem != NULL);
-	spi_rx_sem = xSemaphoreCreateCounting(SPI_RX_QUEUE_SIZE*3, 0);
-	assert(spi_rx_sem != NULL);
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
+	spi_tx_sem = xSemaphoreCreateCounting(SPI_TX_TOTAL_QUEUE_SIZE, 0);
+	assert(spi_tx_sem);
+
+	spi_tx_queue[PRIO_Q_OTHERS] = xQueueCreate(SPI_TX_WIFI_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_tx_queue[PRIO_Q_OTHERS]);
+	spi_tx_queue[PRIO_Q_BT] = xQueueCreate(SPI_TX_BT_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_tx_queue[PRIO_Q_BT]);
+	spi_tx_queue[PRIO_Q_SERIAL] = xQueueCreate(SPI_TX_SERIAL_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_tx_queue[PRIO_Q_SERIAL]);
+#else
+	spi_tx_queue = xQueueCreate(SPI_TX_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_tx_queue);
+#endif
 
-	for (prio_q_idx=0; prio_q_idx<MAX_PRIORITY_QUEUES;prio_q_idx++) {
-		spi_rx_queue[prio_q_idx] = xQueueCreate(SPI_RX_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
-		assert(spi_rx_queue[prio_q_idx] != NULL);
+#ifdef CONFIG_ESP_ENABLE_RX_PRIORITY_QUEUES
+	spi_rx_sem = xSemaphoreCreateCounting(SPI_RX_TOTAL_QUEUE_SIZE, 0);
+	assert(spi_rx_sem);
+
+	spi_rx_queue[PRIO_Q_OTHERS] = xQueueCreate(SPI_RX_WIFI_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_rx_queue[PRIO_Q_OTHERS]);
+	spi_rx_queue[PRIO_Q_BT] = xQueueCreate(SPI_RX_BT_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_rx_queue[PRIO_Q_BT]);
+	spi_rx_queue[PRIO_Q_SERIAL] = xQueueCreate(SPI_RX_SERIAL_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_rx_queue[PRIO_Q_SERIAL]);
+#else
+	spi_rx_queue = xQueueCreate(SPI_RX_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
+	assert(spi_rx_queue);
+#endif
 
-		spi_tx_queue[prio_q_idx] = xQueueCreate(SPI_TX_QUEUE_SIZE, sizeof(interface_buffer_handle_t));
-		assert(spi_tx_queue[prio_q_idx] != NULL);
-	}
 
 	assert(xTaskCreate(spi_transaction_post_process_task , "spi_post_process_task" ,
 			CONFIG_ESP_DEFAULT_TASK_STACK_SIZE, NULL,
@@ -734,6 +812,7 @@ static int32_t esp_spi_write(interface_handle_t *handle, interface_buffer_handle
 				offset+buf_handle->payload_len));
 #endif
 
+#ifdef CONFIG_ESP_ENABLE_TX_PRIORITY_QUEUES
 	if (header->if_type == ESP_SERIAL_IF)
 		xQueueSend(spi_tx_queue[PRIO_Q_SERIAL], &tx_buf_handle, portMAX_DELAY);
 	else if (header->if_type == ESP_HCI_IF)
@@ -742,6 +821,9 @@ static int32_t esp_spi_write(interface_handle_t *handle, interface_buffer_handle
 		xQueueSend(spi_tx_queue[PRIO_Q_OTHERS], &tx_buf_handle, portMAX_DELAY);
 
 	xSemaphoreGive(spi_tx_sem);
+#else
+	xQueueSend(spi_tx_queue, &tx_buf_handle, portMAX_DELAY);
+#endif
 
 	/* indicate waiting data on ready pin */
 	set_dataready_gpio();
@@ -761,6 +843,7 @@ static int esp_spi_read(interface_handle_t *if_handle, interface_buffer_handle_t
 		return ESP_FAIL;
 	}
 
+#ifdef CONFIG_ESP_ENABLE_RX_PRIORITY_QUEUES
 	xSemaphoreTake(spi_rx_sem, portMAX_DELAY);
 
 	if (pdFALSE == xQueueReceive(spi_rx_queue[PRIO_Q_SERIAL], buf_handle, 0))
@@ -769,6 +852,9 @@ static int esp_spi_read(interface_handle_t *if_handle, interface_buffer_handle_t
 				ESP_LOGI(TAG, "%s No element in rx queue", __func__);
 		return ESP_FAIL;
 	}
+#else
+	xQueueReceive(spi_rx_queue, buf_handle, portMAX_DELAY);
+#endif
 
 	return buf_handle->payload_len;
 }

+ 7 - 0
esp/esp_driver/network_adapter/partitions.esp32.csv

@@ -0,0 +1,7 @@
+# ESP-IDF Partition Table
+# Name, Type, SubType, Offset, Size, Flags
+nvs,data,nvs,0x9000,16K,
+otadata,data,ota,0xd000,8K,
+phy_init,data,phy,0xf000,4K,
+ota_0,app,ota_0,0x110000,1M,
+ota_1,app,ota_1,0x210000,1M,

+ 7 - 0
esp/esp_driver/network_adapter/partitions.esp32c6.csv

@@ -0,0 +1,7 @@
+# ESP-IDF Partition Table
+# Name, Type, SubType, Offset, Size, Flags
+nvs,data,nvs,0x9000,16K,
+otadata,data,ota,0xd000,8K,
+phy_init,data,phy,0xf000,4K,
+ota_0,app,ota_0,0x10000,1536K,
+ota_1,app,ota_1,0x190000,1536K,

+ 6 - 7
esp/esp_driver/network_adapter/sdkconfig.defaults

@@ -1,17 +1,16 @@
 CONFIG_ESP32_DEFAULT_CPU_FREQ_160=y
 CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=160
-CONFIG_FREERTOS_UNICORE=y
-CONFIG_SDIO_DAT2_DISABLED=
+CONFIG_FREERTOS_HZ=1000
 
 # BT Configuration
 CONFIG_BT_ENABLED=y
 CONFIG_BT_CONTROLLER_ONLY=y
-CONFIG_BT_BLUEDROID_ENABLED=
-CONFIG_BTDM_CTRL_MODE_BTDM=y
-CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
-
-CONFIG_ESP32_WIFI_NVS_ENABLED=
 
 # OTA
 CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
 CONFIG_PARTITION_TABLE_TWO_OTA=y
+
+# Wifi NVS
+CONFIG_ESP_WIFI_NVS_ENABLED=y
+
+

+ 12 - 4
esp/esp_driver/network_adapter/sdkconfig.defaults.esp32

@@ -9,8 +9,10 @@ CONFIG_BT_BLUEDROID_ENABLED=
 CONFIG_BTDM_CONTROLLER_MODE_BTDM=y
 CONFIG_BTDM_CONTROLLER_HCI_MODE_VHCI=y
 CONFIG_BTDM_CTRL_AUTO_LATENCY=y
-
-CONFIG_ESP32_WIFI_NVS_ENABLED=
+CONFIG_BTDM_CONTROLLER_MODEM_SLEEP=y
+CONFIG_BTDM_CTRL_MODEM_SLEEP=y
+CONFIG_BTDM_CTRL_MODE_BTDM=y
+CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
 
 # BT over UART
 #CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4=y
@@ -20,7 +22,7 @@ CONFIG_ESP32_WIFI_NVS_ENABLED=
 
 #CO-EX config
 CONFIG_FREERTOS_UNICORE=n
-CONFIG_FREERTOS_HZ=400
+CONFIG_FREERTOS_HZ=1000
 CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y
 CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0
 CONFIG_BTDM_CTRL_PINNED_TO_CORE=0
@@ -33,4 +35,10 @@ CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=64
 
 # OTA
 CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
-CONFIG_PARTITION_TABLE_TWO_OTA=y
+
+# partitions
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.esp32.csv"
+
+# iram text optimization
+CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y

+ 1 - 6
esp/esp_driver/network_adapter/sdkconfig.defaults.esp32c2

@@ -7,10 +7,7 @@ CONFIG_SDIO_DAT2_DISABLED=
 CONFIG_BT_ENABLED=y
 CONFIG_BT_CONTROLLER_ONLY=y
 CONFIG_BT_BLUEDROID_ENABLED=
-CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
-CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
-CONFIG_BTDM_CTRL_MODE_BTDM=n
-CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
+CONFIG_BT_LE_SLEEP_ENABLE=y
 
 #UART pins, Enable below config, delete sdkconfig and rebuild
 #CONFIG_BT_LE_HCI_INTERFACE_USE_UART=y
@@ -18,8 +15,6 @@ CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
 #CONFIG_BT_LE_HCI_UART_TX_PIN=5
 #CONFIG_BT_LE_HCI_UART_RX_PIN=18
 
-CONFIG_ESP32_WIFI_NVS_ENABLED=
-
 CONFIG_ESPTOOLPY_FLASHSIZE_4MB=n
 CONFIG_ESPTOOLPY_FLASHSIZE_2MB=y
 CONFIG_PARTITION_TABLE_TWO_OTA=y

+ 1 - 6
esp/esp_driver/network_adapter/sdkconfig.defaults.esp32c3

@@ -7,9 +7,4 @@ CONFIG_SDIO_DAT2_DISABLED=
 CONFIG_BT_ENABLED=y
 CONFIG_BT_CONTROLLER_ONLY=y
 CONFIG_BT_BLUEDROID_ENABLED=
-CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
-CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
-CONFIG_BTDM_CTRL_MODE_BTDM=n
-CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
-
-CONFIG_ESP32_WIFI_NVS_ENABLED=
+CONFIG_BT_LE_SLEEP_ENABLE=y

+ 14 - 5
esp/esp_driver/network_adapter/sdkconfig.defaults.esp32c6

@@ -4,9 +4,7 @@ CONFIG_SDIO_DAT2_DISABLED=
 CONFIG_BT_ENABLED=y
 CONFIG_BT_CONTROLLER_ONLY=y
 CONFIG_BT_BLUEDROID_ENABLED=
-CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
-CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
-CONFIG_BTDM_CTRL_MODE_BTDM=n
+CONFIG_BT_LE_SLEEP_ENABLE=y
 
 # SPI/SDIO only
 CONFIG_BT_LE_HCI_INTERFACE_USE_RAM=y
@@ -21,6 +19,17 @@ CONFIG_BT_LE_HCI_UART_RX_PIN=12
 # #CONFIG_BT_LE_HCI_UART_RTS_PIN=9
 # #CONFIG_BT_LE_HCI_UART_CTS_PIN=13
 
-CONFIG_ESP32_WIFI_NVS_ENABLED=
-
 CONFIG_ESP_CACHE_MALLOC=y
+CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=40
+CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=60
+CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=40
+CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP_WIFI_TX_BA_WIN=32
+CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP_WIFI_RX_BA_WIN=32
+CONFIG_ESP_WIFI_ENABLE_WIFI_RX_STATS=n
+CONFIG_ESP_WIFI_ENABLE_WIFI_TX_STATS=n
+
+# partitions
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.esp32c6.csv"

+ 1 - 6
esp/esp_driver/network_adapter/sdkconfig.defaults.esp32s3

@@ -6,9 +6,4 @@ CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
 CONFIG_BT_ENABLED=y
 CONFIG_BT_CONTROLLER_ONLY=y
 CONFIG_BT_BLUEDROID_ENABLED=
-CONFIG_BTDM_CTRL_MODE_BLE_ONLY=y
-CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY=n
-CONFIG_BTDM_CTRL_MODE_BTDM=n
-CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
-
-CONFIG_ESP32_WIFI_NVS_ENABLED=
+CONFIG_BT_LE_SLEEP_ENABLE=y

+ 2135 - 0
esp/esp_driver/network_adapter/sdkconfig.old

@@ -0,0 +1,2135 @@
+#
+# Automatically generated file. DO NOT EDIT.
+# Espressif IoT Development Framework (ESP-IDF) 5.3.0 Project Configuration
+#
+CONFIG_SOC_BROWNOUT_RESET_SUPPORTED="Not determined"
+CONFIG_SOC_TWAI_BRP_DIV_SUPPORTED="Not determined"
+CONFIG_SOC_DPORT_WORKAROUND="Not determined"
+CONFIG_SOC_CAPS_ECO_VER_MAX=301
+CONFIG_SOC_ADC_SUPPORTED=y
+CONFIG_SOC_DAC_SUPPORTED=y
+CONFIG_SOC_UART_SUPPORTED=y
+CONFIG_SOC_MCPWM_SUPPORTED=y
+CONFIG_SOC_GPTIMER_SUPPORTED=y
+CONFIG_SOC_SDMMC_HOST_SUPPORTED=y
+CONFIG_SOC_BT_SUPPORTED=y
+CONFIG_SOC_PCNT_SUPPORTED=y
+CONFIG_SOC_PHY_SUPPORTED=y
+CONFIG_SOC_WIFI_SUPPORTED=y
+CONFIG_SOC_SDIO_SLAVE_SUPPORTED=y
+CONFIG_SOC_TWAI_SUPPORTED=y
+CONFIG_SOC_EFUSE_SUPPORTED=y
+CONFIG_SOC_EMAC_SUPPORTED=y
+CONFIG_SOC_ULP_SUPPORTED=y
+CONFIG_SOC_CCOMP_TIMER_SUPPORTED=y
+CONFIG_SOC_RTC_FAST_MEM_SUPPORTED=y
+CONFIG_SOC_RTC_SLOW_MEM_SUPPORTED=y
+CONFIG_SOC_RTC_MEM_SUPPORTED=y
+CONFIG_SOC_I2S_SUPPORTED=y
+CONFIG_SOC_RMT_SUPPORTED=y
+CONFIG_SOC_SDM_SUPPORTED=y
+CONFIG_SOC_GPSPI_SUPPORTED=y
+CONFIG_SOC_LEDC_SUPPORTED=y
+CONFIG_SOC_I2C_SUPPORTED=y
+CONFIG_SOC_SUPPORT_COEXISTENCE=y
+CONFIG_SOC_AES_SUPPORTED=y
+CONFIG_SOC_MPI_SUPPORTED=y
+CONFIG_SOC_SHA_SUPPORTED=y
+CONFIG_SOC_FLASH_ENC_SUPPORTED=y
+CONFIG_SOC_SECURE_BOOT_SUPPORTED=y
+CONFIG_SOC_TOUCH_SENSOR_SUPPORTED=y
+CONFIG_SOC_BOD_SUPPORTED=y
+CONFIG_SOC_ULP_FSM_SUPPORTED=y
+CONFIG_SOC_CLK_TREE_SUPPORTED=y
+CONFIG_SOC_MPU_SUPPORTED=y
+CONFIG_SOC_WDT_SUPPORTED=y
+CONFIG_SOC_SPI_FLASH_SUPPORTED=y
+CONFIG_SOC_RNG_SUPPORTED=y
+CONFIG_SOC_LIGHT_SLEEP_SUPPORTED=y
+CONFIG_SOC_DEEP_SLEEP_SUPPORTED=y
+CONFIG_SOC_LP_PERIPH_SHARE_INTERRUPT=y
+CONFIG_SOC_PM_SUPPORTED=y
+CONFIG_SOC_DPORT_WORKAROUND_DIS_INTERRUPT_LVL=5
+CONFIG_SOC_XTAL_SUPPORT_26M=y
+CONFIG_SOC_XTAL_SUPPORT_40M=y
+CONFIG_SOC_XTAL_SUPPORT_AUTO_DETECT=y
+CONFIG_SOC_ADC_RTC_CTRL_SUPPORTED=y
+CONFIG_SOC_ADC_DIG_CTRL_SUPPORTED=y
+CONFIG_SOC_ADC_DMA_SUPPORTED=y
+CONFIG_SOC_ADC_PERIPH_NUM=2
+CONFIG_SOC_ADC_MAX_CHANNEL_NUM=10
+CONFIG_SOC_ADC_ATTEN_NUM=4
+CONFIG_SOC_ADC_DIGI_CONTROLLER_NUM=2
+CONFIG_SOC_ADC_PATT_LEN_MAX=16
+CONFIG_SOC_ADC_DIGI_MIN_BITWIDTH=9
+CONFIG_SOC_ADC_DIGI_MAX_BITWIDTH=12
+CONFIG_SOC_ADC_DIGI_RESULT_BYTES=2
+CONFIG_SOC_ADC_DIGI_DATA_BYTES_PER_CONV=4
+CONFIG_SOC_ADC_DIGI_MONITOR_NUM=0
+CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_HIGH=2
+CONFIG_SOC_ADC_SAMPLE_FREQ_THRES_LOW=20
+CONFIG_SOC_ADC_RTC_MIN_BITWIDTH=9
+CONFIG_SOC_ADC_RTC_MAX_BITWIDTH=12
+CONFIG_SOC_ADC_SHARED_POWER=y
+CONFIG_SOC_SHARED_IDCACHE_SUPPORTED=y
+CONFIG_SOC_IDCACHE_PER_CORE=y
+CONFIG_SOC_CPU_CORES_NUM=2
+CONFIG_SOC_CPU_INTR_NUM=32
+CONFIG_SOC_CPU_HAS_FPU=y
+CONFIG_SOC_HP_CPU_HAS_MULTIPLE_CORES=y
+CONFIG_SOC_CPU_BREAKPOINTS_NUM=2
+CONFIG_SOC_CPU_WATCHPOINTS_NUM=2
+CONFIG_SOC_CPU_WATCHPOINT_MAX_REGION_SIZE=64
+CONFIG_SOC_DAC_CHAN_NUM=2
+CONFIG_SOC_DAC_RESOLUTION=8
+CONFIG_SOC_DAC_DMA_16BIT_ALIGN=y
+CONFIG_SOC_GPIO_PORT=1
+CONFIG_SOC_GPIO_PIN_COUNT=40
+CONFIG_SOC_GPIO_VALID_GPIO_MASK=0xFFFFFFFFFF
+CONFIG_SOC_GPIO_IN_RANGE_MAX=39
+CONFIG_SOC_GPIO_OUT_RANGE_MAX=33
+CONFIG_SOC_GPIO_VALID_DIGITAL_IO_PAD_MASK=0xEF0FEA
+CONFIG_SOC_GPIO_CLOCKOUT_BY_IO_MUX=y
+CONFIG_SOC_GPIO_CLOCKOUT_CHANNEL_NUM=3
+CONFIG_SOC_I2C_NUM=2
+CONFIG_SOC_HP_I2C_NUM=2
+CONFIG_SOC_I2C_FIFO_LEN=32
+CONFIG_SOC_I2C_CMD_REG_NUM=16
+CONFIG_SOC_I2C_SUPPORT_SLAVE=y
+CONFIG_SOC_I2C_SUPPORT_APB=y
+CONFIG_SOC_I2C_STOP_INDEPENDENT=y
+CONFIG_SOC_I2S_NUM=2
+CONFIG_SOC_I2S_HW_VERSION_1=y
+CONFIG_SOC_I2S_SUPPORTS_APLL=y
+CONFIG_SOC_I2S_SUPPORTS_PLL_F160M=y
+CONFIG_SOC_I2S_SUPPORTS_PDM=y
+CONFIG_SOC_I2S_SUPPORTS_PDM_TX=y
+CONFIG_SOC_I2S_PDM_MAX_TX_LINES=1
+CONFIG_SOC_I2S_SUPPORTS_PDM_RX=y
+CONFIG_SOC_I2S_PDM_MAX_RX_LINES=1
+CONFIG_SOC_I2S_SUPPORTS_ADC_DAC=y
+CONFIG_SOC_I2S_SUPPORTS_ADC=y
+CONFIG_SOC_I2S_SUPPORTS_DAC=y
+CONFIG_SOC_I2S_SUPPORTS_LCD_CAMERA=y
+CONFIG_SOC_I2S_TRANS_SIZE_ALIGN_WORD=y
+CONFIG_SOC_I2S_LCD_I80_VARIANT=y
+CONFIG_SOC_LCD_I80_SUPPORTED=y
+CONFIG_SOC_LCD_I80_BUSES=2
+CONFIG_SOC_LCD_I80_BUS_WIDTH=24
+CONFIG_SOC_LEDC_HAS_TIMER_SPECIFIC_MUX=y
+CONFIG_SOC_LEDC_SUPPORT_APB_CLOCK=y
+CONFIG_SOC_LEDC_SUPPORT_REF_TICK=y
+CONFIG_SOC_LEDC_SUPPORT_HS_MODE=y
+CONFIG_SOC_LEDC_CHANNEL_NUM=8
+CONFIG_SOC_LEDC_TIMER_BIT_WIDTH=20
+CONFIG_SOC_MCPWM_GROUPS=2
+CONFIG_SOC_MCPWM_TIMERS_PER_GROUP=3
+CONFIG_SOC_MCPWM_OPERATORS_PER_GROUP=3
+CONFIG_SOC_MCPWM_COMPARATORS_PER_OPERATOR=2
+CONFIG_SOC_MCPWM_GENERATORS_PER_OPERATOR=2
+CONFIG_SOC_MCPWM_TRIGGERS_PER_OPERATOR=2
+CONFIG_SOC_MCPWM_GPIO_FAULTS_PER_GROUP=3
+CONFIG_SOC_MCPWM_CAPTURE_TIMERS_PER_GROUP=y
+CONFIG_SOC_MCPWM_CAPTURE_CHANNELS_PER_TIMER=3
+CONFIG_SOC_MCPWM_GPIO_SYNCHROS_PER_GROUP=3
+CONFIG_SOC_MMU_PERIPH_NUM=2
+CONFIG_SOC_MMU_LINEAR_ADDRESS_REGION_NUM=3
+CONFIG_SOC_MPU_MIN_REGION_SIZE=0x20000000
+CONFIG_SOC_MPU_REGIONS_MAX_NUM=8
+CONFIG_SOC_PCNT_GROUPS=1
+CONFIG_SOC_PCNT_UNITS_PER_GROUP=8
+CONFIG_SOC_PCNT_CHANNELS_PER_UNIT=2
+CONFIG_SOC_PCNT_THRES_POINT_PER_UNIT=2
+CONFIG_SOC_RMT_GROUPS=1
+CONFIG_SOC_RMT_TX_CANDIDATES_PER_GROUP=8
+CONFIG_SOC_RMT_RX_CANDIDATES_PER_GROUP=8
+CONFIG_SOC_RMT_CHANNELS_PER_GROUP=8
+CONFIG_SOC_RMT_MEM_WORDS_PER_CHANNEL=64
+CONFIG_SOC_RMT_SUPPORT_REF_TICK=y
+CONFIG_SOC_RMT_SUPPORT_APB=y
+CONFIG_SOC_RMT_CHANNEL_CLK_INDEPENDENT=y
+CONFIG_SOC_RTCIO_PIN_COUNT=18
+CONFIG_SOC_RTCIO_INPUT_OUTPUT_SUPPORTED=y
+CONFIG_SOC_RTCIO_HOLD_SUPPORTED=y
+CONFIG_SOC_RTCIO_WAKE_SUPPORTED=y
+CONFIG_SOC_SDM_GROUPS=1
+CONFIG_SOC_SDM_CHANNELS_PER_GROUP=8
+CONFIG_SOC_SDM_CLK_SUPPORT_APB=y
+CONFIG_SOC_SPI_HD_BOTH_INOUT_SUPPORTED=y
+CONFIG_SOC_SPI_AS_CS_SUPPORTED=y
+CONFIG_SOC_SPI_PERIPH_NUM=3
+CONFIG_SOC_SPI_DMA_CHAN_NUM=2
+CONFIG_SOC_SPI_MAX_CS_NUM=3
+CONFIG_SOC_SPI_SUPPORT_CLK_APB=y
+CONFIG_SOC_SPI_MAXIMUM_BUFFER_SIZE=64
+CONFIG_SOC_SPI_MAX_PRE_DIVIDER=8192
+CONFIG_SOC_MEMSPI_SRC_FREQ_80M_SUPPORTED=y
+CONFIG_SOC_MEMSPI_SRC_FREQ_40M_SUPPORTED=y
+CONFIG_SOC_MEMSPI_SRC_FREQ_26M_SUPPORTED=y
+CONFIG_SOC_MEMSPI_SRC_FREQ_20M_SUPPORTED=y
+CONFIG_SOC_TIMER_GROUPS=2
+CONFIG_SOC_TIMER_GROUP_TIMERS_PER_GROUP=2
+CONFIG_SOC_TIMER_GROUP_COUNTER_BIT_WIDTH=64
+CONFIG_SOC_TIMER_GROUP_TOTAL_TIMERS=4
+CONFIG_SOC_TIMER_GROUP_SUPPORT_APB=y
+CONFIG_SOC_TOUCH_SENSOR_VERSION=1
+CONFIG_SOC_TOUCH_SENSOR_NUM=10
+CONFIG_SOC_TOUCH_SAMPLE_CFG_NUM=1
+CONFIG_SOC_TWAI_CONTROLLER_NUM=1
+CONFIG_SOC_TWAI_BRP_MIN=2
+CONFIG_SOC_TWAI_CLK_SUPPORT_APB=y
+CONFIG_SOC_TWAI_SUPPORT_MULTI_ADDRESS_LAYOUT=y
+CONFIG_SOC_UART_NUM=3
+CONFIG_SOC_UART_HP_NUM=3
+CONFIG_SOC_UART_SUPPORT_APB_CLK=y
+CONFIG_SOC_UART_SUPPORT_REF_TICK=y
+CONFIG_SOC_UART_FIFO_LEN=128
+CONFIG_SOC_UART_BITRATE_MAX=5000000
+CONFIG_SOC_SPIRAM_SUPPORTED=y
+CONFIG_SOC_SPI_MEM_SUPPORT_CONFIG_GPIO_BY_EFUSE=y
+CONFIG_SOC_SHA_SUPPORT_PARALLEL_ENG=y
+CONFIG_SOC_SHA_ENDIANNESS_BE=y
+CONFIG_SOC_SHA_SUPPORT_SHA1=y
+CONFIG_SOC_SHA_SUPPORT_SHA256=y
+CONFIG_SOC_SHA_SUPPORT_SHA384=y
+CONFIG_SOC_SHA_SUPPORT_SHA512=y
+CONFIG_SOC_MPI_MEM_BLOCKS_NUM=4
+CONFIG_SOC_MPI_OPERATIONS_NUM=y
+CONFIG_SOC_RSA_MAX_BIT_LEN=4096
+CONFIG_SOC_AES_SUPPORT_AES_128=y
+CONFIG_SOC_AES_SUPPORT_AES_192=y
+CONFIG_SOC_AES_SUPPORT_AES_256=y
+CONFIG_SOC_SECURE_BOOT_V1=y
+CONFIG_SOC_EFUSE_SECURE_BOOT_KEY_DIGESTS=y
+CONFIG_SOC_FLASH_ENCRYPTED_XTS_AES_BLOCK_MAX=32
+CONFIG_SOC_PHY_DIG_REGS_MEM_SIZE=21
+CONFIG_SOC_PM_SUPPORT_EXT0_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_EXT1_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_EXT_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_TOUCH_SENSOR_WAKEUP=y
+CONFIG_SOC_PM_SUPPORT_RTC_PERIPH_PD=y
+CONFIG_SOC_PM_SUPPORT_RTC_FAST_MEM_PD=y
+CONFIG_SOC_PM_SUPPORT_RTC_SLOW_MEM_PD=y
+CONFIG_SOC_PM_SUPPORT_RC_FAST_PD=y
+CONFIG_SOC_PM_SUPPORT_VDDSDIO_PD=y
+CONFIG_SOC_PM_SUPPORT_MODEM_PD=y
+CONFIG_SOC_CONFIGURABLE_VDDSDIO_SUPPORTED=y
+CONFIG_SOC_CLK_APLL_SUPPORTED=y
+CONFIG_SOC_CLK_RC_FAST_D256_SUPPORTED=y
+CONFIG_SOC_RTC_SLOW_CLK_SUPPORT_RC_FAST_D256=y
+CONFIG_SOC_CLK_RC_FAST_SUPPORT_CALIBRATION=y
+CONFIG_SOC_CLK_XTAL32K_SUPPORTED=y
+CONFIG_SOC_SDMMC_USE_IOMUX=y
+CONFIG_SOC_SDMMC_NUM_SLOTS=2
+CONFIG_SOC_WIFI_WAPI_SUPPORT=y
+CONFIG_SOC_WIFI_CSI_SUPPORT=y
+CONFIG_SOC_WIFI_MESH_SUPPORT=y
+CONFIG_SOC_WIFI_SUPPORT_VARIABLE_BEACON_WINDOW=y
+CONFIG_SOC_WIFI_NAN_SUPPORT=y
+CONFIG_SOC_BLE_SUPPORTED=y
+CONFIG_SOC_BLE_MESH_SUPPORTED=y
+CONFIG_SOC_BT_CLASSIC_SUPPORTED=y
+CONFIG_SOC_BLUFI_SUPPORTED=y
+CONFIG_SOC_BT_H2C_ENC_KEY_CTRL_ENH_VSC_SUPPORTED=y
+CONFIG_SOC_ULP_HAS_ADC=y
+CONFIG_SOC_PHY_COMBO_MODULE=y
+CONFIG_SOC_EMAC_RMII_CLK_OUT_INTERNAL_LOOPBACK=y
+CONFIG_IDF_CMAKE=y
+CONFIG_IDF_TOOLCHAIN="gcc"
+CONFIG_IDF_TARGET_ARCH_XTENSA=y
+CONFIG_IDF_TARGET_ARCH="xtensa"
+CONFIG_IDF_TARGET="esp32"
+CONFIG_IDF_INIT_VERSION="5.3.0"
+CONFIG_IDF_TARGET_ESP32=y
+CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000
+
+#
+# Build type
+#
+CONFIG_APP_BUILD_TYPE_APP_2NDBOOT=y
+# CONFIG_APP_BUILD_TYPE_RAM is not set
+CONFIG_APP_BUILD_GENERATE_BINARIES=y
+CONFIG_APP_BUILD_BOOTLOADER=y
+CONFIG_APP_BUILD_USE_FLASH_SECTIONS=y
+# CONFIG_APP_REPRODUCIBLE_BUILD is not set
+# CONFIG_APP_NO_BLOBS is not set
+# CONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
+# CONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set
+# end of Build type
+
+#
+# Bootloader config
+#
+
+#
+# Bootloader manager
+#
+CONFIG_BOOTLOADER_COMPILE_TIME_DATE=y
+CONFIG_BOOTLOADER_PROJECT_VER=1
+# end of Bootloader manager
+
+CONFIG_BOOTLOADER_OFFSET_IN_FLASH=0x1000
+CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_SIZE=y
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_DEBUG is not set
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_PERF is not set
+# CONFIG_BOOTLOADER_COMPILER_OPTIMIZATION_NONE is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
+CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
+# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
+# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
+CONFIG_BOOTLOADER_LOG_LEVEL=3
+
+#
+# Serial Flash Configurations
+#
+# CONFIG_BOOTLOADER_FLASH_DC_AWARE is not set
+CONFIG_BOOTLOADER_FLASH_XMC_SUPPORT=y
+# end of Serial Flash Configurations
+
+# CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_8V is not set
+CONFIG_BOOTLOADER_VDDSDIO_BOOST_1_9V=y
+# CONFIG_BOOTLOADER_FACTORY_RESET is not set
+# CONFIG_BOOTLOADER_APP_TEST is not set
+CONFIG_BOOTLOADER_REGION_PROTECTION_ENABLE=y
+CONFIG_BOOTLOADER_WDT_ENABLE=y
+# CONFIG_BOOTLOADER_WDT_DISABLE_IN_USER_CODE is not set
+CONFIG_BOOTLOADER_WDT_TIME_MS=9000
+# CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_ON_POWER_ON is not set
+# CONFIG_BOOTLOADER_SKIP_VALIDATE_ALWAYS is not set
+CONFIG_BOOTLOADER_RESERVE_RTC_SIZE=0
+# CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC is not set
+# end of Bootloader config
+
+#
+# Security features
+#
+CONFIG_SECURE_BOOT_V1_SUPPORTED=y
+# CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT is not set
+# CONFIG_SECURE_BOOT is not set
+# CONFIG_SECURE_FLASH_ENC_ENABLED is not set
+# end of Security features
+
+#
+# Application manager
+#
+CONFIG_APP_COMPILE_TIME_DATE=y
+# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
+# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
+# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set
+CONFIG_APP_RETRIEVE_LEN_ELF_SHA=9
+# end of Application manager
+
+CONFIG_ESP_ROM_HAS_CRC_LE=y
+CONFIG_ESP_ROM_HAS_CRC_BE=y
+CONFIG_ESP_ROM_HAS_MZ_CRC32=y
+CONFIG_ESP_ROM_HAS_JPEG_DECODE=y
+CONFIG_ESP_ROM_HAS_UART_BUF_SWITCH=y
+CONFIG_ESP_ROM_NEEDS_SWSETUP_WORKAROUND=y
+CONFIG_ESP_ROM_HAS_NEWLIB=y
+CONFIG_ESP_ROM_HAS_NEWLIB_NANO_FORMAT=y
+CONFIG_ESP_ROM_HAS_NEWLIB_32BIT_TIME=y
+CONFIG_ESP_ROM_HAS_SW_FLOAT=y
+CONFIG_ESP_ROM_USB_OTG_NUM=-1
+CONFIG_ESP_ROM_USB_SERIAL_DEVICE_NUM=-1
+CONFIG_ESP_ROM_SUPPORT_DEEP_SLEEP_WAKEUP_STUB=y
+
+#
+# Serial flasher config
+#
+# CONFIG_ESPTOOLPY_NO_STUB is not set
+# CONFIG_ESPTOOLPY_FLASHMODE_QIO is not set
+# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
+CONFIG_ESPTOOLPY_FLASHMODE_DIO=y
+# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set
+CONFIG_ESPTOOLPY_FLASH_SAMPLE_MODE_STR=y
+CONFIG_ESPTOOLPY_FLASHMODE="dio"
+# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ_40M=y
+# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set
+# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set
+CONFIG_ESPTOOLPY_FLASHFREQ="40m"
+# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE_4MB=y
+# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_32MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_64MB is not set
+# CONFIG_ESPTOOLPY_FLASHSIZE_128MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE="4MB"
+# CONFIG_ESPTOOLPY_HEADER_FLASHSIZE_UPDATE is not set
+CONFIG_ESPTOOLPY_BEFORE_RESET=y
+# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
+CONFIG_ESPTOOLPY_BEFORE="default_reset"
+CONFIG_ESPTOOLPY_AFTER_RESET=y
+# CONFIG_ESPTOOLPY_AFTER_NORESET is not set
+CONFIG_ESPTOOLPY_AFTER="hard_reset"
+CONFIG_ESPTOOLPY_MONITOR_BAUD=115200
+# end of Serial flasher config
+
+#
+# Partition Table
+#
+# CONFIG_PARTITION_TABLE_SINGLE_APP is not set
+# CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE is not set
+# CONFIG_PARTITION_TABLE_TWO_OTA is not set
+CONFIG_PARTITION_TABLE_CUSTOM=y
+CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.esp32.csv"
+CONFIG_PARTITION_TABLE_FILENAME="partitions.esp32.csv"
+CONFIG_PARTITION_TABLE_OFFSET=0x8000
+CONFIG_PARTITION_TABLE_MD5=y
+# end of Partition Table
+
+#
+# Example Configuration
+#
+CONFIG_ESP_SDIO_HOST_INTERFACE=y
+# CONFIG_ESP_SPI_HOST_INTERFACE is not set
+
+#
+# SDIO Configuration
+#
+# CONFIG_ESP_SDIO_DEFAULT_SPEED is not set
+CONFIG_ESP_SDIO_HIGH_SPEED=y
+# CONFIG_ESP_SDIO_CHECKSUM is not set
+# end of SDIO Configuration
+
+CONFIG_ESP_DEFAULT_TASK_STACK_SIZE=4096
+CONFIG_ESP_DEFAULT_TASK_PRIO=22
+CONFIG_ESP_CACHE_MALLOC=y
+CONFIG_ESP_OTA_WORKAROUND=y
+
+#
+# Enable Debug logs
+#
+# CONFIG_ESP_SERIAL_DEBUG is not set
+# CONFIG_ESP_WLAN_DEBUG is not set
+# CONFIG_ESP_BT_DEBUG is not set
+# end of Enable Debug logs
+# end of Example Configuration
+
+#
+# Compiler options
+#
+CONFIG_COMPILER_OPTIMIZATION_DEBUG=y
+# CONFIG_COMPILER_OPTIMIZATION_SIZE is not set
+# CONFIG_COMPILER_OPTIMIZATION_PERF is not set
+# CONFIG_COMPILER_OPTIMIZATION_NONE is not set
+CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y
+# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set
+# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set
+CONFIG_COMPILER_FLOAT_LIB_FROM_GCCLIB=y
+CONFIG_COMPILER_OPTIMIZATION_ASSERTION_LEVEL=2
+# CONFIG_COMPILER_OPTIMIZATION_CHECKS_SILENT is not set
+CONFIG_COMPILER_HIDE_PATHS_MACROS=y
+# CONFIG_COMPILER_CXX_EXCEPTIONS is not set
+# CONFIG_COMPILER_CXX_RTTI is not set
+CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
+# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set
+# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set
+# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set
+# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set
+# CONFIG_COMPILER_DISABLE_GCC12_WARNINGS is not set
+# CONFIG_COMPILER_DISABLE_GCC13_WARNINGS is not set
+# CONFIG_COMPILER_DUMP_RTL_FILES is not set
+CONFIG_COMPILER_RT_LIB_GCCLIB=y
+CONFIG_COMPILER_RT_LIB_NAME="gcc"
+# CONFIG_COMPILER_ORPHAN_SECTIONS_WARNING is not set
+CONFIG_COMPILER_ORPHAN_SECTIONS_PLACE=y
+# end of Compiler options
+
+#
+# Component config
+#
+
+#
+# Application Level Tracing
+#
+# CONFIG_APPTRACE_DEST_JTAG is not set
+CONFIG_APPTRACE_DEST_NONE=y
+# CONFIG_APPTRACE_DEST_UART1 is not set
+# CONFIG_APPTRACE_DEST_UART2 is not set
+CONFIG_APPTRACE_DEST_UART_NONE=y
+CONFIG_APPTRACE_UART_TASK_PRIO=1
+CONFIG_APPTRACE_LOCK_ENABLE=y
+# end of Application Level Tracing
+
+#
+# Bluetooth
+#
+CONFIG_BT_ENABLED=y
+# CONFIG_BT_BLUEDROID_ENABLED is not set
+# CONFIG_BT_NIMBLE_ENABLED is not set
+CONFIG_BT_CONTROLLER_ONLY=y
+CONFIG_BT_CONTROLLER_ENABLED=y
+# CONFIG_BT_CONTROLLER_DISABLED is not set
+
+#
+# Controller Options
+#
+# CONFIG_BTDM_CTRL_MODE_BLE_ONLY is not set
+# CONFIG_BTDM_CTRL_MODE_BR_EDR_ONLY is not set
+CONFIG_BTDM_CTRL_MODE_BTDM=y
+CONFIG_BTDM_CTRL_BLE_MAX_CONN=3
+CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN=2
+CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN=0
+# CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_HCI is not set
+CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_PCM=y
+CONFIG_BTDM_CTRL_BR_EDR_SCO_DATA_PATH_EFF=1
+CONFIG_BTDM_CTRL_PCM_ROLE_EDGE_CONFIG=y
+CONFIG_BTDM_CTRL_PCM_ROLE_MASTER=y
+# CONFIG_BTDM_CTRL_PCM_ROLE_SLAVE is not set
+CONFIG_BTDM_CTRL_PCM_POLAR_FALLING_EDGE=y
+# CONFIG_BTDM_CTRL_PCM_POLAR_RISING_EDGE is not set
+CONFIG_BTDM_CTRL_PCM_ROLE_EFF=0
+CONFIG_BTDM_CTRL_PCM_POLAR_EFF=0
+CONFIG_BTDM_CTRL_AUTO_LATENCY=y
+CONFIG_BTDM_CTRL_AUTO_LATENCY_EFF=y
+CONFIG_BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT=y
+CONFIG_BTDM_CTRL_LEGACY_AUTH_VENDOR_EVT_EFF=y
+CONFIG_BTDM_CTRL_BLE_MAX_CONN_EFF=3
+CONFIG_BTDM_CTRL_BR_EDR_MAX_ACL_CONN_EFF=2
+CONFIG_BTDM_CTRL_BR_EDR_MAX_SYNC_CONN_EFF=0
+CONFIG_BTDM_CTRL_PINNED_TO_CORE_0=y
+# CONFIG_BTDM_CTRL_PINNED_TO_CORE_1 is not set
+CONFIG_BTDM_CTRL_PINNED_TO_CORE=0
+CONFIG_BTDM_CTRL_HCI_MODE_VHCI=y
+# CONFIG_BTDM_CTRL_HCI_MODE_UART_H4 is not set
+
+#
+# MODEM SLEEP Options
+#
+CONFIG_BTDM_CTRL_MODEM_SLEEP=y
+CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_ORIG=y
+# CONFIG_BTDM_CTRL_MODEM_SLEEP_MODE_EVED is not set
+CONFIG_BTDM_CTRL_LPCLK_SEL_MAIN_XTAL=y
+# end of MODEM SLEEP Options
+
+CONFIG_BTDM_BLE_DEFAULT_SCA_250PPM=y
+CONFIG_BTDM_BLE_SLEEP_CLOCK_ACCURACY_INDEX_EFF=1
+CONFIG_BTDM_BLE_SCAN_DUPL=y
+CONFIG_BTDM_SCAN_DUPL_TYPE_DEVICE=y
+# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA is not set
+# CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE is not set
+CONFIG_BTDM_SCAN_DUPL_TYPE=0
+CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=100
+CONFIG_BTDM_SCAN_DUPL_CACHE_REFRESH_PERIOD=0
+# CONFIG_BTDM_BLE_MESH_SCAN_DUPL_EN is not set
+CONFIG_BTDM_CTRL_FULL_SCAN_SUPPORTED=y
+# CONFIG_BTDM_CTRL_SCAN_BACKOFF_UPPERLIMITMAX is not set
+CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_SUPP=y
+CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100
+CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20
+CONFIG_BTDM_RESERVE_DRAM=0xdb5c
+CONFIG_BTDM_CTRL_HLI=y
+# end of Controller Options
+
+CONFIG_BT_ALARM_MAX_NUM=50
+# end of Bluetooth
+
+# CONFIG_BLE_MESH is not set
+
+#
+# Console Library
+#
+# CONFIG_CONSOLE_SORTED_HELP is not set
+# end of Console Library
+
+#
+# Driver Configurations
+#
+
+#
+# TWAI Configuration
+#
+# CONFIG_TWAI_ISR_IN_IRAM is not set
+CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y
+CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y
+CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y
+CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y
+CONFIG_TWAI_ERRATA_FIX_LISTEN_ONLY_DOM=y
+# end of TWAI Configuration
+
+#
+# Legacy ADC Driver Configuration
+#
+CONFIG_ADC_DISABLE_DAC=y
+# CONFIG_ADC_SUPPRESS_DEPRECATE_WARN is not set
+
+#
+# Legacy ADC Calibration Configuration
+#
+CONFIG_ADC_CAL_EFUSE_TP_ENABLE=y
+CONFIG_ADC_CAL_EFUSE_VREF_ENABLE=y
+CONFIG_ADC_CAL_LUT_ENABLE=y
+# CONFIG_ADC_CALI_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy ADC Calibration Configuration
+# end of Legacy ADC Driver Configuration
+
+#
+# Legacy DAC Driver Configurations
+#
+# CONFIG_DAC_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy DAC Driver Configurations
+
+#
+# Legacy MCPWM Driver Configurations
+#
+# CONFIG_MCPWM_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy MCPWM Driver Configurations
+
+#
+# Legacy Timer Group Driver Configurations
+#
+# CONFIG_GPTIMER_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy Timer Group Driver Configurations
+
+#
+# Legacy RMT Driver Configurations
+#
+# CONFIG_RMT_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy RMT Driver Configurations
+
+#
+# Legacy I2S Driver Configurations
+#
+# CONFIG_I2S_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy I2S Driver Configurations
+
+#
+# Legacy PCNT Driver Configurations
+#
+# CONFIG_PCNT_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy PCNT Driver Configurations
+
+#
+# Legacy SDM Driver Configurations
+#
+# CONFIG_SDM_SUPPRESS_DEPRECATE_WARN is not set
+# end of Legacy SDM Driver Configurations
+# end of Driver Configurations
+
+#
+# eFuse Bit Manager
+#
+# CONFIG_EFUSE_CUSTOM_TABLE is not set
+# CONFIG_EFUSE_VIRTUAL is not set
+# CONFIG_EFUSE_CODE_SCHEME_COMPAT_NONE is not set
+CONFIG_EFUSE_CODE_SCHEME_COMPAT_3_4=y
+# CONFIG_EFUSE_CODE_SCHEME_COMPAT_REPEAT is not set
+CONFIG_EFUSE_MAX_BLK_LEN=192
+# end of eFuse Bit Manager
+
+#
+# ESP-TLS
+#
+CONFIG_ESP_TLS_USING_MBEDTLS=y
+# CONFIG_ESP_TLS_USE_SECURE_ELEMENT is not set
+# CONFIG_ESP_TLS_CLIENT_SESSION_TICKETS is not set
+# CONFIG_ESP_TLS_SERVER_SESSION_TICKETS is not set
+# CONFIG_ESP_TLS_SERVER_CERT_SELECT_HOOK is not set
+# CONFIG_ESP_TLS_SERVER_MIN_AUTH_MODE_OPTIONAL is not set
+# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
+# CONFIG_ESP_TLS_INSECURE is not set
+# end of ESP-TLS
+
+#
+# ADC and ADC Calibration
+#
+# CONFIG_ADC_ONESHOT_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_ADC_CONTINUOUS_ISR_IRAM_SAFE is not set
+
+#
+# ADC Calibration Configurations
+#
+CONFIG_ADC_CALI_EFUSE_TP_ENABLE=y
+CONFIG_ADC_CALI_EFUSE_VREF_ENABLE=y
+CONFIG_ADC_CALI_LUT_ENABLE=y
+# end of ADC Calibration Configurations
+
+CONFIG_ADC_DISABLE_DAC_OUTPUT=y
+# CONFIG_ADC_ENABLE_DEBUG_LOG is not set
+# end of ADC and ADC Calibration
+
+#
+# Wireless Coexistence
+#
+CONFIG_ESP_COEX_ENABLED=y
+CONFIG_ESP_COEX_SW_COEXIST_ENABLE=y
+# CONFIG_ESP_COEX_POWER_MANAGEMENT is not set
+# end of Wireless Coexistence
+
+#
+# Common ESP-related
+#
+CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
+# end of Common ESP-related
+
+#
+# ESP-Driver:DAC Configurations
+#
+# CONFIG_DAC_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_DAC_ISR_IRAM_SAFE is not set
+# CONFIG_DAC_ENABLE_DEBUG_LOG is not set
+CONFIG_DAC_DMA_AUTO_16BIT_ALIGN=y
+# end of ESP-Driver:DAC Configurations
+
+#
+# ESP-Driver:GPIO Configurations
+#
+# CONFIG_GPIO_ESP32_SUPPORT_SWITCH_SLP_PULL is not set
+# CONFIG_GPIO_CTRL_FUNC_IN_IRAM is not set
+# end of ESP-Driver:GPIO Configurations
+
+#
+# ESP-Driver:GPTimer Configurations
+#
+CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=y
+# CONFIG_GPTIMER_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_GPTIMER_ISR_IRAM_SAFE is not set
+# CONFIG_GPTIMER_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:GPTimer Configurations
+
+#
+# ESP-Driver:I2C Configurations
+#
+# CONFIG_I2C_ISR_IRAM_SAFE is not set
+# CONFIG_I2C_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:I2C Configurations
+
+#
+# ESP-Driver:I2S Configurations
+#
+# CONFIG_I2S_ISR_IRAM_SAFE is not set
+# CONFIG_I2S_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:I2S Configurations
+
+#
+# ESP-Driver:LEDC Configurations
+#
+# CONFIG_LEDC_CTRL_FUNC_IN_IRAM is not set
+# end of ESP-Driver:LEDC Configurations
+
+#
+# ESP-Driver:MCPWM Configurations
+#
+# CONFIG_MCPWM_ISR_IRAM_SAFE is not set
+# CONFIG_MCPWM_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_MCPWM_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:MCPWM Configurations
+
+#
+# ESP-Driver:PCNT Configurations
+#
+# CONFIG_PCNT_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_PCNT_ISR_IRAM_SAFE is not set
+# CONFIG_PCNT_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:PCNT Configurations
+
+#
+# ESP-Driver:RMT Configurations
+#
+# CONFIG_RMT_ISR_IRAM_SAFE is not set
+# CONFIG_RMT_RECV_FUNC_IN_IRAM is not set
+# CONFIG_RMT_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:RMT Configurations
+
+#
+# ESP-Driver:Sigma Delta Modulator Configurations
+#
+# CONFIG_SDM_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_SDM_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:Sigma Delta Modulator Configurations
+
+#
+# ESP-Driver:SPI Configurations
+#
+CONFIG_SPI_MASTER_ISR_IN_IRAM=y
+# CONFIG_SPI_SLAVE_IN_IRAM is not set
+CONFIG_SPI_SLAVE_ISR_IN_IRAM=y
+# end of ESP-Driver:SPI Configurations
+
+#
+# ESP-Driver:Touch Sensor Configurations
+#
+# CONFIG_TOUCH_CTRL_FUNC_IN_IRAM is not set
+# CONFIG_TOUCH_ISR_IRAM_SAFE is not set
+# CONFIG_TOUCH_ENABLE_DEBUG_LOG is not set
+# end of ESP-Driver:Touch Sensor Configurations
+
+#
+# ESP-Driver:UART Configurations
+#
+# CONFIG_UART_ISR_IN_IRAM is not set
+# end of ESP-Driver:UART Configurations
+
+#
+# Ethernet
+#
+CONFIG_ETH_ENABLED=y
+CONFIG_ETH_USE_ESP32_EMAC=y
+CONFIG_ETH_PHY_INTERFACE_RMII=y
+CONFIG_ETH_RMII_CLK_INPUT=y
+# CONFIG_ETH_RMII_CLK_OUTPUT is not set
+CONFIG_ETH_RMII_CLK_IN_GPIO=0
+CONFIG_ETH_DMA_BUFFER_SIZE=512
+CONFIG_ETH_DMA_RX_BUFFER_NUM=10
+CONFIG_ETH_DMA_TX_BUFFER_NUM=10
+# CONFIG_ETH_IRAM_OPTIMIZATION is not set
+CONFIG_ETH_USE_SPI_ETHERNET=y
+# CONFIG_ETH_SPI_ETHERNET_DM9051 is not set
+# CONFIG_ETH_SPI_ETHERNET_W5500 is not set
+# CONFIG_ETH_SPI_ETHERNET_KSZ8851SNL is not set
+# CONFIG_ETH_USE_OPENETH is not set
+# CONFIG_ETH_TRANSMIT_MUTEX is not set
+# end of Ethernet
+
+#
+# Event Loop Library
+#
+# CONFIG_ESP_EVENT_LOOP_PROFILING is not set
+CONFIG_ESP_EVENT_POST_FROM_ISR=y
+CONFIG_ESP_EVENT_POST_FROM_IRAM_ISR=y
+# end of Event Loop Library
+
+#
+# GDB Stub
+#
+CONFIG_ESP_GDBSTUB_ENABLED=y
+# CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME is not set
+CONFIG_ESP_GDBSTUB_SUPPORT_TASKS=y
+CONFIG_ESP_GDBSTUB_MAX_TASKS=32
+# end of GDB Stub
+
+#
+# ESP HTTP client
+#
+CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH is not set
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_CUSTOM_TRANSPORT is not set
+# end of ESP HTTP client
+
+#
+# HTTP Server
+#
+CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
+CONFIG_HTTPD_MAX_URI_LEN=512
+CONFIG_HTTPD_ERR_RESP_NO_DELAY=y
+CONFIG_HTTPD_PURGE_BUF_LEN=32
+# CONFIG_HTTPD_LOG_PURGE_DATA is not set
+# CONFIG_HTTPD_WS_SUPPORT is not set
+# CONFIG_HTTPD_QUEUE_WORK_BLOCKING is not set
+# end of HTTP Server
+
+#
+# ESP HTTPS OTA
+#
+# CONFIG_ESP_HTTPS_OTA_DECRYPT_CB is not set
+# CONFIG_ESP_HTTPS_OTA_ALLOW_HTTP is not set
+# end of ESP HTTPS OTA
+
+#
+# ESP HTTPS server
+#
+# CONFIG_ESP_HTTPS_SERVER_ENABLE is not set
+# end of ESP HTTPS server
+
+#
+# Hardware Settings
+#
+
+#
+# Chip revision
+#
+CONFIG_ESP32_REV_MIN_0=y
+# CONFIG_ESP32_REV_MIN_1 is not set
+# CONFIG_ESP32_REV_MIN_1_1 is not set
+# CONFIG_ESP32_REV_MIN_2 is not set
+# CONFIG_ESP32_REV_MIN_3 is not set
+# CONFIG_ESP32_REV_MIN_3_1 is not set
+CONFIG_ESP32_REV_MIN=0
+CONFIG_ESP32_REV_MIN_FULL=0
+CONFIG_ESP_REV_MIN_FULL=0
+
+#
+# Maximum Supported ESP32 Revision (Rev v3.99)
+#
+CONFIG_ESP32_REV_MAX_FULL=399
+CONFIG_ESP_REV_MAX_FULL=399
+# end of Chip revision
+
+#
+# MAC Config
+#
+CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_STA=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_WIFI_AP=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_BT=y
+CONFIG_ESP_MAC_ADDR_UNIVERSE_ETH=y
+CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES_FOUR=y
+CONFIG_ESP_MAC_UNIVERSAL_MAC_ADDRESSES=4
+# CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_TWO is not set
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES_FOUR=y
+CONFIG_ESP32_UNIVERSAL_MAC_ADDRESSES=4
+# CONFIG_ESP_MAC_IGNORE_MAC_CRC_ERROR is not set
+# CONFIG_ESP_MAC_USE_CUSTOM_MAC_AS_BASE_MAC is not set
+# end of MAC Config
+
+#
+# Sleep Config
+#
+# CONFIG_ESP_SLEEP_POWER_DOWN_FLASH is not set
+CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND=y
+# CONFIG_ESP_SLEEP_MSPI_NEED_ALL_IO_PU is not set
+CONFIG_ESP_SLEEP_RTC_BUS_ISO_WORKAROUND=y
+# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set
+CONFIG_ESP_SLEEP_WAIT_FLASH_READY_EXTRA_DELAY=2000
+# CONFIG_ESP_SLEEP_CACHE_SAFE_ASSERTION is not set
+# CONFIG_ESP_SLEEP_DEBUG is not set
+CONFIG_ESP_SLEEP_GPIO_ENABLE_INTERNAL_RESISTORS=y
+# end of Sleep Config
+
+#
+# RTC Clock Config
+#
+CONFIG_RTC_CLK_SRC_INT_RC=y
+# CONFIG_RTC_CLK_SRC_EXT_CRYS is not set
+# CONFIG_RTC_CLK_SRC_EXT_OSC is not set
+# CONFIG_RTC_CLK_SRC_INT_8MD256 is not set
+CONFIG_RTC_CLK_CAL_CYCLES=1024
+# end of RTC Clock Config
+
+#
+# Peripheral Control
+#
+CONFIG_PERIPH_CTRL_FUNC_IN_IRAM=y
+# end of Peripheral Control
+
+#
+# Main XTAL Config
+#
+# CONFIG_XTAL_FREQ_26 is not set
+CONFIG_XTAL_FREQ_40=y
+# CONFIG_XTAL_FREQ_AUTO is not set
+CONFIG_XTAL_FREQ=40
+# end of Main XTAL Config
+
+CONFIG_ESP_SPI_BUS_LOCK_ISR_FUNCS_IN_IRAM=y
+# end of Hardware Settings
+
+#
+# LCD and Touch Panel
+#
+
+#
+# LCD Touch Drivers are maintained in the IDF Component Registry
+#
+
+#
+# LCD Peripheral Configuration
+#
+CONFIG_LCD_PANEL_IO_FORMAT_BUF_SIZE=32
+# CONFIG_LCD_ENABLE_DEBUG_LOG is not set
+# end of LCD Peripheral Configuration
+# end of LCD and Touch Panel
+
+#
+# ESP NETIF Adapter
+#
+CONFIG_ESP_NETIF_IP_LOST_TIMER_INTERVAL=120
+CONFIG_ESP_NETIF_TCPIP_LWIP=y
+# CONFIG_ESP_NETIF_LOOPBACK is not set
+CONFIG_ESP_NETIF_USES_TCPIP_WITH_BSD_API=y
+# CONFIG_ESP_NETIF_RECEIVE_REPORT_ERRORS is not set
+# CONFIG_ESP_NETIF_L2_TAP is not set
+# CONFIG_ESP_NETIF_BRIDGE_EN is not set
+# end of ESP NETIF Adapter
+
+#
+# Partition API Configuration
+#
+# end of Partition API Configuration
+
+#
+# PHY
+#
+CONFIG_ESP_PHY_ENABLED=y
+CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y
+# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set
+CONFIG_ESP_PHY_MAX_WIFI_TX_POWER=20
+CONFIG_ESP_PHY_MAX_TX_POWER=20
+# CONFIG_ESP_PHY_REDUCE_TX_POWER is not set
+CONFIG_ESP_PHY_RF_CAL_PARTIAL=y
+# CONFIG_ESP_PHY_RF_CAL_NONE is not set
+# CONFIG_ESP_PHY_RF_CAL_FULL is not set
+CONFIG_ESP_PHY_CALIBRATION_MODE=0
+# CONFIG_ESP_PHY_PLL_TRACK_DEBUG is not set
+# end of PHY
+
+#
+# Power Management
+#
+# CONFIG_PM_ENABLE is not set
+# end of Power Management
+
+#
+# ESP PSRAM
+#
+# CONFIG_SPIRAM is not set
+# end of ESP PSRAM
+
+#
+# ESP Ringbuf
+#
+# CONFIG_RINGBUF_PLACE_FUNCTIONS_INTO_FLASH is not set
+# end of ESP Ringbuf
+
+#
+# ESP System Settings
+#
+# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_80 is not set
+# CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_160 is not set
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_240=y
+CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ=240
+
+#
+# Memory
+#
+# CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE is not set
+
+#
+# Non-backward compatible options
+#
+# CONFIG_ESP_SYSTEM_ESP32_SRAM1_REGION_AS_IRAM is not set
+# end of Non-backward compatible options
+# end of Memory
+
+#
+# Trace memory
+#
+# CONFIG_ESP32_TRAX is not set
+CONFIG_ESP32_TRACEMEM_RESERVE_DRAM=0x0
+# end of Trace memory
+
+# CONFIG_ESP_SYSTEM_PANIC_PRINT_HALT is not set
+CONFIG_ESP_SYSTEM_PANIC_PRINT_REBOOT=y
+# CONFIG_ESP_SYSTEM_PANIC_SILENT_REBOOT is not set
+# CONFIG_ESP_SYSTEM_PANIC_GDBSTUB is not set
+CONFIG_ESP_SYSTEM_PANIC_REBOOT_DELAY_SECONDS=0
+
+#
+# Memory protection
+#
+# end of Memory protection
+
+CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2304
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584
+CONFIG_ESP_MAIN_TASK_AFFINITY_CPU0=y
+# CONFIG_ESP_MAIN_TASK_AFFINITY_CPU1 is not set
+# CONFIG_ESP_MAIN_TASK_AFFINITY_NO_AFFINITY is not set
+CONFIG_ESP_MAIN_TASK_AFFINITY=0x0
+CONFIG_ESP_MINIMAL_SHARED_STACK_SIZE=2048
+CONFIG_ESP_CONSOLE_UART_DEFAULT=y
+# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set
+# CONFIG_ESP_CONSOLE_NONE is not set
+CONFIG_ESP_CONSOLE_UART=y
+CONFIG_ESP_CONSOLE_UART_NUM=0
+CONFIG_ESP_CONSOLE_ROM_SERIAL_PORT_NUM=0
+CONFIG_ESP_CONSOLE_UART_BAUDRATE=115200
+CONFIG_ESP_INT_WDT=y
+CONFIG_ESP_INT_WDT_TIMEOUT_MS=300
+CONFIG_ESP_INT_WDT_CHECK_CPU1=y
+CONFIG_ESP_TASK_WDT_EN=y
+CONFIG_ESP_TASK_WDT_INIT=y
+# CONFIG_ESP_TASK_WDT_PANIC is not set
+CONFIG_ESP_TASK_WDT_TIMEOUT_S=5
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
+# CONFIG_ESP_PANIC_HANDLER_IRAM is not set
+# CONFIG_ESP_DEBUG_STUBS_ENABLE is not set
+CONFIG_ESP_DEBUG_OCDAWARE=y
+CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5=y
+
+#
+# Brownout Detector
+#
+CONFIG_ESP_BROWNOUT_DET=y
+CONFIG_ESP_BROWNOUT_DET_LVL_SEL_0=y
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_ESP_BROWNOUT_DET_LVL_SEL_7 is not set
+CONFIG_ESP_BROWNOUT_DET_LVL=0
+# end of Brownout Detector
+
+# CONFIG_ESP32_DISABLE_BASIC_ROM_CONSOLE is not set
+CONFIG_ESP_SYSTEM_BROWNOUT_INTR=y
+# end of ESP System Settings
+
+#
+# IPC (Inter-Processor Call)
+#
+CONFIG_ESP_IPC_TASK_STACK_SIZE=1024
+CONFIG_ESP_IPC_USES_CALLERS_PRIORITY=y
+CONFIG_ESP_IPC_ISR_ENABLE=y
+# end of IPC (Inter-Processor Call)
+
+#
+# ESP Timer (High Resolution Timer)
+#
+# CONFIG_ESP_TIMER_PROFILING is not set
+CONFIG_ESP_TIME_FUNCS_USE_RTC_TIMER=y
+CONFIG_ESP_TIME_FUNCS_USE_ESP_TIMER=y
+CONFIG_ESP_TIMER_TASK_STACK_SIZE=3584
+CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1
+# CONFIG_ESP_TIMER_SHOW_EXPERIMENTAL is not set
+CONFIG_ESP_TIMER_TASK_AFFINITY=0x0
+CONFIG_ESP_TIMER_TASK_AFFINITY_CPU0=y
+CONFIG_ESP_TIMER_ISR_AFFINITY_CPU0=y
+# CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD is not set
+CONFIG_ESP_TIMER_IMPL_TG0_LAC=y
+# end of ESP Timer (High Resolution Timer)
+
+#
+# Wi-Fi
+#
+CONFIG_ESP_WIFI_ENABLED=y
+CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
+CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
+# CONFIG_ESP_WIFI_STATIC_TX_BUFFER is not set
+CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=y
+CONFIG_ESP_WIFI_TX_BUFFER_TYPE=1
+CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER_NUM=64
+CONFIG_ESP_WIFI_STATIC_RX_MGMT_BUFFER=y
+# CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUFFER is not set
+CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
+CONFIG_ESP_WIFI_RX_MGMT_BUF_NUM_DEF=5
+# CONFIG_ESP_WIFI_CSI_ENABLED is not set
+CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP_WIFI_TX_BA_WIN=6
+CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP_WIFI_RX_BA_WIN=6
+CONFIG_ESP_WIFI_NVS_ENABLED=y
+# CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0 is not set
+CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1=y
+CONFIG_ESP_WIFI_SOFTAP_BEACON_MAX_LEN=752
+CONFIG_ESP_WIFI_MGMT_SBUF_NUM=32
+CONFIG_ESP_WIFI_IRAM_OPT=y
+# CONFIG_ESP_WIFI_EXTRA_IRAM_OPT is not set
+CONFIG_ESP_WIFI_RX_IRAM_OPT=y
+CONFIG_ESP_WIFI_ENABLE_WPA3_SAE=y
+CONFIG_ESP_WIFI_ENABLE_SAE_PK=y
+CONFIG_ESP_WIFI_SOFTAP_SAE_SUPPORT=y
+CONFIG_ESP_WIFI_ENABLE_WPA3_OWE_STA=y
+# CONFIG_ESP_WIFI_SLP_IRAM_OPT is not set
+CONFIG_ESP_WIFI_SLP_DEFAULT_MIN_ACTIVE_TIME=50
+CONFIG_ESP_WIFI_SLP_DEFAULT_MAX_ACTIVE_TIME=10
+CONFIG_ESP_WIFI_SLP_DEFAULT_WAIT_BROADCAST_DATA_TIME=15
+CONFIG_ESP_WIFI_STA_DISCONNECTED_PM_ENABLE=y
+CONFIG_ESP_WIFI_GMAC_SUPPORT=y
+CONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
+# CONFIG_ESP_WIFI_SLP_BEACON_LOST_OPT is not set
+CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
+# CONFIG_ESP_WIFI_NAN_ENABLE is not set
+CONFIG_ESP_WIFI_MBEDTLS_CRYPTO=y
+CONFIG_ESP_WIFI_MBEDTLS_TLS_CLIENT=y
+# CONFIG_ESP_WIFI_WAPI_PSK is not set
+# CONFIG_ESP_WIFI_11KV_SUPPORT is not set
+# CONFIG_ESP_WIFI_MBO_SUPPORT is not set
+# CONFIG_ESP_WIFI_DPP_SUPPORT is not set
+# CONFIG_ESP_WIFI_11R_SUPPORT is not set
+# CONFIG_ESP_WIFI_WPS_SOFTAP_REGISTRAR is not set
+
+#
+# WPS Configuration Options
+#
+# CONFIG_ESP_WIFI_WPS_STRICT is not set
+# CONFIG_ESP_WIFI_WPS_PASSPHRASE is not set
+# end of WPS Configuration Options
+
+# CONFIG_ESP_WIFI_DEBUG_PRINT is not set
+# CONFIG_ESP_WIFI_TESTING_OPTIONS is not set
+CONFIG_ESP_WIFI_ENTERPRISE_SUPPORT=y
+# CONFIG_ESP_WIFI_ENT_FREE_DYNAMIC_BUFFER is not set
+# end of Wi-Fi
+
+#
+# Core dump
+#
+# CONFIG_ESP_COREDUMP_ENABLE_TO_FLASH is not set
+# CONFIG_ESP_COREDUMP_ENABLE_TO_UART is not set
+CONFIG_ESP_COREDUMP_ENABLE_TO_NONE=y
+# end of Core dump
+
+#
+# FAT Filesystem support
+#
+CONFIG_FATFS_VOLUME_COUNT=2
+CONFIG_FATFS_LFN_NONE=y
+# CONFIG_FATFS_LFN_HEAP is not set
+# CONFIG_FATFS_LFN_STACK is not set
+# CONFIG_FATFS_SECTOR_512 is not set
+CONFIG_FATFS_SECTOR_4096=y
+# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set
+CONFIG_FATFS_CODEPAGE_437=y
+# CONFIG_FATFS_CODEPAGE_720 is not set
+# CONFIG_FATFS_CODEPAGE_737 is not set
+# CONFIG_FATFS_CODEPAGE_771 is not set
+# CONFIG_FATFS_CODEPAGE_775 is not set
+# CONFIG_FATFS_CODEPAGE_850 is not set
+# CONFIG_FATFS_CODEPAGE_852 is not set
+# CONFIG_FATFS_CODEPAGE_855 is not set
+# CONFIG_FATFS_CODEPAGE_857 is not set
+# CONFIG_FATFS_CODEPAGE_860 is not set
+# CONFIG_FATFS_CODEPAGE_861 is not set
+# CONFIG_FATFS_CODEPAGE_862 is not set
+# CONFIG_FATFS_CODEPAGE_863 is not set
+# CONFIG_FATFS_CODEPAGE_864 is not set
+# CONFIG_FATFS_CODEPAGE_865 is not set
+# CONFIG_FATFS_CODEPAGE_866 is not set
+# CONFIG_FATFS_CODEPAGE_869 is not set
+# CONFIG_FATFS_CODEPAGE_932 is not set
+# CONFIG_FATFS_CODEPAGE_936 is not set
+# CONFIG_FATFS_CODEPAGE_949 is not set
+# CONFIG_FATFS_CODEPAGE_950 is not set
+CONFIG_FATFS_CODEPAGE=437
+CONFIG_FATFS_FS_LOCK=0
+CONFIG_FATFS_TIMEOUT_MS=10000
+CONFIG_FATFS_PER_FILE_CACHE=y
+# CONFIG_FATFS_USE_FASTSEEK is not set
+CONFIG_FATFS_VFS_FSTAT_BLKSIZE=0
+# CONFIG_FATFS_IMMEDIATE_FSYNC is not set
+# CONFIG_FATFS_USE_LABEL is not set
+CONFIG_FATFS_LINK_LOCK=y
+# end of FAT Filesystem support
+
+#
+# FreeRTOS
+#
+
+#
+# Kernel
+#
+# CONFIG_FREERTOS_SMP is not set
+# CONFIG_FREERTOS_UNICORE is not set
+CONFIG_FREERTOS_HZ=1000
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_NONE is not set
+# CONFIG_FREERTOS_CHECK_STACKOVERFLOW_PTRVAL is not set
+CONFIG_FREERTOS_CHECK_STACKOVERFLOW_CANARY=y
+CONFIG_FREERTOS_THREAD_LOCAL_STORAGE_POINTERS=1
+CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1536
+# CONFIG_FREERTOS_USE_IDLE_HOOK is not set
+# CONFIG_FREERTOS_USE_TICK_HOOK is not set
+CONFIG_FREERTOS_MAX_TASK_NAME_LEN=16
+# CONFIG_FREERTOS_ENABLE_BACKWARD_COMPATIBILITY is not set
+CONFIG_FREERTOS_TIMER_SERVICE_TASK_NAME="Tmr Svc"
+# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU0 is not set
+# CONFIG_FREERTOS_TIMER_TASK_AFFINITY_CPU1 is not set
+CONFIG_FREERTOS_TIMER_TASK_NO_AFFINITY=y
+CONFIG_FREERTOS_TIMER_SERVICE_TASK_CORE_AFFINITY=0x7FFFFFFF
+CONFIG_FREERTOS_TIMER_TASK_PRIORITY=1
+CONFIG_FREERTOS_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_FREERTOS_TIMER_QUEUE_LENGTH=10
+CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0
+CONFIG_FREERTOS_TASK_NOTIFICATION_ARRAY_ENTRIES=1
+# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set
+# CONFIG_FREERTOS_USE_LIST_DATA_INTEGRITY_CHECK_BYTES is not set
+# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set
+# CONFIG_FREERTOS_USE_APPLICATION_TASK_TAG is not set
+# end of Kernel
+
+#
+# Port
+#
+CONFIG_FREERTOS_TASK_FUNCTION_WRAPPER=y
+# CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK is not set
+CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS=y
+# CONFIG_FREERTOS_TASK_PRE_DELETION_HOOK is not set
+# CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP is not set
+CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y
+CONFIG_FREERTOS_ISR_STACKSIZE=1536
+CONFIG_FREERTOS_INTERRUPT_BACKTRACE=y
+# CONFIG_FREERTOS_FPU_IN_ISR is not set
+CONFIG_FREERTOS_TICK_SUPPORT_CORETIMER=y
+CONFIG_FREERTOS_CORETIMER_0=y
+# CONFIG_FREERTOS_CORETIMER_1 is not set
+CONFIG_FREERTOS_SYSTICK_USES_CCOUNT=y
+CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH=y
+# CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set
+# end of Port
+
+CONFIG_FREERTOS_PORT=y
+CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
+CONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y
+CONFIG_FREERTOS_DEBUG_OCDAWARE=y
+CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y
+CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH=y
+CONFIG_FREERTOS_NUMBER_OF_CORES=2
+# end of FreeRTOS
+
+#
+# Hardware Abstraction Layer (HAL) and Low Level (LL)
+#
+CONFIG_HAL_ASSERTION_EQUALS_SYSTEM=y
+# CONFIG_HAL_ASSERTION_DISABLE is not set
+# CONFIG_HAL_ASSERTION_SILENT is not set
+# CONFIG_HAL_ASSERTION_ENABLE is not set
+CONFIG_HAL_DEFAULT_ASSERTION_LEVEL=2
+CONFIG_HAL_SPI_MASTER_FUNC_IN_IRAM=y
+CONFIG_HAL_SPI_SLAVE_FUNC_IN_IRAM=y
+# end of Hardware Abstraction Layer (HAL) and Low Level (LL)
+
+#
+# Heap memory debugging
+#
+CONFIG_HEAP_POISONING_DISABLED=y
+# CONFIG_HEAP_POISONING_LIGHT is not set
+# CONFIG_HEAP_POISONING_COMPREHENSIVE is not set
+CONFIG_HEAP_TRACING_OFF=y
+# CONFIG_HEAP_TRACING_STANDALONE is not set
+# CONFIG_HEAP_TRACING_TOHOST is not set
+# CONFIG_HEAP_USE_HOOKS is not set
+# CONFIG_HEAP_TASK_TRACKING is not set
+# CONFIG_HEAP_ABORT_WHEN_ALLOCATION_FAILS is not set
+# CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH is not set
+# end of Heap memory debugging
+
+#
+# Log output
+#
+# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
+# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set
+# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
+CONFIG_LOG_DEFAULT_LEVEL_INFO=y
+# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set
+# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set
+CONFIG_LOG_DEFAULT_LEVEL=3
+CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=y
+# CONFIG_LOG_MAXIMUM_LEVEL_DEBUG is not set
+# CONFIG_LOG_MAXIMUM_LEVEL_VERBOSE is not set
+CONFIG_LOG_MAXIMUM_LEVEL=3
+# CONFIG_LOG_MASTER_LEVEL is not set
+CONFIG_LOG_COLORS=y
+CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y
+# CONFIG_LOG_TIMESTAMP_SOURCE_SYSTEM is not set
+# end of Log output
+
+#
+# LWIP
+#
+CONFIG_LWIP_ENABLE=y
+CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
+# CONFIG_LWIP_NETIF_API is not set
+CONFIG_LWIP_TCPIP_TASK_PRIO=18
+# CONFIG_LWIP_TCPIP_CORE_LOCKING is not set
+# CONFIG_LWIP_CHECK_THREAD_SAFETY is not set
+CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
+# CONFIG_LWIP_L2_TO_L3_COPY is not set
+# CONFIG_LWIP_IRAM_OPTIMIZATION is not set
+# CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION is not set
+CONFIG_LWIP_TIMERS_ONDEMAND=y
+CONFIG_LWIP_ND6=y
+# CONFIG_LWIP_FORCE_ROUTER_FORWARDING is not set
+CONFIG_LWIP_MAX_SOCKETS=10
+# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set
+# CONFIG_LWIP_SO_LINGER is not set
+CONFIG_LWIP_SO_REUSE=y
+CONFIG_LWIP_SO_REUSE_RXTOALL=y
+# CONFIG_LWIP_SO_RCVBUF is not set
+# CONFIG_LWIP_NETBUF_RECVINFO is not set
+CONFIG_LWIP_IP_DEFAULT_TTL=64
+CONFIG_LWIP_IP4_FRAG=y
+CONFIG_LWIP_IP6_FRAG=y
+# CONFIG_LWIP_IP4_REASSEMBLY is not set
+# CONFIG_LWIP_IP6_REASSEMBLY is not set
+CONFIG_LWIP_IP_REASS_MAX_PBUFS=10
+# CONFIG_LWIP_IP_FORWARD is not set
+# CONFIG_LWIP_STATS is not set
+CONFIG_LWIP_ESP_GRATUITOUS_ARP=y
+CONFIG_LWIP_GARP_TMR_INTERVAL=60
+CONFIG_LWIP_ESP_MLDV6_REPORT=y
+CONFIG_LWIP_MLDV6_TMR_INTERVAL=40
+CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32
+CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
+# CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set
+CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y
+# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set
+CONFIG_LWIP_DHCP_OPTIONS_LEN=68
+CONFIG_LWIP_NUM_NETIF_CLIENT_DATA=0
+CONFIG_LWIP_DHCP_COARSE_TIMER_SECS=1
+
+#
+# DHCP server
+#
+CONFIG_LWIP_DHCPS=y
+CONFIG_LWIP_DHCPS_LEASE_UNIT=60
+CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
+CONFIG_LWIP_DHCPS_STATIC_ENTRIES=y
+# end of DHCP server
+
+# CONFIG_LWIP_AUTOIP is not set
+CONFIG_LWIP_IPV4=y
+CONFIG_LWIP_IPV6=y
+# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
+CONFIG_LWIP_IPV6_NUM_ADDRESSES=3
+# CONFIG_LWIP_IPV6_FORWARD is not set
+# CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set
+CONFIG_LWIP_NETIF_LOOPBACK=y
+CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8
+
+#
+# TCP
+#
+CONFIG_LWIP_MAX_ACTIVE_TCP=16
+CONFIG_LWIP_MAX_LISTENING_TCP=16
+CONFIG_LWIP_TCP_HIGH_SPEED_RETRANSMISSION=y
+CONFIG_LWIP_TCP_MAXRTX=12
+CONFIG_LWIP_TCP_SYNMAXRTX=12
+CONFIG_LWIP_TCP_MSS=1440
+CONFIG_LWIP_TCP_TMR_INTERVAL=250
+CONFIG_LWIP_TCP_MSL=60000
+CONFIG_LWIP_TCP_FIN_WAIT_TIMEOUT=20000
+CONFIG_LWIP_TCP_SND_BUF_DEFAULT=5760
+CONFIG_LWIP_TCP_WND_DEFAULT=5760
+CONFIG_LWIP_TCP_RECVMBOX_SIZE=6
+CONFIG_LWIP_TCP_ACCEPTMBOX_SIZE=6
+CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
+CONFIG_LWIP_TCP_OOSEQ_TIMEOUT=6
+CONFIG_LWIP_TCP_OOSEQ_MAX_PBUFS=4
+# CONFIG_LWIP_TCP_SACK_OUT is not set
+CONFIG_LWIP_TCP_OVERSIZE_MSS=y
+# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
+CONFIG_LWIP_TCP_RTO_TIME=1500
+# end of TCP
+
+#
+# UDP
+#
+CONFIG_LWIP_MAX_UDP_PCBS=16
+CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
+# end of UDP
+
+#
+# Checksums
+#
+# CONFIG_LWIP_CHECKSUM_CHECK_IP is not set
+# CONFIG_LWIP_CHECKSUM_CHECK_UDP is not set
+CONFIG_LWIP_CHECKSUM_CHECK_ICMP=y
+# end of Checksums
+
+CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=3072
+CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU1 is not set
+CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_LWIP_PPP_SUPPORT is not set
+CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
+CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
+# CONFIG_LWIP_SLIP_SUPPORT is not set
+
+#
+# ICMP
+#
+CONFIG_LWIP_ICMP=y
+# CONFIG_LWIP_MULTICAST_PING is not set
+# CONFIG_LWIP_BROADCAST_PING is not set
+# end of ICMP
+
+#
+# LWIP RAW API
+#
+CONFIG_LWIP_MAX_RAW_PCBS=16
+# end of LWIP RAW API
+
+#
+# SNTP
+#
+CONFIG_LWIP_SNTP_MAX_SERVERS=1
+# CONFIG_LWIP_DHCP_GET_NTP_SRV is not set
+CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
+CONFIG_LWIP_SNTP_STARTUP_DELAY=y
+CONFIG_LWIP_SNTP_MAXIMUM_STARTUP_DELAY=5000
+# end of SNTP
+
+#
+# DNS
+#
+CONFIG_LWIP_DNS_MAX_SERVERS=3
+# CONFIG_LWIP_FALLBACK_DNS_SERVER_SUPPORT is not set
+# end of DNS
+
+CONFIG_LWIP_BRIDGEIF_MAX_PORTS=7
+CONFIG_LWIP_ESP_LWIP_ASSERT=y
+
+#
+# Hooks
+#
+# CONFIG_LWIP_HOOK_TCP_ISN_NONE is not set
+CONFIG_LWIP_HOOK_TCP_ISN_DEFAULT=y
+# CONFIG_LWIP_HOOK_TCP_ISN_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_ROUTE_NONE=y
+# CONFIG_LWIP_HOOK_IP6_ROUTE_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_ROUTE_CUSTOM is not set
+CONFIG_LWIP_HOOK_ND6_GET_GW_NONE=y
+# CONFIG_LWIP_HOOK_ND6_GET_GW_DEFAULT is not set
+# CONFIG_LWIP_HOOK_ND6_GET_GW_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_NONE=y
+# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_SELECT_SRC_ADDR_CUSTOM is not set
+CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_NONE=y
+# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_DEFAULT is not set
+# CONFIG_LWIP_HOOK_NETCONN_EXT_RESOLVE_CUSTOM is not set
+CONFIG_LWIP_HOOK_IP6_INPUT_NONE=y
+# CONFIG_LWIP_HOOK_IP6_INPUT_DEFAULT is not set
+# CONFIG_LWIP_HOOK_IP6_INPUT_CUSTOM is not set
+# end of Hooks
+
+# CONFIG_LWIP_DEBUG is not set
+# end of LWIP
+
+#
+# mbedTLS
+#
+CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
+# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
+# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
+CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
+CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
+CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
+# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
+# CONFIG_MBEDTLS_DEBUG is not set
+
+#
+# mbedTLS v3.x related
+#
+# CONFIG_MBEDTLS_SSL_PROTO_TLS1_3 is not set
+# CONFIG_MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH is not set
+# CONFIG_MBEDTLS_X509_TRUSTED_CERT_CALLBACK is not set
+# CONFIG_MBEDTLS_SSL_CONTEXT_SERIALIZATION is not set
+CONFIG_MBEDTLS_SSL_KEEP_PEER_CERTIFICATE=y
+CONFIG_MBEDTLS_PKCS7_C=y
+# end of mbedTLS v3.x related
+
+#
+# Certificate Bundle
+#
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=y
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=y
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_CMN is not set
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_NONE is not set
+# CONFIG_MBEDTLS_CUSTOM_CERTIFICATE_BUNDLE is not set
+# CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEPRECATED_LIST is not set
+CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_MAX_CERTS=200
+# end of Certificate Bundle
+
+# CONFIG_MBEDTLS_ECP_RESTARTABLE is not set
+CONFIG_MBEDTLS_CMAC_C=y
+CONFIG_MBEDTLS_HARDWARE_AES=y
+CONFIG_MBEDTLS_GCM_SUPPORT_NON_AES_CIPHER=y
+CONFIG_MBEDTLS_HARDWARE_MPI=y
+# CONFIG_MBEDTLS_LARGE_KEY_SOFTWARE_MPI is not set
+CONFIG_MBEDTLS_HARDWARE_SHA=y
+CONFIG_MBEDTLS_ROM_MD5=y
+# CONFIG_MBEDTLS_ATCA_HW_ECDSA_SIGN is not set
+# CONFIG_MBEDTLS_ATCA_HW_ECDSA_VERIFY is not set
+CONFIG_MBEDTLS_HAVE_TIME=y
+# CONFIG_MBEDTLS_PLATFORM_TIME_ALT is not set
+# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set
+CONFIG_MBEDTLS_ECDSA_DETERMINISTIC=y
+CONFIG_MBEDTLS_SHA512_C=y
+CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
+# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set
+# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set
+# CONFIG_MBEDTLS_TLS_DISABLED is not set
+CONFIG_MBEDTLS_TLS_SERVER=y
+CONFIG_MBEDTLS_TLS_CLIENT=y
+CONFIG_MBEDTLS_TLS_ENABLED=y
+
+#
+# TLS Key Exchange Methods
+#
+# CONFIG_MBEDTLS_PSK_MODES is not set
+CONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y
+CONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y
+# end of TLS Key Exchange Methods
+
+CONFIG_MBEDTLS_SSL_RENEGOTIATION=y
+CONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y
+# CONFIG_MBEDTLS_SSL_PROTO_GMTSSL1_1 is not set
+# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set
+CONFIG_MBEDTLS_SSL_ALPN=y
+CONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y
+CONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y
+
+#
+# Symmetric Ciphers
+#
+CONFIG_MBEDTLS_AES_C=y
+# CONFIG_MBEDTLS_CAMELLIA_C is not set
+# CONFIG_MBEDTLS_DES_C is not set
+# CONFIG_MBEDTLS_BLOWFISH_C is not set
+# CONFIG_MBEDTLS_XTEA_C is not set
+CONFIG_MBEDTLS_CCM_C=y
+CONFIG_MBEDTLS_GCM_C=y
+# CONFIG_MBEDTLS_NIST_KW_C is not set
+# end of Symmetric Ciphers
+
+# CONFIG_MBEDTLS_RIPEMD160_C is not set
+
+#
+# Certificates
+#
+CONFIG_MBEDTLS_PEM_PARSE_C=y
+CONFIG_MBEDTLS_PEM_WRITE_C=y
+CONFIG_MBEDTLS_X509_CRL_PARSE_C=y
+CONFIG_MBEDTLS_X509_CSR_PARSE_C=y
+# end of Certificates
+
+CONFIG_MBEDTLS_ECP_C=y
+# CONFIG_MBEDTLS_DHM_C is not set
+CONFIG_MBEDTLS_ECDH_C=y
+CONFIG_MBEDTLS_ECDSA_C=y
+# CONFIG_MBEDTLS_ECJPAKE_C is not set
+CONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
+CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
+CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
+CONFIG_MBEDTLS_ECP_FIXED_POINT_OPTIM=y
+# CONFIG_MBEDTLS_POLY1305_C is not set
+# CONFIG_MBEDTLS_CHACHA20_C is not set
+# CONFIG_MBEDTLS_HKDF_C is not set
+# CONFIG_MBEDTLS_THREADING_C is not set
+CONFIG_MBEDTLS_ERROR_STRINGS=y
+# end of mbedTLS
+
+#
+# ESP-MQTT Configurations
+#
+CONFIG_MQTT_PROTOCOL_311=y
+# CONFIG_MQTT_PROTOCOL_5 is not set
+CONFIG_MQTT_TRANSPORT_SSL=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
+# CONFIG_MQTT_MSG_ID_INCREMENTAL is not set
+# CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set
+# CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set
+# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set
+# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set
+# CONFIG_MQTT_CUSTOM_OUTBOX is not set
+# end of ESP-MQTT Configurations
+
+#
+# Newlib
+#
+CONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y
+# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set
+# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set
+# CONFIG_NEWLIB_STDIN_LINE_ENDING_CRLF is not set
+# CONFIG_NEWLIB_STDIN_LINE_ENDING_LF is not set
+CONFIG_NEWLIB_STDIN_LINE_ENDING_CR=y
+# CONFIG_NEWLIB_NANO_FORMAT is not set
+CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC_HRT=y
+# CONFIG_NEWLIB_TIME_SYSCALL_USE_RTC is not set
+# CONFIG_NEWLIB_TIME_SYSCALL_USE_HRT is not set
+# CONFIG_NEWLIB_TIME_SYSCALL_USE_NONE is not set
+# end of Newlib
+
+#
+# NVS
+#
+# CONFIG_NVS_ASSERT_ERROR_CHECK is not set
+# CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY is not set
+# end of NVS
+
+#
+# OpenThread
+#
+# CONFIG_OPENTHREAD_ENABLED is not set
+
+#
+# Thread Operational Dataset
+#
+CONFIG_OPENTHREAD_NETWORK_NAME="OpenThread-ESP"
+CONFIG_OPENTHREAD_MESH_LOCAL_PREFIX="fd00:db8:a0:0::/64"
+CONFIG_OPENTHREAD_NETWORK_CHANNEL=15
+CONFIG_OPENTHREAD_NETWORK_PANID=0x1234
+CONFIG_OPENTHREAD_NETWORK_EXTPANID="dead00beef00cafe"
+CONFIG_OPENTHREAD_NETWORK_MASTERKEY="00112233445566778899aabbccddeeff"
+CONFIG_OPENTHREAD_NETWORK_PSKC="104810e2315100afd6bc9215a6bfac53"
+# end of Thread Operational Dataset
+
+CONFIG_OPENTHREAD_XTAL_ACCURACY=130
+# CONFIG_OPENTHREAD_SPINEL_ONLY is not set
+# CONFIG_OPENTHREAD_RX_ON_WHEN_IDLE is not set
+
+#
+# Thread Address Query Config
+#
+# end of Thread Address Query Config
+# end of OpenThread
+
+#
+# Protocomm
+#
+CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_0=y
+CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_1=y
+CONFIG_ESP_PROTOCOMM_SUPPORT_SECURITY_VERSION_2=y
+# end of Protocomm
+
+#
+# PThreads
+#
+CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_PTHREAD_STACK_MIN=768
+CONFIG_PTHREAD_DEFAULT_CORE_NO_AFFINITY=y
+# CONFIG_PTHREAD_DEFAULT_CORE_0 is not set
+# CONFIG_PTHREAD_DEFAULT_CORE_1 is not set
+CONFIG_PTHREAD_TASK_CORE_DEFAULT=-1
+CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
+# end of PThreads
+
+#
+# MMU Config
+#
+CONFIG_MMU_PAGE_SIZE_64KB=y
+CONFIG_MMU_PAGE_MODE="64KB"
+CONFIG_MMU_PAGE_SIZE=0x10000
+# end of MMU Config
+
+#
+# Main Flash configuration
+#
+
+#
+# SPI Flash behavior when brownout
+#
+CONFIG_SPI_FLASH_BROWNOUT_RESET_XMC=y
+CONFIG_SPI_FLASH_BROWNOUT_RESET=y
+# end of SPI Flash behavior when brownout
+
+#
+# Optional and Experimental Features (READ DOCS FIRST)
+#
+
+#
+# Features here require specific hardware (READ DOCS FIRST!)
+#
+CONFIG_SPI_FLASH_SUSPEND_TSUS_VAL_US=50
+# end of Optional and Experimental Features (READ DOCS FIRST)
+# end of Main Flash configuration
+
+#
+# SPI Flash driver
+#
+# CONFIG_SPI_FLASH_VERIFY_WRITE is not set
+# CONFIG_SPI_FLASH_ENABLE_COUNTERS is not set
+CONFIG_SPI_FLASH_ROM_DRIVER_PATCH=y
+CONFIG_SPI_FLASH_DANGEROUS_WRITE_ABORTS=y
+# CONFIG_SPI_FLASH_DANGEROUS_WRITE_FAILS is not set
+# CONFIG_SPI_FLASH_DANGEROUS_WRITE_ALLOWED is not set
+# CONFIG_SPI_FLASH_SHARE_SPI1_BUS is not set
+# CONFIG_SPI_FLASH_BYPASS_BLOCK_ERASE is not set
+CONFIG_SPI_FLASH_YIELD_DURING_ERASE=y
+CONFIG_SPI_FLASH_ERASE_YIELD_DURATION_MS=20
+CONFIG_SPI_FLASH_ERASE_YIELD_TICKS=1
+CONFIG_SPI_FLASH_WRITE_CHUNK_SIZE=8192
+# CONFIG_SPI_FLASH_SIZE_OVERRIDE is not set
+# CONFIG_SPI_FLASH_CHECK_ERASE_TIMEOUT_DISABLED is not set
+# CONFIG_SPI_FLASH_OVERRIDE_CHIP_DRIVER_LIST is not set
+
+#
+# Auto-detect flash chips
+#
+CONFIG_SPI_FLASH_VENDOR_XMC_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_GD_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_ISSI_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_MXIC_SUPPORTED=y
+CONFIG_SPI_FLASH_VENDOR_WINBOND_SUPPORTED=y
+CONFIG_SPI_FLASH_SUPPORT_ISSI_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_MXIC_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_GD_CHIP=y
+CONFIG_SPI_FLASH_SUPPORT_WINBOND_CHIP=y
+# CONFIG_SPI_FLASH_SUPPORT_BOYA_CHIP is not set
+# CONFIG_SPI_FLASH_SUPPORT_TH_CHIP is not set
+# end of Auto-detect flash chips
+
+CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=y
+# end of SPI Flash driver
+
+#
+# SPIFFS Configuration
+#
+CONFIG_SPIFFS_MAX_PARTITIONS=3
+
+#
+# SPIFFS Cache Configuration
+#
+CONFIG_SPIFFS_CACHE=y
+CONFIG_SPIFFS_CACHE_WR=y
+# CONFIG_SPIFFS_CACHE_STATS is not set
+# end of SPIFFS Cache Configuration
+
+CONFIG_SPIFFS_PAGE_CHECK=y
+CONFIG_SPIFFS_GC_MAX_RUNS=10
+# CONFIG_SPIFFS_GC_STATS is not set
+CONFIG_SPIFFS_PAGE_SIZE=256
+CONFIG_SPIFFS_OBJ_NAME_LEN=32
+# CONFIG_SPIFFS_FOLLOW_SYMLINKS is not set
+CONFIG_SPIFFS_USE_MAGIC=y
+CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
+CONFIG_SPIFFS_META_LENGTH=4
+CONFIG_SPIFFS_USE_MTIME=y
+
+#
+# Debug Configuration
+#
+# CONFIG_SPIFFS_DBG is not set
+# CONFIG_SPIFFS_API_DBG is not set
+# CONFIG_SPIFFS_GC_DBG is not set
+# CONFIG_SPIFFS_CACHE_DBG is not set
+# CONFIG_SPIFFS_CHECK_DBG is not set
+# CONFIG_SPIFFS_TEST_VISUALISATION is not set
+# end of Debug Configuration
+# end of SPIFFS Configuration
+
+#
+# TCP Transport
+#
+
+#
+# Websocket
+#
+CONFIG_WS_TRANSPORT=y
+CONFIG_WS_BUFFER_SIZE=1024
+# CONFIG_WS_DYNAMIC_BUFFER is not set
+# end of Websocket
+# end of TCP Transport
+
+#
+# Ultra Low Power (ULP) Co-processor
+#
+# CONFIG_ULP_COPROC_ENABLED is not set
+
+#
+# ULP Debugging Options
+#
+# end of ULP Debugging Options
+# end of Ultra Low Power (ULP) Co-processor
+
+#
+# Unity unit testing library
+#
+CONFIG_UNITY_ENABLE_FLOAT=y
+CONFIG_UNITY_ENABLE_DOUBLE=y
+# CONFIG_UNITY_ENABLE_64BIT is not set
+# CONFIG_UNITY_ENABLE_COLOR is not set
+CONFIG_UNITY_ENABLE_IDF_TEST_RUNNER=y
+# CONFIG_UNITY_ENABLE_FIXTURE is not set
+# CONFIG_UNITY_ENABLE_BACKTRACE_ON_FAIL is not set
+# end of Unity unit testing library
+
+#
+# Virtual file system
+#
+CONFIG_VFS_SUPPORT_IO=y
+CONFIG_VFS_SUPPORT_DIR=y
+CONFIG_VFS_SUPPORT_SELECT=y
+CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+# CONFIG_VFS_SELECT_IN_RAM is not set
+CONFIG_VFS_SUPPORT_TERMIOS=y
+CONFIG_VFS_MAX_COUNT=8
+
+#
+# Host File System I/O (Semihosting)
+#
+CONFIG_VFS_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+# end of Host File System I/O (Semihosting)
+# end of Virtual file system
+
+#
+# Wear Levelling
+#
+# CONFIG_WL_SECTOR_SIZE_512 is not set
+CONFIG_WL_SECTOR_SIZE_4096=y
+CONFIG_WL_SECTOR_SIZE=4096
+# end of Wear Levelling
+
+#
+# Wi-Fi Provisioning Manager
+#
+CONFIG_WIFI_PROV_SCAN_MAX_ENTRIES=16
+CONFIG_WIFI_PROV_AUTOSTOP_TIMEOUT=30
+# CONFIG_WIFI_PROV_BLE_BONDING is not set
+# CONFIG_WIFI_PROV_BLE_FORCE_ENCRYPTION is not set
+# CONFIG_WIFI_PROV_KEEP_BLE_ON_AFTER_PROV is not set
+CONFIG_WIFI_PROV_STA_ALL_CHANNEL_SCAN=y
+# CONFIG_WIFI_PROV_STA_FAST_SCAN is not set
+# end of Wi-Fi Provisioning Manager
+# end of Component config
+
+# CONFIG_IDF_EXPERIMENTAL_FEATURES is not set
+
+# Deprecated options for backward compatibility
+# CONFIG_APP_BUILD_TYPE_ELF_RAM is not set
+# CONFIG_NO_BLOBS is not set
+# CONFIG_ESP32_NO_BLOBS is not set
+# CONFIG_ESP32_COMPATIBLE_PRE_V2_1_BOOTLOADERS is not set
+# CONFIG_ESP32_COMPATIBLE_PRE_V3_1_BOOTLOADERS is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
+CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
+# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set
+# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
+CONFIG_LOG_BOOTLOADER_LEVEL=3
+# CONFIG_APP_ROLLBACK_ENABLE is not set
+# CONFIG_FLASH_ENCRYPTION_ENABLED is not set
+# CONFIG_FLASHMODE_QIO is not set
+# CONFIG_FLASHMODE_QOUT is not set
+CONFIG_FLASHMODE_DIO=y
+# CONFIG_FLASHMODE_DOUT is not set
+CONFIG_MONITOR_BAUD=115200
+CONFIG_OPTIMIZATION_LEVEL_DEBUG=y
+CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y
+CONFIG_COMPILER_OPTIMIZATION_DEFAULT=y
+# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set
+# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set
+CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y
+# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set
+# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set
+CONFIG_OPTIMIZATION_ASSERTION_LEVEL=2
+# CONFIG_CXX_EXCEPTIONS is not set
+CONFIG_STACK_CHECK_NONE=y
+# CONFIG_STACK_CHECK_NORM is not set
+# CONFIG_STACK_CHECK_STRONG is not set
+# CONFIG_STACK_CHECK_ALL is not set
+# CONFIG_WARN_WRITE_STRINGS is not set
+# CONFIG_ESP32_APPTRACE_DEST_TRAX is not set
+CONFIG_ESP32_APPTRACE_DEST_NONE=y
+CONFIG_ESP32_APPTRACE_LOCK_ENABLE=y
+# CONFIG_BLUEDROID_ENABLED is not set
+# CONFIG_NIMBLE_ENABLED is not set
+# CONFIG_BTDM_CONTROLLER_MODE_BLE_ONLY is not set
+# CONFIG_BTDM_CONTROLLER_MODE_BR_EDR_ONLY is not set
+CONFIG_BTDM_CONTROLLER_MODE_BTDM=y
+CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN=3
+CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN=2
+CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN=0
+CONFIG_BTDM_CONTROLLER_BLE_MAX_CONN_EFF=3
+CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_ACL_CONN_EFF=2
+CONFIG_BTDM_CONTROLLER_BR_EDR_MAX_SYNC_CONN_EFF=0
+CONFIG_BTDM_CONTROLLER_PINNED_TO_CORE=0
+CONFIG_BTDM_CONTROLLER_HCI_MODE_VHCI=y
+# CONFIG_BTDM_CONTROLLER_HCI_MODE_UART_H4 is not set
+CONFIG_BTDM_CONTROLLER_MODEM_SLEEP=y
+CONFIG_BLE_SCAN_DUPLICATE=y
+CONFIG_SCAN_DUPLICATE_BY_DEVICE_ADDR=y
+# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA is not set
+# CONFIG_SCAN_DUPLICATE_BY_ADV_DATA_AND_DEVICE_ADDR is not set
+CONFIG_SCAN_DUPLICATE_TYPE=0
+CONFIG_DUPLICATE_SCAN_CACHE_SIZE=100
+# CONFIG_BLE_MESH_SCAN_DUPLICATE_EN is not set
+CONFIG_BTDM_CONTROLLER_FULL_SCAN_SUPPORTED=y
+CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_SUPPORTED=y
+CONFIG_BLE_ADV_REPORT_FLOW_CONTROL_NUM=100
+CONFIG_BLE_ADV_REPORT_DISCARD_THRSHOLD=20
+CONFIG_ADC2_DISABLE_DAC=y
+CONFIG_SW_COEXIST_ENABLE=y
+CONFIG_ESP32_WIFI_SW_COEXIST_ENABLE=y
+CONFIG_ESP_WIFI_SW_COEXIST_ENABLE=y
+# CONFIG_MCPWM_ISR_IN_IRAM is not set
+# CONFIG_EVENT_LOOP_PROFILING is not set
+CONFIG_POST_EVENTS_FROM_ISR=y
+CONFIG_POST_EVENTS_FROM_IRAM_ISR=y
+CONFIG_GDBSTUB_SUPPORT_TASKS=y
+CONFIG_GDBSTUB_MAX_TASKS=32
+# CONFIG_OTA_ALLOW_HTTP is not set
+# CONFIG_TWO_UNIVERSAL_MAC_ADDRESS is not set
+CONFIG_FOUR_UNIVERSAL_MAC_ADDRESS=y
+CONFIG_NUMBER_OF_UNIVERSAL_MAC_ADDRESS=4
+# CONFIG_ESP_SYSTEM_PD_FLASH is not set
+CONFIG_ESP32_DEEP_SLEEP_WAKEUP_DELAY=2000
+CONFIG_ESP_SLEEP_DEEP_SLEEP_WAKEUP_DELAY=2000
+CONFIG_ESP32_RTC_CLK_SRC_INT_RC=y
+CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_RC=y
+# CONFIG_ESP32_RTC_CLK_SRC_EXT_CRYS is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_CRYSTAL is not set
+# CONFIG_ESP32_RTC_CLK_SRC_EXT_OSC is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_EXTERNAL_OSC is not set
+# CONFIG_ESP32_RTC_CLK_SRC_INT_8MD256 is not set
+# CONFIG_ESP32_RTC_CLOCK_SOURCE_INTERNAL_8MD256 is not set
+CONFIG_ESP32_RTC_CLK_CAL_CYCLES=1024
+# CONFIG_ESP32_XTAL_FREQ_26 is not set
+CONFIG_ESP32_XTAL_FREQ_40=y
+# CONFIG_ESP32_XTAL_FREQ_AUTO is not set
+CONFIG_ESP32_XTAL_FREQ=40
+CONFIG_ESP32_PHY_CALIBRATION_AND_DATA_STORAGE=y
+# CONFIG_ESP32_PHY_INIT_DATA_IN_PARTITION is not set
+CONFIG_ESP32_PHY_MAX_WIFI_TX_POWER=20
+CONFIG_ESP32_PHY_MAX_TX_POWER=20
+# CONFIG_REDUCE_PHY_TX_POWER is not set
+# CONFIG_ESP32_REDUCE_PHY_TX_POWER is not set
+# CONFIG_SPIRAM_SUPPORT is not set
+# CONFIG_ESP32_SPIRAM_SUPPORT is not set
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_80 is not set
+# CONFIG_ESP32_DEFAULT_CPU_FREQ_160 is not set
+CONFIG_ESP32_DEFAULT_CPU_FREQ_240=y
+CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ=240
+CONFIG_TRACEMEM_RESERVE_DRAM=0x0
+# CONFIG_ESP32_PANIC_PRINT_HALT is not set
+CONFIG_ESP32_PANIC_PRINT_REBOOT=y
+# CONFIG_ESP32_PANIC_SILENT_REBOOT is not set
+# CONFIG_ESP32_PANIC_GDBSTUB is not set
+CONFIG_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_SYSTEM_EVENT_TASK_STACK_SIZE=2304
+CONFIG_MAIN_TASK_STACK_SIZE=3584
+CONFIG_CONSOLE_UART_DEFAULT=y
+# CONFIG_CONSOLE_UART_CUSTOM is not set
+# CONFIG_CONSOLE_UART_NONE is not set
+# CONFIG_ESP_CONSOLE_UART_NONE is not set
+CONFIG_CONSOLE_UART=y
+CONFIG_CONSOLE_UART_NUM=0
+CONFIG_CONSOLE_UART_BAUDRATE=115200
+CONFIG_INT_WDT=y
+CONFIG_INT_WDT_TIMEOUT_MS=300
+CONFIG_INT_WDT_CHECK_CPU1=y
+CONFIG_TASK_WDT=y
+CONFIG_ESP_TASK_WDT=y
+# CONFIG_TASK_WDT_PANIC is not set
+CONFIG_TASK_WDT_TIMEOUT_S=5
+CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0=y
+CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1=y
+# CONFIG_ESP32_DEBUG_STUBS_ENABLE is not set
+CONFIG_ESP32_DEBUG_OCDAWARE=y
+CONFIG_BROWNOUT_DET=y
+CONFIG_ESP32_BROWNOUT_DET=y
+CONFIG_BROWNOUT_DET_LVL_SEL_0=y
+CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_0=y
+# CONFIG_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_1 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_2 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_3 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_4 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_5 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_6 is not set
+# CONFIG_BROWNOUT_DET_LVL_SEL_7 is not set
+# CONFIG_ESP32_BROWNOUT_DET_LVL_SEL_7 is not set
+CONFIG_BROWNOUT_DET_LVL=0
+CONFIG_ESP32_BROWNOUT_DET_LVL=0
+# CONFIG_DISABLE_BASIC_ROM_CONSOLE is not set
+CONFIG_IPC_TASK_STACK_SIZE=1024
+CONFIG_TIMER_TASK_STACK_SIZE=3584
+CONFIG_ESP32_WIFI_ENABLED=y
+CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=16
+CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32
+# CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y
+CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1
+CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=64
+# CONFIG_ESP32_WIFI_CSI_ENABLED is not set
+CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y
+CONFIG_ESP32_WIFI_TX_BA_WIN=6
+CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y
+CONFIG_ESP32_WIFI_RX_BA_WIN=6
+CONFIG_ESP32_WIFI_RX_BA_WIN=6
+CONFIG_ESP32_WIFI_NVS_ENABLED=y
+# CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_0 is not set
+CONFIG_ESP32_WIFI_TASK_PINNED_TO_CORE_1=y
+CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752
+CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32
+CONFIG_ESP32_WIFI_IRAM_OPT=y
+CONFIG_ESP32_WIFI_RX_IRAM_OPT=y
+CONFIG_ESP32_WIFI_ENABLE_WPA3_SAE=y
+CONFIG_ESP32_WIFI_ENABLE_WPA3_OWE_STA=y
+CONFIG_WPA_MBEDTLS_CRYPTO=y
+CONFIG_WPA_MBEDTLS_TLS_CLIENT=y
+# CONFIG_WPA_WAPI_PSK is not set
+# CONFIG_WPA_11KV_SUPPORT is not set
+# CONFIG_WPA_MBO_SUPPORT is not set
+# CONFIG_WPA_DPP_SUPPORT is not set
+# CONFIG_WPA_11R_SUPPORT is not set
+# CONFIG_WPA_WPS_SOFTAP_REGISTRAR is not set
+# CONFIG_WPA_WPS_STRICT is not set
+# CONFIG_WPA_DEBUG_PRINT is not set
+# CONFIG_WPA_TESTING_OPTIONS is not set
+# CONFIG_ESP32_ENABLE_COREDUMP_TO_FLASH is not set
+# CONFIG_ESP32_ENABLE_COREDUMP_TO_UART is not set
+CONFIG_ESP32_ENABLE_COREDUMP_TO_NONE=y
+CONFIG_TIMER_TASK_PRIORITY=1
+CONFIG_TIMER_TASK_STACK_DEPTH=2048
+CONFIG_TIMER_QUEUE_LENGTH=10
+# CONFIG_ENABLE_STATIC_TASK_CLEAN_UP_HOOK is not set
+# CONFIG_HAL_ASSERTION_SILIENT is not set
+# CONFIG_L2_TO_L3_COPY is not set
+CONFIG_ESP_GRATUITOUS_ARP=y
+CONFIG_GARP_TMR_INTERVAL=60
+CONFIG_TCPIP_RECVMBOX_SIZE=32
+CONFIG_TCP_MAXRTX=12
+CONFIG_TCP_SYNMAXRTX=12
+CONFIG_TCP_MSS=1440
+CONFIG_TCP_MSL=60000
+CONFIG_TCP_SND_BUF_DEFAULT=5760
+CONFIG_TCP_WND_DEFAULT=5760
+CONFIG_TCP_RECVMBOX_SIZE=6
+CONFIG_TCP_QUEUE_OOSEQ=y
+CONFIG_TCP_OVERSIZE_MSS=y
+# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_TCP_OVERSIZE_DISABLE is not set
+CONFIG_UDP_RECVMBOX_SIZE=6
+CONFIG_TCPIP_TASK_STACK_SIZE=3072
+CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set
+# CONFIG_TCPIP_TASK_AFFINITY_CPU1 is not set
+CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_PPP_SUPPORT is not set
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_HRT=y
+CONFIG_ESP32_TIME_SYSCALL_USE_RTC_FRC1=y
+# CONFIG_ESP32_TIME_SYSCALL_USE_RTC is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_HRT is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_FRC1 is not set
+# CONFIG_ESP32_TIME_SYSCALL_USE_NONE is not set
+CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_ESP32_PTHREAD_STACK_MIN=768
+CONFIG_ESP32_DEFAULT_PTHREAD_CORE_NO_AFFINITY=y
+# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_0 is not set
+# CONFIG_ESP32_DEFAULT_PTHREAD_CORE_1 is not set
+CONFIG_ESP32_PTHREAD_TASK_CORE_DEFAULT=-1
+CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
+CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ABORTS=y
+# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_FAILS is not set
+# CONFIG_SPI_FLASH_WRITING_DANGEROUS_REGIONS_ALLOWED is not set
+# CONFIG_ESP32_ULP_COPROC_ENABLED is not set
+CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+CONFIG_SUPPORT_TERMIOS=y
+CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+# End of deprecated options

+ 19 - 0
esp/esp_driver/setup.ps1

@@ -0,0 +1,19 @@
+# Warn the user that the script will remove local changes
+# prompt to continue or abort
+$msg = "This will remove your local changes to the project. Continue? [y/n]"
+$response = Read-Host -Prompt $msg
+if ($response -ne 'y') {
+   echo "Aborting"
+   exit
+}
+
+git reset --hard
+echo "ESP hosted: initialize submodule esp-idf"
+git submodule update --init --depth=1
+echo "ESP hosted: initialize submodule for esp-idf"
+cd esp-idf
+git submodule update --init --depth=1
+echo "ESP hosted: installing prerequisites for esp-idf"
+.\install.ps1
+cd ..
+echo "###### Setup Done ######"

+ 27 - 0
esp/esp_driver/setup_windows11.md

@@ -0,0 +1,27 @@
+# Setup for building ESP-Hosted-FG on Windows 11
+
+Follow these steps to setup ESP-IDF and to compile ESP-Hosted-FG using the
+ESP-IDF configured Windows Powershell Command Line tool.
+
+1. Install and setup ESP-IDF on Windows as documented in the [Standard Setup of Toolchain for
+Windows](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html).
+
+2. Use the ESP-IDF [Powershell Command
+Prompt](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html#using-the-command-prompt) to execute `setup.ps1` in the `esp_hosted_fg/esp/esp_driver`
+directory. It will setup `esp-idf` as a submodule to be used by
+`network_adapter`. :warning: **This command is dangerous. It will
+revert all your local changes. Stash if need to keep them**.
+
+3. Setup compiling environment by running `export.ps1` in `esp-idf`
+directory
+
+4. In the `network_adapter` directory of this project, input command
+`idf.py set-target <chip_name>` to set target.
+
+5. Use `idf.py build` to recompile `network_adapter` and generate new
+firmware.
+
+6. Use `idf.py flash` to flash the firmware.
+
+7. Use `idf.py monitor` to monitor the serial out. You can combine
+these two steps (flash and monitor) by running `idf.py flash monitor`.

+ 5 - 0
host/components/src/esp_queue.c

@@ -99,6 +99,11 @@ void esp_queue_destroy(esp_queue_t** q)
 		temp = (*q)->front;
 		(*q)->front = (*q)->front->next;
 
+		if (temp->data) {
+			free(temp->data);
+			temp->data = NULL;
+		}
+
 		free(temp);
 		temp = NULL;
 	}

+ 92 - 15
host/control_lib/include/ctrl_api.h

@@ -15,10 +15,11 @@
 #define SUCCESS                              0
 #define FAILURE                              -1
 
-#define SSID_LENGTH                          32
-#define MAX_MAC_STR_LEN                      18
-#define BSSID_LENGTH                         MAX_MAC_STR_LEN
-#define PASSWORD_LENGTH                      64
+#define MAC_SIZE_BYTES                       6
+#define SSID_LENGTH                          33
+#define MAX_MAC_STR_SIZE                     18
+#define BSSID_STR_SIZE                       MAX_MAC_STR_SIZE
+#define PASSWORD_LENGTH                      65
 #define STATUS_LENGTH                        14
 #define VENDOR_OUI_BUF                       3
 
@@ -34,7 +35,12 @@
 #define WAIT_TIME_B2B_CTRL_REQ               5
 #define DEFAULT_CTRL_RESP_TIMEOUT            30
 #define DEFAULT_CTRL_RESP_AP_SCAN_TIMEOUT    (60*3)
+#define DEFAULT_CTRL_RESP_CONNECT_AP_TIMEOUT (15*3)
 
+#ifndef MAC2STR
+#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]
+#define MACSTR "%02x:%02x:%02x:%02x:%02x:%02x"
+#endif
 
 #define SUCCESS_STR                          "success"
 #define FAILURE_STR                          "failure"
@@ -105,6 +111,9 @@ typedef enum {
 	CTRL_REQ_GET_WIFI_CURR_TX_POWER    = CTRL_MSG_ID__Req_GetWifiCurrTxPower, //0x78
 
 	CTRL_REQ_CONFIG_HEARTBEAT          = CTRL_MSG_ID__Req_ConfigHeartbeat,    //0x79
+	CTRL_REQ_ENABLE_DISABLE            = CTRL_MSG_ID__Req_EnableDisable,      //0x7a
+
+	CTRL_REQ_GET_FW_VERSION            = CTRL_MSG_ID__Req_GetFwVersion,       //0x7b
 	/*
 	 * Add new control path command response before Req_Max
 	 * and update Req_Max
@@ -141,6 +150,9 @@ typedef enum {
 	CTRL_RESP_GET_WIFI_CURR_TX_POWER    = CTRL_MSG_ID__Resp_GetWifiCurrTxPower, //0x78 -> 0xdc
 
 	CTRL_RESP_CONFIG_HEARTBEAT          = CTRL_MSG_ID__Resp_ConfigHeartbeat,    //0x79 -> 0xdd
+	CTRL_RESP_ENABLE_DISABLE            = CTRL_MSG_ID__Resp_EnableDisable,      //0x7a -> 0xde
+
+	CTRL_RESP_GET_FW_VERSION            = CTRL_MSG_ID__Resp_GetFwVersion,       //0x7b -> 0xdf
 	/*
 	 * Add new control path comm       and response before Resp_Max
 	 * and update Resp_Max
@@ -156,6 +168,10 @@ typedef enum {
 		CTRL_MSG_ID__Event_StationDisconnectFromAP,
 	CTRL_EVENT_STATION_DISCONNECT_FROM_ESP_SOFTAP =
 		CTRL_MSG_ID__Event_StationDisconnectFromESPSoftAP,
+	CTRL_EVENT_STATION_CONNECTED_TO_AP =
+		CTRL_MSG_ID__Event_StationConnectedToAP,
+	CTRL_EVENT_STATION_CONNECTED_TO_ESP_SOFTAP =
+		CTRL_MSG_ID__Event_StationConnectedToESPSoftAP,
 	/*
 	 * Add new control path command notification before Event_Max
 	 * and update Event_Max
@@ -208,6 +224,10 @@ typedef enum {
 } wifi_vendor_ie_id_e;
 
 
+enum hosted_features_t {
+	HOSTED_WIFI = HOSTED_FEATURE__Hosted_Wifi,
+	HOSTED_BT = HOSTED_FEATURE__Hosted_Bluetooth,
+};
 
 typedef struct {
 	/* Should be set to WIFI_VENDOR_IE_ELEMENT_ID (0xDD) */
@@ -228,20 +248,20 @@ typedef struct {
 
 typedef struct {
 	uint8_t ssid[SSID_LENGTH];
-	uint8_t bssid[BSSID_LENGTH];
+	uint8_t bssid[BSSID_STR_SIZE];
 	int rssi;
 	int channel;
 	int encryption_mode;
 } wifi_scanlist_t;
 
 typedef struct {
-	uint8_t bssid[BSSID_LENGTH];
+	uint8_t bssid[BSSID_STR_SIZE];
 	int rssi;
 } wifi_connected_stations_list_t;
 
 typedef struct {
 	int mode;
-	char mac[MAX_MAC_STR_LEN];
+	char mac[MAX_MAC_STR_SIZE];
 } wifi_mac_t;
 
 typedef struct {
@@ -251,14 +271,15 @@ typedef struct {
 typedef struct {
 	uint8_t ssid[SSID_LENGTH];
 	uint8_t pwd[PASSWORD_LENGTH];
-	uint8_t bssid[BSSID_LENGTH];
+	uint8_t bssid[BSSID_STR_SIZE];
 	bool is_wpa3_supported;
 	int rssi;
 	int channel;
 	int encryption_mode;
 	uint16_t listen_interval;
 	char status[STATUS_LENGTH];
-	char out_mac[MAX_MAC_STR_LEN];
+	char out_mac[MAX_MAC_STR_SIZE];
+	int band_mode;
 } wifi_ap_config_t;
 
 typedef struct {
@@ -269,7 +290,8 @@ typedef struct {
 	int max_connections;
 	bool ssid_hidden;
 	wifi_bandwidth_e bandwidth;
-	char out_mac[MAX_MAC_STR_LEN];
+	char out_mac[MAX_MAC_STR_SIZE];
+	int band_mode;
 } softap_config_t;
 
 typedef struct {
@@ -304,6 +326,20 @@ typedef struct {
 	int power;
 } wifi_tx_power_t;
 
+typedef struct {
+	char project_name[3];
+	uint8_t major_1;
+	uint8_t major_2;
+	uint8_t minor;
+	uint8_t revision_patch_1;
+	uint8_t revision_patch_2;
+} fw_version_t;
+
+typedef struct {
+	HostedFeature feature;
+	uint8_t enable;
+} feature_enable_disable_t;
+
 typedef struct {
 	/* event */
 	uint32_t hb_num;
@@ -313,9 +349,34 @@ typedef struct {
 } event_heartbeat_t;
 
 typedef struct {
-	int32_t reason;
-	char mac[MAX_MAC_STR_LEN];
-} event_station_disconn_t;
+	uint8_t ssid[SSID_LENGTH];
+	uint32_t ssid_len;
+	uint8_t bssid[BSSID_STR_SIZE];
+	int channel;
+	int authmode;
+	int aid;
+} event_sta_conn_t;
+
+typedef struct {
+	uint8_t ssid[SSID_LENGTH];
+	uint32_t ssid_len;
+	uint8_t bssid[BSSID_STR_SIZE];
+	uint32_t reason;
+	int32_t rssi;
+} event_sta_disconn_t;
+
+typedef struct {
+	uint8_t mac[MAX_MAC_STR_SIZE];
+	int32_t aid;
+	int32_t is_mesh_child;
+} event_softap_sta_conn_t;
+
+typedef struct {
+	uint8_t mac[MAX_MAC_STR_SIZE];
+	int32_t aid;
+	int32_t is_mesh_child;
+	uint32_t reason;
+} event_softap_sta_disconn_t;
 
 typedef struct Ctrl_cmd_t {
 	/* msg type could be 1. req 2. resp 3. notification */
@@ -324,8 +385,11 @@ typedef struct Ctrl_cmd_t {
 	/* control path protobuf msg number */
 	uint16_t msg_id;
 
+	/* uid of request / response */
+	int32_t uid;
+
 	/* statusof response or notification */
-	uint8_t resp_event_status;
+	int32_t resp_event_status;
 
 	union {
 		wifi_mac_t                  wifi_mac;
@@ -342,11 +406,18 @@ typedef struct Ctrl_cmd_t {
 
 		ota_write_t                 ota_write;
 
+		feature_enable_disable_t    feat_ena_disable;
+
 		wifi_tx_power_t             wifi_tx_power;
 
+		fw_version_t                fw_version;
+
 		event_heartbeat_t           e_heartbeat;
 
-		event_station_disconn_t     e_sta_disconnected;
+		event_sta_conn_t            e_sta_conn;
+		event_sta_disconn_t         e_sta_disconn;
+		event_softap_sta_conn_t     e_softap_sta_conn;
+		event_softap_sta_disconn_t  e_softap_sta_disconn;
 	}u;
 
 	/* By default this callback is set to NULL.
@@ -524,6 +595,12 @@ ctrl_cmd_t * ota_write(ctrl_cmd_t req);
  * Creates timer which reset ESP32 after 5 sec */
 ctrl_cmd_t * ota_end(ctrl_cmd_t req);
 
+/* Enable or disable specific feautures from hosted_features_t */
+ctrl_cmd_t * feature_config(ctrl_cmd_t req);
+
+/* Get FW Version */
+ctrl_cmd_t * get_fw_version(ctrl_cmd_t req);
+
 /* Get the interface up for interface `iface` */
 int interface_up(int sockfd, char* iface);
 

+ 12 - 0
host/control_lib/src/ctrl_api.c

@@ -161,3 +161,15 @@ ctrl_cmd_t * ota_end(ctrl_cmd_t req)
 	CTRL_SEND_REQ(CTRL_REQ_OTA_END);
 	CTRL_DECODE_RESP_IF_NOT_ASYNC();
 }
+
+ctrl_cmd_t * feature_config(ctrl_cmd_t req)
+{
+	CTRL_SEND_REQ(CTRL_REQ_ENABLE_DISABLE);
+	CTRL_DECODE_RESP_IF_NOT_ASYNC();
+}
+
+ctrl_cmd_t * get_fw_version(ctrl_cmd_t req)
+{
+	CTRL_SEND_REQ(CTRL_REQ_GET_FW_VERSION);
+	CTRL_DECODE_RESP_IF_NOT_ASYNC();
+}

+ 242 - 103
host/control_lib/src/ctrl_core.c

@@ -3,14 +3,13 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include <sys/errno.h>
+#include <errno.h>
 #include "ctrl_core.h"
 #include "serial_if.h"
 #include "platform_wrapper.h"
 #include "esp_queue.h"
 #include <unistd.h>
 
-
 #ifdef MCU_SYS
 #include "common/common.h"
 #define command_log(...)             printf(__VA_ARGS__); printf("\r");
@@ -69,8 +68,9 @@
     }
 
 #define CHECK_CTRL_MSG_FAILED(msGparaM)                                       \
+	app_resp->resp_event_status = ctrl_msg->msGparaM->resp;                   \
     if (ctrl_msg->msGparaM->resp) {                                           \
-        command_log("Failure resp/event: possibly precondition not met\n");   \
+        command_log("Failure[%d] resp/event: possibly precondition not met\n", (int)app_resp->resp_event_status);   \
         goto fail_parse_ctrl_msg;                                             \
     }
 
@@ -102,6 +102,14 @@ static int call_event_callback(ctrl_cmd_t *app_event);
 static int is_async_resp_callback_registered_by_resp_msg_id(int resp_msg_id);
 static int call_async_resp_callback(ctrl_cmd_t *app_resp);
 
+/* uid to link between requests and responses
+ * uids are incrementing values from 1 onwards. */
+static int32_t uid = 0;
+
+/* expected uid in response
+ * -1 means not a valid id
+ *  0 means slave fw was not updated to support UIDs */
+static int32_t expected_resp_uid = -1;
 
 /* Control response callbacks
  * These will be updated per control request received
@@ -169,12 +177,10 @@ static int convert_mac_to_bytes(uint8_t *out, size_t out_size, char *s)
 	if (!s || (strlen(s) < MIN_MAC_STR_LEN) || (out_size < MAC_SIZE_BYTES))  {
 		if (!s) {
 			command_log("empty input mac str\n");
-		}
-		else if (strlen(s)<MIN_MAC_STR_LEN) {
+		} else if (strlen(s)<MIN_MAC_STR_LEN) {
 			command_log("strlen of in str [%zu]<MIN_MAC_STR_LEN[%u]\n",
 					strlen(s), MIN_MAC_STR_LEN);
-		}
-		else {
+		} else {
 			command_log("out_size[%zu]<MAC_SIZE_BYTES[%u]\n",
 					out_size, MAC_SIZE_BYTES);
 		}
@@ -222,23 +228,78 @@ static int ctrl_app_parse_event(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_ntfy)
 
 	app_ntfy->msg_type = CTRL_EVENT;
 	app_ntfy->msg_id = ctrl_msg->msg_id;
-	app_ntfy->resp_event_status = SUCCESS;
+	app_ntfy->resp_event_status = FAILURE;
 
-	switch ((uint32_t)ctrl_msg->msg_id) {
+	switch (ctrl_msg->msg_id) {
 		case CTRL_EVENT_ESP_INIT: {
+			app_ntfy->resp_event_status = SUCCESS;
 			/*printf("EVENT: ESP INIT\n");*/
 			break;
 		} case CTRL_EVENT_HEARTBEAT: {
 			/*printf("EVENT: Heartbeat\n");*/
+			app_ntfy->resp_event_status = SUCCESS;
 			CHECK_CTRL_MSG_NON_NULL(event_heartbeat);
 			app_ntfy->u.e_heartbeat.hb_num = ctrl_msg->event_heartbeat->hb_num;
 			break;
+		} case CTRL_EVENT_STATION_CONNECTED_TO_AP: {
+			CHECK_CTRL_MSG_NON_NULL(event_station_connected_to_ap);
+			/*printf("EVENT: Station mode: Disconnect with reason [%u]\n",
+					ctrl_msg->event_station_connected_to_ap->resp);*/
+			app_ntfy->resp_event_status = ctrl_msg->event_station_connected_to_ap->resp;
+			if(SUCCESS==app_ntfy->resp_event_status) {
+				strncpy((char *)app_ntfy->u.e_sta_conn.ssid,
+						(char *)ctrl_msg->event_station_connected_to_ap->ssid.data,
+						ctrl_msg->event_station_connected_to_ap->ssid.len);
+				app_ntfy->u.e_sta_conn.ssid_len = ctrl_msg->event_station_connected_to_ap->ssid_len;
+
+				strncpy((char *)app_ntfy->u.e_sta_conn.bssid,
+						(char *)ctrl_msg->event_station_connected_to_ap->bssid.data,
+						ctrl_msg->event_station_connected_to_ap->bssid.len);
+
+				app_ntfy->u.e_sta_conn.channel = ctrl_msg->event_station_connected_to_ap->channel;
+				app_ntfy->u.e_sta_conn.authmode = ctrl_msg->event_station_connected_to_ap->authmode;
+				app_ntfy->u.e_sta_conn.aid = ctrl_msg->event_station_connected_to_ap->aid;
+			}
+			break;
 		} case CTRL_EVENT_STATION_DISCONNECT_FROM_AP: {
 			CHECK_CTRL_MSG_NON_NULL(event_station_disconnect_from_ap);
 			/*printf("EVENT: Station mode: Disconnect with reason [%u]\n",
 					ctrl_msg->event_station_disconnect_from_ap->resp);*/
 			app_ntfy->resp_event_status = ctrl_msg->event_station_disconnect_from_ap->resp;
+			if(SUCCESS==app_ntfy->resp_event_status) {
+				strncpy((char *)app_ntfy->u.e_sta_disconn.ssid,
+						(char *)ctrl_msg->event_station_disconnect_from_ap->ssid.data,
+						ctrl_msg->event_station_disconnect_from_ap->ssid.len);
+				app_ntfy->u.e_sta_disconn.ssid_len = ctrl_msg->event_station_disconnect_from_ap->ssid_len;
+
+				strncpy((char *)app_ntfy->u.e_sta_disconn.bssid,
+						(char *)ctrl_msg->event_station_disconnect_from_ap->bssid.data,
+						ctrl_msg->event_station_disconnect_from_ap->bssid.len);
+
+				app_ntfy->u.e_sta_disconn.reason = ctrl_msg->event_station_disconnect_from_ap->reason;
+				app_ntfy->u.e_sta_disconn.rssi = ctrl_msg->event_station_disconnect_from_ap->rssi;
+			}
 			break;
+		} case CTRL_EVENT_STATION_CONNECTED_TO_ESP_SOFTAP: {
+			CHECK_CTRL_MSG_NON_NULL(event_station_connected_to_esp_softap);
+			app_ntfy->resp_event_status =
+				ctrl_msg->event_station_connected_to_esp_softap->resp;
+
+			if(SUCCESS==app_ntfy->resp_event_status) {
+				CHECK_CTRL_MSG_NON_NULL_VAL(
+					ctrl_msg->event_station_connected_to_esp_softap->mac.data,
+					"NULL mac");
+				strncpy((char *)app_ntfy->u.e_softap_sta_conn.mac,
+					(char *)ctrl_msg->event_station_connected_to_esp_softap->mac.data,
+					ctrl_msg->event_station_connected_to_esp_softap->mac.len);
+				/*printf("EVENT: SoftAP mode: Disconnect MAC[%s]\n",
+					app_ntfy->u.e_softap_sta_conn.mac);*/
+				app_ntfy->u.e_softap_sta_conn.aid =
+					ctrl_msg->event_station_connected_to_esp_softap->aid;
+				app_ntfy->u.e_softap_sta_conn.is_mesh_child =
+					ctrl_msg->event_station_connected_to_esp_softap->is_mesh_child;
+				break;
+			}
 		} case CTRL_EVENT_STATION_DISCONNECT_FROM_ESP_SOFTAP: {
 			CHECK_CTRL_MSG_NON_NULL(event_station_disconnect_from_esp_softap);
 			app_ntfy->resp_event_status =
@@ -248,17 +309,23 @@ static int ctrl_app_parse_event(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_ntfy)
 				CHECK_CTRL_MSG_NON_NULL_VAL(
 					ctrl_msg->event_station_disconnect_from_esp_softap->mac.data,
 					"NULL mac");
-				strncpy(app_ntfy->u.e_sta_disconnected.mac,
+				strncpy((char *)app_ntfy->u.e_softap_sta_disconn.mac,
 					(char *)ctrl_msg->event_station_disconnect_from_esp_softap->mac.data,
 					ctrl_msg->event_station_disconnect_from_esp_softap->mac.len);
 				/*printf("EVENT: SoftAP mode: Disconnect MAC[%s]\n",
-					app_ntfy->u.e_sta_disconnected.mac);*/
+				  app_ntfy->u.e_softap_sta_disconn.mac);*/
+				app_ntfy->u.e_softap_sta_disconn.aid =
+					ctrl_msg->event_station_disconnect_from_esp_softap->aid;
+				app_ntfy->u.e_softap_sta_disconn.is_mesh_child =
+					ctrl_msg->event_station_disconnect_from_esp_softap->is_mesh_child;
+				app_ntfy->u.e_softap_sta_disconn.reason =
+					ctrl_msg->event_station_disconnect_from_esp_softap->reason;
 			}
 			break;
 		} default: {
 			printf("Invalid/unsupported event[%u] received\n",ctrl_msg->msg_id);
 			goto fail_parse_ctrl_msg;
-			// break;
+			break;
 		}
 	}
 
@@ -269,7 +336,7 @@ static int ctrl_app_parse_event(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_ntfy)
 fail_parse_ctrl_msg:
 	ctrl_msg__free_unpacked(ctrl_msg, NULL);
 	ctrl_msg = NULL;
-	app_ntfy->resp_event_status = (uint8_t)FAILURE;
+	app_ntfy->resp_event_status = FAILURE;
 	return FAILURE;
 }
 
@@ -284,17 +351,25 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 	/* 1. Check non NULL */
 	if (!ctrl_msg || !app_resp) {
 		printf("NULL Ctrl resp or NULL App Resp\n");
-		goto fail_parse_ctrl_msg;
+		goto fail_parse_ctrl_msg2;
 	}
 
 	/* 2. update basic fields */
 	app_resp->msg_type = CTRL_RESP;
 	app_resp->msg_id = ctrl_msg->msg_id;
+	app_resp->uid = ctrl_msg->uid;
+	app_resp->resp_event_status = FAILURE;
+	/* if app_resp->uid is 0, slave fw is not updated to return uid
+	 * so we skip this check */
+	if (app_resp->uid && (expected_resp_uid != app_resp->uid)) {
+		// response uid mis-match: ignore this response
+		goto fail_parse_ctrl_msg2;
+	}
 
 	/* 3. parse CtrlMsg into ctrl_cmd_t */
-	switch ((uint32_t)ctrl_msg->msg_id) {
+	switch (ctrl_msg->msg_id) {
 		case CTRL_RESP_GET_MAC_ADDR : {
-			uint8_t len_l = min(ctrl_msg->resp_get_mac_address->mac.len, MAX_MAC_STR_LEN-1);
+			uint8_t len_l = min(ctrl_msg->resp_get_mac_address->mac.len, MAX_MAC_STR_SIZE-1);
 
 			CHECK_CTRL_MSG_NON_NULL(resp_get_mac_address);
 			CHECK_CTRL_MSG_NON_NULL(resp_get_mac_address->mac.data);
@@ -367,8 +442,8 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 					strncpy(p->status, NOT_CONNECTED_STR, STATUS_LENGTH);
 					p->status[STATUS_LENGTH-1] = '\0';
 					command_log("Station is not connected to AP \n");
-					goto fail_parse_ctrl_msg2;
-					// break;
+					goto fail_parse_ctrl_msg;
+					break;
 
 				case SUCCESS:
 					strncpy(p->status, SUCCESS_STR, STATUS_LENGTH);
@@ -383,7 +458,7 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 						uint8_t len_l = 0;
 
 						len_l = min(ctrl_msg->resp_get_ap_config->bssid.len,
-								MAX_MAC_STR_LEN-1);
+								MAX_MAC_STR_SIZE-1);
 						strncpy((char *)p->bssid,
 								(char *)ctrl_msg->resp_get_ap_config->bssid.data,
 								len_l);
@@ -393,6 +468,7 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 					p->channel = ctrl_msg->resp_get_ap_config->chnl;
 					p->rssi = ctrl_msg->resp_get_ap_config->rssi;
 					p->encryption_mode = ctrl_msg->resp_get_ap_config->sec_prot;
+					p->band_mode = ctrl_msg->resp_get_ap_config->band_mode;
 					break;
 
 				case FAILURE:
@@ -401,8 +477,8 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 					strncpy(p->status, FAILURE_STR, STATUS_LENGTH);
 					p->status[STATUS_LENGTH-1] = '\0';
 					command_log("Failed to get AP config \n");
-					goto fail_parse_ctrl_msg2;
-					// break;
+					goto fail_parse_ctrl_msg;
+					break;
 			}
 			break;
 		} case CTRL_RESP_CONNECT_AP : {
@@ -411,26 +487,30 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 
 			app_resp->resp_event_status = ctrl_msg->resp_connect_ap->resp;
 
+			if (ctrl_msg->resp_connect_ap->resp) {
+				command_log("Connect AP failed, Reason[%d]\n", ctrl_msg->resp_connect_ap->resp);
+			}
 			switch(ctrl_msg->resp_connect_ap->resp) {
 				case CTRL_ERR_INVALID_PASSWORD:
 					command_log("Invalid password for SSID\n");
-					goto fail_parse_ctrl_msg2;
-					// break;
+					goto fail_parse_ctrl_msg;
+					break;
 				case CTRL_ERR_NO_AP_FOUND:
 					command_log("SSID: not found/connectable\n");
-					goto fail_parse_ctrl_msg2;
-					// break;
+					goto fail_parse_ctrl_msg;
+					break;
 				case SUCCESS:
+					// command_log("Info: Connect band_mode is %d\n", ctrl_msg->resp_connect_ap->band_mode);
 					CHECK_CTRL_MSG_NON_NULL(resp_connect_ap->mac.data);
 					CHECK_CTRL_MSG_FAILED(resp_connect_ap);
 					break;
 				default:
+					command_log("Connect AP failed, Reason[%u]\n", ctrl_msg->resp_connect_ap->resp);
 					CHECK_CTRL_MSG_FAILED(resp_connect_ap);
-					command_log("Connect AP failed\n");
-					goto fail_parse_ctrl_msg2;
-					// break;
+					goto fail_parse_ctrl_msg;
+					break;
 			}
-			len_l = min(ctrl_msg->resp_connect_ap->mac.len, MAX_MAC_STR_LEN-1);
+			len_l = min(ctrl_msg->resp_connect_ap->mac.len, MAX_MAC_STR_SIZE-1);
 			strncpy(app_resp->u.wifi_ap_config.out_mac,
 					(char *)ctrl_msg->resp_connect_ap->mac.data, len_l);
 			app_resp->u.wifi_ap_config.out_mac[len_l] = '\0';
@@ -471,7 +551,9 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 			app_resp->u.wifi_softap_config.ssid_hidden =
 				ctrl_msg->resp_get_softap_config->ssid_hidden;
 			app_resp->u.wifi_softap_config.bandwidth =
-				(wifi_bandwidth_e)ctrl_msg->resp_get_softap_config->bw;
+				ctrl_msg->resp_get_softap_config->bw;
+			app_resp->u.wifi_softap_config.band_mode =
+				ctrl_msg->resp_get_softap_config->band_mode;
 
 			break;
 		} case CTRL_RESP_SET_SOFTAP_VND_IE : {
@@ -484,12 +566,14 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 			CHECK_CTRL_MSG_FAILED(resp_start_softap);
 			CHECK_CTRL_MSG_NON_NULL(resp_start_softap->mac.data);
 
-			len_l = min(ctrl_msg->resp_connect_ap->mac.len, MAX_MAC_STR_LEN-1);
+			len_l = min(ctrl_msg->resp_connect_ap->mac.len, MAX_MAC_STR_SIZE-1);
 			strncpy(app_resp->u.wifi_softap_config.out_mac,
 					(char *)ctrl_msg->resp_connect_ap->mac.data, len_l);
 			app_resp->u.wifi_softap_config.out_mac[len_l] = '\0';
+			app_resp->u.wifi_softap_config.band_mode = ctrl_msg->resp_connect_ap->band_mode;
 			break;
 		} case CTRL_RESP_GET_SOFTAP_CONN_STA_LIST : {
+			CHECK_CTRL_MSG_NON_NULL(resp_softap_connected_stas_list);
 			wifi_softap_conn_sta_list_t *ap = &app_resp->u.wifi_softap_con_sta;
 			wifi_connected_stations_list_t *list = ap->out_list;
 			CtrlMsgRespSoftAPConnectedSTA *rp =
@@ -534,44 +618,34 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 		} case CTRL_RESP_OTA_BEGIN : {
 			CHECK_CTRL_MSG_NON_NULL(resp_ota_begin);
 			CHECK_CTRL_MSG_FAILED(resp_ota_begin);
-			if (ctrl_msg->resp_ota_begin->resp) {
-				command_log("OTA Begin Failed\n");
-				goto fail_parse_ctrl_msg;
-			}
 			break;
 		} case CTRL_RESP_OTA_WRITE : {
 			CHECK_CTRL_MSG_NON_NULL(resp_ota_write);
 			CHECK_CTRL_MSG_FAILED(resp_ota_write);
-			if (ctrl_msg->resp_ota_write->resp) {
-				command_log("OTA write failed\n");
-				goto fail_parse_ctrl_msg;
-			}
 			break;
 		} case CTRL_RESP_OTA_END : {
 			CHECK_CTRL_MSG_NON_NULL(resp_ota_end);
-			if (ctrl_msg->resp_ota_end->resp) {
-				command_log("OTA write failed\n");
-				goto fail_parse_ctrl_msg;
-			}
+			CHECK_CTRL_MSG_FAILED(resp_ota_end);
 			break;
 		} case CTRL_RESP_SET_WIFI_MAX_TX_POWER: {
-			CHECK_CTRL_MSG_NON_NULL(req_set_wifi_max_tx_power);
+			CHECK_CTRL_MSG_NON_NULL(resp_set_wifi_max_tx_power);
+			app_resp->resp_event_status = ctrl_msg->resp_set_wifi_max_tx_power->resp;
 			switch (ctrl_msg->resp_set_wifi_max_tx_power->resp)
 			{
 				case FAILURE:
 					command_log("Failed to set max tx power\n");
 					goto fail_parse_ctrl_msg;
-					// break;
+					break;
 				case SUCCESS:
 					break;
 				case CTRL_ERR_OUT_OF_RANGE:
 					command_log("Power is OutOfRange. Check api doc for reference\n");
 					goto fail_parse_ctrl_msg;
-					// break;
+					break;
 				default:
 					command_log("unexpected response\n");
 					goto fail_parse_ctrl_msg;
-					// break;
+					break;
 			}
 			break;
 		} case CTRL_RESP_GET_WIFI_CURR_TX_POWER: {
@@ -584,29 +658,48 @@ static int ctrl_app_parse_resp(CtrlMsg *ctrl_msg, ctrl_cmd_t *app_resp)
 			CHECK_CTRL_MSG_NON_NULL(resp_config_heartbeat);
 			CHECK_CTRL_MSG_FAILED(resp_config_heartbeat);
 			break;
+		} case CTRL_RESP_ENABLE_DISABLE: {
+			CHECK_CTRL_MSG_NON_NULL(resp_enable_disable_feat);
+			CHECK_CTRL_MSG_FAILED(resp_enable_disable_feat);
+			break;
+		} case CTRL_RESP_GET_FW_VERSION: {
+			CHECK_CTRL_MSG_NON_NULL(resp_get_fw_version);
+			CHECK_CTRL_MSG_FAILED(resp_get_fw_version);
+
+			strncpy(app_resp->u.fw_version.project_name,
+					ctrl_msg->resp_get_fw_version->name,
+					sizeof(app_resp->u.fw_version.project_name) - 1);
+			app_resp->u.fw_version.major_1 = ctrl_msg->resp_get_fw_version->major1;
+			app_resp->u.fw_version.major_2 = ctrl_msg->resp_get_fw_version->major2;
+			app_resp->u.fw_version.minor = ctrl_msg->resp_get_fw_version->minor;
+			app_resp->u.fw_version.revision_patch_1 = ctrl_msg->resp_get_fw_version->rev_patch1;
+			app_resp->u.fw_version.revision_patch_2 = ctrl_msg->resp_get_fw_version->rev_patch2;
+			break;
 		} default: {
 			command_log("Unsupported Control Resp[%u]\n", ctrl_msg->msg_id);
 			goto fail_parse_ctrl_msg;
-			// break;
+			break;
 		}
 	}
 
 	/* 4. Free up buffers */
 	ctrl_msg__free_unpacked(ctrl_msg, NULL);
 	ctrl_msg = NULL;
-	app_resp->resp_event_status = SUCCESS;
+	expected_resp_uid = -1;
 	return SUCCESS;
 
 	/* 5. Free up buffers in failure cases */
 fail_parse_ctrl_msg:
 	ctrl_msg__free_unpacked(ctrl_msg, NULL);
 	ctrl_msg = NULL;
-	app_resp->resp_event_status = (uint8_t)FAILURE;
-	return FAILURE;
+	expected_resp_uid = -1;
+	return SUCCESS;
+	/* intended fall-through */
 
 fail_parse_ctrl_msg2:
 	ctrl_msg__free_unpacked(ctrl_msg, NULL);
 	ctrl_msg = NULL;
+	expected_resp_uid = -1;
 	return FAILURE;
 }
 
@@ -709,7 +802,12 @@ static int process_ctrl_rx_msg(CtrlMsg * proto_msg, ctrl_rx_ind_t ctrl_rx_func)
 
 		/* Decode protobuf buffer of response and
 		 * copy into app structures */
-		ctrl_app_parse_resp(proto_msg, app_resp);
+		if (ctrl_app_parse_resp(proto_msg, app_resp)) {
+			// failed to parse response into app_resp
+			if (app_resp)
+				mem_free(app_resp);
+			return FAILURE;
+		}
 
 		/* Is callback is available,
 		 * progress as async response */
@@ -790,25 +888,19 @@ static void ctrl_rx_thread(void const *arg)
 		return;
 	}
 
-	/* 2. If serial interface is not available, exit */
-	if (!serial_drv_open(SERIAL_IF_FILE)) {
-		printf("Exiting thread, handle invalid\n");
-		return;
-	}
-
-	/* 3. This queue should already be created
+	/* 2. This queue should already be created
 	 * if NULL, exit here */
 	if (!ctrl_msg_Q) {
 		printf("Ctrl msg Q is not created\n");
 		return;
 	}
 
-	/* 4. Infinite loop to process incoming msg on serial interface */
+	/* 3. Infinite loop to process incoming msg on serial interface */
 	while (1) {
 		uint8_t *buf = NULL;
 		CtrlMsg *resp = NULL;
 
-		/* 4.1 Block on read of protobuf encoded msg */
+		/* 3.1 Block on read of protobuf encoded msg */
 		if (is_ctrl_lib_state(CTRL_LIB_STATE_INACTIVE)) {
 			sleep(1);
 			continue;
@@ -820,19 +912,19 @@ static void ctrl_rx_thread(void const *arg)
 			goto free_bufs;
 		}
 
-		/* 4.2 Decode protobuf */
+		/* 3.2 Decode protobuf */
 		resp = ctrl_msg__unpack(NULL, buf_len, buf);
 		if (!resp) {
 			goto free_bufs;
 		}
-		/* 4.3 Free the read buffer */
+		/* 3.3 Free the read buffer */
 		mem_free(buf);
 
-		/* 4.4 Send for further processing as event or response */
+		/* 3.4 Send for further processing as event or response */
 		process_ctrl_rx_msg(resp, ctrl_rx_func);
 		continue;
 
-		/* 5. cleanup */
+		/* 4. cleanup */
 free_bufs:
 		mem_free(buf);
 		if (resp) {
@@ -920,7 +1012,7 @@ static ctrl_cmd_t * get_response(int *read_len, int timeout_sec)
 		return NULL;
 	}
 
-	// return NULL;
+	return NULL;
 }
 
 /* Check and call control response asynchronous callback if available
@@ -1061,6 +1153,13 @@ ctrl_cmd_t * ctrl_wait_and_parse_sync_resp(ctrl_cmd_t *app_req)
 		if (rx_buf) {
 			mem_free(rx_buf);
 		}
+
+		/* Response timeout
+		 * Reset the response uid to an invalid value as we no longer
+		 * expect a response until the next request
+		 * If a response arrives after this, it will be flagged
+		 * as an invalid response */
+		expected_resp_uid = -1;
 	}
 	return rx_buf;
 }
@@ -1073,26 +1172,43 @@ ctrl_cmd_t * ctrl_wait_and_parse_sync_resp(ctrl_cmd_t *app_req)
  * */
 static void ctrl_async_timeout_handler(void const *arg)
 {
-	ctrl_resp_cb_t func = (ctrl_resp_cb_t)arg;
+	ctrl_resp_cb_t func = arg;
 	if (!func) {
 		printf("NULL func, failed to call callback\n");
+		hosted_post_semaphore(ctrl_req_sem);
+		return;
 	}
-	else {
-		ctrl_cmd_t *app_resp = NULL;
-		app_resp = (ctrl_cmd_t *)hosted_malloc(sizeof(ctrl_cmd_t));
-		if (!app_resp) {
-			printf("Failed to allocate app_resp\n");
-			return;
-		}
-		app_resp->msg_type = CTRL_RESP;
-		app_resp->resp_event_status = CTRL_ERR_REQUEST_TIMEOUT;
+	ctrl_cmd_t *app_resp = NULL;
+	app_resp = (ctrl_cmd_t *)hosted_calloc(1, sizeof(ctrl_cmd_t));
+	if (!app_resp) {
+		printf("Failed to allocate app_resp\n");
+		hosted_post_semaphore(ctrl_req_sem);
+		return;
+	}
+	app_resp->msg_type = CTRL_RESP;
+	app_resp->resp_event_status = CTRL_ERR_REQUEST_TIMEOUT;
 
-		/* call func pointer to notify failure */
-		func(app_resp);
+	/* call func pointer to notify failure */
+	func(app_resp);
 
-		/* Unlock semaphore in negative case */
-		hosted_post_semaphore(ctrl_req_sem);
+	/* only one async timer at a time is handled
+	 * therefore, only one wifi request can be sent at a time
+	 */
+	if (async_timer_handle) {
+		/* async_timer_handle will be cleaned in hosted_timer_stop */
+		hosted_timer_stop(async_timer_handle);
+		async_timer_handle = NULL;
 	}
+
+	/* Response timeout
+	 * Reset the response uid to an invalid value as we no longer
+	 * expect a response until the next request
+	 * If a response arrives after this, it will be flagged
+	 * as an invalid response */
+	expected_resp_uid = -1;
+
+	/* Unlock semaphore in negative case */
+	hosted_post_semaphore(ctrl_req_sem);
 }
 
 /* This is entry level function when control request APIs are used
@@ -1109,34 +1225,46 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 	uint8_t  *buff_to_free1 = NULL;
 	void     *buff_to_free2 = NULL;
 	uint8_t   failure_status = 0;
-
-
+	uint8_t   got_ctrl_req_sem = 0;
 
 	if (!app_req) {
 		failure_status = CTRL_ERR_INCORRECT_ARG;
 		goto fail_req;
 	}
 
-
 	/* 1. Check if any ongoing request present
 	 * Send failure in that case */
 	ret = hosted_get_semaphore(ctrl_req_sem, WAIT_TIME_B2B_CTRL_REQ);
 	if (ret) {
 		failure_status = CTRL_ERR_REQ_IN_PROG;
 		goto fail_req;
+	} else {
+		got_ctrl_req_sem = 1;
 	}
 
 	app_req->msg_type = CTRL_REQ;
 
+	// handle rollover in uid value (range: 1 to INT32_MAX)
+	if (uid < INT32_MAX)
+		uid++;
+	else
+		uid = 1;
+	app_req->uid = uid;
+
 	/* 2. Protobuf msg init */
 	ctrl_msg__init(&req);
 
-	req.msg_id = (CtrlMsgId)app_req->msg_id;
+	req.msg_id = app_req->msg_id;
 	/* payload case is exact match to msg id in esp_hosted_config.pb-c.h */
 	req.payload_case = (CtrlMsg__PayloadCase) app_req->msg_id;
 
+	req.uid = app_req->uid;
+	assert(expected_resp_uid == -1);
+	// set the expected response uid
+	expected_resp_uid = req.uid;
+
 	/* 3. identify request and compose CtrlMsg */
-	switch((uint32_t)req.msg_id) {
+	switch(req.msg_id) {
 		case CTRL_REQ_GET_WIFI_MODE:
 		case CTRL_REQ_GET_AP_CONFIG:
 		case CTRL_REQ_DISCONNECT_AP:
@@ -1146,7 +1274,8 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 		case CTRL_REQ_GET_PS_MODE:
 		case CTRL_REQ_OTA_BEGIN:
 		case CTRL_REQ_OTA_END:
-		case CTRL_REQ_GET_WIFI_CURR_TX_POWER: {
+		case CTRL_REQ_GET_WIFI_CURR_TX_POWER:
+		case CTRL_REQ_GET_FW_VERSION: {
 			/* Intentional fallthrough & empty */
 			break;
 		} case CTRL_REQ_GET_AP_SCAN_LIST: {
@@ -1173,7 +1302,7 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 			if ((p->mode <= WIFI_MODE_NONE) ||
 			    (p->mode >= WIFI_MODE_APSTA)||
 			    (!strlen(p->mac)) ||
-			    (strlen(p->mac) > MAX_MAC_STR_LEN)) {
+			    (strlen(p->mac) > MAX_MAC_STR_SIZE)) {
 				command_log("Invalid parameter\n");
 				failure_status = CTRL_ERR_INCORRECT_ARG;
 				goto fail_req;
@@ -1181,7 +1310,7 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 			ctrl_msg__req__set_mac_address__init(req_payload);
 
 			req_payload->mode = p->mode;
-			req_payload->mac.len = min(strlen(p->mac), MAX_MAC_STR_LEN);
+			req_payload->mac.len = min(strlen(p->mac), MAX_MAC_STR_SIZE);
 			req_payload->mac.data = (uint8_t *)p->mac;
 
 			break;
@@ -1198,6 +1327,9 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 			req_payload->mode = p->mode;
 			break;
 		} case CTRL_REQ_CONNECT_AP: {
+			if (app_req->cmd_timeout_sec < DEFAULT_CTRL_RESP_CONNECT_AP_TIMEOUT)
+				app_req->cmd_timeout_sec = DEFAULT_CTRL_RESP_CONNECT_AP_TIMEOUT;
+
 			wifi_ap_config_t * p = &app_req->u.wifi_ap_config;
 			CTRL_ALLOC_ASSIGN(CtrlMsgReqConnectAP,req_connect_ap);
 
@@ -1214,7 +1346,7 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 				goto fail_req;
 			}
 
-			if (strlen((char *)p->bssid) > MAX_MAC_STR_LEN) {
+			if (strlen((char *)p->bssid) > MAX_MAC_STR_SIZE) {
 				command_log("Invalid BSSID length\n");
 				failure_status = CTRL_ERR_INCORRECT_ARG;
 				goto fail_req;
@@ -1226,19 +1358,21 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 			req_payload->bssid = (char *)&p->bssid;
 			req_payload->is_wpa3_supported = p->is_wpa3_supported;
 			req_payload->listen_interval = p->listen_interval;
+			req_payload->band_mode = p->band_mode;
 			break;
 		} case CTRL_REQ_SET_SOFTAP_VND_IE: {
 			wifi_softap_vendor_ie_t *p = &app_req->u.wifi_softap_vendor_ie;
 			CTRL_ALLOC_ASSIGN(CtrlMsgReqSetSoftAPVendorSpecificIE,
 					req_set_softap_vendor_specific_ie);
 
-			if (p->type > WIFI_VND_IE_TYPE_ASSOC_RESP) {
+			if ((p->type > WIFI_VND_IE_TYPE_ASSOC_RESP) ||
+			    (p->type < WIFI_VND_IE_TYPE_BEACON)) {
 				command_log("Invalid vendor ie type \n");
 				failure_status = CTRL_ERR_INCORRECT_ARG;
 				goto fail_req;
 			}
 
-			if (p->idx > WIFI_VND_IE_ID_1) {
+			if ((p->idx > WIFI_VND_IE_ID_1) || (p->idx < WIFI_VND_IE_ID_0)) {
 				command_log("Invalid vendor ie ID index \n");
 				failure_status = CTRL_ERR_INCORRECT_ARG;
 				goto fail_req;
@@ -1292,13 +1426,6 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 				goto fail_req;
 			}
 
-			if ((p->channel < MIN_CHNL_NO) ||
-			    (p->channel > MAX_CHNL_NO)) {
-				command_log("Invalid softap channel\n");
-				failure_status = CTRL_ERR_INCORRECT_ARG;
-				goto fail_req;
-			}
-
 			if ((p->encryption_mode < WIFI_AUTH_OPEN) ||
 			    (p->encryption_mode == WIFI_AUTH_WEP) ||
 			    (p->encryption_mode > WIFI_AUTH_WPA_WPA2_PSK)) {
@@ -1326,10 +1453,11 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 			req_payload->ssid = (char *)&p->ssid;
 			req_payload->pwd = (char *)&p->pwd;
 			req_payload->chnl = p->channel;
-			req_payload->sec_prot = (CtrlWifiSecProt)p->encryption_mode;
+			req_payload->sec_prot = p->encryption_mode;
 			req_payload->max_conn = p->max_connections;
 			req_payload->ssid_hidden = p->ssid_hidden;
 			req_payload->bw = p->bandwidth;
+			req_payload->band_mode = p->band_mode;
 			break;
 		} case CTRL_REQ_SET_PS_MODE: {
 			wifi_power_save_t * p = &app_req->u.wifi_ps;
@@ -1378,11 +1506,18 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 				printf("Disable Heartbeat\n");
 			}
 			break;
+		} case CTRL_REQ_ENABLE_DISABLE: {
+			CTRL_ALLOC_ASSIGN(CtrlMsgReqEnableDisable, req_enable_disable_feat);
+			ctrl_msg__req__enable_disable__init(req_payload);
+			req_payload->feature = app_req->u.feat_ena_disable.feature;
+			req_payload->enable = app_req->u.feat_ena_disable.enable;
+			printf("%sable feature [%d]\n", (req_payload->enable)? "en": "dis", req_payload->feature);
+			break;
 		} default: {
 			failure_status = CTRL_ERR_UNSUPPORTED_MSG;
 			printf("Unsupported Control Req[%u]",req.msg_id);
 			goto fail_req;
-			// break;
+			break;
 		}
 	}
 
@@ -1424,6 +1559,8 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 			printf("Failed to start async resp timer\n");
 			goto fail_req;
 		}
+		/* For async, clearing semaphore on failed cases done on above timer expiry */
+		got_ctrl_req_sem = 0;
 	}
 
 	/* 8. Pack in protobuf and send the request */
@@ -1451,7 +1588,12 @@ int ctrl_app_send_req(ctrl_cmd_t *app_req)
 
 fail_req:
 
+	if (got_ctrl_req_sem) {
+		hosted_post_semaphore(ctrl_req_sem);
+	}
 
+	//TODO: need to test below and possibly remove redundant code
+	// if(!async_timer_handle && app_req->ctrl_resp_cb) {
 	if (app_req->ctrl_resp_cb) {
 		/* 11. In case of async procedure,
 		 * Let application know of failure using callback itself
@@ -1491,9 +1633,6 @@ int deinit_hosted_control_lib_internal(void)
 {
 	int ret = SUCCESS;
 
-	if (is_ctrl_lib_state(CTRL_LIB_STATE_INACTIVE))
-		return ret;
-
 	set_ctrl_lib_state(CTRL_LIB_STATE_INACTIVE);
 
 	if (ctrl_msg_Q) {

+ 5 - 1
host/driver/network/netdev_api.c

@@ -85,7 +85,11 @@ struct pbuf * network_read(struct network_handle *handle, rt_int32_t timeout)
 	if (!buffer)
 		return NULL;
 
-	rt_mq_recv(handle->ndev->rx_q, buffer, sizeof(struct pbuf), timeout);
+	if (rt_mq_recv(handle->ndev->rx_q, buffer, sizeof(struct pbuf), timeout) != sizeof(struct pbuf)) {
+		printf ("Failed to read from network\n");
+		free(buffer);
+		return NULL;
+	}
 
 	return buffer;
 }

+ 1 - 1
host/driver/serial/serial_ll_if.c

@@ -169,7 +169,7 @@ static uint8_t * serial_ll_read(const serial_ll_handle_t * serial_ll_hdl,
 	 *
 	 * In our example, first approach of blocking read is used.
 	 */
-	if (RT_EOK != rt_mq_recv(serial_ll_hdl->queue, &buf_handle, sizeof(buf_handle), RT_WAITING_FOREVER)) {
+	if (rt_mq_recv(serial_ll_hdl->queue, &buf_handle, sizeof(buf_handle), RT_WAITING_FOREVER) != sizeof(buf_handle)) {
 		printf("serial queue recv failed \n\r");
 		return NULL;
 	}

+ 32 - 25
host/driver/transport/spi/spi_drv.c

@@ -18,13 +18,14 @@
 #include <string.h>
 #include "rtthread.h"
 #include "rtdevice.h"
-#include "string.h"
+#include "common/stats.h"
 #include "common/trace.h"
-#include "spi_drv.h"
+#include "common/common.h"
+#include "transport_drv.h"
 #include "adapter.h"
 #include "serial_drv.h"
 #include "netdev_if.h"
-#include "common/stats.h"
+
 
 #define DBG_TAG           "esp.spi"
 #define DBG_LVL           DBG_INFO
@@ -61,8 +62,8 @@ static void (*spi_drv_evt_handler_fp) (uint8_t);
 /** function declaration **/
 /** Exported functions **/
 static stm_ret_t spi_transaction(uint8_t * txbuff);
-static void transaction_task(void* pvParameters);
-static void process_rx_task(void* pvParameters);
+static void transaction_task(void *pvParameters);
+static void process_rx_task(void *pvParameters);
 static uint8_t * get_tx_buffer(uint8_t *is_valid_tx_buf);
 static void deinit_netdev(void);
 
@@ -317,18 +318,6 @@ stm_ret_t send_to_slave(uint8_t iface_type, uint8_t iface_num,
 	return STM_OK;
 }
 
-/** Local functions **/
-
-/**
-  * @brief  Give breathing time for slave on spi
-  * @param  x - for loop delay count
-  * @retval None
-  */
-static void stop_spi_transactions_for_msec(int x)
-{
-	hard_delay(x);
-}
-
 /**
   * @brief  Full duplex transaction SPI transaction for ESP32S2 hardware
   * @param  txbuff: TX SPI buffer
@@ -373,6 +362,18 @@ static stm_ret_t spi_transaction(uint8_t * txbuff)
 
 		if ((!len) || (len > MAX_PAYLOAD_SIZE) || (offset != sizeof(struct esp_payload_header))) 
 		{
+			if (payload_header->if_num == 0xF && payload_header->if_type == ESP_MAX_IF)
+			{
+				/* dummy packet, ignore it */
+				LOG_D("Dummy packet received from slave");
+			}
+			else
+			{
+				LOG_W("Invalid packet received from slave, length: %d", rx_length);
+				LOG_HEX("rxbuff_head16", 16, rxbuff, min(rx_length, 32));
+				LOG_HEX("rxbuff_tail16", 16, rxbuff + (rx_length - min(rx_length, 32)), min(rx_length, 32));
+			}
+
 			/* Free up buffer, as one of following -
 				* 1. no payload to process
 				* 2. input packet size > driver capacity
@@ -383,7 +384,7 @@ static stm_ret_t spi_transaction(uint8_t * txbuff)
 				free(rxbuff);
 				rxbuff = NULL;
 			}
-			
+
 			/* Give chance to other tasks */
 			rt_thread_yield();
 		}
@@ -403,12 +404,15 @@ static stm_ret_t spi_transaction(uint8_t * txbuff)
 				buf_handle.payload     = rxbuff + offset;
 				buf_handle.seq_num     = le16toh(payload_header->seq_num);
 				buf_handle.flag        = payload_header->flags;
-
-				if (RT_EOK != rt_mq_send_wait(from_slave_queue, &buf_handle, sizeof(buf_handle), RT_WAITING_FOREVER)) {
+				LOG_D("if_type: %d, if_num: %d, len: %d, offset: %d, seq_num: %d, flags: 0x%x",
+						payload_header->if_type, payload_header->if_num, len, offset, le16toh(payload_header->seq_num), payload_header->flags);
+				LOG_HEX("payload", 16, buf_handle.payload, min(buf_handle.payload_len, 32));
+				if (RT_EOK != rt_mq_send_wait(from_slave_queue, &buf_handle, sizeof(interface_buffer_handle_t), 2000)) {
 					LOG_E("Failed to send buffer");
 					goto done;
 				}
 			} else {
+				LOG_E("Checksum mismatch, rx_checksum: 0x%04x, computed_checksum: 0x%04x", rx_checksum, checksum);
 				if (rxbuff) {
 					free(rxbuff);
 					rxbuff = NULL;
@@ -448,7 +452,7 @@ done:
   * @param  argument: Not used
   * @retval None
   */
-static void transaction_task(void* pvParameters)
+static void transaction_task(void *pvParameters)
 {
 	for (;;) {
 
@@ -466,7 +470,7 @@ static void transaction_task(void* pvParameters)
   * @param  argument: Not used
   * @retval None
   */
-static void process_rx_task(void* pvParameters)
+static void process_rx_task(void *pvParameters)
 {
 	interface_buffer_handle_t buf_handle = {0};
 	uint8_t *payload = NULL;
@@ -474,9 +478,12 @@ static void process_rx_task(void* pvParameters)
 	struct esp_priv_event *event = NULL;
 	struct esp_private *priv = NULL;
 
+	LOG_D("Starting RX processing thread");
+
 	while (1) {
 
-		if (rt_mq_recv(from_slave_queue, &buf_handle, sizeof(buf_handle), RT_WAITING_FOREVER) != RT_EOK) {
+		if (rt_mq_recv(from_slave_queue, &buf_handle, sizeof(interface_buffer_handle_t), RT_WAITING_FOREVER) != sizeof(interface_buffer_handle_t)) {
+			LOG_E("Failed to receive buffer");
 			continue;
 		}
 
@@ -527,7 +534,7 @@ static void process_rx_task(void* pvParameters)
 				/* halt spi transactions for some time,
 				 * this is one time delay, to give breathing
 				 * time to slave before spi trans start */
-				stop_spi_transactions_for_msec(50000);
+				// rt_thread_mdelay(100);
 				if (spi_drv_evt_handler_fp) {
 					spi_drv_evt_handler_fp(TRANSPORT_ACTIVE);
 				}
@@ -574,7 +581,7 @@ static uint8_t * get_tx_buffer(uint8_t *is_valid_tx_buf)
 	 * In that case only payload header with zero payload
 	 * length would be transmitted.
 	 */
-	if (RT_EOK == rt_mq_recv(to_slave_queue, &buf_handle, sizeof(buf_handle), 0)) {
+	if (rt_mq_recv(to_slave_queue, &buf_handle, sizeof(buf_handle), 0) == sizeof(buf_handle)) {
 		len = buf_handle.payload_len;
 	}
 

+ 0 - 42
host/driver/transport/spi/spi_drv.h

@@ -1,42 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// Copyright 2015-2021 Espressif Systems (Shanghai) PTE LTD
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-/** prevent recursive inclusion **/
-#ifndef __SPI_DRV_H
-#define __SPI_DRV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/** Includes **/
-#include "common.h"
-#include "transport_drv.h"
-
-/** constants/macros **/
-
-/** Exported Structures **/
-
-/** Exported variables **/
-
-/** Inline functions **/
-
-/** Exported Functions **/
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif

+ 11 - 3
host/driver/transport/transport_drv.c

@@ -17,7 +17,7 @@
 #include "transport_drv.h"
 #include "common/stats.h"
 
-#define DBG_TAG           "esp.trans"
+#define DBG_TAG           "esp.netdev"
 #define DBG_LVL           DBG_INFO
 #include "rtdbg.h"
 
@@ -182,6 +182,7 @@ static void adjust_spi_clock(uint8_t spi_clk_mhz)
 	// 	spi_context.spi_clk_mhz = spi_clk_mhz;
 	// 	spi_context.esp_spi_dev->max_speed_hz = spi_clk_mhz * NUMBER_1M;
 	// }
+#warning "adjust_spi_clock not implemented"
 }
 
 int process_init_event(uint8_t *evt_buf, uint8_t len)
@@ -205,7 +206,7 @@ int process_init_event(uint8_t *evt_buf, uint8_t len)
 		}
 		else if (*pos == ESP_PRIV_SPI_CLK_MHZ)
 		{
-			LOG_D("adjust spi clock: %uMHz", (*(pos + 2)));
+			LOG_D("adjust spi clock frequency to %u MHz", (*(pos + 2)));
 			adjust_spi_clock(*(pos + 2));
 		}
 		else if (*pos == ESP_PRIV_FIRMWARE_CHIP_ID)
@@ -219,9 +220,16 @@ int process_init_event(uint8_t *evt_buf, uint8_t len)
 			process_test_capabilities(*(pos + 2));
 #endif
 		}
+		else if (*pos == ESP_PRIV_FW_DATA)
+		{
+			struct fw_version *fw_ver = (struct fw_version *) (pos + 2);
+			LOG_D("ESP-Hosted Firmware version :: %s-%d.%d.%d.%d.%d",
+					fw_ver->project_name, fw_ver->major1, fw_ver->major2, fw_ver->minor,
+					fw_ver->revision_patch_1, fw_ver->revision_patch_2);
+		}
 		else
 		{
-			LOG_W("Unsupported tag in event");
+			LOG_W("Unsupported tag in event: %d", *pos);
 		}
 		pos += (tag_len+2);
 		len_left -= (tag_len+2);

+ 0 - 1
host/driver/transport/transport_drv.h

@@ -56,7 +56,6 @@ void transport_init(void(*transport_evt_handler)(uint8_t));
 
 void process_event(uint8_t *evt_buf, uint16_t len);
 void process_priv_communication(struct pbuf *pbuf);
-void print_capabilities(uint32_t cap);
 int process_init_event(uint8_t *evt_buf, uint8_t len);
 
 stm_ret_t send_to_slave(uint8_t iface_type, uint8_t iface_num,

+ 5 - 0
host/port/include/platform_wrapper.h

@@ -17,6 +17,11 @@
 #define HOSTED_SEM_BLOCKING                    RT_WAITING_FOREVER
 #define HOSTED_SEM_NON_BLOCKING                0
 
+#define CTRL_PATH_TASK_STACK_SIZE              4096
+#define CTRL_PATH_TASK_PRIO                    osPriorityAboveNormal
+
+#define thread_handle_t                        osThreadId
+#define semaphore_handle_t                     osSemaphoreId
 
 #define mem_free(x)                            \
 {                                              \

+ 2 - 1
host/port/src/platform_wrapper.c

@@ -58,6 +58,7 @@ int control_path_platform_init(void)
 	// 	LOG_E("could not obtain readSemaphore");
 	// 	return STM_FAIL;
 	// }
+#warning "control_path_platform_init"
 
 	serial_ll_if_g = serial_ll_init(control_path_rx_indication);
 	if (!serial_ll_if_g) {
@@ -243,7 +244,7 @@ int hosted_timer_stop(void *timer_handle)
  *
  * void expired(union sigval timer_data){
  *     struct mystruct *a = timer_data.sival_ptr;
- * 	printf("Expired %u", a->mydata++);
+ * 	printf("Expired %u\n", a->mydata++);
  * }
  **/
 

+ 3 - 4
wlan/esp_wlan.c

@@ -15,8 +15,8 @@
 #include "rtdevice.h"
 #include "ctrl_api.h"
 #include "netdev_api.h"
-#include "spi_drv.h"
 #include "common/util.h"
+#include "transport_drv.h"
 
 #define DBG_TAG           "esp.wlan"
 #define DBG_LVL           DBG_INFO
@@ -60,7 +60,6 @@ static void free_ctrl_resp_msg (ctrl_cmd_t *resp)
     }
 
 	free(resp);
-	resp = NULL;
 }
 
 static int get_response_result(ctrl_cmd_t * resp)
@@ -134,7 +133,7 @@ static int esp_ctrl_event_callback (ctrl_cmd_t * event)
 
 		case CTRL_EVENT_STATION_DISCONNECT_FROM_ESP_SOFTAP:
 		{
-			char *p = event->u.e_sta_disconnected.mac;
+			char *p = event->u.e_sta_disconn.bssid;
 			if (p && strlen(p)) {
 				LOG_D("App EVENT: SoftAP mode: Disconnect MAC[%s]", p);
 			}
@@ -403,7 +402,7 @@ static rt_err_t drv_wlan_softap(struct rt_wlan_device *wlan, struct rt_ap_info *
 
 	ctrl_cmd_default_req(&req);
 	strncpy((char *)req.u.wifi_softap_config.ssid, (char *)ap_info->ssid.val, min(ap_info->ssid.len, SSID_LENGTH-1));
-	strncpy((char *)req.u.wifi_softap_config.pwd, (char *)ap_info->key.val, min(ap_info->key.len, MAX_MAC_STR_LEN-1));
+	strncpy((char *)req.u.wifi_softap_config.pwd, (char *)ap_info->key.val, min(ap_info->key.len, PASSWORD_LENGTH-1));
 	req.u.wifi_softap_config.channel = ap_info->channel;
 	req.u.wifi_softap_config.encryption_mode = security_wlan_to_esp(ap_info->security);
 	req.u.wifi_softap_config.max_connections = 2;

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików