PythonExtra/ports/samd/boards/make-pins.py

129 lines
4.0 KiB
Python

#!/usr/bin/env python
"""Generates the pins file for the SAMD port."""
from __future__ import print_function
import argparse
import sys
import csv
pins_header_prefix = """// This file was automatically generated by make-pins.py
//
typedef struct _machine_pin_obj_t {
mp_obj_base_t base;
uint32_t id;
char *name;
} machine_pin_obj_t;
int pin_find(mp_obj_t pin, const machine_pin_obj_t machine_pin_obj[], int table_size);
"""
led_header_prefix = """typedef struct _machine_led_obj_t {
mp_obj_base_t base;
uint32_t id;
char *name;
} machine_led_obj_t;
"""
class Pins:
def __init__(self):
self.board_pins = [] # list of pin objects
self.board_leds = [] # list of led objects
def parse_csv_file(self, filename):
with open(filename, "r") as csvfile:
rows = csv.reader(csvfile, skipinitialspace=True)
for row in rows:
# Pin numbers must start with "PIN_"
# LED numbers must start with "LED_"
if len(row) > 0:
if row[0].startswith("PIN_"):
if len(row) == 1:
self.board_pins.append([row[0], row[0][4:]])
else:
self.board_pins.append([row[0], row[1]])
elif row[0].startswith("LED_"):
self.board_leds.append(["PIN_" + row[0][4:], row[1]])
elif row[0].startswith("-"):
self.board_pins.append(["-1", ""])
def print_pins(self, pins_filename):
with open(pins_filename, "wt") as pins_file:
pins_file.write("// This file was automatically generated by make-pins.py\n")
pins_file.write("//\n")
pins_file.write('#include "modmachine.h"\n')
pins_file.write('#include "sam.h"\n')
pins_file.write('#include "pins.h"\n\n')
pins_file.write("const machine_pin_obj_t machine_pin_obj[] = {\n")
for pin in self.board_pins:
pins_file.write(" {{&machine_pin_type}, ")
pins_file.write(pin[0] + ', "' + pin[1])
pins_file.write('"},\n')
pins_file.write("};\n")
if self.board_leds:
pins_file.write("\nconst machine_led_obj_t machine_led_obj[] = {\n")
for pin in self.board_leds:
pins_file.write(" {{&machine_led_type}, ")
pins_file.write(pin[0] + ', "' + pin[1])
pins_file.write('"},\n')
pins_file.write("};\n")
def print_header(self, hdr_filename):
with open(hdr_filename, "wt") as hdr_file:
hdr_file.write(pins_header_prefix)
if self.board_leds:
hdr_file.write(led_header_prefix)
hdr_file.write(
"extern const machine_pin_obj_t machine_pin_obj[%d];\n" % len(self.board_pins)
)
if self.board_leds:
hdr_file.write(
"extern const machine_led_obj_t machine_led_obj[%d];\n" % len(self.board_leds)
)
def main():
parser = argparse.ArgumentParser(
prog="make-pins.py",
usage="%(prog)s [options] [command]",
description="Generate board specific pin file",
)
parser.add_argument(
"-b",
"--board",
dest="csv_filename",
help="Specifies the pins.csv filename",
)
parser.add_argument(
"-p",
"--pins",
dest="pins_filename",
help="Specifies the name of the generated pins.c file",
)
parser.add_argument(
"-i",
"--inc",
dest="hdr_filename",
help="Specifies name of generated pin header file",
)
args = parser.parse_args(sys.argv[1:])
pins = Pins()
if args.csv_filename:
pins.parse_csv_file(args.csv_filename)
if args.pins_filename:
pins.print_pins(args.pins_filename)
pins.print_header(args.hdr_filename)
if __name__ == "__main__":
main()