pebble/tools/bootloader_test.py

120 lines
3.8 KiB
Python
Raw Permalink Normal View History

#!/usr/bin/env python
# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import argparse
import logging
import time
import subprocess
import sys
import prompt
from serial_port_wrapper import SerialPortWrapper
def get_dbgserial_tty():
# Local import so that we only depend on this package if we're attempting
# to autodetect the TTY. This package isn't always available (e.g., MFG),
# so we don't want it to be required.
import pebble_tty
return pebble_tty.find_dbgserial_tty()
def test_bootloader(s, fw_type, max_wait=5 * 60):
subprocess.call(["./waf", "flash_prf"])
# Wait for prompt to become allowed.
# This is a magical number, but it worked for me.
time.sleep(15)
prompt.go_to_prompt(s)
prompt.issue_command(s, 'bootloader test ' + fw_type)
test_stage = 0
waits = 0
while waits < max_wait:
line = s.readline(1)
if test_stage == 0:
if 'BOOTLOADER TEST STAGE 1' in line:
print "Stage 1 success."
waits = 0
test_stage = 1
continue
elif test_stage == 1:
if 'BOOTLOADER TEST STAGE 2' in line:
print "Stage 2 success!"
waits = 0
test_stage = 2
break
waits += 1
if waits >= max_wait:
print "Couldn't find keyword within allowed time limit!"
if test_stage != 2:
print "BOOTLOADER TEST FOR " + fw_type + " !!!!!FAILED!!!!!"
return False
else:
print "BOOTLOADER TEST FOR " + fw_type + " SUCCEEDED!"
return True
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description="Tool to test the bootloader's updating routines for firmware and PRF.")
parser.add_argument('board', metavar='board',
help='board type (such as snowy_bb2, robert_bb, robert_bb2)')
parser.add_argument('-t', '--tty', metavar='TTY', default=None,
help='the target serial port')
parser.add_argument('-v', '--verbose', action='store_true',
help='print verbose status output')
parser.add_argument('-s', '--skip-rebuild', action='store_true',
help='skip re-building the test firmware')
args = parser.parse_args()
if args.tty is None:
args.tty = get_dbgserial_tty()
if args.verbose:
logging.basicConfig(level=logging.DEBUG)
else:
logging.basicConfig(level=logging.WARNING)
# build
if not args.skip_rebuild:
configure = ["./waf", "configure", "--board="+args.board, "--internal_sdk_build"]
subprocess.call(configure + ["--bootloader-test=stage2"])
subprocess.call(["./waf", "build_prf"])
subprocess.call(["cp", "build/prf/src/fw/tintin_fw.bin", "bootloader_test_stage2.bin"])
subprocess.call(configure + ["--bootloader-test=stage1"])
subprocess.call(["./waf", "build_prf"])
s = SerialPortWrapper(args.tty)
# Test FW loading
if not test_bootloader(s, 'fw'):
s.close()
print "Bootloader test failed!"
sys.exit(1)
# Test PRF loading
if not test_bootloader(s, 'prf'):
s.close()
print "Bootloader test failed!"
sys.exit(2)
s.close()
print "BOOTLOADER TESTS ALL PASSED"