245 lines
7.6 KiB
C
245 lines
7.6 KiB
C
|
/* Copyright 2020 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.
|
||
|
*/
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include <stdint.h>
|
||
|
|
||
|
//#define MD5_ENABLED 1
|
||
|
#ifdef __cplusplus
|
||
|
extern "C"
|
||
|
{
|
||
|
#endif
|
||
|
|
||
|
/**
|
||
|
* Macro which can be used to check the error code,
|
||
|
* and return in case the code is not ESP_LOADER_SUCCESS.
|
||
|
*/
|
||
|
#define RETURN_ON_ERROR(x) \
|
||
|
do \
|
||
|
{ \
|
||
|
esp_loader_error_t _err_ = (x); \
|
||
|
if (_err_ != ESP_LOADER_SUCCESS) \
|
||
|
{ \
|
||
|
return _err_; \
|
||
|
} \
|
||
|
} while (0)
|
||
|
|
||
|
/**
|
||
|
* @brief Error codes
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
ESP_LOADER_SUCCESS, /*!< Success */
|
||
|
ESP_LOADER_ERROR_FAIL, /*!< Unspecified error */
|
||
|
ESP_LOADER_ERROR_TIMEOUT, /*!< Timeout elapsed */
|
||
|
ESP_LOADER_ERROR_IMAGE_SIZE, /*!< Image size to flash is larger than flash size */
|
||
|
ESP_LOADER_ERROR_INVALID_MD5, /*!< Computed and received MD5 does not match */
|
||
|
ESP_LOADER_ERROR_INVALID_PARAM, /*!< Invalid parameter passed to function */
|
||
|
ESP_LOADER_ERROR_INVALID_TARGET, /*!< Connected target is invalid */
|
||
|
ESP_LOADER_ERROR_UNSUPPORTED_CHIP, /*!< Attached chip is not supported */
|
||
|
ESP_LOADER_ERROR_UNSUPPORTED_FUNC, /*!< Function is not supported on attached target */
|
||
|
ESP_LOADER_ERROR_INVALID_RESPONSE /*!< Internal error */
|
||
|
} esp_loader_error_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Supported targets
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
ESP8266_CHIP = 0,
|
||
|
ESP32_CHIP = 1,
|
||
|
ESP32S2_CHIP = 2,
|
||
|
ESP32C3_CHIP = 3,
|
||
|
ESP32S3_CHIP = 4,
|
||
|
ESP32C2_CHIP = 5,
|
||
|
ESP32H2_CHIP = 6,
|
||
|
ESP_MAX_CHIP = 7,
|
||
|
ESP_UNKNOWN_CHIP = 7
|
||
|
} target_chip_t;
|
||
|
|
||
|
/**
|
||
|
* @brief SPI pin configuration arguments
|
||
|
*/
|
||
|
typedef union
|
||
|
{
|
||
|
struct
|
||
|
{
|
||
|
uint32_t pin_clk : 6;
|
||
|
uint32_t pin_q : 6;
|
||
|
uint32_t pin_d : 6;
|
||
|
uint32_t pin_cs : 6;
|
||
|
uint32_t pin_hd : 6;
|
||
|
uint32_t zero : 2;
|
||
|
};
|
||
|
uint32_t val;
|
||
|
} esp_loader_spi_config_t;
|
||
|
|
||
|
/**
|
||
|
* @brief Connection arguments
|
||
|
*/
|
||
|
typedef struct
|
||
|
{
|
||
|
uint32_t sync_timeout; /*!< Maximum time to wait for response from serial interface. */
|
||
|
int32_t trials; /*!< Number of trials to connect to target. If greater than 1,
|
||
|
100 millisecond delay is inserted after each try. */
|
||
|
} esp_loader_connect_args_t;
|
||
|
|
||
|
#define ESP_LOADER_CONNECT_DEFAULT() \
|
||
|
{ \
|
||
|
.sync_timeout = 100, \
|
||
|
.trials = 50, \
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Connects to the target
|
||
|
*
|
||
|
* @param connect_args[in] Timing parameters to be used for connecting to target.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_connect(esp_loader_connect_args_t *connect_args);
|
||
|
|
||
|
/**
|
||
|
* @brief Returns attached target chip.
|
||
|
*
|
||
|
* @warning This function can only be called after connection with target
|
||
|
* has been successfully established by calling esp_loader_connect().
|
||
|
*
|
||
|
* @return One of target_chip_t
|
||
|
*/
|
||
|
target_chip_t esp_loader_get_target(void);
|
||
|
|
||
|
/**
|
||
|
* @brief Initiates flash operation
|
||
|
*
|
||
|
* @param offset[in] Address from which flash operation will be performed.
|
||
|
* @param image_size[in] Size of the whole binary to be loaded into flash.
|
||
|
* @param block_size[in] Size of buffer used in subsequent calls to esp_loader_flash_write.
|
||
|
*
|
||
|
* @note image_size is size of the whole image, whereas, block_size is chunk of data sent
|
||
|
* to the target, each time esp_loader_flash_write function is called.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_flash_start(uint32_t offset, uint32_t image_size, uint32_t block_size);
|
||
|
|
||
|
/**
|
||
|
* @brief Writes supplied data to target's flash memory.
|
||
|
*
|
||
|
* @param payload[in] Data to be flashed into target's memory.
|
||
|
* @param size[in] Size of payload in bytes.
|
||
|
*
|
||
|
* @note size must not be greater that block_size supplied to previously called
|
||
|
* esp_loader_flash_start function. If size is less than block_size,
|
||
|
* remaining bytes of payload buffer will be padded with 0xff.
|
||
|
* Therefore, size of payload buffer has to be equal or greater than block_size.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_flash_write(void *payload, uint32_t size);
|
||
|
|
||
|
/**
|
||
|
* @brief Ends flash operation.
|
||
|
*
|
||
|
* @param reboot[in] reboot the target if true.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_flash_finish(int reboot);
|
||
|
|
||
|
/**
|
||
|
* @brief Writes register.
|
||
|
*
|
||
|
* @param address[in] Address of register.
|
||
|
* @param reg_value[in] New register value.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_write_register(uint32_t address, uint32_t reg_value);
|
||
|
|
||
|
/**
|
||
|
* @brief Reads register.
|
||
|
*
|
||
|
* @param address[in] Address of register.
|
||
|
* @param reg_value[out] Register value.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_read_register(uint32_t address, uint32_t *reg_value);
|
||
|
|
||
|
/**
|
||
|
* @brief Change baud rate.
|
||
|
*
|
||
|
* @note Baud rate has to be also adjusted accordingly on host MCU, as
|
||
|
* target's baud rate is changed upon return from this function.
|
||
|
*
|
||
|
* @param baudrate[in] new baud rate to be set.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
* - ESP_LOADER_ERROR_UNSUPPORTED_FUNC Unsupported on the target
|
||
|
*/
|
||
|
esp_loader_error_t esp_loader_change_baudrate(uint32_t baudrate);
|
||
|
|
||
|
/**
|
||
|
* @brief Verify target's flash integrity by checking MD5.
|
||
|
* MD5 checksum is computed from data pushed to target's memory by calling
|
||
|
* esp_loader_flash_write() function and compared against target's MD5.
|
||
|
* Target computes checksum based on offset and image_size passed to
|
||
|
* esp_loader_flash_start() function.
|
||
|
*
|
||
|
* @note This function is only available if MD5_ENABLED is set.
|
||
|
*
|
||
|
* @return
|
||
|
* - ESP_LOADER_SUCCESS Success
|
||
|
* - ESP_LOADER_ERROR_INVALID_MD5 MD5 does not match
|
||
|
* - ESP_LOADER_ERROR_TIMEOUT Timeout
|
||
|
* - ESP_LOADER_ERROR_INVALID_RESPONSE Internal error
|
||
|
* - ESP_LOADER_ERROR_UNSUPPORTED_FUNC Unsupported on the target
|
||
|
*/
|
||
|
|
||
|
#if MD5_ENABLED
|
||
|
esp_loader_error_t esp_loader_flash_verify(void);
|
||
|
#endif
|
||
|
/**
|
||
|
* @brief Toggles reset pin.
|
||
|
*/
|
||
|
void esp_loader_reset_target(void);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|