This is an automated email from Gerrit. Andreas Fritiofson ([email protected]) just uploaded a new patch set to Gerrit, which you can find at http://openocd.zylin.com/2773
-- gerrit commit 9bbb98b97a2dc0f2a5f93883a885388e56381cbd Author: Andreas Fritiofson <[email protected]> Date: Sat May 16 14:42:47 2015 +0200 Kinetis Design Studio patch This is Freescale's modifications as shipped in KDS v3.0.0 Source Files Package.zip It's obviously not acceptable in it's current form but if someone wants to test it and extract the useful parts, go ahead. Change-Id: I89661015d0be5b6835aa909639f4566771611878 Signed-off-by: Andreas Fritiofson <[email protected]> diff --git a/src/flash/nor/kinetis.c b/src/flash/nor/kinetis.c index 5e192c0..f6a848a 100644 --- a/src/flash/nor/kinetis.c +++ b/src/flash/nor/kinetis.c @@ -90,11 +90,14 @@ const struct { unsigned pflash_sector_size_bytes; unsigned nvm_sector_size_bytes; unsigned num_blocks; -} kinetis_flash_params[4] = { +} kinetis_flash_params[7] = { { 1<<10, 1<<10, 2 }, { 2<<10, 1<<10, 2 }, { 2<<10, 2<<10, 2 }, - { 4<<10, 4<<10, 4 } + { 4<<10, 4<<10, 4 }, + { 4<<10, 4<<10, 2 }, + { 2<<10, 2<<10, 2 }, + { 4<<10, 0, 1 } }; /* Addressess */ @@ -106,6 +109,15 @@ const struct { #define SIM_SDID 0x40048024 #define SIM_FCFG1 0x4004804c #define SIM_FCFG2 0x40048050 +#define SMC_PMCTRL 0x4007E001 +#define SMC_PMSTAT 0x4007E003 +#define WDOG_STCTRLH 0x40052000 + +/* Values */ +#define PM_STAT_RUN 0x01 +#define PM_STAT_VLPR 0x04 +#define PM_STAT_HSR 0x80 +#define PM_CTRL_RUNM_RUN 0x00 /* Commands */ #define FTFx_CMD_BLOCKSTAT 0x00 @@ -117,7 +129,10 @@ const struct { #define FTFx_CMD_MASSERASE 0x44 /* The Kinetis K series uses the following SDID layout : - * Bit 31-16 : 0 + * Bit 31-28 : FAMILYID (or 0 on older devices) + * Bit 27-24 : SUBFAMID (or 0 on older devices) + * Bit 23-20 : SERIESID (or 0 on older devices) + * Bit 19-16 : Reserved (0) * Bit 15-12 : REVID * Bit 11-7 : DIEID * Bit 6-4 : FAMID @@ -131,13 +146,8 @@ const struct { * Bit 15-12 : REVID * Bit 6-4 : Reserved (0) * Bit 3-0 : PINID - * - * SERIESID should be 1 for the KL-series so we assume that if - * bits 31-16 are 0 then it's a K-series MCU. */ -#define KINETIS_SDID_K_SERIES_MASK 0x0000FFFF - #define KINETIS_SDID_DIEID_MASK 0x00000F80 #define KINETIS_SDID_DIEID_K_A 0x00000100 #define KINETIS_SDID_DIEID_K_B 0x00000200 @@ -155,14 +165,20 @@ const struct { #define KINETIS_K_SDID_K20 0x00000290 #define KINETIS_K_SDID_K21 0x00000230 #define KINETIS_K_SDID_K22 0x00000210 +#define KINETIS_K_SDID_K22_M120 0x00000E90 +#define KINETIS_K_SDID_K24 0x00000710 #define KINETIS_K_SDID_K30 0x00000120 #define KINETIS_K_SDID_K40 0x00000130 #define KINETIS_K_SDID_K50 0x000000E0 #define KINETIS_K_SDID_K51 0x000000F0 #define KINETIS_K_SDID_K53 0x00000170 #define KINETIS_K_SDID_K60 0x000001C0 +#define KINETIS_K_SDID_K64 0x00000340 #define KINETIS_K_SDID_K70 0x000001D0 +#define KINETIS_K_SDID_SERIESID_MASK 0x00F00000 +#define KINETIS_K_SDID_SERIESID_KL 0x00000000 + #define KINETIS_KL_SDID_SERIESID_MASK 0x00F00000 #define KINETIS_KL_SDID_SERIESID_KL 0x00100000 @@ -185,6 +201,44 @@ struct kinetis_flash_bank { } flash_class; }; +static int allow_fcf_writes = 0; + +COMMAND_HANDLER(fcf_write_enable_command) +{ + allow_fcf_writes = 1; + command_print(CMD_CTX, "Arbitrary flash configuration field writes disabled"); + LOG_WARNING("BEWARE: incorrect flash configuration may permanently lock device"); + return ERROR_OK; +} + +COMMAND_HANDLER(fcf_write_disable_command) +{ + allow_fcf_writes = 0; + command_print(CMD_CTX, "Arbitrary flash configuration field writes disabled."); + return ERROR_OK; +} + +static const struct command_registration fcf_command_handlers[] = { + { + .name = "fcf_write_enable", + .handler = fcf_write_enable_command, + .mode = COMMAND_CONFIG, + .help = "Allow writing arbitrary values to the Kinetis flash configuration field (use with caution).", + .usage = "", + }, + { + .name = "fcf_write_disable", + .handler = fcf_write_disable_command, + .mode = COMMAND_CONFIG, + .help = "Disable writing arbitrary values to the Kinetis flash configuration field." + "Any writes will be adjusted to use the value " + "0xffffffff 0xffffffff 0xffffffff 0xfffffffe." + "Adjustments will trigger a warning.", + .usage = "", + }, + COMMAND_REGISTRATION_DONE +}; + FLASH_BANK_COMMAND_HANDLER(kinetis_flash_bank_command) { struct kinetis_flash_bank *bank_info; @@ -200,6 +254,8 @@ FLASH_BANK_COMMAND_HANDLER(kinetis_flash_bank_command) bank->driver_priv = bank_info; + register_commands(CMD_CTX, NULL, fcf_command_handlers); + return ERROR_OK; } @@ -538,6 +594,17 @@ static int kinetis_mass_erase(struct flash_bank *bank) return ERROR_OK; } +static uint8_t kinetis_get_mode(struct flash_bank *bank) +{ + int result; + uint8_t pmstat; + result = target_read_u8(bank->target, SMC_PMSTAT, &pmstat); + if (result != ERROR_OK) + return result; + LOG_DEBUG("SMC_PMSTAT: 0x%x", pmstat); + return pmstat; +} + static int kinetis_erase(struct flash_bank *bank, int first, int last) { int result, i; @@ -551,6 +618,18 @@ static int kinetis_erase(struct flash_bank *bank, int first, int last) if ((first > bank->num_sectors) || (last > bank->num_sectors)) return ERROR_FLASH_OPERATION_FAILED; + if ((kinfo->sim_sdid & KINETIS_K_SDID_TYPE_MASK) == KINETIS_K_SDID_K22_M120) { + uint8_t pmstat = kinetis_get_mode (bank); + if (pmstat == PM_STAT_VLPR || pmstat == PM_STAT_HSR) { + LOG_DEBUG("Switching to run mode to perform flash operation"); + uint8_t pmctrl = PM_CTRL_RUNM_RUN; + result = target_write_u8(bank->target, SMC_PMCTRL, pmctrl); + if (result != ERROR_OK) + return result; + while (kinetis_get_mode(bank) != PM_STAT_RUN); + } + } + if ((first == 0) && (last == (bank->num_sectors - 1)) && (kinfo->klxx)) return kinetis_mass_erase(bank); @@ -575,7 +654,7 @@ static int kinetis_erase(struct flash_bank *bank, int first, int last) if (first == 0) { LOG_WARNING - ("flash configuration field erased, please reset the device"); + ("Any changes to flash configuration field will not take effect until next reset"); } return ERROR_OK; @@ -595,12 +674,41 @@ static int kinetis_write(struct flash_bank *bank, uint8_t *buffer, return ERROR_TARGET_NOT_HALTED; } + if (!allow_fcf_writes) { + if (offset <= 0x400 && offset + count > 0x400) { + int fcf_match = 1; + uint32_t requested_fcf[4] = { + *((uint32_t *) (buffer + (0x400 - offset))), + *((uint32_t *) (buffer + (0x404 - offset))), + *((uint32_t *) (buffer + (0x408 - offset))), + *((uint32_t *) (buffer + (0x40c - offset))) + }; + uint32_t required_fcf[4] = { 0xffffffff, 0xffffffff, 0xffffffff, 0xfffffffe }; + for (i = 0; i < 4; i++) { + if (requested_fcf[i] != required_fcf[i]) { + fcf_match = 0; + *((uint32_t *) (buffer + (0x400 + (i * 4) - offset))) = required_fcf[i]; + } + } + if (!fcf_match) { + LOG_WARNING ("Requested write to flash configuration " + "field 0x%08x 0x%08x 0x%08x 0x%08x " + "transformed to 0x%08x 0x%08x 0x%08x 0x%08x", + requested_fcf[0], requested_fcf[1], requested_fcf[2], requested_fcf[3], + required_fcf[0], required_fcf[1], required_fcf[2], required_fcf[3]); + } + } + } + if (kinfo->klxx) { /* fallback to longword write */ fallback = 1; LOG_WARNING("Kinetis L Series supports Program Longword execution only."); LOG_DEBUG("flash write into PFLASH @08%" PRIX32, offset); + } else if (kinfo->granularity == 5 || kinfo->granularity == 6) { + fallback = 1; + LOG_DEBUG("flash write into PFLASH @08%" PRIX32, offset); } else if (kinfo->flash_class == FC_FLEX_NVM) { uint8_t ftfx_fstat; @@ -640,7 +748,7 @@ static int kinetis_write(struct flash_bank *bank, uint8_t *buffer, unsigned prog_section_chunk_bytes = kinfo->sector_size >> 8; /* assume the NVM sector size is half the FlexRAM size */ unsigned prog_size_bytes = MIN(kinfo->sector_size, - kinetis_flash_params[kinfo->granularity].nvm_sector_size_bytes); + kinetis_flash_params[kinfo->granularity].nvm_sector_size_bytes / ((kinfo->granularity == 4) ? 4 : 1)); for (i = 0; i < count; i += prog_size_bytes) { uint8_t residual_buffer[16]; uint8_t ftfx_fstat; @@ -713,7 +821,8 @@ static int kinetis_write(struct flash_bank *bank, uint8_t *buffer, } } /* program longword command, not supported in "SF3" devices */ - else if ((kinfo->granularity != 3) || (kinfo->klxx)) { + else if ((kinfo->granularity != 3 && kinfo->granularity != 4) + || (kinfo->klxx)) { if (count & 0x3) { uint32_t old_count = count; @@ -780,11 +889,12 @@ static int kinetis_read_part_info(struct flash_bank *bank) result = target_read_u32(target, SIM_SDID, &kinfo->sim_sdid); if (result != ERROR_OK) return result; + LOG_DEBUG("SIM_SDID: 0x%x\n", kinfo->sim_sdid); kinfo->klxx = 0; /* K-series MCU? */ - if ((kinfo->sim_sdid & (~KINETIS_SDID_K_SERIES_MASK)) == 0) { + if ((kinfo->sim_sdid & KINETIS_K_SDID_SERIESID_MASK) == KINETIS_K_SDID_SERIESID_KL) { uint32_t mcu_type = kinfo->sim_sdid & KINETIS_K_SDID_TYPE_MASK; switch (mcu_type) { @@ -808,9 +918,21 @@ static int kinetis_read_part_info(struct flash_bank *bank) /* 2kB sectors */ granularity = 2; break; + case KINETIS_K_SDID_K22_M120: + /* 2kB sectors, no program section command */ + granularity = 5; + break; + case KINETIS_K_SDID_K24: + /* 4kB sectors, no program section command */ + granularity = 6; + break; + case KINETIS_K_SDID_K64: + /* 2kB sectors, 2 banks */ + granularity = 4; + break; case KINETIS_K_SDID_K10: case KINETIS_K_SDID_K70: - /* 4kB sectors */ + /* 4kB sectors, 4 banks */ granularity = 3; break; default: @@ -853,8 +975,10 @@ static int kinetis_read_part_info(struct flash_bank *bank) nvm_size = 1 << (14 + (fcfg1_nvmsize >> 1)); break; case 0x0f: - if (granularity == 3) + if (granularity == 3 || granularity == 4) nvm_size = 512<<10; + else if (granularity == 5) + nvm_size = 128<<10; else nvm_size = 256<<10; break; @@ -892,8 +1016,10 @@ static int kinetis_read_part_info(struct flash_bank *bank) pf_size = 1 << (14 + (fcfg1_pfsize >> 1)); break; case 0x0f: - if (granularity == 3) + if (granularity == 3 || granularity == 4) pf_size = 1024<<10; + else if (granularity == 5) + pf_size = 512<<10; else if (fcfg2_pflsh) pf_size = 512<<10; else @@ -1134,6 +1260,140 @@ static int kinetis_blank_check(struct flash_bank *bank) return ERROR_OK; } +/* Set SP - With the ff02 + version of the CMSIS-DAP firmare on TWR-K24F boards, this is required to + ensure SP is initialized correctly. This may be related to the that version of + the firmware deviating from the norm by calling set_target_state(RESET_PROGRAM) + when OpenOCD connects. */ +int kinetis_k24f_fix (struct target *target) +{ + int retval; + uint32_t sim_sdid; + retval = target_read_u32(target, SIM_SDID, &sim_sdid); + if (retval != ERROR_OK) + return retval; + if (((sim_sdid & KINETIS_K_SDID_SERIESID_MASK) == KINETIS_K_SDID_SERIESID_KL) + && ((sim_sdid & KINETIS_K_SDID_TYPE_MASK) == KINETIS_K_SDID_K24)) { + uint32_t sp; + uint32_t pc; + struct armv7m_common *armv7m = target_to_armv7m(target); + target_step (target, 1, 0, 0); + retval = target_read_u32(target, 0x0, &sp); + if (retval != ERROR_OK) { + return retval; + } + retval = armv7m->store_core_reg_u32(target, 13, sp); + if (retval != ERROR_OK) { + return retval; + } + retval = target_read_u32 (target, 0x4, &pc); + if (retval != ERROR_OK) { + return retval; + } + retval = armv7m->store_core_reg_u32 (target, 15, pc & ~1); + if (retval != ERROR_OK) { + return retval; + } + } + return ERROR_OK; +} + +/* Disable the watchdog on Kinetis devices */ +int kinetis_disable_wdog (struct target *target) +{ + struct working_area *wdog_algorithm; + struct armv7m_algorithm armv7m_info; + uint32_t sim_sdid; + uint16_t wdog; + int retval; + + static const uint8_t kinetis_unlock_wdog_code[] = { + /* WDOG_UNLOCK = 0xC520 */ + 0x4f, 0xf4, 0x00, 0x53, /* mov.w r3, #8192 ; 0x2000 */ + 0xc4, 0xf2, 0x05, 0x03, /* movt r3, #16389 ; 0x4005 */ + 0x4c, 0xf2, 0x20, 0x52, /* movw r2, #50464 ; 0xc520 */ + 0xda, 0x81, /* strh r2, [r3, #14] */ + + /* WDOG_UNLOCK = 0xD928 */ + 0x4f, 0xf4, 0x00, 0x53, /* mov.w r3, #8192 ; 0x2000 */ + 0xc4, 0xf2, 0x05, 0x03, /* movt r3, #16389 ; 0x4005 */ + 0x4d, 0xf6, 0x28, 0x12, /* movw r2, #55592 ; 0xd928 */ + 0xda, 0x81, /* strh r2, [r3, #14] */ + + /* WDOG_SCR = 0x1d2 */ + 0x4f, 0xf4, 0x00, 0x53, /* mov.w r3, #8192 ; 0x2000 */ + 0xc4, 0xf2, 0x05, 0x03, /* movt r3, #16389 ; 0x4005 */ + 0x4f, 0xf4, 0xe9, 0x72, /* mov.w r2, #466 ; 0x1d2 */ + 0x1a, 0x80, /* strh r2, [r3, #0] */ + + /* END */ + 0x00, 0xBE, /* bkpt #0 */ + }; + + /* Decide whether the connected device should needs its watchdog disabling. */ + retval = target_read_u32(target, SIM_SDID, &sim_sdid); + if (retval != ERROR_OK) + return retval; + if ((sim_sdid & KINETIS_K_SDID_SERIESID_MASK) == KINETIS_K_SDID_SERIESID_KL) { + uint32_t mcu_type = sim_sdid & KINETIS_K_SDID_TYPE_MASK; + + switch (mcu_type) { + case KINETIS_K_SDID_K22_M120: + case KINETIS_K_SDID_K24: + break; + default: + return ERROR_OK; + } + } + else { + return ERROR_OK; + } + + /* The connected device requires its watchdog disabling. */ + retval = target_read_u16(target, WDOG_STCTRLH, &wdog); + if (retval != ERROR_OK) + return retval; + LOG_INFO("Disabling Kinetis watchdog (initial WDOG_STCTRLH = 0x%x)", wdog); + + retval = target_halt(target); + if (retval != ERROR_OK) + return retval; + target->state = TARGET_HALTED; + + retval = target_alloc_working_area(target, sizeof(kinetis_unlock_wdog_code), &wdog_algorithm); + if (retval != ERROR_OK) + return retval; + + retval = target_write_buffer(target, wdog_algorithm->address, + sizeof(kinetis_unlock_wdog_code), (uint8_t *)kinetis_unlock_wdog_code); + if (retval != ERROR_OK) { + target_free_working_area(target, wdog_algorithm); + return retval; + } + + armv7m_info.common_magic = ARMV7M_COMMON_MAGIC; + armv7m_info.core_mode = ARM_MODE_THREAD; + + retval = target_run_algorithm(target, 0, NULL, 0, NULL, wdog_algorithm->address, + wdog_algorithm->address + (sizeof(kinetis_unlock_wdog_code) - 2), + 10000, &armv7m_info); + + if (retval != ERROR_OK) + LOG_ERROR("error executing kinetis wdog unlock algorithm"); + + retval = target_read_u16(target, WDOG_STCTRLH, &wdog); + if (retval != ERROR_OK) + return retval; + LOG_INFO("WDOG_STCTRLH = 0x%x", wdog); + + target_free_working_area(target, wdog_algorithm); + retval = kinetis_k24f_fix (target); + if (retval != ERROR_OK) + return retval; + + return retval; +} + struct flash_driver kinetis_flash = { .name = "kinetis", .flash_bank_command = kinetis_flash_bank_command, diff --git a/src/helper/configuration.c b/src/helper/configuration.c index dde1491..02444ff 100644 --- a/src/helper/configuration.c +++ b/src/helper/configuration.c @@ -111,7 +111,18 @@ int parse_config_file(struct command_context *cmd_ctx) char **cfg; if (!config_file_names) { - command_run_line(cmd_ctx, "script openocd.cfg"); + int rc; + rc = command_run_line(cmd_ctx, "script openocd.cfg"); + if (rc != ERROR_OK) { + LOG_INFO("No configuration files specified defaulting to kinetis.cfg"); + rc = command_run_line(cmd_ctx, "script kinetis.cfg"); + if (rc != ERROR_OK) { + return rc; + } + } + else { + LOG_INFO("Found openocd.cfg; kinetis.cfg not read automatically"); + } return ERROR_OK; } diff --git a/src/helper/log.c b/src/helper/log.c index cb1fbac..519e471 100644 --- a/src/helper/log.c +++ b/src/helper/log.c @@ -52,12 +52,13 @@ static long long current_time; static long long start; -static char *log_strings[5] = { +static char *log_strings[6] = { "User : ", "Error: ", "Warn : ", /* want a space after each colon, all same width, colons aligned */ "Info : ", - "Debug: " + "Debug: ", + "DAP: " }; static int count; @@ -225,7 +226,7 @@ COMMAND_HANDLER(handle_debug_level_command) if (CMD_ARGC == 1) { int new_level; COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], new_level); - if ((new_level > LOG_LVL_DEBUG) || (new_level < LOG_LVL_SILENT)) { + if ((new_level > LOG_LVL_DAP) || (new_level < LOG_LVL_SILENT)) { LOG_ERROR("level must be between %d and %d", LOG_LVL_SILENT, LOG_LVL_DEBUG); return ERROR_COMMAND_SYNTAX_ERROR; } diff --git a/src/helper/log.h b/src/helper/log.h index e1801e9..1ec043b 100644 --- a/src/helper/log.h +++ b/src/helper/log.h @@ -56,7 +56,8 @@ enum log_levels { LOG_LVL_ERROR = 0, LOG_LVL_WARNING = 1, LOG_LVL_INFO = 2, - LOG_LVL_DEBUG = 3 + LOG_LVL_DEBUG = 3, + LOG_LVL_DAP = 4 }; void log_printf(enum log_levels level, const char *file, unsigned line, @@ -102,6 +103,14 @@ extern int debug_level; #define LOG_LEVEL_IS(FOO) ((debug_level) >= (FOO)) +#define LOG_DAP(expr ...) \ + do { \ + if (debug_level >= LOG_LVL_DAP) \ + log_printf_lf(LOG_LVL_DAP, \ + __FILE__, __LINE__, __func__, \ + expr); \ + } while (0) + #define LOG_DEBUG(expr ...) \ do { \ if (debug_level >= LOG_LVL_DEBUG) \ diff --git a/src/helper/options.c b/src/helper/options.c index a378131..8e6a236 100644 --- a/src/helper/options.c +++ b/src/helper/options.c @@ -25,12 +25,17 @@ #include "config.h" #endif +#include "openocd.h" + #include "configuration.h" /* @todo the inclusion of server.h here is a layering violation */ #include <server/server.h> #include <getopt.h> +#include <libgen.h> +#include <string.h> + static int help_flag, version_flag; static const struct option long_options[] = { @@ -68,6 +73,36 @@ static char *find_suffix(const char *text, const char *suffix) } #endif +#ifdef _WIN32 +#define PATH_DELIM ";" +#else +#define PATH_DELIM ":" + +static char *find_in_path(const char *bin) +{ + char *path = strdup (getenv ("PATH")); + char *elem; + while ((elem = strtok (path, PATH_DELIM))) { + char *t = alloc_printf ("%s/%s", elem, bin); + if (!access (t, X_OK)) + return strdup (elem); + path = NULL; + } + return ""; +} +#endif + +static inline int contains_slash (const char *str) { + int i; + for (i = 0; str[i]; i++) { + if (str[i] == '/') + return 1; + } + return 0; +} + +#undef PKGDATADIR +#define PKGDATADIR "/../" static void add_default_dirs(void) { const char *run_prefix; @@ -92,10 +127,14 @@ static void add_default_dirs(void) run_prefix = strExePath; #else - run_prefix = ""; + if (!contains_slash (argv0)) { + run_prefix = find_in_path (argv0); + } + else { + run_prefix = dirname (strdup (argv0)); + } #endif - LOG_DEBUG("bindir=%s", BINDIR); LOG_DEBUG("pkgdatadir=%s", PKGDATADIR); LOG_DEBUG("run_prefix=%s", run_prefix); @@ -204,7 +243,7 @@ int parse_cmdline_args(struct command_context *cmd_ctx, int argc, char *argv[]) LOG_OUTPUT("--version | -v\tdisplay OpenOCD version\n"); LOG_OUTPUT("--file | -f\tuse configuration file <name>\n"); LOG_OUTPUT("--search | -s\tdir to search for config files and scripts\n"); - LOG_OUTPUT("--debug | -d\tset debug level <0-3>\n"); + LOG_OUTPUT("--debug | -d\tset debug level <0-4>\n"); LOG_OUTPUT("--log_output | -l\tredirect log output to file <name>\n"); LOG_OUTPUT("--command | -c\trun <command>\n"); exit(-1); diff --git a/src/openocd.c b/src/openocd.c index 71e047f..aac1796 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -299,12 +299,15 @@ static int openocd_thread(int argc, char *argv[], struct command_context *cmd_ct return ret; } +char *argv0; + /* normally this is the main() function entry, but if OpenOCD is linked * into application, then this fn will not be invoked, but rather that * application will have it's own implementation of main(). */ int openocd_main(int argc, char *argv[]) { int ret; + argv0 = argv[0]; /* initialize commandline interface */ struct command_context *cmd_ctx; diff --git a/src/openocd.h b/src/openocd.h index 57bf455..23c7225 100644 --- a/src/openocd.h +++ b/src/openocd.h @@ -21,6 +21,8 @@ #ifndef OPENOCD_H #define OPENOCD_H +extern char *argv0; + /** * Different applications can define this entry point to override * the default openocd main function. On most systems, this will be diff --git a/src/target/adi_v5_cmsis_dap.c b/src/target/adi_v5_cmsis_dap.c index 3ff5bfe..8305661 100644 --- a/src/target/adi_v5_cmsis_dap.c +++ b/src/target/adi_v5_cmsis_dap.c @@ -56,7 +56,7 @@ extern struct jtag_interface *jtag_interface; static int (cmsis_dap_queue_ap_abort)(struct adiv5_dap *dap, uint8_t *ack) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_ap_abort"); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_ap_abort"); /* FIXME: implement this properly cmsis-dap has DAP_WriteABORT() * for now just hack @ everything */ @@ -66,7 +66,7 @@ static int (cmsis_dap_queue_ap_abort)(struct adiv5_dap *dap, uint8_t *ack) static int cmsis_dap_queue_dp_read(struct adiv5_dap *dap, unsigned reg, uint32_t *data) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_dp_read %d", reg); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_dp_read %d", reg); int retval = jtag_interface->swd->read_reg( (CMSIS_CMD_DP | CMSIS_CMD_READ | CMSIS_CMD_A32(reg)), data); @@ -82,7 +82,7 @@ static int cmsis_dap_queue_dp_read(struct adiv5_dap *dap, unsigned reg, uint32_t static int cmsis_dap_queue_idcode_read(struct adiv5_dap *dap, uint8_t *ack, uint32_t *data) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_idcode_read"); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_idcode_read"); int retval = cmsis_dap_queue_dp_read(dap, DP_IDCODE, data); if (retval != ERROR_OK) @@ -95,7 +95,7 @@ static int cmsis_dap_queue_idcode_read(struct adiv5_dap *dap, uint8_t *ack, uint static int (cmsis_dap_queue_dp_write)(struct adiv5_dap *dap, unsigned reg, uint32_t data) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_dp_write %d 0x%08" PRIx32, reg, data); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_dp_write %d 0x%08" PRIx32, reg, data); /* setting the ORUNDETECT bit causes issues for some targets, * disable until we find out why */ @@ -132,7 +132,7 @@ static int cmsis_dap_ap_q_bankselect(struct adiv5_dap *dap, unsigned reg) static int (cmsis_dap_queue_ap_read)(struct adiv5_dap *dap, unsigned reg, uint32_t *data) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_ap_read %d", reg); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_ap_read %d", reg); int retval = cmsis_dap_ap_q_bankselect(dap, reg); if (retval != ERROR_OK) @@ -152,7 +152,7 @@ static int (cmsis_dap_queue_ap_read)(struct adiv5_dap *dap, unsigned reg, uint32 static int (cmsis_dap_queue_ap_write)(struct adiv5_dap *dap, unsigned reg, uint32_t data) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_ap_write %d 0x%08" PRIx32, reg, data); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_ap_write %d 0x%08" PRIx32, reg, data); /* TODO: CSW_DBGSWENABLE (bit31) causes issues for some targets * disable until we find out why */ @@ -178,7 +178,7 @@ static int (cmsis_dap_queue_ap_write)(struct adiv5_dap *dap, unsigned reg, uint3 static int (cmsis_dap_queue_ap_read_block)(struct adiv5_dap *dap, unsigned reg, uint32_t blocksize, uint8_t *buffer) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_queue_ap_read_block 0x%08" PRIx32, blocksize); + LOG_DAP("CMSIS-ADI: cmsis_dap_queue_ap_read_block 0x%08" PRIx32, blocksize); int retval = jtag_interface->swd->read_block( (CMSIS_CMD_AP | CMSIS_CMD_READ | CMSIS_CMD_A32(AP_REG_DRW)), @@ -196,7 +196,7 @@ static int (cmsis_dap_queue_ap_read_block)(struct adiv5_dap *dap, unsigned reg, /** Executes all queued DAP operations. */ static int cmsis_dap_run(struct adiv5_dap *dap) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_run"); + LOG_DAP("CMSIS-ADI: cmsis_dap_run"); /* FIXME: for now the CMSIS-DAP interface hard-wires a zero-size queue. */ return ERROR_OK; @@ -243,7 +243,7 @@ static const struct command_registration cmsis_dap_handlers[] = { static int cmsis_dap_select(struct command_context *ctx) { - LOG_DEBUG("CMSIS-ADI: cmsis_dap_select"); + LOG_DAP("CMSIS-ADI: cmsis_dap_select"); int retval = register_commands(ctx, NULL, cmsis_dap_handlers); @@ -278,7 +278,7 @@ static int cmsis_dap_init(struct command_context *ctx) uint32_t idcode; int status; - LOG_DEBUG("CMSIS-ADI: cmsis_dap_init"); + LOG_DAP("CMSIS-ADI: cmsis_dap_init"); /* Force the DAP's ops vector for CMSIS-DAP mode. * messy - is there a better way? */ diff --git a/src/target/cortex_m.c b/src/target/cortex_m.c index dc8d344..6f0de78 100644 --- a/src/target/cortex_m.c +++ b/src/target/cortex_m.c @@ -541,6 +541,9 @@ static int cortex_m_poll(struct target *target) cortex_m_endreset_event(target); target->state = TARGET_RUNNING; prev_target_state = TARGET_RUNNING; + + /* Disable Freescale Kinetis WDOG */ + kinetis_disable_wdog(target); } if (cortex_m->dcb_dhcsr & S_HALT) { @@ -1409,8 +1412,7 @@ int cortex_m_add_watchpoint(struct target *target, struct watchpoint *watchpoint return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; } if (watchpoint->address & ((1 << mask) - 1)) { - LOG_DEBUG("watchpoint address is unaligned"); - return ERROR_TARGET_RESOURCE_NOT_AVAILABLE; + LOG_WARNING("watchpoint address is unaligned"); } /* Caller doesn't seem to be able to describe watching for data @@ -1776,6 +1778,7 @@ int cortex_m_examine(struct target *target) { int retval; uint32_t cpuid, fpcr, mvfr0, mvfr1; + uint8_t fsec; int i; struct cortex_m_common *cortex_m = target_to_cm(target); struct adiv5_dap *swjdp = cortex_m->armv7m.arm.dap; @@ -1792,6 +1795,22 @@ int cortex_m_examine(struct target *target) if (!target_was_examined(target)) { target_set_examined(target); + retval = target_read_u8(target, FSEC, &fsec); + if (retval != ERROR_OK) { + LOG_ERROR("Cannot read FSEC. Device may be secured"); + LOG_INFO("Mass erasing a device will unsecure it until the next reset. " + "To permanently unsecure, mass erase then flash a " + "program containing an appropriate flash configuration field."); + exit(-1); + } + else if ((fsec & 0x3) != 0x2) { + LOG_ERROR("Cannot access device, device is secured"); + LOG_INFO("Mass erasing a device will unsecure it until the next reset. " + "To permanently unsecure, mass erase then flash a " + "program containing an appropriate flash configuration field."); + exit(-1); + } + /* Read from Device Identification Registers */ retval = target_read_u32(target, CPUID, &cpuid); if (retval != ERROR_OK) diff --git a/src/target/cortex_m.h b/src/target/cortex_m.h index 8a284bd..2e7fd68 100644 --- a/src/target/cortex_m.h +++ b/src/target/cortex_m.h @@ -39,6 +39,7 @@ #define ITM_LAR 0xE0000FB0 #define CPUID 0xE000ED00 +#define FSEC 0x0000040C /* Debug Control Block */ #define DCB_DHCSR 0xE000EDF0 #define DCB_DCRSR 0xE000EDF4 @@ -211,4 +212,6 @@ void cortex_m_enable_breakpoints(struct target *target); void cortex_m_enable_watchpoints(struct target *target); void cortex_m_dwt_setup(struct cortex_m_common *cm, struct target *target); +int kinetis_disable_wdog (struct target *target); + #endif /* CORTEX_M_H */ diff --git a/tcl/target/gen-kinetis-cfgs.sh b/tcl/target/gen-kinetis-cfgs.sh new file mode 100644 index 0000000..884fe26 --- /dev/null +++ b/tcl/target/gen-kinetis-cfgs.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +gen_cfg () { + local name=$1 + local tapid=$2 + cp kinetis_template.cfg $name.cfg + sed -i "s/SOMNNAME/$name/g" $name.cfg + sed -i "s/SOMNTAPID/$tapid/g" $name.cfg +} + +gen_cfg kl25 0x0BC11477 +gen_cfg kl26 0x0BC11477 +gen_cfg k64 0x4BA00477 +gen_cfg k21 0x4BA00477 +gen_cfg k22 0x4BA00477 +gen_cfg kl46 0x0BC11477 +gen_cfg k40 0x4ba00477 +gen_cfg k60 0x4ba00477 diff --git a/tcl/target/k21.cfg b/tcl/target/k21.cfg new file mode 100644 index 0000000..8c587e3 --- /dev/null +++ b/tcl/target/k21.cfg @@ -0,0 +1,56 @@ +# +# Freescale Kinetis k21 devices +# + +# +# k21 devices support both JTAG and SWD transports. +# +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME k21 +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x4BA00477 +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME + +# if srst is not fitted use SYSRESETREQ to +# perform a soft reset +cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/k22.cfg b/tcl/target/k22.cfg new file mode 100644 index 0000000..d346fcd --- /dev/null +++ b/tcl/target/k22.cfg @@ -0,0 +1,56 @@ +# +# Freescale Kinetis k22 devices +# + +# +# k22 devices support both JTAG and SWD transports. +# +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME k22 +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x4BA00477 +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME + +# if srst is not fitted use SYSRESETREQ to +# perform a soft reset +cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/k40.cfg b/tcl/target/k40.cfg index ec55028..0757f04 100644 --- a/tcl/target/k40.cfg +++ b/tcl/target/k40.cfg @@ -1,9 +1,9 @@ # -# Freescale Kinetis K40 devices +# Freescale Kinetis k40 devices # # -# K40 devices support both JTAG and SWD transports. +# k40 devices support both JTAG and SWD transports. # source [find target/swj-dp.tcl] @@ -19,21 +19,38 @@ if { [info exists ENDIAN] } { set _ENDIAN little } +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + if { [info exists CPUTAPID] } { set _CPUTAPID $CPUTAPID } else { set _CPUTAPID 0x4ba00477 } -set _TARGETNAME $_CHIPNAME.cpu +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID -swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu -target create $_TARGETNAME cortex_m -chain-position $_CHIPNAME.cpu +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 -$_CHIPNAME.cpu configure -event examine-start { puts "START..." ; } -$_CHIPNAME.cpu configure -event examine-end { puts "END..." ; } +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME # if srst is not fitted use SYSRESETREQ to # perform a soft reset cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/k60.cfg b/tcl/target/k60.cfg index 7ac8bb5..4ace1c1 100644 --- a/tcl/target/k60.cfg +++ b/tcl/target/k60.cfg @@ -1,9 +1,9 @@ # -# Freescale Kinetis K60 devices +# Freescale Kinetis k60 devices # # -# K60 devices support both JTAG and SWD transports. +# k60 devices support both JTAG and SWD transports. # source [find target/swj-dp.tcl] @@ -19,21 +19,38 @@ if { [info exists ENDIAN] } { set _ENDIAN little } +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + if { [info exists CPUTAPID] } { set _CPUTAPID $CPUTAPID } else { set _CPUTAPID 0x4ba00477 } -set _TARGETNAME $_CHIPNAME.cpu +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID -swj_newdap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id $_CPUTAPID +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu -target create $_TARGETNAME cortex_m -chain-position $_CHIPNAME.cpu +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 -$_CHIPNAME.cpu configure -event examine-start { puts "START..." ; } -$_CHIPNAME.cpu configure -event examine-end { puts "END..." ; } +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME # if srst is not fitted use SYSRESETREQ to # perform a soft reset cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/k64.cfg b/tcl/target/k64.cfg new file mode 100644 index 0000000..63b9187 --- /dev/null +++ b/tcl/target/k64.cfg @@ -0,0 +1,56 @@ +# +# Freescale Kinetis k64 devices +# + +# +# k64 devices support both JTAG and SWD transports. +# +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME k64 +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x4BA00477 +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME + +# if srst is not fitted use SYSRESETREQ to +# perform a soft reset +cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/kinetis.cfg b/tcl/target/kinetis.cfg new file mode 100644 index 0000000..c09fd01 --- /dev/null +++ b/tcl/target/kinetis.cfg @@ -0,0 +1,29 @@ +# Config Freescale Kinetis devices providing a CMSIS-DAP interface. + +interface cmsis-dap + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME kinetis +} + +cmsis-dap newdap $_CHIPNAME cpu -irlen 4 +global using_jtag +set using_jtag 0 + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -chain-position $_CHIPNAME.cpu + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size 0x1000 -work-area-backup 0 + +# Flash size is detected automatically. +flash bank $_CHIPNAME.flash kinetis 0 0 0 0 $_TARGETNAME + +cortex_m reset_config sysresetreq + +adapter_khz 1000 + +$_TARGETNAME configure -event gdb-attach { + halt +} diff --git a/tcl/target/kinetis_template.cfg b/tcl/target/kinetis_template.cfg new file mode 100644 index 0000000..ce4f9fb --- /dev/null +++ b/tcl/target/kinetis_template.cfg @@ -0,0 +1,56 @@ +# +# Freescale Kinetis SOMNNAME devices +# + +# +# SOMNNAME devices support both JTAG and SWD transports. +# +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME SOMNNAME +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID SOMNTAPID +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME + +# if srst is not fitted use SYSRESETREQ to +# perform a soft reset +cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/kl25.cfg b/tcl/target/kl25.cfg index c5dda15..ad80c20 100644 --- a/tcl/target/kl25.cfg +++ b/tcl/target/kl25.cfg @@ -1,9 +1,9 @@ # -# Freescale Kinetis KL25 devices +# Freescale Kinetis kl25 devices # # -# KL25 devices support both JTAG and SWD transports. +# kl25 devices support both JTAG and SWD transports. # source [find target/swj-dp.tcl] @@ -30,7 +30,7 @@ if { [info exists WORKAREASIZE] } { if { [info exists CPUTAPID] } { set _CPUTAPID $CPUTAPID } else { - set _CPUTAPID 0x0bc11477 + set _CPUTAPID 0x0BC11477 } swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID @@ -46,3 +46,11 @@ flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME # if srst is not fitted use SYSRESETREQ to # perform a soft reset cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/kl26.cfg b/tcl/target/kl26.cfg new file mode 100644 index 0000000..aa9054d --- /dev/null +++ b/tcl/target/kl26.cfg @@ -0,0 +1,56 @@ +# +# Freescale Kinetis kl26 devices +# + +# +# kl26 devices support both JTAG and SWD transports. +# +source [find target/swj-dp.tcl] + +if { [info exists CHIPNAME] } { + set _CHIPNAME $CHIPNAME +} else { + set _CHIPNAME kl26 +} + +if { [info exists ENDIAN] } { + set _ENDIAN $ENDIAN +} else { + set _ENDIAN little +} + +# Work-area is a space in RAM used for flash programming +# By default use 4kB +if { [info exists WORKAREASIZE] } { + set _WORKAREASIZE $WORKAREASIZE +} else { + set _WORKAREASIZE 0x1000 +} + +if { [info exists CPUTAPID] } { + set _CPUTAPID $CPUTAPID +} else { + set _CPUTAPID 0x0BC11477 +} + +swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID + +set _TARGETNAME $_CHIPNAME.cpu +target create $_TARGETNAME cortex_m -endian $_ENDIAN -chain-position $_CHIPNAME.cpu + +$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0 + +set _FLASHNAME $_CHIPNAME.flash +flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME + +# if srst is not fitted use SYSRESETREQ to +# perform a soft reset +cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." diff --git a/tcl/target/kl46.cfg b/tcl/target/kl46.cfg index 156ae9f..7203f78 100644 --- a/tcl/target/kl46.cfg +++ b/tcl/target/kl46.cfg @@ -1,9 +1,9 @@ # -# Freescale Kinetis KL46 devices +# Freescale Kinetis kl46 devices # # -# KL46 devices supports SWD transport only. +# kl46 devices support both JTAG and SWD transports. # source [find target/swj-dp.tcl] @@ -30,7 +30,7 @@ if { [info exists WORKAREASIZE] } { if { [info exists CPUTAPID] } { set _CPUTAPID $CPUTAPID } else { - set _CPUTAPID 0x0bc11477 + set _CPUTAPID 0x0BC11477 } swj_newdap $_CHIPNAME cpu -irlen 4 -expected-id $_CPUTAPID @@ -46,3 +46,11 @@ flash bank $_FLASHNAME kinetis 0 0 0 0 $_TARGETNAME # if srst is not fitted use SYSRESETREQ to # perform a soft reset cortex_m reset_config sysresetreq + +adapter_khz 50 + +$_TARGETNAME configure -event gdb-attach { + halt +} + +echo "Warning - This configuration file is deprecated and will be removed in future versions, use kinetis.cfg instead." -- ------------------------------------------------------------------------------ One dashboard for servers and applications across Physical-Virtual-Cloud Widest out-of-the-box monitoring support with 50+ applications Performance metrics, stats and reports that give you Actionable Insights Deep dive visibility with transaction tracing using APM Insight. http://ad.doubleclick.net/ddm/clk/290420510;117567292;y _______________________________________________ OpenOCD-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openocd-devel
