bootloader: override the 2nd stage bootloader
Add the possibility to have user bootloader components. This is performed from an application/project, by creating bootloader components. To do so, it is required to create a `bootloader_component` directory containing the custom modules to be compiled with the bootloader. Thanks to this, two solutions are available to override the bootloader now: - Using hooks within a user bootloader component - Using a user defined `main` bootloader component to totally override the old implementation Please check the two new examples in `examples/custom_bootloader` * Closes https://github.com/espressif/esp-idf/issues/7043
This commit is contained in:
@@ -27,6 +27,9 @@ BOOTLOADER_OFFSET := 0x1000
|
||||
# NB: Some variables are cleared in the environment, not
|
||||
# overriden, because they need to be re-defined in the child
|
||||
# project.
|
||||
#
|
||||
# Pass PROJECT_PATH variable, it will let the subproject look
|
||||
# for user defined bootloader component(s).
|
||||
BOOTLOADER_MAKE= +\
|
||||
PROJECT_PATH= \
|
||||
COMPONENT_DIRS= \
|
||||
@@ -35,7 +38,8 @@ BOOTLOADER_MAKE= +\
|
||||
BUILD_DIR_BASE=$(BOOTLOADER_BUILD_DIR) \
|
||||
TEST_COMPONENTS= \
|
||||
TESTS_ALL= \
|
||||
EXCLUDE_COMPONENTS=
|
||||
EXCLUDE_COMPONENTS= \
|
||||
PROJECT_SOURCE_DIR=$(PROJECT_PATH)
|
||||
|
||||
.PHONY: bootloader-clean bootloader-flash bootloader-list-components bootloader $(BOOTLOADER_BIN)
|
||||
|
||||
|
||||
@@ -117,6 +117,7 @@ externalproject_add(bootloader
|
||||
CMAKE_ARGS -DSDKCONFIG=${sdkconfig} -DIDF_PATH=${idf_path} -DIDF_TARGET=${idf_target}
|
||||
-DPYTHON_DEPS_CHECKED=1 -DPYTHON=${python}
|
||||
-DEXTRA_COMPONENT_DIRS=${CMAKE_CURRENT_LIST_DIR}
|
||||
-DPROJECT_SOURCE_DIR=${PROJECT_SOURCE_DIR}
|
||||
${sign_key_arg} ${ver_key_arg}
|
||||
# LEGACY_INCLUDE_COMMON_HEADERS has to be passed in via cache variable since
|
||||
# the bootloader common component requirements depends on this and
|
||||
|
||||
@@ -33,6 +33,21 @@ set(COMPONENTS
|
||||
efuse
|
||||
esp_system
|
||||
newlib)
|
||||
|
||||
# Make EXTRA_COMPONENT_DIRS variable to point to the bootloader_components directory
|
||||
# of the project being compiled
|
||||
set(PROJECT_EXTRA_COMPONENTS "${PROJECT_SOURCE_DIR}/bootloader_components")
|
||||
set(EXTRA_COMPONENT_DIRS "${PROJECT_EXTRA_COMPONENTS}" APPEND)
|
||||
|
||||
# Consider each directory in project's bootloader_components as a component to be compiled
|
||||
file(GLOB proj_components RELATIVE ${PROJECT_EXTRA_COMPONENTS} ${PROJECT_EXTRA_COMPONENTS}/*)
|
||||
foreach(component ${proj_components})
|
||||
# Only directories are considered as components
|
||||
if(IS_DIRECTORY ${curdir}/${child})
|
||||
list(APPEND COMPONENTS ${component})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
set(BOOTLOADER_BUILD 1)
|
||||
include("${IDF_PATH}/tools/cmake/project.cmake")
|
||||
set(common_req log esp_rom esp_common esp_hw_support hal newlib)
|
||||
|
||||
@@ -4,8 +4,10 @@ idf_component_register(SRCS "bootloader_start.c"
|
||||
idf_build_get_property(target IDF_TARGET)
|
||||
set(scripts "ld/${target}/bootloader.ld")
|
||||
|
||||
if(NOT CONFIG_IDF_TARGET_ESP32C3 AND NOT CONFIG_IDF_TARGET_ESP32H2)
|
||||
if(NOT CONFIG_IDF_TARGET_ESP32H2)
|
||||
list(APPEND scripts "ld/${target}/bootloader.rom.ld")
|
||||
endif()
|
||||
|
||||
target_linker_script(${COMPONENT_LIB} INTERFACE "${scripts}")
|
||||
|
||||
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u bootloader_hooks_include")
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// 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.
|
||||
|
||||
#ifndef BOOTLOADER_HOOKS_H
|
||||
#define BOOTLOADER_HOOKS_H
|
||||
|
||||
/**
|
||||
* @file The 2nd stage bootloader can be overriden or completed by an application.
|
||||
* The functions declared here are weak, and thus, are meant to be defined by a user
|
||||
* project, if required.
|
||||
* Please check `custom_bootloader` ESP-IDF examples for more details about this feature.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @brief Function executed *before* the second stage bootloader initialization,
|
||||
* if provided.
|
||||
*/
|
||||
void __attribute__((weak)) bootloader_before_init(void);
|
||||
|
||||
/**
|
||||
* @brief Function executed *after* the second stage bootloader initialization,
|
||||
* if provided.
|
||||
*/
|
||||
void __attribute__((weak)) bootloader_after_init(void);
|
||||
|
||||
#endif // BOOTLOADER_HOOKS_H
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "bootloader_init.h"
|
||||
#include "bootloader_utility.h"
|
||||
#include "bootloader_common.h"
|
||||
#include "bootloader_hooks.h"
|
||||
|
||||
static const char *TAG = "boot";
|
||||
|
||||
@@ -29,11 +30,21 @@ static int selected_boot_partition(const bootloader_state_t *bs);
|
||||
*/
|
||||
void __attribute__((noreturn)) call_start_cpu0(void)
|
||||
{
|
||||
// (0. Call the before-init hook, if available)
|
||||
if (bootloader_before_init) {
|
||||
bootloader_before_init();
|
||||
}
|
||||
|
||||
// 1. Hardware initialization
|
||||
if (bootloader_init() != ESP_OK) {
|
||||
bootloader_reset();
|
||||
}
|
||||
|
||||
// (1.1 Call the after-init hook, if available)
|
||||
if (bootloader_after_init) {
|
||||
bootloader_after_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP
|
||||
// If this boot is a wake up from the deep sleep then go to the short way,
|
||||
// try to load the application which worked before deep sleep.
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
/* No definition for ESP32-C3 target */
|
||||
Reference in New Issue
Block a user