mirror of
https://github.com/esphome/esphome.git
synced 2026-05-27 20:53:46 +08:00
Initial ESP32-C3-DevKitM-1 board support (#2062)
Co-authored-by: Stijn Tintel <stijn@linux-ipv6.be>
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@ static const char *const TAG = "adc";
|
|||||||
void ADCSensor::set_attenuation(adc_atten_t attenuation) { this->attenuation_ = attenuation; }
|
void ADCSensor::set_attenuation(adc_atten_t attenuation) { this->attenuation_ = attenuation; }
|
||||||
|
|
||||||
inline adc1_channel_t gpio_to_adc1(uint8_t pin) {
|
inline adc1_channel_t gpio_to_adc1(uint8_t pin) {
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
switch (pin) {
|
switch (pin) {
|
||||||
case 36:
|
case 36:
|
||||||
return ADC1_CHANNEL_0;
|
return ADC1_CHANNEL_0;
|
||||||
@@ -34,6 +35,22 @@ inline adc1_channel_t gpio_to_adc1(uint8_t pin) {
|
|||||||
default:
|
default:
|
||||||
return ADC1_CHANNEL_MAX;
|
return ADC1_CHANNEL_MAX;
|
||||||
}
|
}
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2
|
||||||
|
switch (pin) {
|
||||||
|
case 0:
|
||||||
|
return ADC1_CHANNEL_0;
|
||||||
|
case 1:
|
||||||
|
return ADC1_CHANNEL_1;
|
||||||
|
case 2:
|
||||||
|
return ADC1_CHANNEL_2;
|
||||||
|
case 3:
|
||||||
|
return ADC1_CHANNEL_3;
|
||||||
|
case 4:
|
||||||
|
return ADC1_CHANNEL_4;
|
||||||
|
default:
|
||||||
|
return ADC1_CHANNEL_MAX;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -46,8 +63,10 @@ void ADCSensor::setup() {
|
|||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
adc1_config_channel_atten(gpio_to_adc1(pin_), attenuation_);
|
adc1_config_channel_atten(gpio_to_adc1(pin_), attenuation_);
|
||||||
adc1_config_width(ADC_WIDTH_BIT_12);
|
adc1_config_width(ADC_WIDTH_BIT_12);
|
||||||
|
#if !CONFIG_IDF_TARGET_ESP32C3 && !CONFIG_IDF_TARGET_ESP32H2
|
||||||
adc_gpio_init(ADC_UNIT_1, (adc_channel_t) gpio_to_adc1(pin_));
|
adc_gpio_init(ADC_UNIT_1, (adc_channel_t) gpio_to_adc1(pin_));
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
void ADCSensor::dump_config() {
|
void ADCSensor::dump_config() {
|
||||||
LOG_SENSOR("", "ADC Sensor", this);
|
LOG_SENSOR("", "ADC Sensor", this);
|
||||||
@@ -89,6 +108,7 @@ float ADCSensor::sample() {
|
|||||||
#ifdef ARDUINO_ARCH_ESP32
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
int raw = adc1_get_raw(gpio_to_adc1(pin_));
|
int raw = adc1_get_raw(gpio_to_adc1(pin_));
|
||||||
float value_v = raw / 4095.0f;
|
float value_v = raw / 4095.0f;
|
||||||
|
#if CONFIG_IDF_TARGET_ESP32
|
||||||
switch (this->attenuation_) {
|
switch (this->attenuation_) {
|
||||||
case ADC_ATTEN_DB_0:
|
case ADC_ATTEN_DB_0:
|
||||||
value_v *= 1.1;
|
value_v *= 1.1;
|
||||||
@@ -105,6 +125,24 @@ float ADCSensor::sample() {
|
|||||||
default: // This is to satisfy the unused ADC_ATTEN_MAX
|
default: // This is to satisfy the unused ADC_ATTEN_MAX
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2
|
||||||
|
switch (this->attenuation_) {
|
||||||
|
case ADC_ATTEN_DB_0:
|
||||||
|
value_v *= 0.84;
|
||||||
|
break;
|
||||||
|
case ADC_ATTEN_DB_2_5:
|
||||||
|
value_v *= 1.13;
|
||||||
|
break;
|
||||||
|
case ADC_ATTEN_DB_6:
|
||||||
|
value_v *= 1.56;
|
||||||
|
break;
|
||||||
|
case ADC_ATTEN_DB_11:
|
||||||
|
value_v *= 3.0;
|
||||||
|
break;
|
||||||
|
default: // This is to satisfy the unused ADC_ATTEN_MAX
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
return value_v;
|
return value_v;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ from esphome.coroutine import FakeEventLoop as _FakeEventLoop
|
|||||||
from esphome.coroutine import coroutine, coroutine_with_priority # noqa
|
from esphome.coroutine import coroutine, coroutine_with_priority # noqa
|
||||||
from esphome.helpers import ensure_unique_string, is_hassio
|
from esphome.helpers import ensure_unique_string, is_hassio
|
||||||
from esphome.util import OrderedDict
|
from esphome.util import OrderedDict
|
||||||
|
from esphome import boards
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from ..cpp_generator import MockObj, MockObjClass, Statement
|
from ..cpp_generator import MockObj, MockObjClass, Statement
|
||||||
@@ -593,10 +594,20 @@ class EsphomeCore:
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def is_esp32(self):
|
def is_esp32(self):
|
||||||
|
"""Check if the ESP32 platform is used.
|
||||||
|
|
||||||
|
This checks if the ESP32 platform is in use, which
|
||||||
|
support ESP32 as well as other chips such as ESP32-C3
|
||||||
|
"""
|
||||||
if self.esp_platform is None:
|
if self.esp_platform is None:
|
||||||
raise ValueError("No platform specified")
|
raise ValueError("No platform specified")
|
||||||
return self.esp_platform == "ESP32"
|
return self.esp_platform == "ESP32"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_esp32_c3(self):
|
||||||
|
"""Check if the ESP32-C3 SoC is being used."""
|
||||||
|
return self.is_esp32 and self.board in boards.ESP32_C3_BOARD_PINS
|
||||||
|
|
||||||
def add_job(self, func, *args, **kwargs):
|
def add_job(self, func, *args, **kwargs):
|
||||||
self.event_loop.add_job(func, *args, **kwargs)
|
self.event_loop.add_job(func, *args, **kwargs)
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import re
|
|||||||
|
|
||||||
import esphome.codegen as cg
|
import esphome.codegen as cg
|
||||||
import esphome.config_validation as cv
|
import esphome.config_validation as cv
|
||||||
from esphome import automation, pins
|
from esphome import automation, boards
|
||||||
from esphome.const import (
|
from esphome.const import (
|
||||||
CONF_ARDUINO_VERSION,
|
CONF_ARDUINO_VERSION,
|
||||||
CONF_BOARD,
|
CONF_BOARD,
|
||||||
@@ -50,18 +50,19 @@ VERSION_REGEX = re.compile(r"^[0-9]+\.[0-9]+\.[0-9]+(?:[ab]\d+)?$")
|
|||||||
CONF_NAME_ADD_MAC_SUFFIX = "name_add_mac_suffix"
|
CONF_NAME_ADD_MAC_SUFFIX = "name_add_mac_suffix"
|
||||||
|
|
||||||
|
|
||||||
def validate_board(value):
|
def validate_board(value: str):
|
||||||
if CORE.is_esp8266:
|
if CORE.is_esp8266:
|
||||||
board_pins = pins.ESP8266_BOARD_PINS
|
boardlist = boards.ESP8266_BOARD_PINS.keys()
|
||||||
elif CORE.is_esp32:
|
elif CORE.is_esp32:
|
||||||
board_pins = pins.ESP32_BOARD_PINS
|
boardlist = list(boards.ESP32_BOARD_PINS.keys())
|
||||||
|
boardlist += list(boards.ESP32_C3_BOARD_PINS.keys())
|
||||||
else:
|
else:
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
if value not in board_pins:
|
if value not in boardlist:
|
||||||
raise cv.Invalid(
|
raise cv.Invalid(
|
||||||
"Could not find board '{}'. Valid boards are {}".format(
|
"Could not find board '{}'. Valid boards are {}".format(
|
||||||
value, ", ".join(sorted(board_pins.keys()))
|
value, ", ".join(sorted(boardlist))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
return value
|
return value
|
||||||
|
|||||||
+31
-864
File diff suppressed because it is too large
Load Diff
@@ -202,6 +202,8 @@ STACKTRACE_ESP8266_PC_RE = re.compile(r"epc1=0x(4[0-9a-fA-F]{7})")
|
|||||||
STACKTRACE_ESP8266_EXCVADDR_RE = re.compile(r"excvaddr=0x(4[0-9a-fA-F]{7})")
|
STACKTRACE_ESP8266_EXCVADDR_RE = re.compile(r"excvaddr=0x(4[0-9a-fA-F]{7})")
|
||||||
STACKTRACE_ESP32_PC_RE = re.compile(r"PC\s*:\s*(?:0x)?(4[0-9a-fA-F]{7})")
|
STACKTRACE_ESP32_PC_RE = re.compile(r"PC\s*:\s*(?:0x)?(4[0-9a-fA-F]{7})")
|
||||||
STACKTRACE_ESP32_EXCVADDR_RE = re.compile(r"EXCVADDR\s*:\s*(?:0x)?(4[0-9a-fA-F]{7})")
|
STACKTRACE_ESP32_EXCVADDR_RE = re.compile(r"EXCVADDR\s*:\s*(?:0x)?(4[0-9a-fA-F]{7})")
|
||||||
|
STACKTRACE_ESP32_C3_PC_RE = re.compile(r"MEPC\s*:\s*(?:0x)?(4[0-9a-fA-F]{7})")
|
||||||
|
STACKTRACE_ESP32_C3_RA_RE = re.compile(r"RA\s*:\s*(?:0x)?(4[0-9a-fA-F]{7})")
|
||||||
STACKTRACE_BAD_ALLOC_RE = re.compile(
|
STACKTRACE_BAD_ALLOC_RE = re.compile(
|
||||||
r"^last failed alloc call: (4[0-9a-fA-F]{7})\((\d+)\)$"
|
r"^last failed alloc call: (4[0-9a-fA-F]{7})\((\d+)\)$"
|
||||||
)
|
)
|
||||||
@@ -228,6 +230,9 @@ def process_stacktrace(config, line, backtrace_state):
|
|||||||
# ESP32 PC/EXCVADDR
|
# ESP32 PC/EXCVADDR
|
||||||
_parse_register(config, STACKTRACE_ESP32_PC_RE, line)
|
_parse_register(config, STACKTRACE_ESP32_PC_RE, line)
|
||||||
_parse_register(config, STACKTRACE_ESP32_EXCVADDR_RE, line)
|
_parse_register(config, STACKTRACE_ESP32_EXCVADDR_RE, line)
|
||||||
|
# ESP32-C3 PC/RA
|
||||||
|
_parse_register(config, STACKTRACE_ESP32_C3_PC_RE, line)
|
||||||
|
_parse_register(config, STACKTRACE_ESP32_C3_RA_RE, line)
|
||||||
|
|
||||||
# bad alloc
|
# bad alloc
|
||||||
match = re.match(STACKTRACE_BAD_ALLOC_RE, line)
|
match = re.match(STACKTRACE_BAD_ALLOC_RE, line)
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ from esphome.helpers import get_bool_env, write_file
|
|||||||
from esphome.log import color, Fore
|
from esphome.log import color, Fore
|
||||||
|
|
||||||
# pylint: disable=anomalous-backslash-in-string
|
# pylint: disable=anomalous-backslash-in-string
|
||||||
from esphome.pins import ESP32_BOARD_PINS, ESP8266_BOARD_PINS
|
from esphome.boards import ESP32_BOARD_PINS, ESP8266_BOARD_PINS
|
||||||
from esphome.storage_json import StorageJSON, ext_storage_path
|
from esphome.storage_json import StorageJSON, ext_storage_path
|
||||||
from esphome.util import safe_print
|
from esphome.util import safe_print
|
||||||
from esphome.const import ALLOWED_NAME_CHARS, ENV_QUICKWIZARD
|
from esphome.const import ALLOWED_NAME_CHARS, ENV_QUICKWIZARD
|
||||||
|
|||||||
+1
-1
@@ -25,7 +25,7 @@ from esphome.helpers import (
|
|||||||
get_bool_env,
|
get_bool_env,
|
||||||
)
|
)
|
||||||
from esphome.storage_json import StorageJSON, storage_path
|
from esphome.storage_json import StorageJSON, storage_path
|
||||||
from esphome.pins import ESP8266_FLASH_SIZES, ESP8266_LD_SCRIPTS
|
from esphome.boards import ESP8266_FLASH_SIZES, ESP8266_LD_SCRIPTS
|
||||||
from esphome import loader
|
from esphome import loader
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|||||||
@@ -11,13 +11,13 @@ import pytest
|
|||||||
|
|
||||||
from esphome.config_validation import Invalid
|
from esphome.config_validation import Invalid
|
||||||
from esphome.core import EsphomeCore
|
from esphome.core import EsphomeCore
|
||||||
from esphome import pins
|
from esphome import boards, pins
|
||||||
|
|
||||||
|
|
||||||
MOCK_ESP8266_BOARD_ID = "_mock_esp8266"
|
MOCK_ESP8266_BOARD_ID = "_mock_esp8266"
|
||||||
MOCK_ESP8266_PINS = {"X0": 16, "X1": 5, "X2": 4, "LED": 2}
|
MOCK_ESP8266_PINS = {"X0": 16, "X1": 5, "X2": 4, "LED": 2}
|
||||||
MOCK_ESP8266_BOARD_ALIAS_ID = "_mock_esp8266_alias"
|
MOCK_ESP8266_BOARD_ALIAS_ID = "_mock_esp8266_alias"
|
||||||
MOCK_ESP8266_FLASH_SIZE = pins.FLASH_SIZE_2_MB
|
MOCK_ESP8266_FLASH_SIZE = boards.FLASH_SIZE_2_MB
|
||||||
|
|
||||||
MOCK_ESP32_BOARD_ID = "_mock_esp32"
|
MOCK_ESP32_BOARD_ID = "_mock_esp32"
|
||||||
MOCK_ESP32_PINS = {"Y0": 12, "Y1": 8, "Y2": 3, "LED": 9, "A0": 8}
|
MOCK_ESP32_PINS = {"Y0": 12, "Y1": 8, "Y2": 3, "LED": 9, "A0": 8}
|
||||||
@@ -31,19 +31,19 @@ def mock_mcu(monkeypatch):
|
|||||||
"""
|
"""
|
||||||
Add a mock MCU into the lists as a stable fixture
|
Add a mock MCU into the lists as a stable fixture
|
||||||
"""
|
"""
|
||||||
pins.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ID] = MOCK_ESP8266_PINS
|
boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ID] = MOCK_ESP8266_PINS
|
||||||
pins.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ID] = MOCK_ESP8266_FLASH_SIZE
|
boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ID] = MOCK_ESP8266_FLASH_SIZE
|
||||||
pins.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ALIAS_ID] = MOCK_ESP8266_BOARD_ID
|
boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ALIAS_ID] = MOCK_ESP8266_BOARD_ID
|
||||||
pins.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ALIAS_ID] = MOCK_ESP8266_FLASH_SIZE
|
boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ALIAS_ID] = MOCK_ESP8266_FLASH_SIZE
|
||||||
pins.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ID] = MOCK_ESP32_PINS
|
boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ID] = MOCK_ESP32_PINS
|
||||||
pins.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ALIAS_ID] = MOCK_ESP32_BOARD_ID
|
boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ALIAS_ID] = MOCK_ESP32_BOARD_ID
|
||||||
yield
|
yield
|
||||||
del pins.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ID]
|
del boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ID]
|
||||||
del pins.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ID]
|
del boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ID]
|
||||||
del pins.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ALIAS_ID]
|
del boards.ESP8266_BOARD_PINS[MOCK_ESP8266_BOARD_ALIAS_ID]
|
||||||
del pins.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ALIAS_ID]
|
del boards.ESP8266_FLASH_SIZES[MOCK_ESP8266_BOARD_ALIAS_ID]
|
||||||
del pins.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ID]
|
del boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ID]
|
||||||
del pins.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ALIAS_ID]
|
del boards.ESP32_BOARD_PINS[MOCK_ESP32_BOARD_ALIAS_ID]
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import esphome.wizard as wz
|
import esphome.wizard as wz
|
||||||
import pytest
|
import pytest
|
||||||
from esphome.pins import ESP8266_BOARD_PINS
|
from esphome.boards import ESP8266_BOARD_PINS
|
||||||
from mock import MagicMock
|
from mock import MagicMock
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user