Procházet zdrojové kódy

Added support for ESP32-S3

Martin Valik před 4 roky
rodič
revize
988154feb4
5 změnil soubory, kde provedl 33 přidání a 5 odebrání
  1. 2 1
      .gitlab-ci.yml
  2. 3 2
      include/esp_loader.h
  3. 18 1
      src/esp_targets.c
  4. 3 1
      src/serial_comm.c
  5. 7 0
      test/test.cpp

+ 2 - 1
.gitlab-ci.yml

@@ -33,11 +33,12 @@ before_script:
 
 
 build_with_idf:
 build_with_idf:
   stage: build
   stage: build
-  image: ${CI_DOCKER_REGISTRY}/esp32-ci-env
+  image: $CI_DOCKER_REGISTRY/esp-env:v4.4-1
   tags:
   tags:
     - build
     - build
     - internet
     - internet
   script:
   script:
+    - source /opt/pyenv/activate && pyenv global 3.6.13
     - *clone_and_setup_idf
     - *clone_and_setup_idf
     - cd $CI_PROJECT_DIR/examples/esp32_example
     - cd $CI_PROJECT_DIR/examples/esp32_example
     # Build for all supported targets
     # Build for all supported targets

+ 3 - 2
include/esp_loader.h

@@ -57,8 +57,9 @@ typedef enum {
     ESP32_CHIP   = 1,
     ESP32_CHIP   = 1,
     ESP32S2_CHIP = 2,
     ESP32S2_CHIP = 2,
     ESP32C3_CHIP = 3,
     ESP32C3_CHIP = 3,
-    ESP_MAX_CHIP = 4,
-    ESP_UNKNOWN_CHIP = 4
+    ESP32S3_CHIP = 4,
+    ESP_MAX_CHIP = 5,
+    ESP_UNKNOWN_CHIP = 5
 } target_chip_t;
 } target_chip_t;
 
 
 /**
 /**

+ 18 - 1
src/esp_targets.c

@@ -31,6 +31,7 @@ typedef struct {
 #define ESP8266_SPI_REG_BASE 0x60000200
 #define ESP8266_SPI_REG_BASE 0x60000200
 #define ESP32S2_SPI_REG_BASE 0x3f402000
 #define ESP32S2_SPI_REG_BASE 0x3f402000
 #define ESP32C3_SPI_REG_BASE 0x60002000
 #define ESP32C3_SPI_REG_BASE 0x60002000
+#define ESP32S3_SPI_REG_BASE 0x60002000
 #define ESP32_SPI_REG_BASE   0x3ff42000
 #define ESP32_SPI_REG_BASE   0x3ff42000
 
 
 static esp_loader_error_t spi_config_esp32(uint32_t efuse_base, uint32_t *spi_config);
 static esp_loader_error_t spi_config_esp32(uint32_t efuse_base, uint32_t *spi_config);
@@ -101,6 +102,22 @@ static const esp_target_t esp_target[ESP_MAX_CHIP] = {
         .chip_magic_value = 0x6921506f,
         .chip_magic_value = 0x6921506f,
         .read_spi_config = spi_config_esp32xx,
         .read_spi_config = spi_config_esp32xx,
     },
     },
+
+    // ESP32S3
+    {
+        .regs = {
+            .cmd  = ESP32C3_SPI_REG_BASE + 0x00,
+            .usr  = ESP32C3_SPI_REG_BASE + 0x18,
+            .usr1 = ESP32C3_SPI_REG_BASE + 0x1c,
+            .usr2 = ESP32C3_SPI_REG_BASE + 0x20,
+            .w0   = ESP32C3_SPI_REG_BASE + 0x58,
+            .mosi_dlen = ESP32C3_SPI_REG_BASE + 0x24,
+            .miso_dlen = ESP32C3_SPI_REG_BASE + 0x28,
+        },
+        .efuse_base = 0x60007000,
+        .chip_magic_value = 0x00000009,
+        .read_spi_config = spi_config_esp32xx, // !
+    },
 };
 };
 
 
 const target_registers_t *get_esp_target_data(target_chip_t chip)
 const target_registers_t *get_esp_target_data(target_chip_t chip)
@@ -171,7 +188,7 @@ static esp_loader_error_t spi_config_esp32(uint32_t efuse_base, uint32_t *spi_co
     return ESP_LOADER_SUCCESS;
     return ESP_LOADER_SUCCESS;
 }
 }
 
 
-// Applies for esp32s2 and esp32c3
+// Applies for esp32s2, esp32c3 and esp32c3
 static esp_loader_error_t spi_config_esp32xx(uint32_t efuse_base, uint32_t *spi_config)
 static esp_loader_error_t spi_config_esp32xx(uint32_t efuse_base, uint32_t *spi_config)
 {
 {
     *spi_config = 0;
     *spi_config = 0;

+ 3 - 1
src/serial_comm.c

@@ -238,7 +238,9 @@ static esp_loader_error_t check_response(command_t cmd, uint32_t *reg_value, voi
 
 
 static inline uint32_t encryption_field_size(target_chip_t target)
 static inline uint32_t encryption_field_size(target_chip_t target)
 {
 {
-    return (target == ESP32S2_CHIP || target == ESP32C3_CHIP) ? 0 : sizeof(uint32_t);
+    return (target == ESP32S2_CHIP || 
+            target == ESP32C3_CHIP || 
+            target == ESP32S3_CHIP) ? 0 : sizeof(uint32_t);
 }
 }
 
 
 
 

+ 7 - 0
test/test.cpp

@@ -116,6 +116,7 @@ map<target_chip_t, uint32_t> chip_magic_value = {
     {ESP32_CHIP,    0x00f01d83},
     {ESP32_CHIP,    0x00f01d83},
     {ESP32S2_CHIP,  0x000007c6},
     {ESP32S2_CHIP,  0x000007c6},
     {ESP32C3_CHIP,  0x6921506f},
     {ESP32C3_CHIP,  0x6921506f},
+    {ESP32S3_CHIP,  0x00000009},
 };
 };
 
 
 void queue_connect_response(target_chip_t target = ESP32_CHIP)
 void queue_connect_response(target_chip_t target = ESP32_CHIP)
@@ -200,6 +201,12 @@ TEST_CASE( "Can detect attached target" )
         REQUIRE( esp_loader_get_target() == ESP32C3_CHIP );
         REQUIRE( esp_loader_get_target() == ESP32C3_CHIP );
     }
     }
 
 
+    SECTION( "Can detect ESP32S3" ) {
+        queue_connect_response(ESP32S3_CHIP);
+        REQUIRE_SUCCESS( esp_loader_connect(&connect_config) );
+        REQUIRE( esp_loader_get_target() == ESP32S3_CHIP );
+    }
+
     SECTION( "Can detect ESP8266" ) {
     SECTION( "Can detect ESP8266" ) {
         queue_connect_response(ESP8266_CHIP);
         queue_connect_response(ESP8266_CHIP);
         REQUIRE_SUCCESS( esp_loader_connect(&connect_config) );
         REQUIRE_SUCCESS( esp_loader_connect(&connect_config) );