Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 1 | #!/bin/bash |
Chirayu Desai | cc931dc | 2022-07-08 19:43:32 +0530 | [diff] [blame] | 2 | |
Michael Bestas | d137feb | 2023-12-01 02:26:28 +0200 | [diff] [blame] | 3 | # SPDX-FileCopyrightText: 2022-2023 The Calyx Institute |
Chirayu Desai | cc931dc | 2022-07-08 19:43:32 +0530 | [diff] [blame] | 4 | # |
| 5 | # SPDX-License-Identifier: Apache-2.0 |
| 6 | |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 7 | # |
Michael Bestas | d137feb | 2023-12-01 02:26:28 +0200 | [diff] [blame] | 8 | # firmware: |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 9 | # |
| 10 | # Setup pixel firmware |
| 11 | # |
| 12 | # |
| 13 | ############################################################################## |
| 14 | |
| 15 | |
| 16 | ### SET ### |
| 17 | |
| 18 | # use bash strict mode |
| 19 | set -euo pipefail |
| 20 | |
| 21 | |
| 22 | ### TRAPS ### |
| 23 | |
| 24 | # trap signals for clean exit |
| 25 | trap 'exit $?' EXIT |
| 26 | trap 'error_m interrupted!' SIGINT |
| 27 | |
| 28 | ### CONSTANTS ### |
| 29 | readonly script_path="$(cd "$(dirname "$0")";pwd -P)" |
Jis G Jacob | 4c84cfa | 2024-02-09 11:20:03 -0500 | [diff] [blame] | 30 | readonly vars_path="${script_path}/../../../vendor/bliss/vars" |
Michael Bestas | 7c70cb8 | 2022-01-13 16:52:45 +0200 | [diff] [blame] | 31 | readonly top="${script_path}/../../.." |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 32 | |
Jis G Jacob | 4c84cfa | 2024-02-09 11:20:03 -0500 | [diff] [blame] | 33 | readonly fbpacktool="${top}/bliss/scripts/fbpacktool/fbpacktool.py" |
Chirayu Desai | 3bbe097 | 2022-03-13 16:06:16 +0530 | [diff] [blame] | 34 | readonly qc_image_unpacker="${top}/prebuilts/extract-tools/linux-x86/bin/qc_image_unpacker" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 35 | readonly extract_ota_py="${top}/tools/extract-utils/extract_ota.py" |
| 36 | |
| 37 | readonly work_dir="${WORK_DIR:-/tmp/pixel}" |
| 38 | |
Chirayu Desai | dd101d6 | 2022-03-01 23:38:44 +0530 | [diff] [blame] | 39 | source "${vars_path}/pixels" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 40 | |
| 41 | readonly device="${1}" |
| 42 | source "${vars_path}/${device}" |
| 43 | |
Chirayu Desai | b319e39 | 2023-06-21 15:56:44 +0530 | [diff] [blame] | 44 | readonly _wifi_only="${wifi_only:-false}" |
| 45 | |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 46 | readonly factory_dir="${work_dir}/${device}/${build_id}/factory/${device}-${build_id,,}" |
| 47 | readonly ota_zip="${work_dir}/${device}/${build_id}/$(basename ${ota_url})" |
| 48 | readonly ota_firmware_dir="${work_dir}/${device}/${build_id}/firmware" |
| 49 | |
Michael Bestas | df57e2f | 2022-01-13 17:06:01 +0200 | [diff] [blame] | 50 | readonly vendor_path="${top}/vendor/firmware/${device}" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 51 | |
| 52 | ## HELP MESSAGE (USAGE INFO) |
| 53 | # TODO |
| 54 | |
| 55 | ### FUNCTIONS ### |
| 56 | |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 57 | # Unpack the seperate partitions needed for OTA |
| 58 | # from the factory image's bootloader.img |
| 59 | unpack_firmware() { |
Michael Bestas | da703f3 | 2023-06-12 12:24:26 +0300 | [diff] [blame] | 60 | local fbpk="${fbpk_version:-v1}" |
| 61 | |
Chirayu Desai | b319e39 | 2023-06-21 15:56:44 +0530 | [diff] [blame] | 62 | if [[ "${_wifi_only}" != "true" ]]; then |
| 63 | # modem.img |
| 64 | "${qc_image_unpacker}" -i "${factory_dir}"/radio-*.img -o "${ota_firmware_dir}" |
| 65 | # Alternative: dd bs=4 skip=35 |
| 66 | fi |
Michael Bestas | da703f3 | 2023-06-12 12:24:26 +0300 | [diff] [blame] | 67 | |
| 68 | if [[ "$fbpk" == "v1" ]]; then |
| 69 | # All other ${firmware_partitions[@]} |
| 70 | "${qc_image_unpacker}" -i "${factory_dir}"/bootloader-*.img -o "${ota_firmware_dir}" |
| 71 | else |
| 72 | # All other ${firmware_partitions[@]} |
| 73 | python3 "${fbpacktool}" unpack -o "${ota_firmware_dir}" "${factory_dir}"/bootloader-*.img |
| 74 | fi |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 75 | } |
| 76 | |
| 77 | extract_firmware() { |
| 78 | echo "${ota_sha256} ${ota_zip}" | sha256sum --check --status |
| 79 | python3 ${extract_ota_py} ${ota_zip} -o "${ota_firmware_dir}" -p ${firmware_partitions[@]} |
| 80 | } |
| 81 | |
| 82 | # Firmware included in OTAs, separate partitions |
| 83 | # Can be extracted from bootloader.img inside the factory image, |
| 84 | # or directly from the OTA zip |
| 85 | copy_ota_firmware() { |
| 86 | for fp in ${firmware_partitions[@]}; do |
Michael Bestas | df57e2f | 2022-01-13 17:06:01 +0200 | [diff] [blame] | 87 | cp "${ota_firmware_dir}/${fp}.img" "${vendor_path}/radio/${fp}.img" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 88 | done |
| 89 | } |
| 90 | |
| 91 | setup_makefiles() { |
Michael Bestas | df57e2f | 2022-01-13 17:06:01 +0200 | [diff] [blame] | 92 | echo "AB_OTA_PARTITIONS += \\" > "${vendor_path}/config.mk" |
| 93 | for fp in ${firmware_partitions[@]}; do |
| 94 | echo " ${fp} \\" >> "${vendor_path}/config.mk" |
| 95 | done |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 96 | |
Michael Bestas | df57e2f | 2022-01-13 17:06:01 +0200 | [diff] [blame] | 97 | echo "LOCAL_PATH := \$(call my-dir)" > "${vendor_path}/firmware.mk" |
| 98 | echo >> "${vendor_path}/firmware.mk" |
| 99 | echo "ifeq (\$(TARGET_DEVICE),${device})" >> "${vendor_path}/firmware.mk" |
| 100 | for fp in ${firmware_partitions[@]}; do |
| 101 | echo "\$(call add-radio-file,radio/${fp}.img)" >> "${vendor_path}/firmware.mk" |
| 102 | done |
| 103 | echo "endif" >> "${vendor_path}/firmware.mk" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 104 | } |
| 105 | |
| 106 | # error message |
| 107 | # ARG1: error message for STDERR |
| 108 | # ARG2: error status |
| 109 | error_m() { |
| 110 | echo "ERROR: ${1:-'failed.'}" 1>&2 |
| 111 | return "${2:-1}" |
| 112 | } |
| 113 | |
| 114 | # print help message. |
| 115 | help_message() { |
| 116 | echo "${help_message:-'No help available.'}" |
| 117 | } |
| 118 | |
| 119 | main() { |
Chirayu Desai | 39c5155 | 2021-12-24 06:00:54 +0530 | [diff] [blame] | 120 | rm -rf "${ota_firmware_dir}" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 121 | mkdir -p "${ota_firmware_dir}" |
Michael Bestas | df57e2f | 2022-01-13 17:06:01 +0200 | [diff] [blame] | 122 | rm -rf "${vendor_path}/radio" |
| 123 | mkdir -p "${vendor_path}/radio" |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 124 | |
Chirayu Desai | 58b51ee | 2021-12-03 03:21:59 +0530 | [diff] [blame] | 125 | # Not all devices need OTA, most are supported in image_unpacker |
| 126 | if [[ -n ${needs_ota-} ]]; then |
| 127 | extract_firmware |
| 128 | else |
| 129 | unpack_firmware |
| 130 | fi |
| 131 | copy_ota_firmware |
| 132 | setup_makefiles |
| 133 | } |
| 134 | |
| 135 | ### RUN PROGRAM ### |
| 136 | |
| 137 | main "${@}" |
| 138 | |
| 139 | |
| 140 | ## |