aboutsummaryrefslogtreecommitdiff
path: root/src/jtag/drivers/versaloon/usbtoxxx
diff options
context:
space:
mode:
authorFatih Aşıcı <fatih.asici@gmail.com>2014-02-16 10:12:39 +0100
committerAndreas Fritiofson <andreas.fritiofson@gmail.com>2014-07-03 19:43:01 +0000
commit5f9c59409b193c3f3f1408db43ad7d05e004d687 (patch)
tree6d99a3c97fea442072f96f3b345414bcf7a608c5 /src/jtag/drivers/versaloon/usbtoxxx
parentd48b47e4329c6fa51f18e759281ba13e01b85394 (diff)
vsllink: Add SWD support
Tested with stm32f1x, stm32f4x and kl25 targets using SWD transport. Change-Id: I118d07371b53f402ea9ac73f874460a309c05100 Signed-off-by: Fatih Aşıcı <fatih.asici@gmail.com> Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/1947 Tested-by: jenkins
Diffstat (limited to 'src/jtag/drivers/versaloon/usbtoxxx')
-rw-r--r--src/jtag/drivers/versaloon/usbtoxxx/usbtoswd.c29
-rw-r--r--src/jtag/drivers/versaloon/usbtoxxx/usbtoxxx.h3
2 files changed, 24 insertions, 8 deletions
diff --git a/src/jtag/drivers/versaloon/usbtoxxx/usbtoswd.c b/src/jtag/drivers/versaloon/usbtoxxx/usbtoswd.c
index b8d27af9..cd9d51c0 100644
--- a/src/jtag/drivers/versaloon/usbtoxxx/usbtoswd.c
+++ b/src/jtag/drivers/versaloon/usbtoxxx/usbtoswd.c
@@ -30,7 +30,7 @@
#include "usbtoxxx.h"
#include "usbtoxxx_internal.h"
-RESULT usbtoswd_callback(void *p, uint8_t *src, uint8_t *processed)
+RESULT usbtoswd_read_callback(void *p, uint8_t *src, uint8_t *processed)
{
struct versaloon_pending_t *pending = (struct versaloon_pending_t *)p;
@@ -40,6 +40,18 @@ RESULT usbtoswd_callback(void *p, uint8_t *src, uint8_t *processed)
return ERROR_OK;
}
+RESULT usbtoswd_write_callback(void *p, uint8_t *src, uint8_t *processed)
+{
+ struct versaloon_pending_t *pending = (struct versaloon_pending_t *)p;
+
+ if (pending->extra_data != NULL)
+ *((uint8_t *)pending->extra_data) = src[0];
+
+ /* mark it processed to ignore other input data */
+ *processed = 1;
+ return ERROR_OK;
+}
+
RESULT usbtoswd_init(uint8_t interface_index)
{
return usbtoxxx_init_command(USB_TO_SWD, interface_index);
@@ -69,7 +81,8 @@ RESULT usbtoswd_config(uint8_t interface_index, uint8_t trn, uint16_t retry,
return usbtoxxx_conf_command(USB_TO_SWD, interface_index, cfg_buf, 5);
}
-RESULT usbtoswd_seqout(uint8_t interface_index, uint8_t *data, uint16_t bitlen)
+RESULT usbtoswd_seqout(uint8_t interface_index, const uint8_t *data,
+ uint16_t bitlen)
{
uint16_t bytelen = (bitlen + 7) >> 3;
@@ -130,14 +143,16 @@ RESULT usbtoswd_transact(uint8_t interface_index, uint8_t request,
memset(buff + 1, 0, 4);
versaloon_set_extra_data(ack);
- versaloon_set_callback(usbtoswd_callback);
if (request & 0x04) {
/* read */
- return usbtoxxx_inout_command(USB_TO_SWD, interface_index, buff, 5, 5,
- (uint8_t *)data, 1, 4, 0);
+ versaloon_set_callback(usbtoswd_read_callback);
} else {
/* write */
- return usbtoxxx_inout_command(USB_TO_SWD, interface_index, buff, 5, 5,
- NULL, 0, 0, 0);
+ versaloon_set_callback(usbtoswd_write_callback);
}
+
+ /* Input buffer must be passed even for write operations. Otherwise
+ * the callback function is not called and ack value is not set. */
+ return usbtoxxx_inout_command(USB_TO_SWD, interface_index, buff, 5, 5,
+ (uint8_t *)data, 1, 4, 0);
}
diff --git a/src/jtag/drivers/versaloon/usbtoxxx/usbtoxxx.h b/src/jtag/drivers/versaloon/usbtoxxx/usbtoxxx.h
index 83139fcc..fa53062b 100644
--- a/src/jtag/drivers/versaloon/usbtoxxx/usbtoxxx.h
+++ b/src/jtag/drivers/versaloon/usbtoxxx/usbtoxxx.h
@@ -183,7 +183,8 @@ RESULT usbtoswd_init(uint8_t interface_index);
RESULT usbtoswd_fini(uint8_t interface_index);
RESULT usbtoswd_config(uint8_t interface_index, uint8_t trn, uint16_t retry,
uint16_t dly);
-RESULT usbtoswd_seqout(uint8_t interface_index, uint8_t *data, uint16_t bitlen);
+RESULT usbtoswd_seqout(uint8_t interface_index, const uint8_t *data,
+ uint16_t bitlen);
RESULT usbtoswd_seqin(uint8_t interface_index, uint8_t *data, uint16_t bitlen);
RESULT usbtoswd_transact(uint8_t interface_index, uint8_t request,
uint32_t *data, uint8_t *ack);