261 lines
6.4 KiB
Python
261 lines
6.4 KiB
Python
|
#!/usr/bin/env python2
|
||
|
# Copyright 2017 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.
|
||
|
|
||
|
"""Script to control tigertail USB-C Mux board."""
|
||
|
|
||
|
import argparse
|
||
|
import sys
|
||
|
import time
|
||
|
|
||
|
import ecusb.tiny_servo_common as c
|
||
|
|
||
|
STM_VIDPID = '18d1:5027'
|
||
|
serialno = 'Uninitialized'
|
||
|
|
||
|
def do_mux(mux, pty):
|
||
|
"""Set mux via ec console 'pty'.
|
||
|
|
||
|
Args:
|
||
|
mux: mux to connect to DUT, 'A', 'B', or 'off'
|
||
|
pty: a pty object connected to tigertail
|
||
|
|
||
|
Commands are:
|
||
|
# > mux A
|
||
|
# TYPE-C mux is A
|
||
|
"""
|
||
|
validmux = ['A', 'B', 'off']
|
||
|
if mux not in validmux:
|
||
|
c.log('Mux setting %s invalid, try one of %s' % (mux, validmux))
|
||
|
return False
|
||
|
|
||
|
cmd = '\r\nmux %s\r\n' % mux
|
||
|
regex = 'TYPE\-C mux is ([^\s\r\n]*)\r'
|
||
|
|
||
|
results = pty._issue_cmd_get_results(cmd, [regex])[0]
|
||
|
result = results[1].strip().strip('\n\r')
|
||
|
|
||
|
if result != mux:
|
||
|
c.log('Mux set to %s but saved as %s.' % (mux, result))
|
||
|
return False
|
||
|
c.log('Mux set to %s' % result)
|
||
|
return True
|
||
|
|
||
|
def do_version(pty):
|
||
|
"""Check version via ec console 'pty'.
|
||
|
|
||
|
Args:
|
||
|
pty: a pty object connected to tigertail
|
||
|
|
||
|
Commands are:
|
||
|
# > version
|
||
|
# Chip: stm stm32f07x
|
||
|
# Board: 0
|
||
|
# RO: tigertail_v1.1.6749-74d1a312e
|
||
|
# RW: tigertail_v1.1.6749-74d1a312e
|
||
|
# Build: tigertail_v1.1.6749-74d1a312e
|
||
|
# 2017-07-25 20:08:34 nsanders@meatball.mtv.corp.google.com
|
||
|
|
||
|
"""
|
||
|
cmd = '\r\nversion\r\n'
|
||
|
regex = 'RO:\s+(\S+)\s+RW:\s+(\S+)\s+Build:\s+(\S+)\s+' \
|
||
|
'(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d) (\S+)'
|
||
|
|
||
|
results = pty._issue_cmd_get_results(cmd, [regex])[0]
|
||
|
c.log('Version is %s' % results[3])
|
||
|
c.log('RO: %s' % results[1])
|
||
|
c.log('RW: %s' % results[2])
|
||
|
c.log('Date: %s' % results[4])
|
||
|
c.log('Src: %s' % results[5])
|
||
|
|
||
|
return True
|
||
|
|
||
|
def do_check_serial(pty):
|
||
|
"""Check serial via ec console 'pty'.
|
||
|
|
||
|
Args:
|
||
|
pty: a pty object connected to tigertail
|
||
|
|
||
|
Commands are:
|
||
|
# > serialno
|
||
|
# Serial number: number
|
||
|
"""
|
||
|
cmd = '\r\nserialno\r\n'
|
||
|
regex = 'Serial number: ([^\n\r]+)'
|
||
|
|
||
|
results = pty._issue_cmd_get_results(cmd, [regex])[0]
|
||
|
c.log('Serial is %s' % results[1])
|
||
|
|
||
|
return True
|
||
|
|
||
|
|
||
|
def do_power(count, bus, pty):
|
||
|
"""Check power usage via ec console 'pty'.
|
||
|
|
||
|
Args:
|
||
|
count: number of samples to capture
|
||
|
bus: rail to monitor, 'vbus', 'cc1', or 'cc2'
|
||
|
pty: a pty object connected to tigertail
|
||
|
|
||
|
Commands are:
|
||
|
# > ina 0
|
||
|
# Configuration: 4127
|
||
|
# Shunt voltage: 02c4 => 1770 uV
|
||
|
# Bus voltage : 1008 => 5130 mV
|
||
|
# Power : 0019 => 625 mW
|
||
|
# Current : 0082 => 130 mA
|
||
|
# Calibration : 0155
|
||
|
# Mask/Enable : 0008
|
||
|
# Alert limit : 0000
|
||
|
"""
|
||
|
if bus == 'vbus':
|
||
|
ina = 0
|
||
|
if bus == 'cc1':
|
||
|
ina = 4
|
||
|
if bus == 'cc2':
|
||
|
ina = 1
|
||
|
|
||
|
start = time.time()
|
||
|
|
||
|
c.log('time,\tmV,\tmW,\tmA')
|
||
|
|
||
|
cmd = '\r\nina %s\r\n' % ina
|
||
|
regex = 'Bus voltage : \S+ \S+ (\d+) mV\s+' \
|
||
|
'Power : \S+ \S+ (\d+) mW\s+' \
|
||
|
'Current : \S+ \S+ (\d+) mA'
|
||
|
|
||
|
for i in xrange(0, count):
|
||
|
results = pty._issue_cmd_get_results(cmd, [regex])[0]
|
||
|
c.log('%.2f,\t%s,\t%s\t%s' % (time.time() - start,
|
||
|
results[1], results[2], results[3]))
|
||
|
|
||
|
return True
|
||
|
|
||
|
def do_reboot(pty):
|
||
|
"""Reboot via ec console pty
|
||
|
|
||
|
Args:
|
||
|
pty: a pty object connected to tigertail
|
||
|
|
||
|
Command is: reboot.
|
||
|
"""
|
||
|
cmd = '\r\nreboot\r\n'
|
||
|
regex = 'Rebooting'
|
||
|
|
||
|
try:
|
||
|
results = pty._issue_cmd_get_results(cmd, [regex])[0]
|
||
|
time.sleep(1)
|
||
|
c.log(results)
|
||
|
except Exception as e:
|
||
|
c.log(e)
|
||
|
return False
|
||
|
|
||
|
return True
|
||
|
|
||
|
def do_sysjump(region, pty):
|
||
|
"""Set region via ec console 'pty'.
|
||
|
|
||
|
Args:
|
||
|
region: ec code region to execute, 'ro' or 'rw'
|
||
|
pty: a pty object connected to tigertail
|
||
|
|
||
|
Commands are:
|
||
|
# > sysjump rw
|
||
|
"""
|
||
|
validregion = ['ro', 'rw']
|
||
|
if region not in validregion:
|
||
|
c.log('Region setting %s invalid, try one of %s' % (
|
||
|
region, validregion))
|
||
|
return False
|
||
|
|
||
|
cmd = '\r\nsysjump %s\r\n' % region
|
||
|
try:
|
||
|
pty._issue_cmd(cmd)
|
||
|
time.sleep(1)
|
||
|
except Exception as e:
|
||
|
c.log(e)
|
||
|
return False
|
||
|
|
||
|
c.log('Region requested %s' % region)
|
||
|
return True
|
||
|
|
||
|
def get_parser():
|
||
|
parser = argparse.ArgumentParser(
|
||
|
description=__doc__)
|
||
|
parser.add_argument('-s', '--serialno', type=str, default=None,
|
||
|
help='serial number of board to use')
|
||
|
parser.add_argument('-b', '--bus', type=str, default='vbus',
|
||
|
help='Which rail to log: [vbus|cc1|cc2]')
|
||
|
group = parser.add_mutually_exclusive_group()
|
||
|
group.add_argument('--setserialno', type=str, default=None,
|
||
|
help='serial number to set on the board.')
|
||
|
group.add_argument('--check_serial', action='store_true',
|
||
|
help='check serial number set on the board.')
|
||
|
group.add_argument('-m', '--mux', type=str, default=None,
|
||
|
help='mux selection')
|
||
|
group.add_argument('-p', '--power', action='store_true',
|
||
|
help='check VBUS')
|
||
|
group.add_argument('-l', '--powerlog', type=int, default=None,
|
||
|
help='log VBUS')
|
||
|
group.add_argument('-r', '--sysjump', type=str, default=None,
|
||
|
help='region selection')
|
||
|
group.add_argument('--reboot', action='store_true',
|
||
|
help='reboot tigertail')
|
||
|
group.add_argument('--check_version', action='store_true',
|
||
|
help='check tigertail version')
|
||
|
return parser
|
||
|
|
||
|
def main(argv):
|
||
|
parser = get_parser()
|
||
|
opts = parser.parse_args(argv)
|
||
|
|
||
|
result = True
|
||
|
|
||
|
# Let's make sure there's a tigertail
|
||
|
# If nothing found in 5 seconds, fail.
|
||
|
c.wait_for_usb(STM_VIDPID, timeout=5., serialname=opts.serialno)
|
||
|
|
||
|
pty = c.setup_tinyservod(STM_VIDPID, 0, serialname=opts.serialno)
|
||
|
|
||
|
if opts.bus not in ('vbus', 'cc1', 'cc2'):
|
||
|
c.log('Try --bus [vbus|cc1|cc2]')
|
||
|
result = False
|
||
|
|
||
|
elif opts.setserialno:
|
||
|
try:
|
||
|
c.do_serialno(opts.setserialno, pty)
|
||
|
except Exception:
|
||
|
result = False
|
||
|
|
||
|
elif opts.mux:
|
||
|
result &= do_mux(opts.mux, pty)
|
||
|
|
||
|
elif opts.sysjump:
|
||
|
result &= do_sysjump(opts.sysjump, pty)
|
||
|
|
||
|
elif opts.reboot:
|
||
|
result &= do_reboot(pty)
|
||
|
|
||
|
elif opts.check_version:
|
||
|
result &= do_version(pty)
|
||
|
|
||
|
elif opts.check_serial:
|
||
|
result &= do_check_serial(pty)
|
||
|
|
||
|
elif opts.power:
|
||
|
result &= do_power(1, opts.bus, pty)
|
||
|
|
||
|
elif opts.powerlog:
|
||
|
result &= do_power(opts.powerlog, opts.bus, pty)
|
||
|
|
||
|
if result:
|
||
|
c.log('PASS')
|
||
|
else:
|
||
|
c.log('FAIL')
|
||
|
exit(-1)
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
sys.exit(main(sys.argv[1:]))
|