| 
									
										
										
										
											2024-09-17 12:17:12 -07:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2024-12-27 09:11:09 +07:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2023-03-23 16:33:35 +07:00
										 |  |  | 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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-24 14:02:09 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-24 20:17:53 +07:00
										 |  |  | # ----------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-03-23 16:33:35 +07:00
										 |  |  | # Dependencies | 
					
						
							| 
									
										
										
										
											2024-05-24 20:17:53 +07:00
										 |  |  | # ----------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-03-23 16:33:35 +07:00
										 |  |  | def gen_deps_doc(): | 
					
						
							|  |  |  |     deps_rst = Path(TOP) / "docs/reference/dependencies.rst" | 
					
						
							| 
									
										
										
										
											2023-11-24 19:11:28 +07:00
										 |  |  |     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") | 
					
						
							| 
									
										
										
										
											2023-03-23 16:33:35 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 09:11:09 +07:00
										 |  |  | # ----------------------------------------- | 
					
						
							|  |  |  | # 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 | 
					
						
							|  |  |  | **************** | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 09:58:07 +07:00
										 |  |  | 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 | 
					
						
							| 
									
										
										
										
											2024-12-27 09:11:09 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-27 09:58:07 +07:00
										 |  |  | -  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"""
 | 
					
						
							| 
									
										
										
										
											2024-12-27 09:11:09 +07:00
										 |  |  |         f.write(title) | 
					
						
							|  |  |  |         for manuf, boards in sorted(vendor_data.items()): | 
					
						
							|  |  |  |             f.write(f"\n\n{manuf}\n") | 
					
						
							| 
									
										
										
										
											2024-12-27 09:58:07 +07:00
										 |  |  |             f.write(f"{'-' * len(manuf)}\n\n") | 
					
						
							| 
									
										
										
										
											2024-12-27 09:11:09 +07:00
										 |  |  |             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 | 
					
						
							|  |  |  | # ----------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-03-23 16:33:35 +07:00
										 |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     gen_deps_doc() | 
					
						
							| 
									
										
										
										
											2024-12-27 09:11:09 +07:00
										 |  |  |     gen_boards_doc() |