| #!/usr/bin/env python3 | |
| 
 | |
| # SPDX-FileCopyrightText: 2023 Melissa LeBlanc-Williams for Adafruit Industries | |
| # | |
| # SPDX-License-Identifier: MIT | |
| 
 | |
| """ | |
| `bin.rpi_info` | |
| ================================================================================ | |
|  | |
| Interactive mode will prompt for the revision code | |
| Otherwise it will be detected automatically | |
|  | |
| * Author(s): Melissa LeBlanc-Williams | |
|  | |
| Implementation Notes | |
| -------------------- | |
|  | |
| **Software and Dependencies:** | |
|  | |
| * Linux and Python 3.7 or Higher | |
|  | |
| """ | |
| 
 | |
| import sys | |
| import argparse | |
| import adafruit_platformdetect | |
| from adafruit_platformdetect.revcodes import PiDecoder | |
| 
 | |
| detector = adafruit_platformdetect.Detector() | |
| parser = argparse.ArgumentParser() | |
| 
 | |
| 
 | |
| def print_property(label, value): | |
|     """Format and print a property""" | |
|     print(f"{label}: {value}") | |
| 
 | |
| 
 | |
| def main(interactive): | |
|     """Run the program""" | |
|     pi_rev_code = detector.board._pi_rev_code()  # pylint: disable=protected-access | |
| 
 | |
|     if pi_rev_code is None: | |
|         print("Raspberry Pi not detected. Using interactive mode") | |
| 
 | |
|     if pi_rev_code is None or interactive: | |
|         pi_rev_code = input( | |
|             "Enter a Raspberry Pi revision code (e.g. d03114 or 000f): " | |
|         ) | |
| 
 | |
|     print_property("Revision Code", pi_rev_code) | |
| 
 | |
|     try: | |
|         decoder = PiDecoder(pi_rev_code) | |
|     except ValueError: | |
|         print("Invalid revision code. It should be a hexadecimal value.") | |
|         sys.exit(1) | |
| 
 | |
|     if not decoder.is_valid_code(): | |
|         print( | |
|             "Code is invalid. This rev code includes at least one " | |
|             "value that is outside of the expected range." | |
|         ) | |
|         sys.exit(1) | |
| 
 | |
|     if decoder.is_new_format(): | |
|         print_property("Overvoltage", decoder.overvoltage) | |
|         print_property("OTP Program", decoder.otp_program) | |
|         print_property("OTP Read", decoder.otp_read) | |
|         print_property("Warranty bit", decoder.warranty_bit) | |
|         print_property("New flag", decoder.rev_style) | |
|         print_property("Memory size", decoder.memory_size) | |
|         print_property("Manufacturer", decoder.manufacturer) | |
|         print_property("Processor", decoder.processor) | |
|         print_property("Type", decoder.type) | |
|         print_property("Revision", decoder.revision) | |
|     else: | |
|         print_property("Warranty bit", decoder.warranty_bit) | |
|         print_property("Model", decoder.type) | |
|         print_property("Revision", decoder.revision) | |
|         print_property("RAM", decoder.memory_size) | |
|         print_property("Manufacturer", decoder.manufacturer) | |
| 
 | |
| 
 | |
| # Main function | |
| if __name__ == "__main__": | |
|     parser.add_argument( | |
|         "-i", "--interactive", help="Interactive Mode", action="store_true" | |
|     ) | |
|     args = parser.parse_args() | |
|     main(args.interactive)
 |