summaryrefslogtreecommitdiff
path: root/util/flash_ec
blob: 417a823fd58092006bd7f4cef597208daeabd530 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/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"

# Parse command line
FLAGS_HELP="usage: $0 [flags]"
FLAGS "$@" || exit 1
eval set -- "${FLAGS_ARGV}"
check_flags_only_and_allow_null_arg "$@" && set --

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 [[ ! -z "${FLAGS_image}" ]] ; then
		if [ ! -r "${FLAGS_image}" ]; then
			die "Invalid image path : ${FLAGS_image}"
		fi
		echo "${FLAGS_image}"
		return
	else
		if [ -x "${LOCAL_BUILD}" ]; then
			echo "${LOCAL_BUILD}"
			return
		fi
		if [ -x "${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() {
	IMG_SIZE=262144
	OCD_CFG="servo_v2_slower.cfg"
	OCD_PATH="${SRC_ROOT}/platform/ec/chip/lm4/openocd"
	OCD_CMDS="init ; flash_lm4 ${IMG} 0 262144 ; exit"

	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}"
}

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."

# Restore servo settings
servo_restore "$save"

# reset the EC
dut_control cold_reset:on
dut_control cold_reset:off