118 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/env python3
 | 
						|
import re
 | 
						|
import pandas as pd
 | 
						|
from tabulate import tabulate
 | 
						|
from pathlib import Path
 | 
						|
from get_deps import deps_all
 | 
						|
 | 
						|
# TOP is tinyusb root dir
 | 
						|
TOP = Path(__file__).parent.parent.resolve()
 | 
						|
 | 
						|
 | 
						|
# -----------------------------------------
 | 
						|
# Dependencies
 | 
						|
# -----------------------------------------
 | 
						|
def gen_deps_doc():
 | 
						|
    deps_rst = Path(TOP) / "docs/reference/dependencies.rst"
 | 
						|
    df = pd.DataFrame.from_dict(deps_all, orient='index', columns=['Repo', 'Commit', 'Required by'])
 | 
						|
    df = df[['Repo', 'Commit', 'Required by']].sort_index()
 | 
						|
    df = df.rename_axis("Local Path")
 | 
						|
 | 
						|
    outstr = f"""\
 | 
						|
************
 | 
						|
Dependencies
 | 
						|
************
 | 
						|
 | 
						|
MCU low-level peripheral driver and external libraries for building TinyUSB examples
 | 
						|
 | 
						|
{tabulate(df, headers="keys", tablefmt='rst')}
 | 
						|
"""
 | 
						|
 | 
						|
    with deps_rst.open('w') as f:
 | 
						|
        f.write(outstr)
 | 
						|
 | 
						|
 | 
						|
# -----------------------------------------
 | 
						|
# Dependencies
 | 
						|
# -----------------------------------------
 | 
						|
def extract_metadata(file_path):
 | 
						|
    metadata = {}
 | 
						|
    try:
 | 
						|
        with open(file_path, 'r') as file:
 | 
						|
            content = file.read()
 | 
						|
            # Match metadata block
 | 
						|
            match = re.search(r'/\*\s*metadata:(.*?)\*/', content, re.DOTALL)
 | 
						|
            if match:
 | 
						|
                block = match.group(1)
 | 
						|
                # Extract key-value pairs
 | 
						|
                for line in block.splitlines():
 | 
						|
                    key_value = re.match(r'\s*(\w+):\s*(.+)', line)
 | 
						|
                    if key_value:
 | 
						|
                        key, value = key_value.groups()
 | 
						|
                        metadata[key] = value.strip()
 | 
						|
    except FileNotFoundError:
 | 
						|
        pass
 | 
						|
    return metadata
 | 
						|
 | 
						|
 | 
						|
def gen_boards_doc():
 | 
						|
    # 'Manufacturer' : { 'Board' }
 | 
						|
    vendor_data = {}
 | 
						|
    # 'Board' : [ 'Name', 'Family', 'url', 'note' ]
 | 
						|
    all_boards = {}
 | 
						|
    #  extract metadata from family.c
 | 
						|
    for family_dir in sorted((Path(TOP) / "hw/bsp").iterdir()):
 | 
						|
        if family_dir.is_dir():
 | 
						|
            family_c = family_dir / "family.c"
 | 
						|
            if not family_c.exists():
 | 
						|
                family_c = family_dir / "boards/family.c"
 | 
						|
            f_meta = extract_metadata(family_c)
 | 
						|
            if not f_meta:
 | 
						|
                continue
 | 
						|
            manuf = f_meta.get('manufacturer', '')
 | 
						|
            if manuf not in vendor_data:
 | 
						|
                vendor_data[manuf] = {}
 | 
						|
            # extract metadata from board.h
 | 
						|
            for board_dir in sorted((family_dir / "boards").iterdir()):
 | 
						|
                if board_dir.is_dir():
 | 
						|
                    b_meta = extract_metadata(board_dir / "board.h")
 | 
						|
                    if not b_meta:
 | 
						|
                        continue
 | 
						|
                    b_entry = [
 | 
						|
                        b_meta.get('name', ''),
 | 
						|
                        family_dir.name,
 | 
						|
                        b_meta.get('url', ''),
 | 
						|
                        b_meta.get('note', '')
 | 
						|
                    ]
 | 
						|
                    vendor_data[manuf][board_dir.name] = b_entry
 | 
						|
    boards_rst = Path(TOP) / "docs/reference/boards.rst"
 | 
						|
    with boards_rst.open('w') as f:
 | 
						|
        title = f"""\
 | 
						|
****************
 | 
						|
Supported Boards
 | 
						|
****************
 | 
						|
 | 
						|
The board support code is only used for self-contained examples and testing. It is not used when TinyUSB is part of a larger project.
 | 
						|
It is responsible for getting the MCU started and the USB peripheral clocked with minimal of on-board devices
 | 
						|
 | 
						|
-  One LED : for status
 | 
						|
-  One Button : to get input from user
 | 
						|
-  One UART : needed for logging with LOGGER=uart, maybe required for host/dual examples
 | 
						|
 | 
						|
Following boards are supported"""
 | 
						|
        f.write(title)
 | 
						|
        for manuf, boards in sorted(vendor_data.items()):
 | 
						|
            f.write(f"\n\n{manuf}\n")
 | 
						|
            f.write(f"{'-' * len(manuf)}\n\n")
 | 
						|
            df = pd.DataFrame.from_dict(boards, orient='index', columns=['Name', 'Family', 'URL', 'Note'])
 | 
						|
            df = df.rename_axis("Board")
 | 
						|
            f.write(tabulate(df, headers="keys", tablefmt='rst'))
 | 
						|
 | 
						|
 | 
						|
# -----------------------------------------
 | 
						|
# Main
 | 
						|
# -----------------------------------------
 | 
						|
if __name__ == "__main__":
 | 
						|
    gen_deps_doc()
 | 
						|
    gen_boards_doc()
 |