struct adapter_driver *adapter_driver;
const char * const jtag_only[] = { "jtag", NULL };
+enum adapter_clk_mode {
+ CLOCK_MODE_UNSELECTED = 0,
+ CLOCK_MODE_KHZ,
+ CLOCK_MODE_RCLK
+};
+
/**
* Adapter configuration
*/
static struct {
+ bool adapter_initialized;
char *usb_location;
+ enum adapter_clk_mode clock_mode;
+ int speed_khz;
+ int rclk_fallback_speed_khz;
} adapter_config;
-/* speed in kHz*/
-static int speed_khz;
-/* speed to fallback to when RCLK is requested but not supported */
-static int rclk_fallback_speed_khz;
-static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
-
-static bool adapter_initialized;
-
bool is_adapter_initialized(void)
{
- return adapter_initialized;
+ return adapter_config.adapter_initialized;
}
/**
retval = adapter_driver->init();
if (retval != ERROR_OK)
return retval;
- adapter_initialized = true;
+ adapter_config.adapter_initialized = true;
if (!adapter_driver->speed) {
LOG_INFO("This adapter doesn't support configurable speed");
return ERROR_OK;
}
- if (clock_mode == CLOCK_MODE_UNSELECTED) {
+ if (adapter_config.clock_mode == CLOCK_MODE_UNSELECTED) {
LOG_ERROR("An adapter speed is not selected in the init script."
" Insert a call to \"adapter speed\" or \"jtag_rclk\" to proceed.");
return ERROR_JTAG_INIT_FAILED;
}
- int requested_khz = jtag_get_speed_khz();
+ int requested_khz = adapter_get_speed_khz();
int actual_khz = requested_khz;
- int jtag_speed_var = 0;
- retval = jtag_get_speed(&jtag_speed_var);
+ int speed_var = 0;
+ retval = adapter_get_speed(&speed_var);
if (retval != ERROR_OK)
return retval;
- retval = adapter_driver->speed(jtag_speed_var);
+ retval = adapter_driver->speed(speed_var);
if (retval != ERROR_OK)
return retval;
- retval = jtag_get_speed_readable(&actual_khz);
+ retval = adapter_get_speed_readable(&actual_khz);
if (retval != ERROR_OK)
- LOG_INFO("adapter-specific clock speed value %d", jtag_speed_var);
+ LOG_INFO("adapter-specific clock speed value %d", speed_var);
else if (actual_khz) {
/* Adaptive clocking -- JTAG-specific */
- if ((clock_mode == CLOCK_MODE_RCLK)
- || ((clock_mode == CLOCK_MODE_KHZ) && !requested_khz)) {
+ if ((adapter_config.clock_mode == CLOCK_MODE_RCLK)
+ || ((adapter_config.clock_mode == CLOCK_MODE_KHZ) && !requested_khz)) {
LOG_INFO("RCLK (adaptive clock speed) not supported - fallback to %d kHz"
, actual_khz);
} else
LOG_ERROR("failed: %d", result);
}
+ free(adapter_config.usb_location);
+
struct jtag_tap *t = jtag_all_taps();
while (t) {
struct jtag_tap *n = t->next_tap;
return ERROR_OK;
}
-unsigned jtag_get_speed_khz(void)
+unsigned int adapter_get_speed_khz(void)
{
- return speed_khz;
+ return adapter_config.speed_khz;
}
-static int adapter_khz_to_speed(unsigned khz, int *speed)
+static int adapter_khz_to_speed(unsigned int khz, int *speed)
{
- LOG_DEBUG("convert khz to interface specific speed value");
- speed_khz = khz;
+ LOG_DEBUG("convert khz to adapter specific speed value");
+ adapter_config.speed_khz = khz;
if (!is_adapter_initialized())
return ERROR_OK;
- LOG_DEBUG("have interface set up");
+ LOG_DEBUG("have adapter set up");
if (!adapter_driver->khz) {
- LOG_ERROR("Translation from khz to jtag_speed not implemented");
+ LOG_ERROR("Translation from khz to adapter speed not implemented");
return ERROR_FAIL;
}
int speed_div1;
- int retval = adapter_driver->khz(jtag_get_speed_khz(), &speed_div1);
+ int retval = adapter_driver->khz(adapter_get_speed_khz(), &speed_div1);
if (retval != ERROR_OK)
return retval;
*speed = speed_div1;
return ERROR_OK;
}
-static int jtag_rclk_to_speed(unsigned fallback_speed_khz, int *speed)
+static int adapter_rclk_to_speed(unsigned int fallback_speed_khz, int *speed)
{
int retval = adapter_khz_to_speed(0, speed);
if ((retval != ERROR_OK) && fallback_speed_khz) {
return retval;
}
-static int jtag_set_speed(int speed)
+static int adapter_set_speed(int speed)
{
/* this command can be called during CONFIG,
- * in which case jtag isn't initialized */
+ * in which case adapter isn't initialized */
return is_adapter_initialized() ? adapter_driver->speed(speed) : ERROR_OK;
}
-int jtag_config_khz(unsigned khz)
+int adapter_config_khz(unsigned int khz)
{
- LOG_DEBUG("handle jtag khz");
- clock_mode = CLOCK_MODE_KHZ;
+ LOG_DEBUG("handle adapter khz");
+ adapter_config.clock_mode = CLOCK_MODE_KHZ;
int speed = 0;
int retval = adapter_khz_to_speed(khz, &speed);
- return (retval != ERROR_OK) ? retval : jtag_set_speed(speed);
+ return (retval != ERROR_OK) ? retval : adapter_set_speed(speed);
}
-int jtag_config_rclk(unsigned fallback_speed_khz)
+int adapter_config_rclk(unsigned int fallback_speed_khz)
{
- LOG_DEBUG("handle jtag rclk");
- clock_mode = CLOCK_MODE_RCLK;
- rclk_fallback_speed_khz = fallback_speed_khz;
+ LOG_DEBUG("handle adapter rclk");
+ adapter_config.clock_mode = CLOCK_MODE_RCLK;
+ adapter_config.rclk_fallback_speed_khz = fallback_speed_khz;
int speed = 0;
- int retval = jtag_rclk_to_speed(fallback_speed_khz, &speed);
- return (retval != ERROR_OK) ? retval : jtag_set_speed(speed);
+ int retval = adapter_rclk_to_speed(fallback_speed_khz, &speed);
+ return (retval != ERROR_OK) ? retval : adapter_set_speed(speed);
}
-int jtag_get_speed(int *speed)
+int adapter_get_speed(int *speed)
{
- switch (clock_mode) {
+ switch (adapter_config.clock_mode) {
case CLOCK_MODE_KHZ:
- adapter_khz_to_speed(jtag_get_speed_khz(), speed);
+ adapter_khz_to_speed(adapter_get_speed_khz(), speed);
break;
case CLOCK_MODE_RCLK:
- jtag_rclk_to_speed(rclk_fallback_speed_khz, speed);
+ adapter_rclk_to_speed(adapter_config.rclk_fallback_speed_khz, speed);
break;
default:
- LOG_ERROR("BUG: unknown jtag clock mode");
+ LOG_ERROR("BUG: unknown adapter clock mode");
return ERROR_FAIL;
}
return ERROR_OK;
}
-int jtag_get_speed_readable(int *khz)
+int adapter_get_speed_readable(int *khz)
{
- int jtag_speed_var = 0;
- int retval = jtag_get_speed(&jtag_speed_var);
+ int speed_var = 0;
+ int retval = adapter_get_speed(&speed_var);
if (retval != ERROR_OK)
return retval;
if (!is_adapter_initialized())
return ERROR_OK;
if (!adapter_driver->speed_div) {
- LOG_ERROR("Translation from jtag_speed to khz not implemented");
+ LOG_ERROR("Translation from adapter speed to khz not implemented");
return ERROR_FAIL;
}
- return adapter_driver->speed_div(jtag_speed_var, khz);
+ return adapter_driver->speed_div(speed_var, khz);
}
/*
continue;
if (adapter_drivers[i]->commands) {
- retval = register_commands(CMD_CTX, NULL,
- adapter_drivers[i]->commands);
+ retval = register_commands(CMD_CTX, NULL, adapter_drivers[i]->commands);
if (retval != ERROR_OK)
return retval;
}
unsigned khz = 0;
COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], khz);
- retval = jtag_config_khz(khz);
+ retval = adapter_config_khz(khz);
if (retval != ERROR_OK)
return retval;
}
- int cur_speed = jtag_get_speed_khz();
- retval = jtag_get_speed_readable(&cur_speed);
+ int cur_speed = adapter_get_speed_khz();
+ retval = adapter_get_speed_readable(&cur_speed);
if (retval != ERROR_OK)
return retval;
* @todo Remove internal assumptions that all debug adapters use JTAG for
* transport. Various types and data structures are not named generically.
*/
-int interface_register_commands(struct command_context *ctx)
+int adapter_register_commands(struct command_context *ctx)
{
return register_commands(ctx, NULL, interface_command_handlers);
}