1 /* 2 * SPDX-FileCopyrightText: 2016 Cesanta Software Limited 3 * 4 * SPDX-License-Identifier: GPL-2.0-or-later 5 * 6 * SPDX-FileContributor: 2016-2022 Espressif Systems (Shanghai) CO LTD 7 */ 8 9 #pragma once 10 #include <stdbool.h> 11 #include <stdint.h> 12 13 /* Maximum write block size, used for various buffers. */ 14 #define MAX_WRITE_BLOCK 0x4000 15 16 /* Flash geometry constants */ 17 #define FLASH_SECTOR_SIZE 4096 18 #define FLASH_BLOCK_SIZE 65536 19 #define FLASH_PAGE_SIZE 256 20 #define FLASH_STATUS_MASK 0xFFFF 21 #define SECTORS_PER_BLOCK (FLASH_BLOCK_SIZE / FLASH_SECTOR_SIZE) 22 23 /* 32-bit addressing is supported only by ESP32S3 */ 24 #if defined(ESP32S3) && !defined(ESP32S3BETA2) 25 #define FLASH_MAX_SIZE 64*1024*1024 26 extern bool large_flash_mode; 27 #else 28 #define FLASH_MAX_SIZE 16*1024*1024 29 #endif 30 31 /* Full set of protocol commands */ 32 typedef enum { 33 /* Commands supported by the ESP8266 & ESP32 bootloaders */ 34 ESP_FLASH_BEGIN = 0x02, 35 ESP_FLASH_DATA = 0x03, 36 ESP_FLASH_END = 0x04, 37 ESP_MEM_BEGIN = 0x05, 38 ESP_MEM_END = 0x06, 39 ESP_MEM_DATA = 0x07, 40 ESP_SYNC = 0x08, 41 ESP_WRITE_REG = 0x09, 42 ESP_READ_REG = 0x0a, 43 44 /* Commands supported by the ESP32 bootloader */ 45 ESP_SPI_SET_PARAMS = 0x0b, 46 ESP_PIN_READ = 0x0c, /* ??? */ 47 ESP_SPI_ATTACH = 0x0d, 48 ESP_SPI_READ = 0x0e, 49 ESP_SET_BAUD = 0x0f, 50 ESP_FLASH_DEFLATED_BEGIN = 0x10, 51 ESP_FLASH_DEFLATED_DATA = 0x11, 52 ESP_FLASH_DEFLATED_END = 0x12, 53 ESP_FLASH_VERIFY_MD5 = 0x13, 54 55 /* Commands supported by the ESP32S2 and later bootloaders */ 56 ESP_GET_SECURITY_INFO = 0x14, 57 58 /* Stub-only commands */ 59 ESP_ERASE_FLASH = 0xD0, 60 ESP_ERASE_REGION = 0xD1, 61 ESP_READ_FLASH = 0xD2, 62 ESP_RUN_USER_CODE = 0xD3, 63 64 /* Flash encryption debug mode supported command */ 65 ESP_FLASH_ENCRYPT_DATA = 0xD4, 66 } esp_command; 67 68 /* Command request header */ 69 typedef struct __attribute__((packed)) { 70 uint8_t zero; 71 uint8_t op; /* maps to esp_command enum */ 72 uint16_t data_len; 73 int32_t checksum; 74 uint8_t data_buf[32]; /* actually variable length, determined by data_len */ 75 } esp_command_req_t; 76 77 /* Command response header */ 78 typedef struct __attribute__((packed)) { 79 uint8_t resp; /* should be '1' */ 80 uint8_t op_ret; /* Should match 'op' */ 81 uint16_t len_ret; /* Length of result data (can be ignored as SLIP framing helps) */ 82 int32_t value; /* 32-bit response used by some commands */ 83 } esp_command_response_t; 84 85 86 /* command response has some (optional) data after it, then 2 (or 4 on ESP32 ROM) 87 bytes of status. 88 */ 89 typedef struct __attribute__((packed)) { 90 uint8_t error; /* non-zero = failed */ 91 uint8_t status; /* status of a failure */ 92 } esp_command_data_status_t; 93 94 /* Error codes */ 95 typedef enum { 96 ESP_OK = 0, 97 98 ESP_BAD_DATA_LEN = 0xC0, 99 ESP_BAD_DATA_CHECKSUM = 0xC1, 100 ESP_BAD_BLOCKSIZE = 0xC2, 101 ESP_INVALID_COMMAND = 0xC3, 102 ESP_FAILED_SPI_OP = 0xC4, 103 ESP_FAILED_SPI_UNLOCK = 0xC5, 104 ESP_NOT_IN_FLASH_MODE = 0xC6, 105 ESP_INFLATE_ERROR = 0xC7, 106 ESP_NOT_ENOUGH_DATA = 0xC8, 107 ESP_TOO_MUCH_DATA = 0xC9, 108 109 ESP_CMD_NOT_IMPLEMENTED = 0xFF, 110 } esp_command_error; 111