hla: add ability to change adapter speed (if supported)
authorSpencer Oliver <spen@spen-soft.co.uk>
Thu, 9 Oct 2014 18:48:56 +0000 (19:48 +0100)
committerSpencer Oliver <spen@spen-soft.co.uk>
Thu, 15 Jan 2015 23:21:01 +0000 (23:21 +0000)
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
src/jtag/hla/hla_interface.c
src/jtag/hla/hla_interface.h
src/jtag/hla/hla_layout.h

index 44a7fc69f8917b821a0ed5a3a10beb1d6a637b88..c426f87a1e37d105f500879179b7f61cc4c638bc 100644 (file)
@@ -37,7 +37,7 @@
 
 #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)
 {
@@ -148,20 +148,31 @@ int hl_interface_init_reset(void)
        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;
 }
 
-static int dummy_speed_div(int speed, int *khz)
+static int hl_interface_speed_div(int speed, int *khz)
 {
        *khz = speed;
        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;
 }
 
@@ -340,7 +351,7 @@ struct jtag_interface hl_interface = {
        .init = hl_interface_init,
        .quit = hl_interface_quit,
        .execute_queue = hl_interface_execute_queue,
-       .speed = &dummy_speed,
-       .khz = &dummy_khz,
-       .speed_div = &dummy_speed_div,
+       .speed = &hl_interface_speed,
+       .khz = &hl_interface_khz,
+       .speed_div = &hl_interface_speed_div,
 };
index cb961bdea7897eb968a5cf172473c3a53400d274..aac1be30a09be039ed59c7962bb5b7484b07516e 100644 (file)
@@ -50,6 +50,8 @@ struct hl_interface_param_s {
        FILE *trace_f;
        /** Trace module source clock rate */
        uint32_t trace_source_hz;
+       /** Initial interface clock clock speed */
+       int initial_interface_speed;
 };
 
 struct hl_interface_s {
index df93cb69da0dec7a3623c27a633d5e4ab53f3940..e989f66599a50a3a5c1264fa4ede4bb9992bb040 100644 (file)
@@ -78,6 +78,8 @@ struct hl_layout_api_s {
        /** */
        int (*custom_command) (void *handle, const char *command);
        /** */
+       int (*speed)(void *handle, int khz, bool query);
+       /** */
        enum target_state (*state) (void *fd);
 };