# SPDX-FileCopyrightText: 2014-2022 Fredrik Ahlberg, Angus Gratton, # Espressif Systems (Shanghai) CO LTD, other contributors as noted. # # SPDX-License-Identifier: GPL-2.0-or-later import struct import time from typing import Dict from .esp32c3 import ESP32C3ROM from ..loader import ESPLoader from ..util import FatalError class ESP32C2ROM(ESP32C3ROM): CHIP_NAME = "ESP32-C2" IMAGE_CHIP_ID = 12 IROM_MAP_START = 0x42000000 IROM_MAP_END = 0x42400000 DROM_MAP_START = 0x3C000000 DROM_MAP_END = 0x3C400000 # Magic value for ESP32C2 ECO0 , ECO1 and ECO4 respectively CHIP_DETECT_MAGIC_VALUE = [0x6F51306F, 0x7C41A06F, 0x0C21E06F] EFUSE_BASE = 0x60008800 EFUSE_BLOCK2_ADDR = EFUSE_BASE + 0x040 MAC_EFUSE_REG = EFUSE_BASE + 0x040 EFUSE_SECURE_BOOT_EN_REG = EFUSE_BASE + 0x30 EFUSE_SECURE_BOOT_EN_MASK = 1 << 21 EFUSE_SPI_BOOT_CRYPT_CNT_REG = EFUSE_BASE + 0x30 EFUSE_SPI_BOOT_CRYPT_CNT_MASK = 0x7 << 18 EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG = EFUSE_BASE + 0x30 EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT = 1 << 6 EFUSE_XTS_KEY_LENGTH_256_REG = EFUSE_BASE + 0x30 EFUSE_XTS_KEY_LENGTH_256 = 1 << 10 EFUSE_BLOCK_KEY0_REG = EFUSE_BASE + 0x60 EFUSE_RD_DIS_REG = EFUSE_BASE + 0x30 EFUSE_RD_DIS = 3 FLASH_FREQUENCY = { "60m": 0xF, "30m": 0x0, "20m": 0x1, "15m": 0x2, } MEMORY_MAP = [ [0x00000000, 0x00010000, "PADDING"], [0x3C000000, 0x3C400000, "DROM"], [0x3FCA0000, 0x3FCE0000, "DRAM"], [0x3FC88000, 0x3FD00000, "BYTE_ACCESSIBLE"], [0x3FF00000, 0x3FF50000, "DROM_MASK"], [0x40000000, 0x40090000, "IROM_MASK"], [0x42000000, 0x42400000, "IROM"], [0x4037C000, 0x403C0000, "IRAM"], ] UF2_FAMILY_ID = 0x2B88D29C KEY_PURPOSES: Dict[int, str] = {} def get_pkg_version(self): num_word = 1 return (self.read_reg(self.EFUSE_BLOCK2_ADDR + (4 * num_word)) >> 22) & 0x07 def get_chip_description(self): chip_name = { 0: "ESP32-C2", 1: "ESP32-C2", }.get(self.get_pkg_version(), "unknown ESP32-C2") major_rev = self.get_major_chip_version() minor_rev = self.get_minor_chip_version() return f"{chip_name} (revision v{major_rev}.{minor_rev})" def get_minor_chip_version(self): num_word = 1 return (self.read_reg(self.EFUSE_BLOCK2_ADDR + (4 * num_word)) >> 16) & 0xF def get_major_chip_version(self): num_word = 1 return (self.read_reg(self.EFUSE_BLOCK2_ADDR + (4 * num_word)) >> 20) & 0x3 def get_flash_cap(self): # ESP32-C2 doesn't have eFuse field FLASH_CAP. # Can't get info about the flash chip. return 0 def get_flash_vendor(self): # ESP32-C2 doesn't have eFuse field FLASH_VENDOR. # Can't get info about the flash chip. return "" def get_crystal_freq(self): # The crystal detection algorithm of ESP32/ESP8266 works for ESP32-C2 as well. return ESPLoader.get_crystal_freq(self) def change_baud(self, baud): rom_with_26M_XTAL = not self.IS_STUB and self.get_crystal_freq() == 26 if rom_with_26M_XTAL: # The code is copied over from ESPLoader.change_baud(). # Probably this is just a temporary solution until the next chip revision. # The ROM code thinks it uses a 40 MHz XTAL. Recompute the baud rate # in order to trick the ROM code to set the correct baud rate for # a 26 MHz XTAL. false_rom_baud = baud * 40 // 26 print(f"Changing baud rate to {baud}") self.command( self.ESP_CHANGE_BAUDRATE, struct.pack("