Brian Daniels / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
screamer
Date:
Wed Mar 30 19:28:05 2016 +0100
Revision:
2:5f044fef8f98
Parent:
0:4a2e5f0422d6
Child:
12:66348abb837e
Adjust all paths in python to reflect the mbed OS structure

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:4a2e5f0422d6 1 #! /usr/bin/env python2
screamer 0:4a2e5f0422d6 2 """
screamer 0:4a2e5f0422d6 3 mbed SDK
screamer 0:4a2e5f0422d6 4 Copyright (c) 2011-2013 ARM Limited
screamer 0:4a2e5f0422d6 5
screamer 0:4a2e5f0422d6 6 Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:4a2e5f0422d6 7 you may not use this file except in compliance with the License.
screamer 0:4a2e5f0422d6 8 You may obtain a copy of the License at
screamer 0:4a2e5f0422d6 9
screamer 0:4a2e5f0422d6 10 http://www.apache.org/licenses/LICENSE-2.0
screamer 0:4a2e5f0422d6 11
screamer 0:4a2e5f0422d6 12 Unless required by applicable law or agreed to in writing, software
screamer 0:4a2e5f0422d6 13 distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:4a2e5f0422d6 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:4a2e5f0422d6 15 See the License for the specific language governing permissions and
screamer 0:4a2e5f0422d6 16 limitations under the License.
screamer 0:4a2e5f0422d6 17
screamer 0:4a2e5f0422d6 18
screamer 0:4a2e5f0422d6 19 TEST BUILD & RUN
screamer 0:4a2e5f0422d6 20 """
screamer 0:4a2e5f0422d6 21 import sys
screamer 0:4a2e5f0422d6 22 from time import sleep
screamer 0:4a2e5f0422d6 23 from shutil import copy
screamer 0:4a2e5f0422d6 24 from os.path import join, abspath, dirname
screamer 0:4a2e5f0422d6 25
screamer 0:4a2e5f0422d6 26 # Be sure that the tools directory is in the search path
screamer 0:4a2e5f0422d6 27 ROOT = abspath(join(dirname(__file__), ".."))
screamer 0:4a2e5f0422d6 28 sys.path.insert(0, ROOT)
screamer 0:4a2e5f0422d6 29
screamer 2:5f044fef8f98 30 from tools.utils import args_error
screamer 2:5f044fef8f98 31 from tools.paths import BUILD_DIR
screamer 2:5f044fef8f98 32 from tools.paths import RTOS_LIBRARIES
screamer 2:5f044fef8f98 33 from tools.paths import RPC_LIBRARY
screamer 2:5f044fef8f98 34 from tools.paths import ETH_LIBRARY
screamer 2:5f044fef8f98 35 from tools.paths import USB_HOST_LIBRARIES, USB_LIBRARIES
screamer 2:5f044fef8f98 36 from tools.paths import DSP_LIBRARIES
screamer 2:5f044fef8f98 37 from tools.paths import FS_LIBRARY
screamer 2:5f044fef8f98 38 from tools.paths import UBLOX_LIBRARY
screamer 2:5f044fef8f98 39 from tools.tests import TESTS, Test, TEST_MAP
screamer 2:5f044fef8f98 40 from tools.tests import TEST_MBED_LIB
screamer 2:5f044fef8f98 41 from tools.targets import TARGET_MAP
screamer 2:5f044fef8f98 42 from tools.options import get_default_options_parser
screamer 2:5f044fef8f98 43 from tools.build_api import build_project
screamer 0:4a2e5f0422d6 44 try:
screamer 2:5f044fef8f98 45 import tools.private_settings as ps
screamer 0:4a2e5f0422d6 46 except:
screamer 0:4a2e5f0422d6 47 ps = object()
screamer 0:4a2e5f0422d6 48
screamer 0:4a2e5f0422d6 49
screamer 0:4a2e5f0422d6 50 if __name__ == '__main__':
screamer 0:4a2e5f0422d6 51 # Parse Options
screamer 0:4a2e5f0422d6 52 parser = get_default_options_parser()
screamer 0:4a2e5f0422d6 53 parser.add_option("-p",
screamer 0:4a2e5f0422d6 54 type="int",
screamer 0:4a2e5f0422d6 55 dest="program",
screamer 0:4a2e5f0422d6 56 help="The index of the desired test program: [0-%d]" % (len(TESTS)-1))
screamer 0:4a2e5f0422d6 57
screamer 0:4a2e5f0422d6 58 parser.add_option("-n",
screamer 0:4a2e5f0422d6 59 dest="program_name",
screamer 0:4a2e5f0422d6 60 help="The name of the desired test program")
screamer 0:4a2e5f0422d6 61
screamer 0:4a2e5f0422d6 62 parser.add_option("-j", "--jobs",
screamer 0:4a2e5f0422d6 63 type="int",
screamer 0:4a2e5f0422d6 64 dest="jobs",
screamer 0:4a2e5f0422d6 65 default=1,
screamer 0:4a2e5f0422d6 66 help="Number of concurrent jobs (default 1). Use 0 for auto based on host machine's number of CPUs")
screamer 0:4a2e5f0422d6 67
screamer 0:4a2e5f0422d6 68 parser.add_option("-v", "--verbose",
screamer 0:4a2e5f0422d6 69 action="store_true",
screamer 0:4a2e5f0422d6 70 dest="verbose",
screamer 0:4a2e5f0422d6 71 default=False,
screamer 0:4a2e5f0422d6 72 help="Verbose diagnostic output")
screamer 0:4a2e5f0422d6 73
screamer 0:4a2e5f0422d6 74 parser.add_option("--silent",
screamer 0:4a2e5f0422d6 75 action="store_true",
screamer 0:4a2e5f0422d6 76 dest="silent",
screamer 0:4a2e5f0422d6 77 default=False,
screamer 0:4a2e5f0422d6 78 help="Silent diagnostic output (no copy, compile notification)")
screamer 0:4a2e5f0422d6 79
screamer 0:4a2e5f0422d6 80 parser.add_option("-D", "",
screamer 0:4a2e5f0422d6 81 action="append",
screamer 0:4a2e5f0422d6 82 dest="macros",
screamer 0:4a2e5f0422d6 83 help="Add a macro definition")
screamer 0:4a2e5f0422d6 84
screamer 0:4a2e5f0422d6 85 # Local run
screamer 0:4a2e5f0422d6 86 parser.add_option("--automated", action="store_true", dest="automated",
screamer 0:4a2e5f0422d6 87 default=False, help="Automated test")
screamer 0:4a2e5f0422d6 88 parser.add_option("--host", dest="host_test",
screamer 0:4a2e5f0422d6 89 default=None, help="Host test")
screamer 0:4a2e5f0422d6 90 parser.add_option("--extra", dest="extra",
screamer 0:4a2e5f0422d6 91 default=None, help="Extra files")
screamer 0:4a2e5f0422d6 92 parser.add_option("--peripherals", dest="peripherals",
screamer 0:4a2e5f0422d6 93 default=None, help="Required peripherals")
screamer 0:4a2e5f0422d6 94 parser.add_option("--dep", dest="dependencies",
screamer 0:4a2e5f0422d6 95 default=None, help="Dependencies")
screamer 0:4a2e5f0422d6 96 parser.add_option("--source", dest="source_dir",
screamer 0:4a2e5f0422d6 97 default=None, help="The source (input) directory")
screamer 0:4a2e5f0422d6 98 parser.add_option("--duration", type="int", dest="duration",
screamer 0:4a2e5f0422d6 99 default=None, help="Duration of the test")
screamer 0:4a2e5f0422d6 100 parser.add_option("--build", dest="build_dir",
screamer 0:4a2e5f0422d6 101 default=None, help="The build (output) directory")
screamer 0:4a2e5f0422d6 102 parser.add_option("-d", "--disk", dest="disk",
screamer 0:4a2e5f0422d6 103 default=None, help="The mbed disk")
screamer 0:4a2e5f0422d6 104 parser.add_option("-s", "--serial", dest="serial",
screamer 0:4a2e5f0422d6 105 default=None, help="The mbed serial port")
screamer 0:4a2e5f0422d6 106 parser.add_option("-b", "--baud", type="int", dest="baud",
screamer 0:4a2e5f0422d6 107 default=None, help="The mbed serial baud rate")
screamer 0:4a2e5f0422d6 108 parser.add_option("-L", "--list-tests", action="store_true", dest="list_tests",
screamer 0:4a2e5f0422d6 109 default=False, help="List available tests in order and exit")
screamer 0:4a2e5f0422d6 110
screamer 0:4a2e5f0422d6 111 # Ideally, all the tests with a single "main" thread can be run with, or
screamer 0:4a2e5f0422d6 112 # without the rtos, eth, usb_host, usb, dsp, fat, ublox
screamer 0:4a2e5f0422d6 113 parser.add_option("--rtos",
screamer 0:4a2e5f0422d6 114 action="store_true", dest="rtos",
screamer 0:4a2e5f0422d6 115 default=False, help="Link with RTOS library")
screamer 0:4a2e5f0422d6 116
screamer 0:4a2e5f0422d6 117 parser.add_option("--rpc",
screamer 0:4a2e5f0422d6 118 action="store_true", dest="rpc",
screamer 0:4a2e5f0422d6 119 default=False, help="Link with RPC library")
screamer 0:4a2e5f0422d6 120
screamer 0:4a2e5f0422d6 121 parser.add_option("--eth",
screamer 0:4a2e5f0422d6 122 action="store_true", dest="eth",
screamer 0:4a2e5f0422d6 123 default=False,
screamer 0:4a2e5f0422d6 124 help="Link with Ethernet library")
screamer 0:4a2e5f0422d6 125
screamer 0:4a2e5f0422d6 126 parser.add_option("--usb_host",
screamer 0:4a2e5f0422d6 127 action="store_true",
screamer 0:4a2e5f0422d6 128 dest="usb_host",
screamer 0:4a2e5f0422d6 129 default=False,
screamer 0:4a2e5f0422d6 130 help="Link with USB Host library")
screamer 0:4a2e5f0422d6 131
screamer 0:4a2e5f0422d6 132 parser.add_option("--usb",
screamer 0:4a2e5f0422d6 133 action="store_true",
screamer 0:4a2e5f0422d6 134 dest="usb",
screamer 0:4a2e5f0422d6 135 default=False,
screamer 0:4a2e5f0422d6 136 help="Link with USB Device library")
screamer 0:4a2e5f0422d6 137
screamer 0:4a2e5f0422d6 138 parser.add_option("--dsp",
screamer 0:4a2e5f0422d6 139 action="store_true",
screamer 0:4a2e5f0422d6 140 dest="dsp",
screamer 0:4a2e5f0422d6 141 default=False,
screamer 0:4a2e5f0422d6 142 help="Link with DSP library")
screamer 0:4a2e5f0422d6 143
screamer 0:4a2e5f0422d6 144 parser.add_option("--fat",
screamer 0:4a2e5f0422d6 145 action="store_true",
screamer 0:4a2e5f0422d6 146 dest="fat",
screamer 0:4a2e5f0422d6 147 default=False,
screamer 0:4a2e5f0422d6 148 help="Link with FS ad SD card file system library")
screamer 0:4a2e5f0422d6 149
screamer 0:4a2e5f0422d6 150 parser.add_option("--ublox",
screamer 0:4a2e5f0422d6 151 action="store_true",
screamer 0:4a2e5f0422d6 152 dest="ublox",
screamer 0:4a2e5f0422d6 153 default=False,
screamer 0:4a2e5f0422d6 154 help="Link with U-Blox library")
screamer 0:4a2e5f0422d6 155
screamer 0:4a2e5f0422d6 156 parser.add_option("--testlib",
screamer 0:4a2e5f0422d6 157 action="store_true",
screamer 0:4a2e5f0422d6 158 dest="testlib",
screamer 0:4a2e5f0422d6 159 default=False,
screamer 0:4a2e5f0422d6 160 help="Link with mbed test library")
screamer 0:4a2e5f0422d6 161
screamer 0:4a2e5f0422d6 162 # Specify a different linker script
screamer 0:4a2e5f0422d6 163 parser.add_option("-l", "--linker", dest="linker_script",
screamer 0:4a2e5f0422d6 164 default=None, help="use the specified linker script")
screamer 0:4a2e5f0422d6 165
screamer 0:4a2e5f0422d6 166 (options, args) = parser.parse_args()
screamer 0:4a2e5f0422d6 167
screamer 0:4a2e5f0422d6 168 # Print available tests in order and exit
screamer 0:4a2e5f0422d6 169 if options.list_tests is True:
screamer 0:4a2e5f0422d6 170 print '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:4a2e5f0422d6 171 sys.exit()
screamer 0:4a2e5f0422d6 172
screamer 0:4a2e5f0422d6 173 # force program to "0" if a source dir is specified
screamer 0:4a2e5f0422d6 174 if options.source_dir is not None:
screamer 0:4a2e5f0422d6 175 p = 0
screamer 0:4a2e5f0422d6 176 n = None
screamer 0:4a2e5f0422d6 177 else:
screamer 0:4a2e5f0422d6 178 # Program Number or name
screamer 0:4a2e5f0422d6 179 p, n = options.program, options.program_name
screamer 0:4a2e5f0422d6 180
screamer 0:4a2e5f0422d6 181 if n is not None and p is not None:
screamer 0:4a2e5f0422d6 182 args_error(parser, "[ERROR] specify either '-n' or '-p', not both")
screamer 0:4a2e5f0422d6 183 if n:
screamer 0:4a2e5f0422d6 184 # We will transform 'n' to list of 'p' (integers which are test numbers)
screamer 0:4a2e5f0422d6 185 nlist = n.split(',')
screamer 0:4a2e5f0422d6 186 for test_id in nlist:
screamer 0:4a2e5f0422d6 187 if test_id not in TEST_MAP.keys():
screamer 0:4a2e5f0422d6 188 args_error(parser, "[ERROR] Program with name '%s' not found"% test_id)
screamer 0:4a2e5f0422d6 189
screamer 0:4a2e5f0422d6 190 p = [TEST_MAP[n].n for n in nlist]
screamer 0:4a2e5f0422d6 191 elif p is None or (p < 0) or (p > (len(TESTS)-1)):
screamer 0:4a2e5f0422d6 192 message = "[ERROR] You have to specify one of the following tests:\n"
screamer 0:4a2e5f0422d6 193 message += '\n'.join(map(str, sorted(TEST_MAP.values())))
screamer 0:4a2e5f0422d6 194 args_error(parser, message)
screamer 0:4a2e5f0422d6 195
screamer 0:4a2e5f0422d6 196 # If 'p' was set via -n to list of numbers make this a single element integer list
screamer 0:4a2e5f0422d6 197 if type(p) != type([]):
screamer 0:4a2e5f0422d6 198 p = [p]
screamer 0:4a2e5f0422d6 199
screamer 0:4a2e5f0422d6 200 # Target
screamer 0:4a2e5f0422d6 201 if options.mcu is None :
screamer 0:4a2e5f0422d6 202 args_error(parser, "[ERROR] You should specify an MCU")
screamer 0:4a2e5f0422d6 203 mcu = options.mcu
screamer 0:4a2e5f0422d6 204
screamer 0:4a2e5f0422d6 205 # Toolchain
screamer 0:4a2e5f0422d6 206 if options.tool is None:
screamer 0:4a2e5f0422d6 207 args_error(parser, "[ERROR] You should specify a TOOLCHAIN")
screamer 0:4a2e5f0422d6 208 toolchain = options.tool
screamer 0:4a2e5f0422d6 209
screamer 0:4a2e5f0422d6 210 # Test
screamer 0:4a2e5f0422d6 211 for test_no in p:
screamer 0:4a2e5f0422d6 212 test = Test(test_no)
screamer 0:4a2e5f0422d6 213 if options.automated is not None: test.automated = options.automated
screamer 0:4a2e5f0422d6 214 if options.dependencies is not None: test.dependencies = options.dependencies
screamer 0:4a2e5f0422d6 215 if options.host_test is not None: test.host_test = options.host_test;
screamer 0:4a2e5f0422d6 216 if options.peripherals is not None: test.peripherals = options.peripherals;
screamer 0:4a2e5f0422d6 217 if options.duration is not None: test.duration = options.duration;
screamer 0:4a2e5f0422d6 218 if options.extra is not None: test.extra_files = options.extra
screamer 0:4a2e5f0422d6 219
screamer 0:4a2e5f0422d6 220 if not test.is_supported(mcu, toolchain):
screamer 0:4a2e5f0422d6 221 print 'The selected test is not supported on target %s with toolchain %s' % (mcu, toolchain)
screamer 0:4a2e5f0422d6 222 sys.exit()
screamer 0:4a2e5f0422d6 223
screamer 0:4a2e5f0422d6 224 # Linking with extra libraries
screamer 0:4a2e5f0422d6 225 if options.rtos: test.dependencies.append(RTOS_LIBRARIES)
screamer 0:4a2e5f0422d6 226 if options.rpc: test.dependencies.append(RPC_LIBRARY)
screamer 0:4a2e5f0422d6 227 if options.eth: test.dependencies.append(ETH_LIBRARY)
screamer 0:4a2e5f0422d6 228 if options.usb_host: test.dependencies.append(USB_HOST_LIBRARIES)
screamer 0:4a2e5f0422d6 229 if options.usb: test.dependencies.append(USB_LIBRARIES)
screamer 0:4a2e5f0422d6 230 if options.dsp: test.dependencies.append(DSP_LIBRARIES)
screamer 0:4a2e5f0422d6 231 if options.fat: test.dependencies.append(FS_LIBRARY)
screamer 0:4a2e5f0422d6 232 if options.ublox: test.dependencies.append(UBLOX_LIBRARY)
screamer 0:4a2e5f0422d6 233 if options.testlib: test.dependencies.append(TEST_MBED_LIB)
screamer 0:4a2e5f0422d6 234
screamer 0:4a2e5f0422d6 235 build_dir = join(BUILD_DIR, "test", mcu, toolchain, test.id)
screamer 0:4a2e5f0422d6 236 if options.source_dir is not None:
screamer 0:4a2e5f0422d6 237 test.source_dir = options.source_dir
screamer 0:4a2e5f0422d6 238 build_dir = options.source_dir
screamer 0:4a2e5f0422d6 239
screamer 0:4a2e5f0422d6 240 if options.build_dir is not None:
screamer 0:4a2e5f0422d6 241 build_dir = options.build_dir
screamer 0:4a2e5f0422d6 242
screamer 0:4a2e5f0422d6 243 target = TARGET_MAP[mcu]
screamer 0:4a2e5f0422d6 244 try:
screamer 0:4a2e5f0422d6 245 bin_file = build_project(test.source_dir, build_dir, target, toolchain, test.dependencies, options.options,
screamer 0:4a2e5f0422d6 246 linker_script=options.linker_script,
screamer 0:4a2e5f0422d6 247 clean=options.clean,
screamer 0:4a2e5f0422d6 248 verbose=options.verbose,
screamer 0:4a2e5f0422d6 249 silent=options.silent,
screamer 0:4a2e5f0422d6 250 macros=options.macros,
screamer 0:4a2e5f0422d6 251 jobs=options.jobs)
screamer 0:4a2e5f0422d6 252 print 'Image: %s'% bin_file
screamer 0:4a2e5f0422d6 253
screamer 0:4a2e5f0422d6 254 if options.disk:
screamer 0:4a2e5f0422d6 255 # Simple copy to the mbed disk
screamer 0:4a2e5f0422d6 256 copy(bin_file, options.disk)
screamer 0:4a2e5f0422d6 257
screamer 0:4a2e5f0422d6 258 if options.serial:
screamer 0:4a2e5f0422d6 259 # Import pyserial: https://pypi.python.org/pypi/pyserial
screamer 0:4a2e5f0422d6 260 from serial import Serial
screamer 0:4a2e5f0422d6 261
screamer 0:4a2e5f0422d6 262 sleep(target.program_cycle_s())
screamer 0:4a2e5f0422d6 263
screamer 0:4a2e5f0422d6 264 serial = Serial(options.serial, timeout = 1)
screamer 0:4a2e5f0422d6 265 if options.baud:
screamer 0:4a2e5f0422d6 266 serial.setBaudrate(options.baud)
screamer 0:4a2e5f0422d6 267
screamer 0:4a2e5f0422d6 268 serial.flushInput()
screamer 0:4a2e5f0422d6 269 serial.flushOutput()
screamer 0:4a2e5f0422d6 270
screamer 0:4a2e5f0422d6 271 try:
screamer 0:4a2e5f0422d6 272 serial.sendBreak()
screamer 0:4a2e5f0422d6 273 except:
screamer 0:4a2e5f0422d6 274 # In linux a termios.error is raised in sendBreak and in setBreak.
screamer 0:4a2e5f0422d6 275 # The following setBreak() is needed to release the reset signal on the target mcu.
screamer 0:4a2e5f0422d6 276 try:
screamer 0:4a2e5f0422d6 277 serial.setBreak(False)
screamer 0:4a2e5f0422d6 278 except:
screamer 0:4a2e5f0422d6 279 pass
screamer 0:4a2e5f0422d6 280
screamer 0:4a2e5f0422d6 281 while True:
screamer 0:4a2e5f0422d6 282 c = serial.read(512)
screamer 0:4a2e5f0422d6 283 sys.stdout.write(c)
screamer 0:4a2e5f0422d6 284 sys.stdout.flush()
screamer 0:4a2e5f0422d6 285
screamer 0:4a2e5f0422d6 286 except KeyboardInterrupt, e:
screamer 0:4a2e5f0422d6 287 print "\n[CTRL+c] exit"
screamer 0:4a2e5f0422d6 288 except Exception,e:
screamer 0:4a2e5f0422d6 289 if options.verbose:
screamer 0:4a2e5f0422d6 290 import traceback
screamer 0:4a2e5f0422d6 291 traceback.print_exc(file=sys.stdout)
screamer 0:4a2e5f0422d6 292 else:
screamer 0:4a2e5f0422d6 293 print "[ERROR] %s" % str(e)