Files
OpenCellular/util/flash_ec
Vadim Bendebury 4efe1ed157 Fix the ec flash programming script to properly handle errors
When a nonexisting file is specified as the EC image, the ec flash
programming script reports the error, but continues running and
returns zero status (success) after completion.

With this change the exit status on some errors gets communicated to
the caller.

The openocd script is edited to drop the unused parameter of the
flash_lm4() function and the flash_ec script is edited not to require
EC images to be executable.

BRANCH=none
BUG=chrome-os-partner:15610
TEST=manual
   . run flash_ec with nonexisting or nonreadable file as a parameter,
     observe it to report proper return status. Run it with a proper
     image file name and observe it succeed.
   . run the command again, while the device is being programmed enter
     'ctl-c', observe programming stepped but the 'Restoring servo
     settings..." message still showing up.

Change-Id: Iac0b233fe579b0d5a84cf5a9acf85ed8bf10422e
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/37363
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
2012-11-07 09:48:29 -08:00

149 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
COMMON_SH=/usr/lib/crosutils/common.sh
. "${COMMON_SH}" || exit 1
# Flags
DEFINE_string board "${DEFAULT_BOARD}" \
"The board to run debugger on."
DEFINE_string image "" \
"Full pathname of the EC firmware image to flash."
DEFINE_boolean ro "${FLAGS_FALSE}" \
"Write only the read-only partition"
DEFINE_string offset "0" \
"Offset where to program the image from."
# Parse command line
FLAGS_HELP="usage: $0 [flags]"
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
check_flags_only_and_allow_null_arg "$@" && set --
set -e
cleanup() {
if [ -n "${save}" ]; then
info "Restoring servo settings..."
servo_restore "$save"
fi
# reset the EC
dut_control cold_reset:on
dut_control cold_reset:off
}
trap cleanup EXIT
BOARD=${FLAGS_board}
BOARD_ROOT=/build/${BOARD}
# Possible default EC images
if [ "${FLAGS_ro}" = ${FLAGS_TRUE} ] ; then
EC_FILE=ec.RO.flat
else
EC_FILE=ec.bin
fi
EMERGE_BUILD=${BOARD_ROOT}/firmware/${EC_FILE}
LOCAL_BUILD=${SRC_ROOT}/platform/ec/build/${BOARD}/${EC_FILE}
# Find the EC image to use
function ec_image() {
# No image specified on the command line, try default ones
if [[ -n "${FLAGS_image}" ]] ; then
if [ -f "${FLAGS_image}" ]; then
echo "${FLAGS_image}"
return
fi
die "Invalid image path : ${FLAGS_image}"
else
if [ -f "${LOCAL_BUILD}" ]; then
echo "${LOCAL_BUILD}"
return
fi
if [ -f "${EMERGE_BUILD}" ]; then
echo "${EMERGE_BUILD}"
return
fi
fi
die "no EC image found : build one or specify one."
}
# Find the EC UART on the servo v2
function ec_uart() {
SERVOD_FAIL="Cannot communicate with servo. is servod running ?"
(dut-control uart1_pty || die "${SERVOD_FAIL}") | cut -d: -f2
}
# Servo variables management
SERVO_VARS="uart1_en uart1_parity uart1_baudrate \
jtag_buf_on_flex_en jtag_buf_en spi1_vref"
function dut_control() {
dut-control "$1" >/dev/null
}
function servo_save() {
dut-control ${SERVO_VARS}
}
function servo_restore() {
echo "$1" | while read line
do
dut_control "$line"
done
}
# Board specific flashing scripts
function flash_daisy() {
TOOL_PATH="${SCRIPT_LOCATION}/../build/${BOARD}/util:$PATH"
STM32MON=$(PATH="${TOOL_PATH}" which stm32mon)
if [ ! -x "$STM32MON" ]; then
die "no stm32mon util found."
fi
info "Using serial flasher : ${STM32MON}"
dut_control uart1_en:on
dut_control uart1_parity:even
dut_control uart1_baudrate:115200
# force the EC to boot in serial monitor mode
dut_control spi1_vref:pp3300
# reset the EC
dut_control cold_reset:on
dut_control cold_reset:off
${STM32MON} -d ${EC_UART} -e -w ${IMG}
}
function flash_link() {
OCD_CFG="servo_v2_slower.cfg"
OCD_PATH="${SRC_ROOT}/platform/ec/chip/lm4/openocd"
OCD_CMDS="init ; flash_lm4 ${IMG} ${FLAGS_offset}; shutdown;"
dut_control jtag_buf_on_flex_en:on
dut_control jtag_buf_en:on
sudo openocd -s "${OCD_PATH}" -f "${OCD_CFG}" -c "${OCD_CMDS}" || \
die "Failed to program ${IMG}"
}
IMG="$(ec_image)"
info "Using EC image : ${IMG}"
EC_UART="$(ec_uart)"
info "EC UART pty : ${EC_UART}"
save="$(servo_save)"
case "${BOARD}" in
daisy | snow | spring ) flash_daisy ;;
link ) flash_link ;;
*) die "board ${BOARD} not supported" ;;
esac
info "Flashing done."