// Copyright 2022 King Kévin // // 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. #include #include "esp_check.h" #include "esp_err.h" #include "esp_log.h" #include "esp_partition.h" #include "esp_ota_ops.h" #include "tusb.h" #include "tusb_dfu_rt.h" #include "sdkconfig.h" static const char *TAG = "tusb_dfu_rt"; esp_err_t tusb_dfu_rf_init(void) { // verify if factory partition exists const esp_partition_t *factory = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL); if (!factory) { return ESP_ERR_NOT_FOUND; } // verify if ota data partition exists const esp_partition_t *otadata = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_OTA, NULL); if (!otadata) { return ESP_ERR_NOT_FOUND; } return ESP_OK; } /* TinyUSB callbacks */ // Invoked on DFU_DETACH request to reboot to the bootloader // WARNING: function linked until public function (e.g. tusb_dfu_rf_init) is called void tud_dfu_runtime_reboot_to_dfu_cb(void) { ESP_LOGI(TAG, "reboot"); // switch to dfu factory const esp_partition_t *factory = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL); if (!factory) { ESP_LOGE(TAG, "factory partition not found"); return; } esp_err_t rc = esp_ota_set_boot_partition(factory); if (ESP_OK != rc) { ESP_LOGE(TAG, "can't set boot to factory"); return; } esp_restart(); }