circuitpython/ports/samd/boards/make-pin-af.py
robert-hh 6c037af086 samd/boards: Create pin_af_table.c from pin_af_table_SAMDxx.csv files.
This step just creates the table.  The firmware cannot be built at this
commit.  The next commit will complete the pin-af mechanism.
2022-10-06 22:38:45 +11:00

105 lines
3.5 KiB
Python

#!/usr/bin/env python
"""Generates the pin_cap table file for the SAMD port."""
from __future__ import print_function
import argparse
import sys
import csv
table_header = """// This file was automatically generated by make-pin-cap.py
//
"""
class Pins:
def __init__(self):
self.board_pins = [] # list of pin objects
def parse_csv_file(self, filename):
with open(filename, "r") as csvfile:
rows = csv.reader(csvfile)
for row in rows:
# Pin numbers must start with "PA", "PB", "PC" or "PD"
if len(row) > 0 and row[0].strip().upper()[:2] in ("PA", "PB", "PC", "PD"):
self.board_pins.append(row)
def print_table(self, table_filename, mcu_name):
with open(table_filename, "wt") as table_file:
table_file.write(table_header)
table_file.write("const pin_af_t pin_af_table[] = {\n")
if mcu_name == "SAMD21":
for row in self.board_pins:
pin = "PIN_" + row[0].upper()
table_file.write(" #ifdef " + pin + "\n")
eic = row[1] if row[1] else "0xff"
adc = row[2] if row[2] else "0xff"
table_file.write(" {%s, %s, %s" % (pin, eic, adc))
for cell in row[3:]:
if cell:
table_file.write(
", 0x%s" % cell if len(cell) == 2 else ", 0x0%s" % cell
)
else:
table_file.write(", 0xff")
table_file.write("},\n")
table_file.write(" #endif\n")
else:
for row in self.board_pins:
pin = "PIN_" + row[0].upper()
table_file.write(" #ifdef " + pin + "\n")
eic = row[1] if row[1] else "0xff"
adc0 = row[2] if row[2] else "0xff"
adc1 = row[3] if row[3] else "0xff"
table_file.write(" {%s, %s, %s, %s" % (pin, eic, adc0, adc1))
for cell in row[4:]:
if cell:
table_file.write(
", 0x%s" % cell if len(cell) == 2 else ", 0x0%s" % cell
)
else:
table_file.write(", 0xff")
table_file.write("},\n")
table_file.write(" #endif\n")
table_file.write("};\n")
def main():
parser = argparse.ArgumentParser(
prog="make-pin-cap.py",
usage="%(prog)s [options] [command]",
description="Generate MCU-specific pin cap table file",
)
parser.add_argument(
"-c",
"--csv",
dest="csv_filename",
help="Specifies the pin-mux-xxxx.csv filename",
)
parser.add_argument(
"-t",
"--table",
dest="table_filename",
help="Specifies the name of the generated pin cap table file",
)
parser.add_argument(
"-m",
"--mcu",
dest="mcu_name",
help="Specifies type of the MCU (SAMD21 or SAMD51)",
)
args = parser.parse_args(sys.argv[1:])
pins = Pins()
if args.csv_filename:
pins.parse_csv_file(args.csv_filename)
if args.table_filename:
pins.print_table(args.table_filename, args.mcu_name)
if __name__ == "__main__":
main()