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;
LOG_INFO("adapter-specific clock speed value %d", jtag_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
unsigned jtag_get_speed_khz(void)
{
- return speed_khz;
+ return adapter_config.speed_khz;
}
static int adapter_khz_to_speed(unsigned khz, int *speed)
{
LOG_DEBUG("convert khz to interface specific speed value");
- speed_khz = khz;
+ adapter_config.speed_khz = khz;
if (!is_adapter_initialized())
return ERROR_OK;
LOG_DEBUG("have interface set up");
int jtag_config_khz(unsigned khz)
{
LOG_DEBUG("handle jtag khz");
- clock_mode = CLOCK_MODE_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);
int jtag_config_rclk(unsigned fallback_speed_khz)
{
LOG_DEBUG("handle jtag rclk");
- clock_mode = CLOCK_MODE_RCLK;
- rclk_fallback_speed_khz = fallback_speed_khz;
+ 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 jtag_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);
break;
case CLOCK_MODE_RCLK:
- jtag_rclk_to_speed(rclk_fallback_speed_khz, speed);
+ jtag_rclk_to_speed(adapter_config.rclk_fallback_speed_khz, speed);
break;
default:
LOG_ERROR("BUG: unknown jtag clock mode");