summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xports/esp32/boards/make-pins.py185
-rw-r--r--ports/esp32/boards/pins_prefix.c4
-rw-r--r--ports/esp32/esp32_common.cmake28
-rw-r--r--ports/esp32/machine_pin.c450
-rw-r--r--ports/esp32/machine_pin.h164
5 files changed, 462 insertions, 369 deletions
diff --git a/ports/esp32/boards/make-pins.py b/ports/esp32/boards/make-pins.py
new file mode 100755
index 000000000..e0f988549
--- /dev/null
+++ b/ports/esp32/boards/make-pins.py
@@ -0,0 +1,185 @@
+#!/usr/bin/env python
+
+import argparse
+import sys
+import csv
+import re
+
+MAX_CPU_PINS = 49
+
+
+def parse_pin(name_str):
+ """Parses a string and returns a pin number."""
+ if len(name_str) < 2:
+ raise ValueError("Expecting pin name to be at least 2 characters.")
+ if not name_str.startswith("GPIO"):
+ raise ValueError("Expecting pin name to start with GPIO")
+ return int(re.findall(r"\d+$", name_str)[0])
+
+
+class Pin:
+ def __init__(self, pin):
+ self.pin = pin
+ self.is_board = False
+
+ def cpu_pin_name(self):
+ return "GPIO{:d}".format(self.pin)
+
+ def is_board_pin(self):
+ return self.is_board
+
+ def set_is_board_pin(self):
+ self.is_board = True
+
+
+class NamedPin:
+ def __init__(self, name, pin):
+ self._name = name
+ self._pin = pin
+
+ def pin(self):
+ return self._pin
+
+ def name(self):
+ return self._name
+
+
+class Pins:
+ def __init__(self):
+ self.cpu_pins = [] # list of NamedPin objects
+ self.board_pins = [] # list of NamedPin objects
+
+ def find_pin(self, pin_name):
+ for pin in self.cpu_pins:
+ if pin.name() == pin_name:
+ return pin.pin()
+
+ def create_pins(self):
+ for pin_num in range(MAX_CPU_PINS):
+ pin = Pin(pin_num)
+ self.cpu_pins.append(NamedPin(pin.cpu_pin_name(), pin))
+
+ def parse_board_file(self, filename):
+ with open(filename, "r") as csvfile:
+ rows = csv.reader(csvfile)
+ for row in rows:
+ if len(row) == 0 or row[0].startswith("#"):
+ # Skip empty lines, and lines starting with "#"
+ continue
+ if len(row) != 2:
+ raise ValueError("Expecting two entries in a row")
+
+ cpu_pin_name = row[1]
+ parse_pin(cpu_pin_name)
+ pin = self.find_pin(cpu_pin_name)
+ if not pin:
+ raise ValueError("Unknown pin {}".format(cpu_pin_name))
+ pin.set_is_board_pin()
+ if row[0]: # Only add board pins that have a name
+ self.board_pins.append(NamedPin(row[0], pin))
+
+ def print_table(self, label, named_pins, out_source):
+ print("", file=out_source)
+ print(
+ "const machine_{}_obj_t machine_{}_obj_table[GPIO_NUM_MAX] = {{".format(label, label),
+ file=out_source,
+ )
+ for pin in named_pins:
+ print(" #if MICROPY_HW_ENABLE_{}".format(pin.name()), file=out_source)
+ print(
+ " [GPIO_NUM_{}] = {{ .base = {{ .type = &machine_{}_type }} }},".format(
+ pin.pin().pin, label
+ ),
+ file=out_source,
+ )
+ print(" #endif", file=out_source)
+ print("};", file=out_source)
+
+ def print_named(self, label, named_pins, out_source):
+ print("", file=out_source)
+ print(
+ "STATIC const mp_rom_map_elem_t machine_pin_{:s}_pins_locals_dict_table[] = {{".format(
+ label
+ ),
+ file=out_source,
+ )
+ for named_pin in named_pins:
+ pin = named_pin.pin()
+ print(
+ " {{ MP_ROM_QSTR(MP_QSTR_{:s}), MP_ROM_PTR(&pin_{:s}) }},".format(
+ named_pin.name(), pin.cpu_pin_name()
+ ),
+ file=out_source,
+ )
+
+ print("};", file=out_source)
+ print(
+ "MP_DEFINE_CONST_DICT(machine_pin_{:s}_pins_locals_dict, machine_pin_{:s}_pins_locals_dict_table);".format(
+ label, label
+ ),
+ file=out_source,
+ )
+
+ def print_tables(self, out_source):
+ self.print_table("pin", self.cpu_pins, out_source)
+ self.print_table("pin_irq", self.cpu_pins, out_source)
+ self.print_named("board", self.board_pins, out_source)
+
+ def print_header(self, out_header):
+ # Provide #defines for each cpu pin.
+ for named_pin in self.cpu_pins:
+ pin = named_pin.pin()
+ n = pin.cpu_pin_name()
+ print("#if MICROPY_HW_ENABLE_{}".format(n), file=out_header)
+ print(
+ "#define pin_{:s} (machine_pin_obj_table[{}])".format(n, pin.pin),
+ file=out_header,
+ )
+ print("#endif", file=out_header)
+
+ # Provide #define's mapping board to cpu name.
+ for named_pin in self.board_pins:
+ if named_pin.pin().is_board_pin():
+ print(
+ "#define pin_{:s} pin_{:s}".format(
+ named_pin.name(), named_pin.pin().cpu_pin_name()
+ ),
+ file=out_header,
+ )
+
+
+def main():
+ parser = argparse.ArgumentParser(description="Generate board specific pin file")
+ parser.add_argument("--board-csv")
+ parser.add_argument("--prefix")
+ parser.add_argument("--output-source")
+ parser.add_argument("--output-header")
+ args = parser.parse_args(sys.argv[1:])
+
+ pins = Pins()
+ pins.create_pins()
+
+ if args.board_csv:
+ pins.parse_board_file(args.board_csv)
+
+ with open(args.output_source, "w") as out_source:
+ print("// This file was automatically generated by make-pins.py", file=out_source)
+ print("//", file=out_source)
+
+ if args.board_csv:
+ print("// --board-csv {:s}".format(args.board_csv), file=out_source)
+
+ if args.prefix:
+ print("// --prefix {:s}".format(args.prefix), file=out_source)
+ print("", file=out_source)
+ with open(args.prefix, "r") as prefix_file:
+ print(prefix_file.read(), end="", file=out_source)
+
+ pins.print_tables(out_source)
+
+ with open(args.output_header, "w") as out_header:
+ pins.print_header(out_header)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/ports/esp32/boards/pins_prefix.c b/ports/esp32/boards/pins_prefix.c
new file mode 100644
index 000000000..2733ddaab
--- /dev/null
+++ b/ports/esp32/boards/pins_prefix.c
@@ -0,0 +1,4 @@
+#include "py/obj.h"
+#include "machine_pin.h"
+#include "modmachine.h"
+#include "genhdr/pins.h"
diff --git a/ports/esp32/esp32_common.cmake b/ports/esp32/esp32_common.cmake
index d55dd3813..c7d629cd6 100644
--- a/ports/esp32/esp32_common.cmake
+++ b/ports/esp32/esp32_common.cmake
@@ -90,6 +90,7 @@ list(APPEND MICROPY_SOURCE_PORT
modespnow.c
)
list(TRANSFORM MICROPY_SOURCE_PORT PREPEND ${MICROPY_PORT_DIR}/)
+list(APPEND MICROPY_SOURCE_PORT ${CMAKE_BINARY_DIR}/pins.c)
list(APPEND MICROPY_SOURCE_QSTR
${MICROPY_SOURCE_PY}
@@ -198,3 +199,30 @@ endforeach()
# Include the main MicroPython cmake rules.
include(${MICROPY_DIR}/py/mkrules.cmake)
+
+# Generate source files for named pins (requires mkrules.cmake for MICROPY_GENHDR_DIR).
+
+set(GEN_PINS_PREFIX "${MICROPY_PORT_DIR}/boards/pins_prefix.c")
+set(GEN_PINS_MKPINS "${MICROPY_PORT_DIR}/boards/make-pins.py")
+set(GEN_PINS_SRC "${CMAKE_BINARY_DIR}/pins.c")
+set(GEN_PINS_HDR "${MICROPY_GENHDR_DIR}/pins.h")
+
+if(EXISTS "${MICROPY_BOARD_DIR}/pins.csv")
+ set(GEN_PINS_BOARD_CSV "${MICROPY_BOARD_DIR}/pins.csv")
+ set(GEN_PINS_BOARD_CSV_ARG --board-csv "${GEN_PINS_BOARD_CSV}")
+endif()
+
+target_sources(${MICROPY_TARGET} PRIVATE ${GEN_PINS_HDR})
+
+add_custom_command(
+ OUTPUT ${GEN_PINS_SRC} ${GEN_PINS_HDR}
+ COMMAND ${Python3_EXECUTABLE} ${GEN_PINS_MKPINS} ${GEN_PINS_BOARD_CSV_ARG}
+ --prefix ${GEN_PINS_PREFIX} --output-source ${GEN_PINS_SRC} --output-header ${GEN_PINS_HDR}
+ DEPENDS
+ ${MICROPY_MPVERSION}
+ ${GEN_PINS_MKPINS}
+ ${GEN_PINS_BOARD_CSV}
+ ${GEN_PINS_PREFIX}
+ VERBATIM
+ COMMAND_EXPAND_LISTS
+)
diff --git a/ports/esp32/machine_pin.c b/ports/esp32/machine_pin.c
index 119b5d250..835f16b1b 100644
--- a/ports/esp32/machine_pin.c
+++ b/ports/esp32/machine_pin.c
@@ -5,7 +5,7 @@
*
* The MIT License (MIT)
*
- * Copyright (c) 2016 Damien P. George
+ * Copyright (c) 2016-2023 Damien P. George
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -38,8 +38,10 @@
#include "mphalport.h"
#include "modmachine.h"
#include "extmod/virtpin.h"
+#include "machine_pin.h"
#include "machine_rtc.h"
#include "modesp32.h"
+#include "genhdr/pins.h"
#if CONFIG_IDF_TARGET_ESP32C3
#include "soc/usb_serial_jtag_reg.h"
@@ -55,174 +57,18 @@
#define GPIO_FIRST_NON_OUTPUT (46)
#endif
-typedef struct _machine_pin_obj_t {
- mp_obj_base_t base;
- gpio_num_t id;
-} machine_pin_obj_t;
-
-typedef struct _machine_pin_irq_obj_t {
- mp_obj_base_t base;
- gpio_num_t id;
-} machine_pin_irq_obj_t;
-
-STATIC const machine_pin_obj_t machine_pin_obj[GPIO_NUM_MAX] = {
- #if CONFIG_IDF_TARGET_ESP32
-
- {{&machine_pin_type}, GPIO_NUM_0},
- {{&machine_pin_type}, GPIO_NUM_1},
- {{&machine_pin_type}, GPIO_NUM_2},
- {{&machine_pin_type}, GPIO_NUM_3},
- {{&machine_pin_type}, GPIO_NUM_4},
- {{&machine_pin_type}, GPIO_NUM_5},
- {{&machine_pin_type}, GPIO_NUM_6},
- {{&machine_pin_type}, GPIO_NUM_7},
- {{&machine_pin_type}, GPIO_NUM_8},
- {{&machine_pin_type}, GPIO_NUM_9},
- {{&machine_pin_type}, GPIO_NUM_10},
- {{&machine_pin_type}, GPIO_NUM_11},
- {{&machine_pin_type}, GPIO_NUM_12},
- {{&machine_pin_type}, GPIO_NUM_13},
- {{&machine_pin_type}, GPIO_NUM_14},
- {{&machine_pin_type}, GPIO_NUM_15},
- #if CONFIG_ESP32_SPIRAM_SUPPORT
- {{NULL}, -1},
- {{NULL}, -1},
- #else
- {{&machine_pin_type}, GPIO_NUM_16},
- {{&machine_pin_type}, GPIO_NUM_17},
- #endif
- {{&machine_pin_type}, GPIO_NUM_18},
- {{&machine_pin_type}, GPIO_NUM_19},
- {{&machine_pin_type}, GPIO_NUM_20},
- {{&machine_pin_type}, GPIO_NUM_21},
- {{&machine_pin_type}, GPIO_NUM_22},
- {{&machine_pin_type}, GPIO_NUM_23},
- {{NULL}, -1},
- {{&machine_pin_type}, GPIO_NUM_25},
- {{&machine_pin_type}, GPIO_NUM_26},
- {{&machine_pin_type}, GPIO_NUM_27},
- {{NULL}, -1},
- {{NULL}, -1},
- {{NULL}, -1},
- {{NULL}, -1},
- {{&machine_pin_type}, GPIO_NUM_32},
- {{&machine_pin_type}, GPIO_NUM_33},
- {{&machine_pin_type}, GPIO_NUM_34},
- {{&machine_pin_type}, GPIO_NUM_35},
- {{&machine_pin_type}, GPIO_NUM_36},
- {{&machine_pin_type}, GPIO_NUM_37},
- {{&machine_pin_type}, GPIO_NUM_38},
- {{&machine_pin_type}, GPIO_NUM_39},
-
- #elif CONFIG_IDF_TARGET_ESP32C3
-
- {{&machine_pin_type}, GPIO_NUM_0},
- {{&machine_pin_type}, GPIO_NUM_1},
- {{&machine_pin_type}, GPIO_NUM_2},
- {{&machine_pin_type}, GPIO_NUM_3},
- {{&machine_pin_type}, GPIO_NUM_4},
- {{&machine_pin_type}, GPIO_NUM_5},
- {{&machine_pin_type}, GPIO_NUM_6},
- {{&machine_pin_type}, GPIO_NUM_7},
- {{&machine_pin_type}, GPIO_NUM_8},
- {{&machine_pin_type}, GPIO_NUM_9},
- {{&machine_pin_type}, GPIO_NUM_10},
- {{&machine_pin_type}, GPIO_NUM_11},
- {{&machine_pin_type}, GPIO_NUM_12},
- {{&machine_pin_type}, GPIO_NUM_13},
- {{NULL}, -1}, // 14 FLASH
- {{NULL}, -1}, // 15 FLASH
- {{NULL}, -1}, // 16 FLASH
- {{NULL}, -1}, // 17 FLASH
- #if CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
- {{NULL}, -1}, // 18 is for native USB D-
- {{NULL}, -1}, // 19 is for native USB D+
- #else
- {{&machine_pin_type}, GPIO_NUM_18},
- {{&machine_pin_type}, GPIO_NUM_19},
- #endif
- {{&machine_pin_type}, GPIO_NUM_20},
- {{&machine_pin_type}, GPIO_NUM_21},
-
- #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
-
- {{&machine_pin_type}, GPIO_NUM_0},
- {{&machine_pin_type}, GPIO_NUM_1},
- {{&machine_pin_type}, GPIO_NUM_2},
- {{&machine_pin_type}, GPIO_NUM_3},
- {{&machine_pin_type}, GPIO_NUM_4},
- {{&machine_pin_type}, GPIO_NUM_5},
- {{&machine_pin_type}, GPIO_NUM_6},
- {{&machine_pin_type}, GPIO_NUM_7},
- {{&machine_pin_type}, GPIO_NUM_8},
- {{&machine_pin_type}, GPIO_NUM_9},
- {{&machine_pin_type}, GPIO_NUM_10},
- {{&machine_pin_type}, GPIO_NUM_11},
- {{&machine_pin_type}, GPIO_NUM_12},
- {{&machine_pin_type}, GPIO_NUM_13},
- {{&machine_pin_type}, GPIO_NUM_14},
- {{&machine_pin_type}, GPIO_NUM_15},
- {{&machine_pin_type}, GPIO_NUM_16},
- {{&machine_pin_type}, GPIO_NUM_17},
- {{&machine_pin_type}, GPIO_NUM_18},
- #if CONFIG_USB_CDC_ENABLED
- {{NULL}, -1}, // 19 is for native USB D-
- {{NULL}, -1}, // 20 is for native USB D-
- #else
- {{&machine_pin_type}, GPIO_NUM_19},
- {{&machine_pin_type}, GPIO_NUM_20},
- #endif
- {{&machine_pin_type}, GPIO_NUM_21},
- {{NULL}, -1}, // 22 not a pin
- {{NULL}, -1}, // 23 not a pin
- {{NULL}, -1}, // 24 not a pin
- {{NULL}, -1}, // 25 not a pin
- #if CONFIG_SPIRAM
- {{NULL}, -1}, // 26 PSRAM
- #else
- {{&machine_pin_type}, GPIO_NUM_26},
- #endif
- {{NULL}, -1}, // 27 FLASH/PSRAM
- {{NULL}, -1}, // 28 FLASH/PSRAM
- {{NULL}, -1}, // 29 FLASH/PSRAM
- {{NULL}, -1}, // 30 FLASH/PSRAM
- {{NULL}, -1}, // 31 FLASH/PSRAM
- {{NULL}, -1}, // 32 FLASH/PSRAM
- #if CONFIG_SPIRAM_MODE_OCT
- {{NULL}, -1}, // 33 FLASH/PSRAM
- {{NULL}, -1}, // 34 FLASH/PSRAM
- {{NULL}, -1}, // 35 FLASH/PSRAM
- {{NULL}, -1}, // 36 FLASH/PSRAM
- {{NULL}, -1}, // 37 FLASH/PSRAM
- #else
- {{&machine_pin_type}, GPIO_NUM_33},
- {{&machine_pin_type}, GPIO_NUM_34},
- {{&machine_pin_type}, GPIO_NUM_35},
- {{&machine_pin_type}, GPIO_NUM_36},
- {{&machine_pin_type}, GPIO_NUM_37},
- #endif
- {{&machine_pin_type}, GPIO_NUM_38},
- {{&machine_pin_type}, GPIO_NUM_39}, // MTCLK
- {{&machine_pin_type}, GPIO_NUM_40}, // MTDO
- {{&machine_pin_type}, GPIO_NUM_41}, // MTDI
- {{&machine_pin_type}, GPIO_NUM_42}, // MTMS
- {{&machine_pin_type}, GPIO_NUM_43}, // U0TXD
- {{&machine_pin_type}, GPIO_NUM_44}, // U0RXD
- {{&machine_pin_type}, GPIO_NUM_45},
- {{&machine_pin_type}, GPIO_NUM_46},
+// Return the gpio_num_t index for a given pin or pin-irq object.
+#define PIN_OBJ_INDEX(self) ((self) - &machine_pin_obj_table[0])
+#define PIN_IRQ_OBJ_INDEX(self) ((self) - &machine_pin_irq_obj_table[0])
- #endif
-
- #if CONFIG_IDF_TARGET_ESP32S3 && MICROPY_HW_ESP32S3_EXTENDED_IO
-
- {{&machine_pin_type}, GPIO_NUM_47},
- {{&machine_pin_type}, GPIO_NUM_48},
-
- #endif
-};
-
-// forward declaration
-STATIC const machine_pin_irq_obj_t machine_pin_irq_object[GPIO_NUM_MAX];
+STATIC const machine_pin_obj_t *machine_pin_find_named(const mp_obj_dict_t *named_pins, mp_obj_t name) {
+ const mp_map_t *named_map = &named_pins->map;
+ mp_map_elem_t *named_elem = mp_map_lookup((mp_map_t *)named_map, name, MP_MAP_LOOKUP);
+ if (named_elem != NULL && named_elem->value != NULL) {
+ return MP_OBJ_TO_PTR(named_elem->value);
+ }
+ return NULL;
+}
void machine_pins_init(void) {
static bool did_install = false;
@@ -234,16 +80,16 @@ void machine_pins_init(void) {
}
void machine_pins_deinit(void) {
- for (int i = 0; i < MP_ARRAY_SIZE(machine_pin_obj); ++i) {
- if (machine_pin_obj[i].id != (gpio_num_t)-1) {
- gpio_isr_handler_remove(machine_pin_obj[i].id);
+ for (int i = 0; i < MP_ARRAY_SIZE(machine_pin_obj_table); ++i) {
+ if (machine_pin_obj_table[i].base.type != NULL) {
+ gpio_isr_handler_remove(i);
}
}
}
STATIC void machine_pin_isr_handler(void *arg) {
machine_pin_obj_t *self = arg;
- mp_obj_t handler = MP_STATE_PORT(machine_pin_irq_handler)[self->id];
+ mp_obj_t handler = MP_STATE_PORT(machine_pin_irq_handler)[PIN_OBJ_INDEX(self)];
mp_sched_schedule(handler, MP_OBJ_FROM_PTR(self));
mp_hal_wake_main_task_from_isr();
}
@@ -252,28 +98,37 @@ STATIC const machine_pin_obj_t *machine_pin_find(mp_obj_t pin_in) {
if (mp_obj_is_type(pin_in, &machine_pin_type)) {
return pin_in;
}
- // get the wanted pin object
- if (mp_obj_is_small_int(pin_in)) {
+
+ // Try to find the pin via integer index into the array of all pins.
+ if (mp_obj_is_int(pin_in)) {
int wanted_pin = mp_obj_get_int(pin_in);
- if (0 <= wanted_pin && wanted_pin < MP_ARRAY_SIZE(machine_pin_obj)) {
- machine_pin_obj_t *self = (machine_pin_obj_t *)&machine_pin_obj[wanted_pin];
+ if (0 <= wanted_pin && wanted_pin < MP_ARRAY_SIZE(machine_pin_obj_table)) {
+ const machine_pin_obj_t *self = (machine_pin_obj_t *)&machine_pin_obj_table[wanted_pin];
if (self->base.type != NULL) {
return self;
}
}
}
- // At this place a check for named pins may be added
- //
- mp_raise_ValueError(MP_ERROR_TEXT("expecting a pin"));
+
+ // Try to find the pin in the board pins dict.
+ if (mp_obj_is_str(pin_in)) {
+ const machine_pin_obj_t *self = machine_pin_find_named(&machine_pin_board_pins_locals_dict, pin_in);
+ if (self->base.type != NULL) {
+ return self;
+ }
+ }
+
+ mp_raise_ValueError(MP_ERROR_TEXT("invalid pin"));
}
gpio_num_t machine_pin_get_id(mp_obj_t pin_in) {
- return machine_pin_find(pin_in)->id;
+ const machine_pin_obj_t *self = machine_pin_find(pin_in);
+ return PIN_OBJ_INDEX(self);
}
STATIC void machine_pin_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) {
machine_pin_obj_t *self = self_in;
- mp_printf(print, "Pin(%u)", self->id);
+ mp_printf(print, "Pin(%u)", PIN_OBJ_INDEX(self));
}
// pin.init(mode=None, pull=-1, *, value, drive, hold)
@@ -293,32 +148,32 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
// reset the pin to digital if this is a mode-setting init (grab it back from ADC)
if (args[ARG_mode].u_obj != mp_const_none) {
- if (rtc_gpio_is_valid_gpio(self->id)) {
+ if (rtc_gpio_is_valid_gpio(PIN_OBJ_INDEX(self))) {
#if !CONFIG_IDF_TARGET_ESP32C3
- rtc_gpio_deinit(self->id);
+ rtc_gpio_deinit(PIN_OBJ_INDEX(self));
#endif
}
}
#if CONFIG_IDF_TARGET_ESP32C3
- if (self->id == 18 || self->id == 19) {
+ if (PIN_OBJ_INDEX(self) == 18 || PIN_OBJ_INDEX(self) == 19) {
CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_USB_PAD_ENABLE);
}
#endif
// configure the pin for gpio
- esp_rom_gpio_pad_select_gpio(self->id);
+ esp_rom_gpio_pad_select_gpio(PIN_OBJ_INDEX(self));
// set initial value (do this before configuring mode/pull)
if (args[ARG_value].u_obj != MP_OBJ_NULL) {
- gpio_set_level(self->id, mp_obj_is_true(args[ARG_value].u_obj));
+ gpio_set_level(PIN_OBJ_INDEX(self), mp_obj_is_true(args[ARG_value].u_obj));
}
// set drive capability (do this before configuring mode)
- if (args[ARG_drive].u_obj != MP_OBJ_NULL && GPIO_IS_VALID_OUTPUT_GPIO(self->id)) {
+ if (args[ARG_drive].u_obj != MP_OBJ_NULL && GPIO_IS_VALID_OUTPUT_GPIO(PIN_OBJ_INDEX(self))) {
mp_int_t strength = mp_obj_get_int(args[ARG_drive].u_obj);
if (0 <= strength && strength < GPIO_DRIVE_CAP_MAX) {
- gpio_set_drive_capability(self->id, strength);
+ gpio_set_drive_capability(PIN_OBJ_INDEX(self), strength);
}
}
@@ -326,11 +181,11 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
if (args[ARG_mode].u_obj != mp_const_none) {
mp_int_t pin_io_mode = mp_obj_get_int(args[ARG_mode].u_obj);
#ifdef GPIO_FIRST_NON_OUTPUT
- if (self->id >= GPIO_FIRST_NON_OUTPUT && (pin_io_mode & GPIO_MODE_DEF_OUTPUT)) {
+ if (PIN_OBJ_INDEX(self) >= GPIO_FIRST_NON_OUTPUT && (pin_io_mode & GPIO_MODE_DEF_OUTPUT)) {
mp_raise_ValueError(MP_ERROR_TEXT("pin can only be input"));
}
#endif
- gpio_set_direction(self->id, pin_io_mode);
+ gpio_set_direction(PIN_OBJ_INDEX(self), pin_io_mode);
}
// configure pull
@@ -340,24 +195,24 @@ STATIC mp_obj_t machine_pin_obj_init_helper(const machine_pin_obj_t *self, size_
mode = mp_obj_get_int(args[ARG_pull].u_obj);
}
if (mode & GPIO_PULL_DOWN) {
- gpio_pulldown_en(self->id);
+ gpio_pulldown_en(PIN_OBJ_INDEX(self));
} else {
- gpio_pulldown_dis(self->id);
+ gpio_pulldown_dis(PIN_OBJ_INDEX(self));
}
if (mode & GPIO_PULL_UP) {
- gpio_pullup_en(self->id);
+ gpio_pullup_en(PIN_OBJ_INDEX(self));
} else {
- gpio_pullup_dis(self->id);
+ gpio_pullup_dis(PIN_OBJ_INDEX(self));
}
}
// configure pad hold
- if (args[ARG_hold].u_obj != MP_OBJ_NULL && GPIO_IS_VALID_OUTPUT_GPIO(self->id)) {
+ if (args[ARG_hold].u_obj != MP_OBJ_NULL && GPIO_IS_VALID_OUTPUT_GPIO(PIN_OBJ_INDEX(self))) {
// always disable pad hold to apply outstanding config changes
- gpio_hold_dis(self->id);
+ gpio_hold_dis(PIN_OBJ_INDEX(self));
// (re-)enable pad hold if requested
if (mp_obj_is_true(args[ARG_hold].u_obj)) {
- gpio_hold_en(self->id);
+ gpio_hold_en(PIN_OBJ_INDEX(self));
}
}
@@ -387,10 +242,10 @@ STATIC mp_obj_t machine_pin_call(mp_obj_t self_in, size_t n_args, size_t n_kw, c
machine_pin_obj_t *self = self_in;
if (n_args == 0) {
// get pin
- return MP_OBJ_NEW_SMALL_INT(gpio_get_level(self->id));
+ return MP_OBJ_NEW_SMALL_INT(gpio_get_level(PIN_OBJ_INDEX(self)));
} else {
// set pin
- gpio_set_level(self->id, mp_obj_is_true(args[0]));
+ gpio_set_level(PIN_OBJ_INDEX(self), mp_obj_is_true(args[0]));
return mp_const_none;
}
}
@@ -410,7 +265,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(machine_pin_value_obj, 1, 2, machine_
// pin.off()
STATIC mp_obj_t machine_pin_off(mp_obj_t self_in) {
machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
- gpio_set_level(self->id, 0);
+ gpio_set_level(PIN_OBJ_INDEX(self), 0);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_off_obj, machine_pin_off);
@@ -418,7 +273,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_off_obj, machine_pin_off);
// pin.on()
STATIC mp_obj_t machine_pin_on(mp_obj_t self_in) {
machine_pin_obj_t *self = MP_OBJ_TO_PTR(self_in);
- gpio_set_level(self->id, 1);
+ gpio_set_level(PIN_OBJ_INDEX(self), 1);
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_pin_on_obj, machine_pin_on);
@@ -455,20 +310,20 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_
mp_raise_ValueError(MP_ERROR_TEXT("no resources"));
}
- if (!RTC_IS_VALID_EXT_PIN(self->id)) {
+ if (!RTC_IS_VALID_EXT_PIN(PIN_OBJ_INDEX(self))) {
mp_raise_ValueError(MP_ERROR_TEXT("invalid pin for wake"));
}
if (machine_rtc_config.ext0_pin == -1) {
- machine_rtc_config.ext0_pin = self->id;
- } else if (machine_rtc_config.ext0_pin != self->id) {
+ machine_rtc_config.ext0_pin = PIN_OBJ_INDEX(self);
+ } else if (machine_rtc_config.ext0_pin != PIN_OBJ_INDEX(self)) {
mp_raise_ValueError(MP_ERROR_TEXT("no resources"));
}
machine_rtc_config.ext0_level = trigger == GPIO_INTR_LOW_LEVEL ? 0 : 1;
machine_rtc_config.ext0_wake_types = wake;
} else {
- if (machine_rtc_config.ext0_pin == self->id) {
+ if (machine_rtc_config.ext0_pin == PIN_OBJ_INDEX(self)) {
machine_rtc_config.ext0_pin = -1;
}
@@ -476,18 +331,25 @@ STATIC mp_obj_t machine_pin_irq(size_t n_args, const mp_obj_t *pos_args, mp_map_
handler = MP_OBJ_NULL;
trigger = 0;
}
- gpio_isr_handler_remove(self->id);
- MP_STATE_PORT(machine_pin_irq_handler)[self->id] = handler;
- gpio_set_intr_type(self->id, trigger);
- gpio_isr_handler_add(self->id, machine_pin_isr_handler, (void *)self);
+ gpio_isr_handler_remove(PIN_OBJ_INDEX(self));
+ MP_STATE_PORT(machine_pin_irq_handler)[PIN_OBJ_INDEX(self)] = handler;
+ gpio_set_intr_type(PIN_OBJ_INDEX(self), trigger);
+ gpio_isr_handler_add(PIN_OBJ_INDEX(self), machine_pin_isr_handler, (void *)self);
}
}
// return the irq object
- return MP_OBJ_FROM_PTR(&machine_pin_irq_object[self->id]);
+ return MP_OBJ_FROM_PTR(&machine_pin_irq_obj_table[PIN_OBJ_INDEX(self)]);
}
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_pin_irq_obj, 1, machine_pin_irq);
+MP_DEFINE_CONST_OBJ_TYPE(
+ machine_pin_board_pins_obj_type,
+ MP_QSTR_board,
+ MP_TYPE_FLAG_NONE,
+ locals_dict, &machine_pin_board_pins_locals_dict
+ );
+
STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
// instance methods
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_pin_init_obj) },
@@ -496,6 +358,9 @@ STATIC const mp_rom_map_elem_t machine_pin_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_on), MP_ROM_PTR(&machine_pin_on_obj) },
{ MP_ROM_QSTR(MP_QSTR_irq), MP_ROM_PTR(&machine_pin_irq_obj) },
+ // class attributes
+ { MP_ROM_QSTR(MP_QSTR_board), MP_ROM_PTR(&machine_pin_board_pins_obj_type) },
+
// class constants
{ MP_ROM_QSTR(MP_QSTR_IN), MP_ROM_INT(GPIO_MODE_INPUT) },
{ MP_ROM_QSTR(MP_QSTR_OUT), MP_ROM_INT(GPIO_MODE_INPUT_OUTPUT) },
@@ -518,10 +383,10 @@ STATIC mp_uint_t pin_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_t arg, i
switch (request) {
case MP_PIN_READ: {
- return gpio_get_level(self->id);
+ return gpio_get_level(PIN_OBJ_INDEX(self));
}
case MP_PIN_WRITE: {
- gpio_set_level(self->id, arg);
+ gpio_set_level(PIN_OBJ_INDEX(self), arg);
return 0;
}
}
@@ -548,172 +413,19 @@ MP_DEFINE_CONST_OBJ_TYPE(
/******************************************************************************/
// Pin IRQ object
-STATIC const mp_obj_type_t machine_pin_irq_type;
-
-STATIC const machine_pin_irq_obj_t machine_pin_irq_object[GPIO_NUM_MAX] = {
- #if CONFIG_IDF_TARGET_ESP32
-
- {{&machine_pin_irq_type}, GPIO_NUM_0},
- {{&machine_pin_irq_type}, GPIO_NUM_1},
- {{&machine_pin_irq_type}, GPIO_NUM_2},
- {{&machine_pin_irq_type}, GPIO_NUM_3},
- {{&machine_pin_irq_type}, GPIO_NUM_4},
- {{&machine_pin_irq_type}, GPIO_NUM_5},
- {{&machine_pin_irq_type}, GPIO_NUM_6},
- {{&machine_pin_irq_type}, GPIO_NUM_7},
- {{&machine_pin_irq_type}, GPIO_NUM_8},
- {{&machine_pin_irq_type}, GPIO_NUM_9},
- {{&machine_pin_irq_type}, GPIO_NUM_10},
- {{&machine_pin_irq_type}, GPIO_NUM_11},
- {{&machine_pin_irq_type}, GPIO_NUM_12},
- {{&machine_pin_irq_type}, GPIO_NUM_13},
- {{&machine_pin_irq_type}, GPIO_NUM_14},
- {{&machine_pin_irq_type}, GPIO_NUM_15},
- #if CONFIG_ESP32_SPIRAM_SUPPORT
- {{NULL}, -1},
- {{NULL}, -1},
- #else
- {{&machine_pin_irq_type}, GPIO_NUM_16},
- {{&machine_pin_irq_type}, GPIO_NUM_17},
- #endif
- {{&machine_pin_irq_type}, GPIO_NUM_18},
- {{&machine_pin_irq_type}, GPIO_NUM_19},
- {{&machine_pin_irq_type}, GPIO_NUM_20},
- {{&machine_pin_irq_type}, GPIO_NUM_21},
- {{&machine_pin_irq_type}, GPIO_NUM_22},
- {{&machine_pin_irq_type}, GPIO_NUM_23},
- {{NULL}, -1},
- {{&machine_pin_irq_type}, GPIO_NUM_25},
- {{&machine_pin_irq_type}, GPIO_NUM_26},
- {{&machine_pin_irq_type}, GPIO_NUM_27},
- {{NULL}, -1},
- {{NULL}, -1},
- {{NULL}, -1},
- {{NULL}, -1},
- {{&machine_pin_irq_type}, GPIO_NUM_32},
- {{&machine_pin_irq_type}, GPIO_NUM_33},
- {{&machine_pin_irq_type}, GPIO_NUM_34},
- {{&machine_pin_irq_type}, GPIO_NUM_35},
- {{&machine_pin_irq_type}, GPIO_NUM_36},
- {{&machine_pin_irq_type}, GPIO_NUM_37},
- {{&machine_pin_irq_type}, GPIO_NUM_38},
- {{&machine_pin_irq_type}, GPIO_NUM_39},
-
- #elif CONFIG_IDF_TARGET_ESP32C3
-
- {{&machine_pin_irq_type}, GPIO_NUM_0},
- {{&machine_pin_irq_type}, GPIO_NUM_1},
- {{&machine_pin_irq_type}, GPIO_NUM_2},
- {{&machine_pin_irq_type}, GPIO_NUM_3},
- {{&machine_pin_irq_type}, GPIO_NUM_4},
- {{&machine_pin_irq_type}, GPIO_NUM_5},
- {{&machine_pin_irq_type}, GPIO_NUM_6},
- {{&machine_pin_irq_type}, GPIO_NUM_7},
- {{&machine_pin_irq_type}, GPIO_NUM_8},
- {{&machine_pin_irq_type}, GPIO_NUM_9},
- {{&machine_pin_irq_type}, GPIO_NUM_10},
- {{&machine_pin_irq_type}, GPIO_NUM_11},
- {{&machine_pin_irq_type}, GPIO_NUM_12},
- {{&machine_pin_irq_type}, GPIO_NUM_13},
- {{&machine_pin_irq_type}, GPIO_NUM_14},
- {{&machine_pin_irq_type}, GPIO_NUM_15},
- {{&machine_pin_irq_type}, GPIO_NUM_16},
- {{&machine_pin_irq_type}, GPIO_NUM_17},
- {{&machine_pin_irq_type}, GPIO_NUM_18},
- {{&machine_pin_irq_type}, GPIO_NUM_19},
- {{&machine_pin_irq_type}, GPIO_NUM_20},
- {{&machine_pin_irq_type}, GPIO_NUM_21},
-
- #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
-
- {{&machine_pin_irq_type}, GPIO_NUM_0},
- {{&machine_pin_irq_type}, GPIO_NUM_1},
- {{&machine_pin_irq_type}, GPIO_NUM_2},
- {{&machine_pin_irq_type}, GPIO_NUM_3},
- {{&machine_pin_irq_type}, GPIO_NUM_4},
- {{&machine_pin_irq_type}, GPIO_NUM_5},
- {{&machine_pin_irq_type}, GPIO_NUM_6},
- {{&machine_pin_irq_type}, GPIO_NUM_7},
- {{&machine_pin_irq_type}, GPIO_NUM_8},
- {{&machine_pin_irq_type}, GPIO_NUM_9},
- {{&machine_pin_irq_type}, GPIO_NUM_10},
- {{&machine_pin_irq_type}, GPIO_NUM_11},
- {{&machine_pin_irq_type}, GPIO_NUM_12},
- {{&machine_pin_irq_type}, GPIO_NUM_13},
- {{&machine_pin_irq_type}, GPIO_NUM_14},
- {{&machine_pin_irq_type}, GPIO_NUM_15},
- {{&machine_pin_irq_type}, GPIO_NUM_16},
- {{&machine_pin_irq_type}, GPIO_NUM_17},
- {{&machine_pin_irq_type}, GPIO_NUM_18},
- #if CONFIG_USB_CDC_ENABLED
- {{NULL}, -1}, // 19 is for native USB D-
- {{NULL}, -1}, // 20 is for native USB D-
- #else
- {{&machine_pin_irq_type}, GPIO_NUM_19},
- {{&machine_pin_irq_type}, GPIO_NUM_20},
- #endif
- {{&machine_pin_irq_type}, GPIO_NUM_21},
- {{NULL}, -1}, // 22 not a pin
- {{NULL}, -1}, // 23 not a pin
- {{NULL}, -1}, // 24 not a pin
- {{NULL}, -1}, // 25 not a pin
- #if CONFIG_SPIRAM
- {{NULL}, -1}, // 26 PSRAM
- #else
- {{&machine_pin_irq_type}, GPIO_NUM_26},
- #endif
- {{NULL}, -1}, // 27 FLASH/PSRAM
- {{NULL}, -1}, // 28 FLASH/PSRAM
- {{NULL}, -1}, // 29 FLASH/PSRAM
- {{NULL}, -1}, // 30 FLASH/PSRAM
- {{NULL}, -1}, // 31 FLASH/PSRAM
- {{NULL}, -1}, // 32 FLASH/PSRAM
- #if CONFIG_SPIRAM_MODE_OCT
- {{NULL}, -1}, // 33 FLASH/PSRAM
- {{NULL}, -1}, // 34 FLASH/PSRAM
- {{NULL}, -1}, // 35 FLASH/PSRAM
- {{NULL}, -1}, // 36 FLASH/PSRAM
- {{NULL}, -1}, // 37 FLASH/PSRAM
- #else
- {{&machine_pin_irq_type}, GPIO_NUM_33},
- {{&machine_pin_irq_type}, GPIO_NUM_34},
- {{&machine_pin_irq_type}, GPIO_NUM_35},
- {{&machine_pin_irq_type}, GPIO_NUM_36},
- {{&machine_pin_irq_type}, GPIO_NUM_37},
- #endif
- {{&machine_pin_irq_type}, GPIO_NUM_38},
- {{&machine_pin_irq_type}, GPIO_NUM_39},
- {{&machine_pin_irq_type}, GPIO_NUM_40},
- {{&machine_pin_irq_type}, GPIO_NUM_41},
- {{&machine_pin_irq_type}, GPIO_NUM_42},
- {{&machine_pin_irq_type}, GPIO_NUM_43},
- {{&machine_pin_irq_type}, GPIO_NUM_44},
- {{&machine_pin_irq_type}, GPIO_NUM_45},
- {{&machine_pin_irq_type}, GPIO_NUM_46},
-
- #endif
-
- #if CONFIG_IDF_TARGET_ESP32S3 && MICROPY_HW_ESP32S3_EXTENDED_IO
-
- {{&machine_pin_irq_type}, GPIO_NUM_47},
- {{&machine_pin_irq_type}, GPIO_NUM_48},
-
- #endif
-};
-
STATIC mp_obj_t machine_pin_irq_call(mp_obj_t self_in, size_t n_args, size_t n_kw, const mp_obj_t *args) {
machine_pin_irq_obj_t *self = self_in;
mp_arg_check_num(n_args, n_kw, 0, 0, false);
- machine_pin_isr_handler((void *)&machine_pin_obj[self->id]);
+ machine_pin_isr_handler((void *)&machine_pin_obj_table[PIN_IRQ_OBJ_INDEX(self)]);
return mp_const_none;
}
STATIC mp_obj_t machine_pin_irq_trigger(size_t n_args, const mp_obj_t *args) {
machine_pin_irq_obj_t *self = args[0];
- uint32_t orig_trig = GPIO.pin[self->id].int_type;
+ uint32_t orig_trig = GPIO.pin[PIN_IRQ_OBJ_INDEX(self)].int_type;
if (n_args == 2) {
// set trigger
- gpio_set_intr_type(self->id, mp_obj_get_int(args[1]));
+ gpio_set_intr_type(PIN_IRQ_OBJ_INDEX(self), mp_obj_get_int(args[1]));
}
// return original trigger value
return MP_OBJ_NEW_SMALL_INT(orig_trig);
@@ -725,7 +437,7 @@ STATIC const mp_rom_map_elem_t machine_pin_irq_locals_dict_table[] = {
};
STATIC MP_DEFINE_CONST_DICT(machine_pin_irq_locals_dict, machine_pin_irq_locals_dict_table);
-STATIC MP_DEFINE_CONST_OBJ_TYPE(
+MP_DEFINE_CONST_OBJ_TYPE(
machine_pin_irq_type,
MP_QSTR_IRQ,
MP_TYPE_FLAG_NONE,
diff --git a/ports/esp32/machine_pin.h b/ports/esp32/machine_pin.h
new file mode 100644
index 000000000..dbbaac221
--- /dev/null
+++ b/ports/esp32/machine_pin.h
@@ -0,0 +1,164 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2023 Damien P. George
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef MICROPY_INCLUDED_ESP32_MACHINE_PIN_H
+#define MICROPY_INCLUDED_ESP32_MACHINE_PIN_H
+
+#include "py/obj.h"
+#include "hal/gpio_types.h"
+
+// Define which pins are enabled for a given SoC and configuration.
+
+#if CONFIG_IDF_TARGET_ESP32
+
+#define MICROPY_HW_ENABLE_GPIO0 (1)
+#define MICROPY_HW_ENABLE_GPIO1 (1)
+#define MICROPY_HW_ENABLE_GPIO2 (1)
+#define MICROPY_HW_ENABLE_GPIO3 (1)
+#define MICROPY_HW_ENABLE_GPIO4 (1)
+#define MICROPY_HW_ENABLE_GPIO5 (1)
+#define MICROPY_HW_ENABLE_GPIO6 (1)
+#define MICROPY_HW_ENABLE_GPIO7 (1)
+#define MICROPY_HW_ENABLE_GPIO8 (1)
+#define MICROPY_HW_ENABLE_GPIO9 (1)
+#define MICROPY_HW_ENABLE_GPIO10 (1)
+#define MICROPY_HW_ENABLE_GPIO11 (1)
+#define MICROPY_HW_ENABLE_GPIO12 (1)
+#define MICROPY_HW_ENABLE_GPIO13 (1)
+#define MICROPY_HW_ENABLE_GPIO14 (1)
+#define MICROPY_HW_ENABLE_GPIO15 (1)
+#if !CONFIG_ESP32_SPIRAM_SUPPORT
+#define MICROPY_HW_ENABLE_GPIO16 (1)
+#define MICROPY_HW_ENABLE_GPIO17 (1)
+#endif
+#define MICROPY_HW_ENABLE_GPIO18 (1)
+#define MICROPY_HW_ENABLE_GPIO19 (1)
+#define MICROPY_HW_ENABLE_GPIO20 (1)
+#define MICROPY_HW_ENABLE_GPIO21 (1)
+#define MICROPY_HW_ENABLE_GPIO22 (1)
+#define MICROPY_HW_ENABLE_GPIO23 (1)
+#define MICROPY_HW_ENABLE_GPIO25 (1)
+#define MICROPY_HW_ENABLE_GPIO26 (1)
+#define MICROPY_HW_ENABLE_GPIO27 (1)
+#define MICROPY_HW_ENABLE_GPIO32 (1)
+#define MICROPY_HW_ENABLE_GPIO33 (1)
+#define MICROPY_HW_ENABLE_GPIO34 (1)
+#define MICROPY_HW_ENABLE_GPIO35 (1)
+#define MICROPY_HW_ENABLE_GPIO36 (1)
+#define MICROPY_HW_ENABLE_GPIO37 (1)
+#define MICROPY_HW_ENABLE_GPIO38 (1)
+#define MICROPY_HW_ENABLE_GPIO39 (1)
+
+#elif CONFIG_IDF_TARGET_ESP32C3
+
+#define MICROPY_HW_ENABLE_GPIO0 (1)
+#define MICROPY_HW_ENABLE_GPIO1 (1)
+#define MICROPY_HW_ENABLE_GPIO2 (1)
+#define MICROPY_HW_ENABLE_GPIO3 (1)
+#define MICROPY_HW_ENABLE_GPIO4 (1)
+#define MICROPY_HW_ENABLE_GPIO5 (1)
+#define MICROPY_HW_ENABLE_GPIO6 (1)
+#define MICROPY_HW_ENABLE_GPIO7 (1)
+#define MICROPY_HW_ENABLE_GPIO8 (1)
+#define MICROPY_HW_ENABLE_GPIO9 (1)
+#define MICROPY_HW_ENABLE_GPIO10 (1)
+#define MICROPY_HW_ENABLE_GPIO11 (1)
+#define MICROPY_HW_ENABLE_GPIO12 (1)
+#define MICROPY_HW_ENABLE_GPIO13 (1)
+#if !CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG
+#define MICROPY_HW_ENABLE_GPIO18 (1)
+#define MICROPY_HW_ENABLE_GPIO19 (1)
+#endif
+#define MICROPY_HW_ENABLE_GPIO20 (1)
+#define MICROPY_HW_ENABLE_GPIO21 (1)
+
+#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
+
+#define MICROPY_HW_ENABLE_GPIO0 (1)
+#define MICROPY_HW_ENABLE_GPIO1 (1)
+#define MICROPY_HW_ENABLE_GPIO2 (1)
+#define MICROPY_HW_ENABLE_GPIO3 (1)
+#define MICROPY_HW_ENABLE_GPIO4 (1)
+#define MICROPY_HW_ENABLE_GPIO5 (1)
+#define MICROPY_HW_ENABLE_GPIO6 (1)
+#define MICROPY_HW_ENABLE_GPIO7 (1)
+#define MICROPY_HW_ENABLE_GPIO8 (1)
+#define MICROPY_HW_ENABLE_GPIO9 (1)
+#define MICROPY_HW_ENABLE_GPIO10 (1)
+#define MICROPY_HW_ENABLE_GPIO11 (1)
+#define MICROPY_HW_ENABLE_GPIO12 (1)
+#define MICROPY_HW_ENABLE_GPIO13 (1)
+#define MICROPY_HW_ENABLE_GPIO14 (1)
+#define MICROPY_HW_ENABLE_GPIO15 (1)
+#define MICROPY_HW_ENABLE_GPIO16 (1)
+#define MICROPY_HW_ENABLE_GPIO17 (1)
+#define MICROPY_HW_ENABLE_GPIO18 (1)
+#if !CONFIG_USB_CDC_ENABLED
+#define MICROPY_HW_ENABLE_GPIO19 (1)
+#define MICROPY_HW_ENABLE_GPIO20 (1)
+#endif
+#define MICROPY_HW_ENABLE_GPIO21 (1)
+#if !CONFIG_SPIRAM
+#define MICROPY_HW_ENABLE_GPIO26 (1)
+#endif
+#if !CONFIG_SPIRAM_MODE_OCT
+#define MICROPY_HW_ENABLE_GPIO33 (1)
+#define MICROPY_HW_ENABLE_GPIO34 (1)
+#define MICROPY_HW_ENABLE_GPIO35 (1)
+#define MICROPY_HW_ENABLE_GPIO36 (1)
+#define MICROPY_HW_ENABLE_GPIO37 (1)
+#endif
+#define MICROPY_HW_ENABLE_GPIO38 (1)
+#define MICROPY_HW_ENABLE_GPIO39 (1)
+#define MICROPY_HW_ENABLE_GPIO40 (1)
+#define MICROPY_HW_ENABLE_GPIO41 (1)
+#define MICROPY_HW_ENABLE_GPIO42 (1)
+#define MICROPY_HW_ENABLE_GPIO43 (1)
+#define MICROPY_HW_ENABLE_GPIO44 (1)
+#define MICROPY_HW_ENABLE_GPIO45 (1)
+#define MICROPY_HW_ENABLE_GPIO46 (1)
+#if CONFIG_IDF_TARGET_ESP32S3 && MICROPY_HW_ESP32S3_EXTENDED_IO
+#define MICROPY_HW_ENABLE_GPIO47 (1)
+#define MICROPY_HW_ENABLE_GPIO48 (1)
+#endif
+
+#endif
+
+typedef struct _machine_pin_obj_t {
+ mp_obj_base_t base;
+} machine_pin_obj_t;
+
+typedef struct _machine_pin_irq_obj_t {
+ mp_obj_base_t base;
+} machine_pin_irq_obj_t;
+
+extern const mp_obj_type_t machine_pin_irq_type;
+
+extern const machine_pin_obj_t machine_pin_obj_table[GPIO_NUM_MAX];
+extern const machine_pin_irq_obj_t machine_pin_irq_obj_table[GPIO_NUM_MAX];
+
+extern const mp_obj_dict_t machine_pin_board_pins_locals_dict;
+
+#endif // MICROPY_INCLUDED_ESP32_MACHINE_PIN_H