mirror of
https://github.com/W3SLAV/micropython.git
synced 2025-06-20 12:35:34 -04:00

For now, this implements the functionality required for esp32 and rp2, including support for numeric pins, rp2 alternate functions, and rp2 extended pins. This also updates the rp2 port to use the same structure for pins.h and pins.csv as for esp32, and moves the pin definitions directly into the table (rather than having a table of pointers), which is a small code size improvement. Support for "hidden" pins in pins.csv is added (matching the stm32 implementation). This work was funded through GitHub Sponsors. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
68 lines
2.3 KiB
Python
Executable File
68 lines
2.3 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../tools"))
|
|
import boardgen
|
|
|
|
|
|
# Pins start at zero, and the highest pin index on any ESP32* chip is 48.
|
|
NUM_GPIOS = 49
|
|
|
|
|
|
class Esp32Pin(boardgen.Pin):
|
|
# Required by NumericPinGenerator.
|
|
def index(self):
|
|
return int(self._cpu_pin_name[4:])
|
|
|
|
# The IDF provides `GPIO_NUM_x = x` as an enum.
|
|
def index_name(self):
|
|
return "GPIO_NUM_{:d}".format(self.index())
|
|
|
|
# Emit the combined struct which contains both the pin and irq instances.
|
|
def definition(self):
|
|
return "{ .base = { .type = &machine_pin_type }, .irq = { .base = { .type = &machine_pin_irq_type } } }"
|
|
|
|
# This script isn't family-aware, so we always emit the maximum number of
|
|
# pins and rely on the `MICROPY_HW_ENABLE_GPIOn` macros defined in
|
|
# machine_pin.h to figure out which ones are actually available.
|
|
def enable_macro(self):
|
|
return "MICROPY_HW_ENABLE_{}".format(self._cpu_pin_name)
|
|
|
|
# ESP32 cpu names must be "GPIOn".
|
|
@staticmethod
|
|
def validate_cpu_pin_name(cpu_pin_name):
|
|
boardgen.Pin.validate_cpu_pin_name(cpu_pin_name)
|
|
|
|
if not cpu_pin_name.startswith("GPIO") or not cpu_pin_name[4:].isnumeric():
|
|
raise boardgen.PinGeneratorError(
|
|
"Invalid cpu pin name '{}', must be 'GPIOn'".format(cpu_pin_name)
|
|
)
|
|
|
|
if not (0 <= int(cpu_pin_name[4:]) < NUM_GPIOS):
|
|
raise boardgen.PinGeneratorError("Unknown cpu pin '{}'".format(cpu_pin_name))
|
|
|
|
|
|
class Esp32PinGenerator(boardgen.NumericPinGenerator):
|
|
def __init__(self):
|
|
# Use custom pin type above.
|
|
super().__init__(pin_type=Esp32Pin)
|
|
|
|
# Pre-define the pins (i.e. don't require them to be listed in pins.csv).
|
|
for i in range(NUM_GPIOS):
|
|
self.add_cpu_pin("GPIO{}".format(i))
|
|
|
|
# Only use pre-defined cpu pins (do not let board.csv create them).
|
|
def find_pin_by_cpu_pin_name(self, cpu_pin_name, create=True):
|
|
return super().find_pin_by_cpu_pin_name(cpu_pin_name, create=False)
|
|
|
|
# This is provided by the IDF and is one more than the highest available
|
|
# GPIO num.
|
|
def cpu_table_size(self):
|
|
return "GPIO_NUM_MAX"
|
|
|
|
|
|
if __name__ == "__main__":
|
|
Esp32PinGenerator().main()
|