jlink: Retrieve maximum speed from device.

If supported, the maximum transport speed is now retrieved from the
device.

Change-Id: I614f405ec91cf199c851781785fd26cbd10c37a6
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
Reviewed-on: http://openocd.zylin.com/2955
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
__archive__
Marc Schink 2015-09-21 14:27:49 +02:00 committed by Freddie Chopin
parent 442f1540d5
commit 4b608d7fea
1 changed files with 20 additions and 4 deletions

View File

@ -216,11 +216,23 @@ static int jlink_execute_queue(void)
static int jlink_speed(int speed) static int jlink_speed(int speed)
{ {
int ret; int ret;
uint32_t freq;
uint16_t div;
int max_speed;
if (speed > JLINK_MAX_SPEED) { if (jaylink_has_cap(caps, JAYLINK_DEV_CAP_GET_SPEEDS)) {
LOG_INFO("Reduce speed from %d kHz to %d kHz (maximum).", speed, ret = jaylink_get_speeds(devh, &freq, &div);
JLINK_MAX_SPEED);
speed = JLINK_MAX_SPEED; if (ret != JAYLINK_OK) {
LOG_ERROR("jaylink_get_speeds() failed: %s.",
jaylink_strerror_name(ret));
return ERROR_JTAG_DEVICE_ERROR;
}
freq = freq / 1000;
max_speed = freq / div;
} else {
max_speed = JLINK_MAX_SPEED;
} }
if (!speed) { if (!speed) {
@ -230,6 +242,10 @@ static int jlink_speed(int speed)
} }
speed = JAYLINK_SPEED_ADAPTIVE_CLOCKING; speed = JAYLINK_SPEED_ADAPTIVE_CLOCKING;
} else if (speed > max_speed) {
LOG_INFO("Reduced speed from %d kHz to %d kHz (maximum).", speed,
max_speed);
speed = max_speed;
} }
ret = jaylink_set_speed(devh, speed); ret = jaylink_set_speed(devh, speed);