hal_stm32/scripts/genllheaders/genllheaders.py

129 lines
3.2 KiB
Python

"""
Utility to autogenerate generic LL HAL headers.
Usage::
python3 genllheaders.py [-p /path/to/HAL] [-o /path/to/output_dir]
Copyright (c) 2020 Teslabs Engineering S.L.
SPDX-License-Identifier: Apache-2.0
"""
import argparse
import logging
from pathlib import Path
import re
import shutil
from jinja2 import Environment, FileSystemLoader
logger = logging.getLogger(__name__)
SCRIPT_DIR = Path(__file__).absolute().parent
"""Script directory."""
README_TEMPLATE_FILE = "readme-template.j2"
"""Readme template file."""
HEADER_TEMPLATE_FILE = "header-template.j2"
"""Header template file."""
REPO_ROOT = SCRIPT_DIR / ".." / ".."
"""Repository root (used for input/output default folders)."""
LL_API_IGNORE = [
"usb"
]
"""List of LL APIs to be ignored."""
def main(hal_path, output):
"""Entry point.
Args:
hal_path: Zephyr CubeMX HAL path.
output: Output directory.
"""
# obtain all available LL APIs for each series
ll_apis = dict()
versions = dict()
for entry in sorted(hal_path.iterdir()):
if not entry.is_dir() or not entry.name.startswith("stm32"):
continue
series = entry.name
# collect version
with open(entry / "README") as f:
readme = f.read()
m = re.search(r"version v?([0-9\.]+)", readme)
if not m:
logger.error(f"Could not determine version for {series}")
continue
versions[series] = m.group(1)
# obtain series LL headers
series_headers = entry / "drivers" / "include"
for header in series_headers.iterdir():
m = re.match(r"stm32[a-z0-9]+_ll_([a-z0-9]+)\.h", header.name)
if not m:
continue
ll_api = m.group(1)
if ll_api in LL_API_IGNORE:
continue
if ll_api not in ll_apis:
ll_apis[ll_api] = list()
ll_apis[ll_api].append(series)
# write header files
env = Environment(
trim_blocks=True, lstrip_blocks=True, loader=FileSystemLoader(SCRIPT_DIR)
)
readme_template = env.get_template(README_TEMPLATE_FILE)
header_template = env.get_template(HEADER_TEMPLATE_FILE)
if output.exists():
shutil.rmtree(output)
output.mkdir(parents=True)
readme_file = output / "README.rst"
with open(readme_file, "w") as f:
f.write(readme_template.render(versions=versions))
output_headers = output / "include"
output_headers.mkdir()
for ll_api, all_series in ll_apis.items():
header_file = output_headers / ("stm32_ll_" + ll_api + ".h")
with open(header_file, "w") as f:
f.write(header_template.render(ll_api=ll_api, all_series=all_series))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"-p",
"--hal-path",
type=Path,
default=REPO_ROOT / "stm32cube",
help="Zephyr CubeMX HAL path",
)
parser.add_argument(
"-o",
"--output",
type=Path,
default=REPO_ROOT / "stm32cube" / "common_ll",
help="Output directory",
)
args = parser.parse_args()
main(args.hal_path, args.output)