diff --git a/README.md b/README.md index bc30f04bb8..387cb4a2e6 100644 --- a/README.md +++ b/README.md @@ -20,26 +20,27 @@ Documentation * [mbed library internals](http://mbed.org/handbook/mbed-library-internals) * [Adding a new target microcontroller](http://mbed.org/handbook/mbed-SDK-porting) -Supported Microcontrollers --------------------------- +Supported Microcontrollers and Boards +------------------------------------- NXP: -* [LPC1768](http://mbed.org/platforms/mbed-LPC1768/) (Cortex-M3) -* [LPC1768](http://mbed.org/platforms/u-blox-C027/) (Cortex-M3) -* [LPC11U24](http://mbed.org/platforms/mbed-LPC11U24/) (Cortex-M0) -* [LPC11U35](http://mbed.org/platforms/EA-LPC11U35/) (Cortex-M0) -* LPC2368 (ARM7TDMI-S) +* [mbed LPC1768](http://mbed.org/platforms/mbed-LPC1768/) (Cortex-M3) +* [u-blox C027 LPC1768](http://mbed.org/platforms/u-blox-C027/) (Cortex-M3) +* [mbed LPC11U24](http://mbed.org/platforms/mbed-LPC11U24/) (Cortex-M0) +* [EA LPC11U35](http://mbed.org/platforms/EA-LPC11U35/) (Cortex-M0) +* mbed LPC2368 (ARM7TDMI-S) * LPC810 (Cortex-M0+) * [LPC812](http://mbed.org/platforms/NXP-LPC800-MAX/) (Cortex-M0+) -* [LPC4088](http://mbed.org/platforms/EA-LPC4088/) (Cortex-M4) +* [EA LPC4088](http://mbed.org/platforms/EA-LPC4088/) (Cortex-M4) * LPC4330 (Cortex-M4 + Cortex-M0) * [LPC1347](http://mbed.org/platforms/DipCortex-M3/) (Cortex-M3) * [LPC1114](http://mbed.org/platforms/LPC1114FN28/) (Cortex-M0) * LPC11C24 (Cortex-M0) +* [LPC1549](https://mbed.org/platforms/LPCXpresso1549/) (Cortex-M3) Freescale: -* KL05Z (Cortex-M0+) -* [KL25Z](http://mbed.org/platforms/KL25Z/) (Cortex-M0+) -* [KL46Z](https://mbed.org/platforms/FRDM-KL46Z/) (Cortex-M0+) +* [FRDM-KL05Z](https://mbed.org/platforms/FRDM-KL05Z/) (Cortex-M0+) +* [FRDM-KL25Z](http://mbed.org/platforms/KL25Z/) (Cortex-M0+) +* [FRDM-KL46Z](https://mbed.org/platforms/FRDM-KL46Z/) (Cortex-M0+) STMicroelectronics: * [Nucleo-F103RB](https://mbed.org/platforms/ST-Nucleo-F103RB/) (Cortex-M3) @@ -48,6 +49,9 @@ STMicroelectronics: * [Nucleo-F401RE](https://mbed.org/platforms/ST-Nucleo-F401RE/) (Cortex-M4) * STM32F407 (Cortex-M4) +Nordic: +* [nRF51822-mKIT](https://mbed.org/platforms/Nordic-nRF51822/) (Cortex-M0) + Supported Toolchains and IDEs ----------------------------- * GCC ARM: [GNU Tools for ARM Embedded Processors](https://launchpad.net/gcc-arm-embedded/4.7/4.7-2012-q4-major) diff --git a/libraries/USBDevice/USBDevice/USBEndpoints.h b/libraries/USBDevice/USBDevice/USBEndpoints.h index 1c3409bd14..e36fc05a64 100644 --- a/libraries/USBDevice/USBDevice/USBEndpoints.h +++ b/libraries/USBDevice/USBDevice/USBEndpoints.h @@ -41,7 +41,7 @@ typedef enum { #include "USBEndpoints_LPC17_LPC23.h" #elif defined(TARGET_LPC11UXX) || defined(TARGET_LPC1347) #include "USBEndpoints_LPC11U.h" -#elif defined(TARGET_KL25Z) +#elif defined(TARGET_KL25Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D5M) #include "USBEndpoints_KL25Z.h" #elif defined (TARGET_STM32F4XX) #include "USBEndpoints_STM32F4.h" diff --git a/libraries/USBDevice/USBDevice/USBHAL_KL25Z.cpp b/libraries/USBDevice/USBDevice/USBHAL_KL25Z.cpp index 9afa2a980b..6a7a3bfb1d 100644 --- a/libraries/USBDevice/USBDevice/USBHAL_KL25Z.cpp +++ b/libraries/USBDevice/USBDevice/USBHAL_KL25Z.cpp @@ -16,7 +16,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#if defined(TARGET_KL25Z) +#if defined(TARGET_KL25Z) | defined(TARGET_KL46Z) | defined(TARGET_K20D5M) #include "USBHAL.h" @@ -59,7 +59,7 @@ typedef struct BDT { uint8_t dummy; // RSVD: BD[8:15] uint16_t byte_count; // BD[16:32] uint32_t address; // Addr -} BDT; +} BDT; // there are: @@ -82,10 +82,10 @@ uint32_t USBHAL::endpointReadcore(uint8_t endpoint, uint8_t *buffer) { return 0; } -USBHAL::USBHAL(void) { +USBHAL::USBHAL(void) { // Disable IRQ NVIC_DisableIRQ(USB0_IRQn); - + // fill in callback array epCallback[0] = &USBHAL::EP1_OUT_callback; epCallback[1] = &USBHAL::EP1_IN_callback; @@ -117,11 +117,11 @@ USBHAL::USBHAL(void) { epCallback[27] = &USBHAL::EP14_IN_callback; epCallback[28] = &USBHAL::EP15_OUT_callback; epCallback[29] = &USBHAL::EP15_IN_callback; - - + + // choose usb src as PLL SIM->SOPT2 |= (SIM_SOPT2_USBSRC_MASK | SIM_SOPT2_PLLFLLSEL_MASK); - + // enable OTG clock SIM->SCGC4 |= SIM_SCGC4_USBOTG_MASK; @@ -129,12 +129,12 @@ USBHAL::USBHAL(void) { instance = this; NVIC_SetVector(USB0_IRQn, (uint32_t)&_usbisr); NVIC_EnableIRQ(USB0_IRQn); - + // USB Module Configuration // Reset USB Module USB0->USBTRC0 |= USB_USBTRC0_USBRESET_MASK; while(USB0->USBTRC0 & USB_USBTRC0_USBRESET_MASK); - + // Set BDT Base Register USB0->BDTPAGE1=(uint8_t)((uint32_t)bdt>>8); USB0->BDTPAGE2=(uint8_t)((uint32_t)bdt>>16); @@ -144,14 +144,14 @@ USBHAL::USBHAL(void) { USB0->ISTAT = 0xff; // USB Interrupt Enablers - USB0->INTEN |= USB_INTEN_TOKDNEEN_MASK | - USB_INTEN_SOFTOKEN_MASK | + USB0->INTEN |= USB_INTEN_TOKDNEEN_MASK | + USB_INTEN_SOFTOKEN_MASK | USB_INTEN_ERROREN_MASK | USB_INTEN_USBRSTEN_MASK; - - // Disable weak pull downs - USB0->USBCTRL &= ~(USB_USBCTRL_PDE_MASK | USB_USBCTRL_SUSP_MASK); - + + // Disable weak pull downs + USB0->USBCTRL &= ~(USB_USBCTRL_PDE_MASK | USB_USBCTRL_SUSP_MASK); + USB0->USBTRC0 |= 0x40; } @@ -296,9 +296,9 @@ EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_ uint32_t n, sz, idx, setup = 0; uint8_t not_iso; uint8_t * ep_buf; - + uint32_t log_endpoint = PHY_TO_LOG(endpoint); - + if (endpoint > NUMBER_OF_PHYSICAL_ENDPOINTS - 1) { return EP_INVALID; } @@ -335,7 +335,7 @@ EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_ if (((Data1 >> endpoint) & 1) == ((bdt[idx].info >> 6) & 1)) { if (setup && (buffer[6] == 0)) // if no setup data stage, Data1 &= ~1UL; // set DATA0 - else + else Data1 ^= (1 << endpoint); } @@ -345,7 +345,7 @@ EP_STATUS USBHAL::endpointReadResult(uint8_t endpoint, uint8_t * buffer, uint32_ else { bdt[idx].info = BD_DTS_MASK | BD_OWN_MASK; } - + USB0->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK; *bytesRead = sz; @@ -368,27 +368,27 @@ EP_STATUS USBHAL::endpointWrite(uint8_t endpoint, uint8_t *data, uint32_t size) idx = EP_BDT_IDX(PHY_TO_LOG(endpoint), TX, 0); bdt[idx].byte_count = size; - - + + // non iso endpoint if (USB0->ENDPOINT[PHY_TO_LOG(endpoint)].ENDPT & USB_ENDPT_EPHSHK_MASK) { ep_buf = endpoint_buffer[idx]; } else { ep_buf = endpoint_buffer_iso[2]; } - + for (n = 0; n < size; n++) { ep_buf[n] = data[n]; } - + if ((Data1 >> endpoint) & 1) { bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK; } else { bdt[idx].info = BD_OWN_MASK | BD_DTS_MASK | BD_DATA01_MASK; } - + Data1 ^= (1 << endpoint); - + return EP_PENDING; } @@ -429,7 +429,7 @@ void USBHAL::usbisr(void) { uint8_t istat = USB0->ISTAT; // reset interrupt - if (istat & USB_ISTAT_USBRST_MASK) { + if (istat & USB_ISTAT_USBRST_MASK) { // disable all endpt for(i = 0; i < 16; i++) { USB0->ENDPOINT[i].ENDPT = 0x00; @@ -457,11 +457,11 @@ void USBHAL::usbisr(void) { // SOF interrupt if (istat & USB_ISTAT_SOFTOK_MASK) { - USB0->ISTAT = USB_ISTAT_SOFTOK_MASK; + USB0->ISTAT = USB_ISTAT_SOFTOK_MASK; // SOF event, read frame number SOF(frameNumber()); } - + // stall interrupt if (istat & 1<<7) { if (USB0->ENDPOINT[0].ENDPT & USB_ENDPT_EPSTALL_MASK) @@ -483,7 +483,7 @@ void USBHAL::usbisr(void) { // EP0 SETUP event (SETUP data received) EP0setupCallback(); - + } else { // OUT packet if (TOK_PID((EP_BDT_IDX(num, dir, ev_odd))) == OUT_TOKEN) { @@ -517,11 +517,11 @@ void USBHAL::usbisr(void) { USB0->ISTAT = USB_ISTAT_TOKDNE_MASK; } - + // sleep interrupt if (istat & 1<<4) { USB0->ISTAT |= USB_ISTAT_SLEEP_MASK; - } + } // error interrupt if (istat & USB_ISTAT_ERROR_MASK) { diff --git a/workspace_tools/singletest.py b/workspace_tools/singletest.py index 562ea499c0..f20399ba75 100644 --- a/workspace_tools/singletest.py +++ b/workspace_tools/singletest.py @@ -41,6 +41,8 @@ Usage: import sys import json +import optparse +import pprint from prettytable import PrettyTable from serial import Serial @@ -51,6 +53,7 @@ from time import sleep, time ROOT = abspath(join(dirname(__file__), "..")) sys.path.insert(0, ROOT) +# Imports related to mbed build pi from workspace_tools.build_api import build_project, build_mbed_libs from workspace_tools.paths import BUILD_DIR from workspace_tools.targets import TARGET_MAP @@ -60,6 +63,7 @@ from workspace_tools.tests import TEST_MAP ROOT = abspath(join(dirname(__file__), "..")) sys.path.insert(0, ROOT) +# Imports related to mbed build pi from workspace_tools.utils import delete_dir_files from workspace_tools.settings import MUTs @@ -77,7 +81,9 @@ class SingleTestRunner(): """ if sleep_before_reset > 0: sleep(sleep_before_reset) - verbose_msg = "Reset::cmd(sendBreak)" + if verbose: + verbose_msg = "Reset::cmd(sendBreak)" + # Reset type decision if mcu_name.startswith('NRF51822'): # Nordic call(["nrfjprog", "-r"]) verbose_msg = "Reset::cmd(nrfjprog)" @@ -86,6 +92,7 @@ class SingleTestRunner(): verbose_msg = "Reset::cmd(ST-LINK_CLI.exe)" else: serial.sendBreak() + if sleep_before_reset > 0: sleep(sleep_after_reset) if verbose: @@ -97,6 +104,7 @@ class SingleTestRunner(): serial.flushOutput() def is_peripherals_available(self, target, peripherals=None): + """ Checks if specified target should run specific peripheral test case.""" if peripherals is not None: peripherals = set(peripherals) @@ -114,7 +122,7 @@ class SingleTestRunner(): return False def run_host_test(self, name, target_name, disk, port, - duration, extra_serial, verbose=True): + duration, extra_serial, verbose=False): """ Functions resets target and grabs by timeouted pooling test log via serial port. @@ -151,10 +159,14 @@ class SingleTestRunner(): # Parse test 'output' data result = "UNDEF" for line in output.splitlines(): - if '{success}' in line: result = "OK" - if '{failure}' in line: result = "FAIL" - if '{error}' in line: result = "ERROR" - if '{end}' in line: break + if '{success}' in line: + result = "OK" + if '{failure}' in line: + result = "FAIL" + if '{error}' in line: + result = "ERROR" + if '{end}' in line: + break return result def print_test_result(self, test_result, target_name, toolchain_name, @@ -246,25 +258,54 @@ def shape_test_request(mcu, image_path, test_id, duration=10): if __name__ == '__main__': - start = time() - single_test = SingleTestRunner() + # Command line options + parser = optparse.OptionParser() + parser.add_option('-i', '--tests', + dest='test_spec_filename', + metavar="FILE", + help='Points to file with test specification') + + parser.add_option('-s', '--suppress-summary', + dest='suppress_summary', + default=False, + action="store_true", + help='Suppresses display of wellformatted table with test results') + + parser.add_option('-v', '--verbose', + dest='verbose', + default=False, + action="store_true", + help='Verbose mode (pronts some extra information)') + + parser.epilog="Example: singletest.py -i test_spec.json" + (opts, args) = parser.parse_args() # Below list tells script which targets and their toolchain(s) # should be covered by the test scenario - test_spec = { - "targets": { - # "KL25Z": ["ARM", "GCC_ARM"], - # "LPC1768": ["ARM", "GCC_ARM", "GCC_CR", "GCC_CS", "IAR"], - # "LPC11U24": ["uARM"] - # "UBLOX_C027": ["IAR"] - # "NRF51822": ["ARM"] - # "NUCLEO_F103RB": ["ARM"], - # "LPC2368": ["ARM"], - # "LPC812": ["uARM"], - # "LPC1549": ["uARM"] - "LPC4088": ["ARM"] # , "GCC_CR", "GCC_ARM" - } - } + test_spec = None + + # Open file with test specification + if opts.test_spec_filename: + try: + with open(opts.test_spec_filename) as data_file: + try: + test_spec = json.load(data_file) + except ValueError as json_error_msg: + test_spec = None + print "Error: %s" % (json_error_msg) + except IOError as fileopen_error_msg: + print "Error: %s" % (fileopen_error_msg) + if opts.verbose and test_spec: + pp = pprint.PrettyPrinter(indent=4) + pp.pprint(test_spec) + + if test_spec is None: + parser.print_help() + exit(-1) + + # Magic happens here... ;) + start = time() + single_test = SingleTestRunner() clean = test_spec.get('clean', False) test_ids = test_spec.get('test_ids', []) @@ -287,7 +328,8 @@ if __name__ == '__main__': if test.automated and test.is_supported(target, toolchain): if not single_test.is_peripherals_available(target, test.peripherals): - print "TargetTest::%s::TestSkipped(%s)" % (target, ",".join(test.peripherals)) + if opts.verbose: + print "TargetTest::%s::TestSkipped(%s)" % (target, ",".join(test.peripherals)) continue test_result = { @@ -296,7 +338,7 @@ if __name__ == '__main__': 'test_id': test_id, } - path = build_project(test.source_dir, join(build_dir, test_id), T, toolchain, test.dependencies, clean=clean, verbose=False) + path = build_project(test.source_dir, join(build_dir, test_id), T, toolchain, test.dependencies, clean=clean, verbose=opts.verbose) if target.startswith('NRF51822'): # Nordic: #Convert bin to Hex and Program nrf chip via jlink @@ -314,19 +356,21 @@ if __name__ == '__main__': elapsed_time = time() - start - print - print "Test summary:" - # Pretty table package is used to print results - pt = PrettyTable(["Result", "Target", "Toolchain", "Test ID", "Test Description", - "Elapsed Time (sec)", "Timeout (sec)"]) - pt.align["Result"] = "l" # Left align - pt.align["Target"] = "l" # Left align - pt.align["Toolchain"] = "l" # Left align - pt.align["Test ID"] = "l" # Left align - pt.align["Test Description"] = "l" # Left align - pt.padding_width = 1 # One space between column edges and contents (default) + # Human readable summary + if not opts.suppress_summary: + print + print "Test summary:" + # Pretty table package is used to print results + pt = PrettyTable(["Result", "Target", "Toolchain", "Test ID", "Test Description", + "Elapsed Time (sec)", "Timeout (sec)"]) + pt.align["Result"] = "l" # Left align + pt.align["Target"] = "l" # Left align + pt.align["Toolchain"] = "l" # Left align + pt.align["Test ID"] = "l" # Left align + pt.align["Test Description"] = "l" # Left align + pt.padding_width = 1 # One space between column edges and contents (default) - for test in test_summary: - pt.add_row(test) - print pt + for test in test_summary: + pt.add_row(test) + print pt print "Completed in %d sec" % (time() - start)