aboutsummaryrefslogtreecommitdiff
path: root/src/server/ipdbg.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/ipdbg.c')
-rw-r--r--src/server/ipdbg.c36
1 files changed, 32 insertions, 4 deletions
diff --git a/src/server/ipdbg.c b/src/server/ipdbg.c
index 69d0f57..c1bdb29 100644
--- a/src/server/ipdbg.c
+++ b/src/server/ipdbg.c
@@ -10,11 +10,12 @@
#include <jtag/jtag.h>
#include <server/server.h>
#include <target/target.h>
+#include <pld/pld.h>
#include "ipdbg.h"
#define IPDBG_BUFFER_SIZE 16384
-#define IPDBG_MIN_NUM_OF_OPTIONS 4
+#define IPDBG_MIN_NUM_OF_OPTIONS 2
#define IPDBG_MAX_NUM_OF_OPTIONS 14
#define IPDBG_MIN_DR_LENGTH 11
#define IPDBG_MAX_DR_LENGTH 13
@@ -631,10 +632,8 @@ static int ipdbg_start(uint16_t port, struct jtag_tap *tap, uint32_t user_instru
}
} else {
int retval = ipdbg_create_hub(tap, user_instruction, data_register_length, virtual_ir, &hub);
- if (retval != ERROR_OK) {
- free(virtual_ir);
+ if (retval != ERROR_OK)
return retval;
- }
}
struct ipdbg_service *service = NULL;
@@ -716,6 +715,7 @@ COMMAND_HANDLER(handle_ipdbg_command)
uint32_t virtual_ir_length = 5;
uint32_t virtual_ir_value = 0x11;
struct ipdbg_virtual_ir_info *virtual_ir = NULL;
+ int user_num = 1;
if ((CMD_ARGC < IPDBG_MIN_NUM_OF_OPTIONS) || (CMD_ARGC > IPDBG_MAX_NUM_OF_OPTIONS))
return ERROR_COMMAND_SYNTAX_ERROR;
@@ -742,6 +742,34 @@ COMMAND_HANDLER(handle_ipdbg_command)
IPDBG_MIN_DR_LENGTH, IPDBG_MAX_DR_LENGTH);
return ERROR_FAIL;
}
+ } else if (strcmp(CMD_ARGV[i], "-pld") == 0) {
+ ++i;
+ if (i >= CMD_ARGC || CMD_ARGV[i][0] == '-')
+ return ERROR_COMMAND_SYNTAX_ERROR;
+ struct pld_device *device = get_pld_device_by_name_or_numstr(CMD_ARGV[i]);
+ if (!device || !device->driver) {
+ command_print(CMD, "pld device '#%s' is out of bounds or unknown", CMD_ARGV[i]);
+ return ERROR_FAIL;
+ }
+ COMMAND_PARSE_OPTIONAL_NUMBER(int, i, user_num);
+ struct pld_ipdbg_hub pld_hub;
+ struct pld_driver *driver = device->driver;
+ if (!driver->get_ipdbg_hub) {
+ command_print(CMD, "pld driver has no ipdbg support");
+ return ERROR_FAIL;
+ }
+ if (driver->get_ipdbg_hub(user_num, device, &pld_hub) != ERROR_OK) {
+ command_print(CMD, "unable to retrieve hub from pld driver");
+ return ERROR_FAIL;
+ }
+ if (!pld_hub.tap) {
+ command_print(CMD, "no tap received from pld driver");
+ return ERROR_FAIL;
+ }
+ hub_configured = true;
+ user_instruction = pld_hub.user_ir_code;
+ tap = pld_hub.tap;
+
} else if (strcmp(CMD_ARGV[i], "-vir") == 0) {
COMMAND_PARSE_OPTIONAL_NUMBER(u32, i, virtual_ir_value);
COMMAND_PARSE_OPTIONAL_NUMBER(u32, i, virtual_ir_length);