openocd: manually fix Yoda conditions
[fw/openocd] / src / target / stm8.c
index ad05b54f9b24bbc72a54af9e87938d607f771678..21fc8c54f819e8067b542399bf6ba8797a1e784b 100644 (file)
@@ -45,6 +45,8 @@ static int stm8_set_breakpoint(struct target *target,
 static void stm8_enable_watchpoints(struct target *target);
 static int stm8_unset_watchpoint(struct target *target,
                struct watchpoint *watchpoint);
+static int (*adapter_speed)(int speed);
+extern struct adapter_driver *adapter_driver;
 
 static const struct {
        unsigned id;
@@ -157,7 +159,6 @@ struct stm8_algorithm {
 struct stm8_core_reg {
        uint32_t num;
        struct target *target;
-       struct stm8_common *stm8_common;
 };
 
 enum hw_break_type {
@@ -797,8 +798,35 @@ static int stm8_read_memory(struct target *target, target_addr_t address,
        return retval;
 }
 
+static int stm8_speed(int speed)
+{
+       int retval;
+       uint8_t csr;
+
+       LOG_DEBUG("stm8_speed: %d", speed);
+
+       csr = SAFE_MASK | SWIM_DM;
+       if (speed >= SWIM_FREQ_HIGH)
+               csr |= HS;
+
+       LOG_DEBUG("writing B0 to SWIM_CSR (SAFE_MASK + SWIM_DM + HS:%d)", csr & HS ? 1 : 0);
+       retval = stm8_write_u8(NULL, SWIM_CSR, csr);
+       if (retval != ERROR_OK)
+               return retval;
+       return adapter_speed(speed);
+}
+
 static int stm8_init(struct command_context *cmd_ctx, struct target *target)
 {
+       /*
+        * FIXME: this is a temporarily hack that needs better implementation.
+        * Being the only overwrite of adapter_driver, it prevents declaring const
+        * the struct adapter_driver.
+        * intercept adapter_driver->speed() calls
+        */
+       adapter_speed = adapter_driver->speed;
+       adapter_driver->speed = stm8_speed;
+
        stm8_build_reg_cache(target);
 
        return ERROR_OK;
@@ -938,7 +966,7 @@ static int stm8_reset_deassert(struct target *target)
        if (target->reset_halt)
                return ERROR_OK;
 
-       /* Instead of going thrugh saving context, polling and
+       /* Instead of going through saving context, polling and
           then resuming target again just clear stall and proceed. */
        target->state = TARGET_RUNNING;
        return stm8_exit_debug(target);
@@ -1114,7 +1142,7 @@ static int stm8_read_core_reg(struct target *target, unsigned int num)
                return ERROR_COMMAND_SYNTAX_ERROR;
 
        reg_value = stm8->core_regs[num];
-       LOG_DEBUG("read core reg %i value 0x%" PRIx32 "", num , reg_value);
+       LOG_DEBUG("read core reg %i value 0x%" PRIx32 "", num, reg_value);
        buf_set_u32(stm8->core_cache->reg_list[num].value, 0, 32, reg_value);
        stm8->core_cache->reg_list[num].valid = true;
        stm8->core_cache->reg_list[num].dirty = false;
@@ -1134,7 +1162,7 @@ static int stm8_write_core_reg(struct target *target, unsigned int num)
 
        reg_value = buf_get_u32(stm8->core_cache->reg_list[num].value, 0, 32);
        stm8->core_regs[num] = reg_value;
-       LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", num , reg_value);
+       LOG_DEBUG("write core reg %i value 0x%" PRIx32 "", num, reg_value);
        stm8->core_cache->reg_list[num].valid = true;
        stm8->core_cache->reg_list[num].dirty = false;
 
@@ -1192,7 +1220,6 @@ static struct reg_cache *stm8_build_reg_cache(struct target *target)
        for (i = 0; i < num_regs; i++) {
                arch_info[i].num = stm8_regs[i].id;
                arch_info[i].target = target;
-               arch_info[i].stm8_common = stm8;
 
                reg_list[i].name = stm8_regs[i].name;
                reg_list[i].size = stm8_regs[i].bits;
@@ -1279,7 +1306,7 @@ static int stm8_arch_state(struct target *target)
 static int stm8_step(struct target *target, int current,
                target_addr_t address, int handle_breakpoints)
 {
-       LOG_DEBUG("%" PRIx32 " " TARGET_ADDR_FMT " %" PRIx32,
+       LOG_DEBUG("%x " TARGET_ADDR_FMT " %x",
                current, address, handle_breakpoints);
 
        /* get pointers to arch-specific information */
@@ -1660,17 +1687,6 @@ static int stm8_examine(struct target *target)
 
        if (!target_was_examined(target)) {
                if (!stm8->swim_configured) {
-                       /* set SWIM_CSR = 0xa0 (enable mem access & mask reset) */
-                       LOG_DEBUG("writing A0 to SWIM_CSR (SAFE_MASK + SWIM_DM)");
-                       retval = stm8_write_u8(target, SWIM_CSR, SAFE_MASK + SWIM_DM);
-                       if (retval != ERROR_OK)
-                               return retval;
-                       /* set high speed */
-                       LOG_DEBUG("writing B0 to SWIM_CSR (SAFE_MASK + SWIM_DM + HS)");
-                       retval = stm8_write_u8(target, SWIM_CSR, SAFE_MASK + SWIM_DM + HS);
-                       if (retval != ERROR_OK)
-                               return retval;
-                       jtag_config_khz(1);
                        stm8->swim_configured = true;
                        /*
                                Now is the time to deassert reset if connect_under_reset.
@@ -1858,7 +1874,7 @@ static int stm8_run_algorithm(struct target *target, int num_mem_params,
                        continue;
 
                struct reg *reg = register_get_by_name(stm8->core_cache,
-                               reg_params[i].reg_name, 0);
+                               reg_params[i].reg_name, false);
 
                if (!reg) {
                        LOG_ERROR("BUG: register '%s' not found", reg_params[i].reg_name);
@@ -1892,7 +1908,7 @@ static int stm8_run_algorithm(struct target *target, int num_mem_params,
        for (int i = 0; i < num_reg_params; i++) {
                if (reg_params[i].direction != PARAM_OUT) {
                        struct reg *reg = register_get_by_name(stm8->core_cache,
-                                       reg_params[i].reg_name, 0);
+                                       reg_params[i].reg_name, false);
                        if (!reg) {
                                LOG_ERROR("BUG: register '%s' not found",
                                                reg_params[i].reg_name);
@@ -1927,7 +1943,7 @@ static int stm8_run_algorithm(struct target *target, int num_mem_params,
        return ERROR_OK;
 }
 
-int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
+static int stm8_jim_configure(struct target *target, struct jim_getopt_info *goi)
 {
        struct stm8_common *stm8 = target_to_stm8(target);
        jim_wide w;
@@ -1936,7 +1952,7 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
 
        arg = Jim_GetString(goi->argv[0], NULL);
        if (!strcmp(arg, "-blocksize")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -1946,16 +1962,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->blocksize = w;
-               LOG_DEBUG("blocksize=%8.8x", stm8->blocksize);
+               LOG_DEBUG("blocksize=%8.8" PRIx32, stm8->blocksize);
                return JIM_OK;
        }
        if (!strcmp(arg, "-flashstart")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -1965,16 +1981,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->flashstart = w;
-               LOG_DEBUG("flashstart=%8.8x", stm8->flashstart);
+               LOG_DEBUG("flashstart=%8.8" PRIx32, stm8->flashstart);
                return JIM_OK;
        }
        if (!strcmp(arg, "-flashend")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -1984,16 +2000,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->flashend = w;
-               LOG_DEBUG("flashend=%8.8x", stm8->flashend);
+               LOG_DEBUG("flashend=%8.8" PRIx32, stm8->flashend);
                return JIM_OK;
        }
        if (!strcmp(arg, "-eepromstart")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2003,16 +2019,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->eepromstart = w;
-               LOG_DEBUG("eepromstart=%8.8x", stm8->eepromstart);
+               LOG_DEBUG("eepromstart=%8.8" PRIx32, stm8->eepromstart);
                return JIM_OK;
        }
        if (!strcmp(arg, "-eepromend")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2022,16 +2038,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->eepromend = w;
-               LOG_DEBUG("eepromend=%8.8x", stm8->eepromend);
+               LOG_DEBUG("eepromend=%8.8" PRIx32, stm8->eepromend);
                return JIM_OK;
        }
        if (!strcmp(arg, "-optionstart")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2041,16 +2057,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->optionstart = w;
-               LOG_DEBUG("optionstart=%8.8x", stm8->optionstart);
+               LOG_DEBUG("optionstart=%8.8" PRIx32, stm8->optionstart);
                return JIM_OK;
        }
        if (!strcmp(arg, "-optionend")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2060,16 +2076,16 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                        return JIM_ERR;
                }
 
-               e = Jim_GetOpt_Wide(goi, &w);
+               e = jim_getopt_wide(goi, &w);
                if (e != JIM_OK)
                        return e;
 
                stm8->optionend = w;
-               LOG_DEBUG("optionend=%8.8x", stm8->optionend);
+               LOG_DEBUG("optionend=%8.8" PRIx32, stm8->optionend);
                return JIM_OK;
        }
        if (!strcmp(arg, "-enable_step_irq")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2078,7 +2094,7 @@ int stm8_jim_configure(struct target *target, Jim_GetOptInfo *goi)
                return JIM_OK;
        }
        if (!strcmp(arg, "-enable_stm8l")) {
-               e = Jim_GetOpt_String(goi, &arg, NULL);
+               e = jim_getopt_string(goi, &arg, NULL);
                if (e != JIM_OK)
                        return e;
 
@@ -2141,7 +2157,7 @@ static const struct command_registration stm8_exec_command_handlers[] = {
        COMMAND_REGISTRATION_DONE
 };
 
-const struct command_registration stm8_command_handlers[] = {
+static const struct command_registration stm8_command_handlers[] = {
        {
                .name = "stm8",
                .mode = COMMAND_ANY,