micropython/ports/renesas-ra/boards/make-pins.py

90 wiersze
3.1 KiB
Python

#!/usr/bin/env python
import os
import re
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "../../../tools"))
import boardgen
class RenesasRaPin(boardgen.Pin):
def __init__(self, cpu_pin_name):
super().__init__(cpu_pin_name)
self._port = int(cpu_pin_name[1], 16)
self._bit = int(cpu_pin_name[2:])
self._adc_name = None
self._adc_bits = 0
self._adc_channel = 0
def add_adc(self, adc):
# The previous version of make-pins.py handled len==4 to mean
# adc_bits=8, but this is not used in any of the current af.csv files,
# so this needs to be validated.
assert len(adc) == 5 and (adc.startswith("AN0") or adc.startswith("AN1"))
self._adc_name = adc
self._adc_bit = 12
self._adc_channel = int(adc[2:])
# Called for each AF defined in the csv file for this pin.
def add_af(self, af_idx, af_name, af):
if af_idx == 0 and af:
assert af_name == "Analog"
self.add_adc(af)
# Use the PIN() macro defined in ra_pin_prefix.c for defining the pin
# objects.
def definition(self):
# PIN(p_name, p_pin, p_adc)
adc = "&pin_{}_adc_obj".format(self.name()) if self._adc_name else "NULL"
return "PIN({:s}, {:d}, {:s})".format(self.name(), self._port * 16 + self._bit, adc)
# This will be called at the start of the output (after the prefix). Use
# it to emit the ADC objects (via the PIN_ADC() macro).
def print_source(self, out_source):
# PIN_ADC(p_name, p_pin, adc_bit, adc_channel)
if self._adc_name:
print(
"const machine_pin_adc_obj_t pin_{}_adc_obj = PIN_ADC({:s}, {:d}, {:d}, {:d});".format(
self.name(),
self._adc_name,
self._port * 16 + self._bit,
self._adc_bits,
self._adc_channel,
),
file=out_source,
)
# RA cpu names must be "PXNN", where X is hexadecimal port, NN is decimal bit offset.
@staticmethod
def validate_cpu_pin_name(cpu_pin_name):
boardgen.Pin.validate_cpu_pin_name(cpu_pin_name)
if not re.match("^P[0-9A-F][0-9][0-9]$", cpu_pin_name):
raise boardgen.PinGeneratorError("Invalid cpu pin name '{}'".format(cpu_pin_name))
class RenesasRaPinGenerator(boardgen.PinGenerator):
def __init__(self):
# Use custom pin type above, and also enable the --af-csv argument so
# that add_af gets called on each pin.
super().__init__(
pin_type=RenesasRaPin,
enable_af=True,
)
# Override the default implementation just to change the default arguments.
def parse_af_csv(self, filename):
return super().parse_af_csv(filename, header_rows=1, pin_col=0, af_col=3)
# Renesas-specific behavior, we use pin_PNNN for the cpu names, but
# pyb_pin_FOO for the board names.
def board_name_define_prefix(self):
return "pyb_"
if __name__ == "__main__":
RenesasRaPinGenerator().main()