diff options
author | Tom Hughes <tomhughes@chromium.org> | 2019-07-15 17:01:31 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-07-23 20:18:09 -0700 |
commit | 2ad39013e188b32640486b662005d29a199937b9 (patch) | |
tree | e399aa4da2dc7dbc274db26caa623ab91acda9b3 /util | |
parent | 6f994b8e3ac868ffb1fba35473c753e65dcd1b5e (diff) | |
download | chrome-ec-2ad39013e188b32640486b662005d29a199937b9.tar.gz |
util: Unify separate flash_fp_mcu scripts into single common one
For fingerprint firmware we are moving towards a model where the "board"
(in EC terminology) is a specific MCU+FP_SENSOR combination and not tied
to the main system board that it's connected to (e.g., "hatch",
"nocturne", etc.). This change decouples flash_fp_mcu from the EC
"board".
BRANCH=none
BUG=b:136678758,b:137108509
TEST=make buildall -j
hatch:
flash_fp_mcu /opt/google/biod/fw/hatch_fp_v2.0.1359-6f54be08d.bin
nocturne:
flash_fp_mcu /opt/google/biod/fw/nocturne_fp_v2.0.1765+87bb17a39.bin
nami:
flash_fp_mcu /opt/google/biod/fw/nami_fp_v2.2.144-7a08e07eb.bin
Cq-Depend:chromium:1705055
Change-Id: Idfe298f59ab9df8657a570cc47e956b4e94ee1a1
Signed-off-by: Tom Hughes <tomhughes@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1704808
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Nicolas Norvez <norvez@chromium.org>
Diffstat (limited to 'util')
-rw-r--r-- | util/flash_fp_mcu (renamed from util/flash_fp_mcu_common.sh) | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/util/flash_fp_mcu_common.sh b/util/flash_fp_mcu index ef70bc61e1..6a23aa691c 100644 --- a/util/flash_fp_mcu_common.sh +++ b/util/flash_fp_mcu @@ -46,6 +46,63 @@ get_spiid() { exit 1 } +# Taken verbatim from +# https://chromium.googlesource.com/chromiumos/docs/+/master/lsb-release.md#shell +# This should not be used by anything except get_platform_name. +# See https://crbug.com/98462. +lsbval() { + local key="$1" + local lsbfile="${2:-/etc/lsb-release}" + + if ! echo "${key}" | grep -Eq '^[a-zA-Z0-9_]+$'; then + return 1 + fi + + sed -E -n -e \ + "/^[[:space:]]*${key}[[:space:]]*=/{ + s:^[^=]+=[[:space:]]*:: + s:[[:space:]]+$:: + p + }" "${lsbfile}" +} + +# Get the underlying board (reference design) that we're running on (not the +# FPMCU or sensor). +get_platform_name() { + # "-l" converts to lowercase + local -l platform_name="$(cros_config /identity platform-name)" + + # If we don't get any result from cros_config, then we have to possible cases: + # + # 1) We're running on a non-unibuild device (the only one with FP is nocturne) + # 2) We're running on a proto device during bringup and the cros_config + # settings haven't yet been setup. + # + # In either case we can fall back to /etc/lsb-release. It's not recommended + # to do this, but we don't have any other options in this case. + # + # TODO(https://crbug.com/984629): cros_config should handle reading + # /etc/lsb-release as backup for us. + if [[ -z "${platform_name}" ]]; then + echo "Getting platform name from cros_config failed." \ + "Falling back to /etc/lsb-release." 1>&2 + platform_name="$(lsbval "CHROMEOS_RELEASE_BOARD")" + if [[ -z "${platform_name}" ]]; then + exit 1 + fi + fi + + echo "${platform_name}" +} + +check_gpio_chip_exists() { + local gpiochip="$1" + if [[ ! -e "/sys/class/gpio/${gpiochip}" ]]; then + echo "Cannot find GPIO chip: ${gpiochip}" + exit 1 + fi +} + flash_fp_mcu_stm32() { local spidev="${1}" local gpio_nrst="${2}" @@ -139,3 +196,70 @@ flash_fp_mcu_stm32() { # Test it ectool --name=cros_fp version } + +config_hatch() { + check_gpio_chip_exists "gpiochip200" + + readonly SPIDEV="/dev/spidev1.1" + # FPMCU RST_ODL is on GPP_A12 = 200 + 12 = 212 + readonly GPIO_NRST=212 + # FPMCU BOOT0 is on GPP_A22 = 200 + 22 = 222 + readonly GPIO_BOOT0=222 + # No PWREN GPIO on Hatch, FPMCU is always on + readonly GPIO_PWREN="" +} + +config_nami() { + check_gpio_chip_exists "gpiochip360" + + readonly SPIDEV="/dev/spidev32765.0" + # FPMCU RST_ODL is on GPP_C9 = 360 + 57 = 417 + readonly GPIO_NRST=417 + # FPMCU BOOT0 is on GPP_D5 = 360 + 77 = 437 + readonly GPIO_BOOT0=437 + # FP_PWR_EN is on GPP_B11 = 360 + 35 = 395 + readonly GPIO_PWREN=395 +} + +config_nocturne() { + check_gpio_chip_exists "gpiochip360" + + readonly SPIDEV="/dev/spidev32765.0" + # FPMCU RST_ODL is on GPP_C10 = 360 + 58 = 418 + readonly GPIO_NRST=418 + # FPMCU BOOT0 is on GPP_C8 = 360 + 56 = 416 + readonly GPIO_BOOT0=416 + # FP_PWR_EN is on GPP_A11 = 360 + 11 = 371 + readonly GPIO_PWREN=371 +} + +# The "platform name" corresponds to the underlying board (reference design) +# that we're running on (not the FPMCU or sensor). At the moment all of the +# reference designs use the same GPIOs. If for some reason a design differs in +# the future, we will want to add a nested check in the config_<platform_name> +# function. Doing it in this manner allows us to reduce the number of +# configurations that we have to maintain (and reduces the amount of testing +# if we're only updating a specific config_<platform_name>). +readonly PLATFORM_NAME="$(get_platform_name)" + +echo "Using config for ${PLATFORM_NAME}" + +# Check that the config function exists +if [[ "$(type -t "config_${PLATFORM_NAME}")" != "function" ]]; then + echo "No config for platform ${PLATFORM_NAME}" + exit 1 +fi + +config_${PLATFORM_NAME} + +if [[ $? -ne 0 ]]; then + echo "Configuration failed for platform ${PLATFORM_NAME}" + exit 1 +fi + +flash_fp_mcu_stm32 \ + "${SPIDEV}" \ + "${GPIO_NRST}" \ + "${GPIO_BOOT0}" \ + "${GPIO_PWREN}" \ + "${1}" |