diff --git a/libraries/tests/mbed/i2c_eeprom/main.cpp b/libraries/tests/mbed/i2c_eeprom/main.cpp new file mode 100644 index 0000000000..0f24e85950 --- /dev/null +++ b/libraries/tests/mbed/i2c_eeprom/main.cpp @@ -0,0 +1,125 @@ +#include "test_env.h" + +/****************************************************************************** +This will test an I2C EEPROM connected to mbed by writing a predefined byte at +address 0 and then reading it back and comparing it with the known byte value a +number of times. This test was written specifically for reproducing the bug +reported here: + +https://mbed.org/forum/bugs-suggestions/topic/4128/ + +Test configuration: + +* set 'ntests' to the number of iterations +* set 'i2c_speed_hz' to the desired speed of the I2C interface +* set 'i2c_delay_us' to the delay that will be inserted between 'write' and +'read' I2C operations (https://mbed.org/users/mbed_official/code/mbed/issues/1 +for more details). '0' disables the delay. +* define I2C_EEPROM_VERBOSE to get verbose output + +The test ran with a 24LC256 external EEPROM memory, but any I2C EEPROM memory +that uses two byte addresses should work. +******************************************************************************/ + +// Test configuration block +static const int ntests = 10000; +static const int i2c_freq_hz = 400000; +static const int i2c_delay_us = 0; +//#define I2C_EEPROM_VERBOSE +// End of test configuration block + +#if defined(TARGET_KL25Z) +I2C i2c(PTE0, PTE1); +#else +I2C i2c(p28, p27); +#endif + +#ifdef I2C_EEPROM_VERBOSE +#define dprintf printf +#else +int dprintf(const char* args, ...) { + return 0; +} +#endif + +class TestHelper { +public: + // Defaults to 'passed' + TestHelper() { + passed(); + } + + void passed() { + m_result = true; + } + + void failed() { + m_result = false; + } + + ~TestHelper() { + notify_completion(m_result); + } +private: + bool m_result; +}; + +int main() { + const int addr = 0xA0; + const char mark = 0x66; + char data[3]; + int fw = 0, fr = 0, fc = 0; + int i2c_stat; + TestHelper helper; + + i2c.frequency(i2c_freq_hz); + + // Data write + data[0] = data[1] = 0; + data[2] = mark; + if((i2c_stat = i2c.write(addr, data, 3)) != 0) { + dprintf("Unable to write data to EEPROM (i2c_stat = 0x%02X), aborting\r\n", i2c_stat); + helper.failed(); + return 1; + } + // ACK polling (assumes write will be successful eventually) + while(i2c.write(addr, data, 0) != 0); + + // Data read (actual test) + for(int i = 0; i < ntests; i ++) + { + data[0] = data[1] = 0; + if((i2c_stat = i2c.write(addr, data, 2, true)) != 0) + { + dprintf("Test %d failed at write, i2c_stat is 0x%02X\r\n", i, i2c_stat); + fw ++; + continue; + } + if(i2c_delay_us != 0) + wait_us(i2c_delay_us); + if((i2c_stat = i2c.read(addr, data, 1)) != 0) + { + dprintf("Test %d failed at read, i2c_stat is 0x%02X\r\n", i, i2c_stat); + fr ++; + continue; + } + if(data[0] != mark) + { + dprintf("Test %d failed at data match\r\n", i); + fc ++; + } + } + dprintf("Test finished.\r\n"); + if(fw + fr + fc == 0) + dprintf("No failures in %d tests.\r\n", ntests); + else + { + dprintf("Statistics:\r\n"); + dprintf(" Total tests: %d\r\n", ntests); + dprintf(" Failed at write: %d\r\n", fw); + dprintf(" Failed at read: %d\r\n", fr); + dprintf(" Data mismatch: %d\r\n", fc); + dprintf(" Total failures: %d\r\n", fw + fr + fc); + helper.failed(); + } +} diff --git a/workspace_tools/export/uvision4.py b/workspace_tools/export/uvision4.py index 2d1a99654b..51037d8733 100644 --- a/workspace_tools/export/uvision4.py +++ b/workspace_tools/export/uvision4.py @@ -5,7 +5,7 @@ from os.path import basename class Uvision4(Exporter): NAME = 'uVision4' TOOLCHAIN = 'ARM' - TARGETS = ['LPC1768', 'LPC11U24', 'KL25Z'] + TARGETS = ['LPC1768', 'LPC11U24', 'KL25Z', 'LPC1347'] FILE_TYPES = { 'c_sources':'1', 'cpp_sources':'8', @@ -21,7 +21,6 @@ class Uvision4(Exporter): source_files.append({ 'name': basename(file), 'type': n, 'path': file }) - ctx = { 'name': self.program_name, 'include_paths': self.resources.inc_dirs, @@ -33,7 +32,4 @@ class Uvision4(Exporter): # Project file self.gen_file('uvision4_%s.uvproj.tmpl' % target, ctx, '%s.uvproj' % self.program_name) - - if (target == 'lpc1768' or target == 'lpc11u24' or target == 'kl25z'): - # Add debug option to target the MCB1700 - self.gen_file('uvision4_%s.uvopt.tmpl' % target, ctx, '%s.uvopt' % self.program_name) + self.gen_file('uvision4_%s.uvopt.tmpl' % target, ctx, '%s.uvopt' % self.program_name) diff --git a/workspace_tools/export/uvision4_lpc11u24.uvproj.tmpl b/workspace_tools/export/uvision4_lpc11u24.uvproj.tmpl index e69a9c6180..323403a022 100644 --- a/workspace_tools/export/uvision4_lpc11u24.uvproj.tmpl +++ b/workspace_tools/export/uvision4_lpc11u24.uvproj.tmpl @@ -344,7 +344,7 @@ 0 --gnu - TARGET_LPC11U24 + TARGET_LPC11U24, NDEBUG, TOOLCHAIN_ARM, __CMSIS_RTOS, __CORTEX_M0 {% for path in include_paths %} {{path}}; {% endfor %} @@ -358,7 +358,7 @@ 0 0 - --gnu + diff --git a/workspace_tools/export_test.py b/workspace_tools/export_test.py index 1323b33ae0..52036a6d9c 100644 --- a/workspace_tools/export_test.py +++ b/workspace_tools/export_test.py @@ -72,7 +72,7 @@ if __name__ == '__main__': setup_test_user_prj() for toolchain, target in [ - ('uvision', 'LPC1768'), ('uvision', 'LPC11U24'), ('uvision', 'KL25Z'), + ('uvision', 'LPC1768'), ('uvision', 'LPC11U24'), ('uvision', 'KL25Z'), ('uvision', 'LPC1347'), ('codered', 'LPC1768'), diff --git a/workspace_tools/synch.py b/workspace_tools/synch.py index 6b5770755b..66a2ede872 100644 --- a/workspace_tools/synch.py +++ b/workspace_tools/synch.py @@ -12,17 +12,19 @@ from optparse import OptionParser ROOT = abspath(join(dirname(__file__), "..")) sys.path.append(ROOT) -from workspace_tools.settings import MBED_ORG_PATH, MBED_ORG_USER +from workspace_tools.settings import MBED_ORG_PATH, MBED_ORG_USER, BUILD_DIR from workspace_tools.paths import LIB_DIR from workspace_tools.utils import cmd, run_cmd +MBED_URL = "mbed.org" +# MBED_URL = "world2.dev.mbed.org" + MBED_REPO_EXT = (".lib", ".bld") # mbed_official code that does have a mirror in the mbed SDK OFFICIAL_CODE = ( - ("mbed-src" , "mbed"), - + ("mbed-src" , "mbed"), ("mbed-rtos", "rtos"), ("mbed-dsp" , "dsp"), ("mbed-rpc" , "rpc"), @@ -35,7 +37,7 @@ OFFICIAL_CODE = ( ("EthernetInterface", "net/eth/EthernetInterface"), ("USBDevice", "USBDevice"), - ("USBHost", "USBHost"), + ("USBHost" , "USBHost"), ) @@ -71,7 +73,7 @@ CODE_WITH_DEPENDENCIES = ( class MbedOfficialRepository: - URL = "http://mbed.org/users/mbed_official/code/%s/" + URL = "http://" + MBED_URL + "/users/mbed_official/code/%s/" def __init__(self, name): self.name = name @@ -123,32 +125,35 @@ def visit_files(path, visit, ignore=None, select=None): visit(join(root, file)) +def update_repo(repo_name, sdk_path): + repo = MbedOfficialRepository(repo_name) + # copy files from mbed SDK to mbed_official repository + def visit_mbed_sdk(sdk_file): + repo_file = join(repo.path, relpath(sdk_file, sdk_path)) + + repo_dir = dirname(repo_file) + if not exists(repo_dir): + makedirs(repo_dir) + + copyfile(sdk_file, repo_file) + visit_files(sdk_path, visit_mbed_sdk, ['.json']) + + # remove repository files that do not exist in the mbed SDK + def visit_repo(repo_file): + sdk_file = join(sdk_path, relpath(repo_file, repo.path)) + if not exists(sdk_file): + remove(repo_file) + print "remove: %s" % repo_file + visit_files(repo.path, visit_repo, MBED_REPO_EXT) + + repo.publish() + + def update_code(repositories): for repo_name, sdk_dir in repositories: print '\n=== Updating "%s" ===' % repo_name - repo = MbedOfficialRepository(repo_name) sdk_path = join(LIB_DIR, sdk_dir) - - # copy files from mbed SDK to mbed_official repository - def visit_mbed_sdk(sdk_file): - repo_file = join(repo.path, relpath(sdk_file, sdk_path)) - - repo_dir = dirname(repo_file) - if not exists(repo_dir): - makedirs(repo_dir) - - copyfile(sdk_file, repo_file) - visit_files(sdk_path, visit_mbed_sdk, ['.json']) - - # remove repository files that do not exist in the mbed SDK - def visit_repo(repo_file): - sdk_file = join(sdk_path, relpath(repo_file, repo.path)) - if not exists(sdk_file): - remove(repo_file) - print "remove: %s" % repo_file - visit_files(repo.path, visit_repo, MBED_REPO_EXT) - - repo.publish() + update_repo(repo_name, sdk_path) def update_dependencies(repositories): @@ -167,17 +172,25 @@ def update_dependencies(repositories): repo.publish() +def update_mbed(): + update_repo("mbed", join(BUILD_DIR, "mbed")) + + if __name__ == '__main__': parser = OptionParser() - parser.add_option("-c", "--code", dest="code", + parser.add_option("-c", "--code", action="store_true", default=False, help="Update the mbed_official code") - parser.add_option("-d", "--dependencies", dest="dependencies", + parser.add_option("-d", "--dependencies", action="store_true", default=False, help="Update the mbed_official code dependencies") + parser.add_option("-m", "--mbed", + action="store_true", default=False, + help="Release a build of the mbed library") + (options, args) = parser.parse_args() if options.code: @@ -185,3 +198,7 @@ if __name__ == '__main__': if options.dependencies: update_dependencies(CODE_WITH_DEPENDENCIES) + + if options.mbed: + update_mbed() + diff --git a/workspace_tools/targets.py b/workspace_tools/targets.py index 072345bdc3..ef1c88029e 100644 --- a/workspace_tools/targets.py +++ b/workspace_tools/targets.py @@ -163,6 +163,15 @@ class MBED_MCU(Target): self.supported_toolchains = ["ARM"] +class LPC1347(Target): + def __init__(self): + Target.__init__(self) + + self.core = "Cortex-M3" + + self.extra_labels = ['NXP', 'LPC13XX'] + + self.supported_toolchains = ["ARM", "GCC_ARM"] # Get a single instance for each target TARGETS = [ @@ -175,7 +184,8 @@ TARGETS = [ LPC4088(), LPC4330_M4(), STM32F407(), - MBED_MCU() + MBED_MCU(), + LPC1347() ] # Map each target name to its unique instance diff --git a/workspace_tools/tests.py b/workspace_tools/tests.py index a705e36ddf..8c06c6ee59 100644 --- a/workspace_tools/tests.py +++ b/workspace_tools/tests.py @@ -332,6 +332,12 @@ TESTS = [ "automated": True, "peripherals": ["ADXL345"] }, + { + "id": "MBED_28", "description": "I2C EEPROM read/write test", + "source_dir": join(TEST_DIR, "mbed", "i2c_eeprom"), + "dependencies": [MBED_LIBRARIES, TEST_MBED_LIB], + "automated": True, + }, { "id": "MBED_29", "description": "I2C master/slave test", "source_dir": join(TEST_DIR, "mbed", "i2c_master_slave"), @@ -535,19 +541,16 @@ TESTS = [ "id": "USB_1", "description": "Mouse", "source_dir": join(TEST_DIR, "usb", "device", "basic"), "dependencies": [MBED_LIBRARIES, USB_LIBRARIES], - "supported": CORTEX_ARM_SUPPORT, }, { "id": "USB_2", "description": "Keyboard", "source_dir": join(TEST_DIR, "usb", "device", "keyboard"), "dependencies": [MBED_LIBRARIES, USB_LIBRARIES], - "supported": CORTEX_ARM_SUPPORT, }, { "id": "USB_3", "description": "Mouse_Keyboard", "source_dir": join(TEST_DIR, "usb", "device", "keyboard"), "dependencies": [MBED_LIBRARIES, USB_LIBRARIES], - "supported": CORTEX_ARM_SUPPORT, }, { "id": "USB_4", "description": "Serial Port", @@ -559,19 +562,16 @@ TESTS = [ "id": "USB_5", "description": "Generic HID", "source_dir": join(TEST_DIR, "usb", "device", "raw_hid"), "dependencies": [MBED_LIBRARIES, USB_LIBRARIES], - "supported": CORTEX_ARM_SUPPORT, }, { "id": "USB_6", "description": "MIDI", "source_dir": join(TEST_DIR, "usb", "device", "midi"), "dependencies": [MBED_LIBRARIES, USB_LIBRARIES], - "supported": CORTEX_ARM_SUPPORT, }, { "id": "USB_7", "description": "AUDIO", "source_dir": join(TEST_DIR, "usb", "device", "audio"), "dependencies": [MBED_LIBRARIES, USB_LIBRARIES], - "supported": CORTEX_ARM_SUPPORT, }, # CMSIS DSP @@ -650,7 +650,7 @@ class Test: self.n = n self.__dict__.update(Test.DEFAULTS) self.__dict__.update(TESTS[n]) - + def is_supported(self, target, toolchain): if not hasattr(self, 'supported'): return True