1717
1818#include "esp32-hal-hosted.h"
1919#include "esp32-hal-log.h"
20+ #include "pins_arduino.h"
2021
22+ #include "esp_hosted.h"
2123#include "esp_hosted_transport_config.h"
22- extern esp_err_t esp_hosted_init ();
23- extern esp_err_t esp_hosted_deinit ();
24+ // extern esp_err_t esp_hosted_init();
25+ // extern esp_err_t esp_hosted_deinit();
2426
2527static bool hosted_initialized = false;
2628static bool hosted_ble_active = false;
@@ -46,6 +48,100 @@ static sdio_pin_config_t sdio_pin_config = {
4648#endif
4749};
4850
51+ static esp_hosted_coprocessor_fwver_t slave_version_struct = {.major1 = 0 , .minor1 = 0 , .patch1 = 0 };
52+ static esp_hosted_coprocessor_fwver_t host_version_struct = {
53+ .major1 = ESP_HOSTED_VERSION_MAJOR_1 , .minor1 = ESP_HOSTED_VERSION_MINOR_1 , .patch1 = ESP_HOSTED_VERSION_PATCH_1
54+ };
55+
56+ void hostedGetHostVersion (uint32_t * major , uint32_t * minor , uint32_t * patch ) {
57+ * major = host_version_struct .major1 ;
58+ * minor = host_version_struct .minor1 ;
59+ * patch = host_version_struct .patch1 ;
60+ }
61+
62+ void hostedGetSlaveVersion (uint32_t * major , uint32_t * minor , uint32_t * patch ) {
63+ * major = slave_version_struct .major1 ;
64+ * minor = slave_version_struct .minor1 ;
65+ * patch = slave_version_struct .patch1 ;
66+ }
67+
68+ bool hostedHasUpdate () {
69+ uint32_t host_version = ESP_HOSTED_VERSION_VAL (host_version_struct .major1 , host_version_struct .minor1 , host_version_struct .patch1 );
70+ uint32_t slave_version = 0 ;
71+
72+ esp_err_t ret = esp_hosted_get_coprocessor_fwversion (& slave_version_struct );
73+ if (ret != ESP_OK ) {
74+ log_e ("Could not get slave firmware version: %s" , esp_err_to_name (ret ));
75+ } else {
76+ slave_version = ESP_HOSTED_VERSION_VAL (slave_version_struct .major1 , slave_version_struct .minor1 , slave_version_struct .patch1 );
77+ }
78+
79+ log_i ("Host firmware version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 , host_version_struct .major1 , host_version_struct .minor1 , host_version_struct .patch1 );
80+ log_i ("Slave firmware version: %" PRIu32 ".%" PRIu32 ".%" PRIu32 , slave_version_struct .major1 , slave_version_struct .minor1 , slave_version_struct .patch1 );
81+
82+ // compare major.minor only
83+ // slave_version &= 0xFFFFFF00;
84+ // host_version &= 0xFFFFFF00;
85+
86+ if (host_version == slave_version ) {
87+ log_i ("Versions Match!" );
88+ } else if (host_version > slave_version ) {
89+ log_w ("Version on Host is NEWER than version on co-processor" );
90+ log_w ("Update URL: %s" , hostedGetUpdateURL ());
91+ return true;
92+ } else {
93+ log_w ("Version on Host is OLDER than version on co-processor" );
94+ }
95+ return false;
96+ }
97+
98+ char * hostedGetUpdateURL () {
99+ // https://espressif.github.io/arduino-esp32/hosted/esp32c6-v1.2.3.bin
100+ static char url [92 ] = {0 };
101+ snprintf (
102+ url , 92 , "https://espressif.github.io/arduino-esp32/hosted/%s-v%" PRIu32 ".%" PRIu32 ".%" PRIu32 ".bin" , CONFIG_ESP_HOSTED_IDF_SLAVE_TARGET ,
103+ host_version_struct .major1 , host_version_struct .minor1 , host_version_struct .patch1
104+ );
105+ return url ;
106+ }
107+
108+ bool hostedBeginUpdate () {
109+ esp_err_t err = esp_hosted_slave_ota_begin ();
110+ if (err != ESP_OK ) {
111+ log_e ("Failed to begin Update: %s" , esp_err_to_name (err ));
112+ }
113+ return err == ESP_OK ;
114+ }
115+
116+ bool hostedWriteUpdate (uint8_t * buf , uint32_t len ) {
117+ esp_err_t err = esp_hosted_slave_ota_write (buf , len );
118+ if (err != ESP_OK ) {
119+ log_e ("Failed to write Update: %s" , esp_err_to_name (err ));
120+ }
121+ return err == ESP_OK ;
122+ }
123+
124+ bool hostedEndUpdate () {
125+ esp_err_t err = esp_hosted_slave_ota_end ();
126+ if (err != ESP_OK ) {
127+ log_e ("Failed to end Update: %s" , esp_err_to_name (err ));
128+ }
129+ return err == ESP_OK ;
130+ }
131+
132+ bool hostedActivateUpdate () {
133+ esp_err_t err = esp_hosted_slave_ota_activate ();
134+ if (err != ESP_OK ) {
135+ log_e ("Failed to activate Update: %s" , esp_err_to_name (err ));
136+ }
137+ // else {
138+ // hostedDeinit();
139+ // delay(1000);
140+ // hostedInit();
141+ // }
142+ return err == ESP_OK ;
143+ }
144+
49145static bool hostedInit () {
50146 if (!hosted_initialized ) {
51147 log_i ("Initializing ESP-Hosted" );
@@ -69,6 +165,12 @@ static bool hostedInit() {
69165 return false;
70166 }
71167 log_i ("ESP-Hosted initialized!" );
168+ if (esp_hosted_connect_to_slave () != ESP_OK ) {
169+ log_e ("Failed to connect to slave" );
170+ return false;
171+ }
172+ hostedHasUpdate ();
173+ return true;
72174 }
73175
74176 // Attach pins to PeriMan here
@@ -101,8 +203,21 @@ static bool hostedDeinit() {
101203
102204bool hostedInitBLE () {
103205 log_i ("Initializing ESP-Hosted for BLE" );
206+ if (!hostedInit ()) {
207+ return false;
208+ }
209+ esp_err_t err = esp_hosted_bt_controller_init ();
210+ if (err != ESP_OK ) {
211+ log_e ("esp_hosted_bt_controller_init failed: %s" , esp_err_to_name (err ));
212+ return false;
213+ }
214+ err = esp_hosted_bt_controller_enable ();
215+ if (err != ESP_OK ) {
216+ log_e ("esp_hosted_bt_controller_enable failed: %s" , esp_err_to_name (err ));
217+ return false;
218+ }
104219 hosted_ble_active = true;
105- return hostedInit () ;
220+ return true ;
106221}
107222
108223bool hostedInitWiFi () {
@@ -113,6 +228,16 @@ bool hostedInitWiFi() {
113228
114229bool hostedDeinitBLE () {
115230 log_i ("Deinitializing ESP-Hosted for BLE" );
231+ esp_err_t err = esp_hosted_bt_controller_disable ();
232+ if (err != ESP_OK ) {
233+ log_e ("esp_hosted_bt_controller_disable failed: %s" , esp_err_to_name (err ));
234+ return false;
235+ }
236+ err = esp_hosted_bt_controller_deinit (false);
237+ if (err != ESP_OK ) {
238+ log_e ("esp_hosted_bt_controller_deinit failed: %s" , esp_err_to_name (err ));
239+ return false;
240+ }
116241 hosted_ble_active = false;
117242 if (!hosted_wifi_active ) {
118243 return hostedDeinit ();
0 commit comments