hla: add ability to change adapter speed (if supported)
As a note we need to cache the requested speed setting, as the hla interface may not be ready when the first adapter_khz is called. Change-Id: I2fa6807d5f0bd3f0365cf178bd10a230c39415a7 Signed-off-by: Spencer Oliver <spen@spen-soft.co.uk> Reviewed-on: http://openocd.zylin.com/2334 Tested-by: jenkins__archive__
parent
0ea9a66239
commit
ab0432176c
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
#include <target/target.h>
|
#include <target/target.h>
|
||||||
|
|
||||||
static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, HL_TRANSPORT_UNKNOWN, false, NULL, 0}, 0, 0 };
|
static struct hl_interface_s hl_if = { {0, 0, 0, 0, 0, HL_TRANSPORT_UNKNOWN, false, NULL, 0, -1}, 0, 0 };
|
||||||
|
|
||||||
int hl_interface_open(enum hl_transports tr)
|
int hl_interface_open(enum hl_transports tr)
|
||||||
{
|
{
|
||||||
|
@ -148,20 +148,31 @@ int hl_interface_init_reset(void)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dummy_khz(int khz, int *jtag_speed)
|
static int hl_interface_khz(int khz, int *jtag_speed)
|
||||||
{
|
{
|
||||||
*jtag_speed = khz;
|
*jtag_speed = hl_if.layout->api->speed(hl_if.handle, khz, true);
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dummy_speed_div(int speed, int *khz)
|
static int hl_interface_speed_div(int speed, int *khz)
|
||||||
{
|
{
|
||||||
*khz = speed;
|
*khz = speed;
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dummy_speed(int speed)
|
static int hl_interface_speed(int speed)
|
||||||
{
|
{
|
||||||
|
if (hl_if.layout->api->speed == NULL)
|
||||||
|
return ERROR_OK;
|
||||||
|
|
||||||
|
if (hl_if.handle == NULL) {
|
||||||
|
/* pass speed as initial param as interface not open yet */
|
||||||
|
hl_if.param.initial_interface_speed = speed;
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
hl_if.layout->api->speed(hl_if.handle, speed, false);
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -340,7 +351,7 @@ struct jtag_interface hl_interface = {
|
||||||
.init = hl_interface_init,
|
.init = hl_interface_init,
|
||||||
.quit = hl_interface_quit,
|
.quit = hl_interface_quit,
|
||||||
.execute_queue = hl_interface_execute_queue,
|
.execute_queue = hl_interface_execute_queue,
|
||||||
.speed = &dummy_speed,
|
.speed = &hl_interface_speed,
|
||||||
.khz = &dummy_khz,
|
.khz = &hl_interface_khz,
|
||||||
.speed_div = &dummy_speed_div,
|
.speed_div = &hl_interface_speed_div,
|
||||||
};
|
};
|
||||||
|
|
|
@ -50,6 +50,8 @@ struct hl_interface_param_s {
|
||||||
FILE *trace_f;
|
FILE *trace_f;
|
||||||
/** Trace module source clock rate */
|
/** Trace module source clock rate */
|
||||||
uint32_t trace_source_hz;
|
uint32_t trace_source_hz;
|
||||||
|
/** Initial interface clock clock speed */
|
||||||
|
int initial_interface_speed;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hl_interface_s {
|
struct hl_interface_s {
|
||||||
|
|
|
@ -78,6 +78,8 @@ struct hl_layout_api_s {
|
||||||
/** */
|
/** */
|
||||||
int (*custom_command) (void *handle, const char *command);
|
int (*custom_command) (void *handle, const char *command);
|
||||||
/** */
|
/** */
|
||||||
|
int (*speed)(void *handle, int khz, bool query);
|
||||||
|
/** */
|
||||||
enum target_state (*state) (void *fd);
|
enum target_state (*state) (void *fd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue