diff --git a/raspi-blinka.py b/raspi-blinka.py new file mode 100644 index 0000000..c216ab0 --- /dev/null +++ b/raspi-blinka.py @@ -0,0 +1,155 @@ +""" +Adafruit Raspberry Pi Blinka Setup Script +(C) Adafruit Industries, Creative Commons 3.0 - Attribution Share Alike + +Written by Melissa LeBlanc-Williams for Adafruit Industries +""" + +import os +import sys + +try: + from adafruit_shell import Shell +except ImportError: + raise RuntimeError("The library 'adafruit_shell' was not found. To install, try typing: sudo pip3 install adafruit-python-shell") + +shell = Shell() +shell.group="Blinka" +default_python = 3 +blinka_minimum_python_version = 3.7 + +def default_python_version(numeric=True): + version = shell.run_command("python -c 'import platform; print(platform.python_version())'", suppress_message=True, return_output=True) + if numeric: + try: + return float(version[0:version.rfind(".")]) + except ValueError: + return None + return version + +def get_python3_version(numeric=True): + version = shell.run_command("python3 -c 'import platform; print(platform.python_version())'", suppress_message=True, return_output=True) + if numeric: + return float(version[0:version.rfind(".")]) + return version + +def check_blinka_python_version(): + """ + Check the Python 3 version for Blinka (which may be a later version than we're running this script with) + """ + print("Making sure the required version of Python is installed") + current = get_python3_version(False) + current_major, current_minor = current.split(".")[0:2] + required_major, required_minor = str(blinka_minimum_python_version).split(".")[0:2] + + if int(current_major) >= int(required_major) and int(current_minor) >= int(required_minor): + return + + shell.bail("Blinka requires a minimum of Python version {} to install, current one is {}. Please update your OS!".format(blinka_minimum_python_version, current)) + +def sys_update(): + print("Updating System Packages") + if not shell.run_command("sudo apt-get update --allow-releaseinfo-change"): + shell.bail("Apt failed to update indexes!") + print("Upgrading packages...") + if not shell.run_command("sudo apt-get -y upgrade"): + shell.bail("Apt failed to install software!") + +def set_raspiconfig(): + """ + Enable various Raspberry Pi interfaces + """ + print("Enabling I2C") + shell.run_command("sudo raspi-config nonint do_i2c 0") + print("Enabling SPI") + shell.run_command("sudo raspi-config nonint do_spi 0") + print("Enabling Serial") + if not shell.run_command("sudo raspi-config nonint do_serial_hw 0", suppress_message=True): + shell.run_command("sudo raspi-config nonint do_serial 0") + print("Enabling SSH") + shell.run_command("sudo raspi-config nonint do_ssh 0") + print("Enabling Camera") + shell.run_command("sudo raspi-config nonint do_camera 0") + print("Disable raspi-config at Boot") + shell.run_command("sudo raspi-config nonint disable_raspi_config_at_boot 0") + +def update_python(): + print("Making sure Python 3 is the default") + if default_python < 3: + shell.run_command("sudo apt-get install -y python3 git python3-pip") + shell.run_command("sudo update-alternatives --install /usr/bin/python python $(which python2) 1") + shell.run_command("sudo update-alternatives --install /usr/bin/python python $(which python3) 2") + shell.run_command("sudo update-alternatives --skip-auto --config python") + +def update_pip(): + print("Making sure PIP and setuptools is installed") + shell.run_command("sudo apt-get install --upgrade -y python3-pip python3-setuptools") + +def install_blinka(user=False): + print("Installing latest version of Blinka locally") + shell.run_command("sudo apt-get install -y i2c-tools libgpiod-dev python3-libgpiod") + pip_command = "pip3 install --upgrade" + username = None + if user: + username = os.environ["SUDO_USER"] + shell.run_command(f"{pip_command} RPi.GPIO", run_as_user=username) + shell.run_command(f"{pip_command} adafruit-blinka", run_as_user=username) + +# Custom function to run additional commands for Pi 5 +def check_and_install_for_pi5(pi_model): + if pi_model.startswith("RASPBERRY_PI_5"): + print("Detected Raspberry Pi 5, applying additional fixes...") + os.system("sudo apt remove python3-rpi.gpio") + os.system("pip3 install rpi-lgpio") + else: + print(f"Detected {pi_model}, no additional fixes needed.") + +def main(): + global default_python + shell.clear() + # Check Raspberry Pi and Bail + pi_model = shell.get_board_model() + print("""This script configures your +Raspberry Pi and installs Blinka +""") + print("{} detected.\n".format(pi_model)) + if not shell.is_raspberry_pi(): + shell.bail("Non-Raspberry Pi board detected. This must be run on a Raspberry Pi") + os_identifier = shell.get_os() + if os_identifier != "Raspbian": + shell.bail("Sorry, the OS detected was {}. This script currently only runs on Raspberry Pi OS.".format(os_identifier)) + if not shell.is_python3(): + shell.bail("You must be running Python 3. Older versions have now been deprecated.") + shell.check_kernel_update_reboot_required() + python_version = default_python_version() + if not python_version: + shell.warn("WARNING No Default System python tied to the `python` command. It will be set to Version 3.") + default_python = 0 + if not shell.prompt("Continue?"): + shell.exit() + elif int(default_python_version()) < 3: + shell.warn("WARNING Default System python version is {}. It will be updated to Version 3.".format(default_python_version(False))) + default_python = 2 + if not shell.prompt("Continue?"): + shell.exit() + sys_update() + check_blinka_python_version() + set_raspiconfig() + update_python() + update_pip() + install_blinka(True) + + # Check and install for Pi 5 if detected + check_and_install_for_pi5(pi_model) + + # Done + print("""DONE. + +Settings take effect on next boot. +""") + shell.prompt_reboot() + +# Main function +if __name__ == "__main__": + shell.require_root() + main()