ftdi: Report an error if no ftdi_vid_pid is specified
[fw/openocd] / src / jtag / drivers / ftdi.c
index 60387a98f9c6c8b379fe2121f99ce7fd695cf192..f1d28d2fd26e826ded388dd238cb770d8100ec5f 100644 (file)
@@ -213,7 +213,7 @@ static int ftdi_set_signal(const struct signal *s, char value)
        return ERROR_OK;
 }
 
-static int ftdi_get_signal(const struct signal *s, uint16_t * value_out)
+static int ftdi_get_signal(const struct signal *s, uint16_t *value_out)
 {
        uint8_t data_low = 0;
        uint8_t data_high = 0;
@@ -517,46 +517,40 @@ static void ftdi_execute_scan(struct jtag_command *cmd)
                tap_state_name(tap_get_end_state()));
 }
 
-static void ftdi_execute_reset(struct jtag_command *cmd)
+static int ftdi_reset(int trst, int srst)
 {
-       LOG_DEBUG_IO("reset trst: %i srst %i",
-               cmd->cmd.reset->trst, cmd->cmd.reset->srst);
-
-       if (cmd->cmd.reset->trst == 1
-           || (cmd->cmd.reset->srst
-               && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
-               tap_set_state(TAP_RESET);
-
-       struct signal *trst = find_signal_by_name("nTRST");
-       if (cmd->cmd.reset->trst == 1) {
-               if (trst)
-                       ftdi_set_signal(trst, '0');
+       struct signal *sig_ntrst = find_signal_by_name("nTRST");
+       struct signal *sig_nsrst = find_signal_by_name("nSRST");
+
+       LOG_DEBUG_IO("reset trst: %i srst %i", trst, srst);
+
+       if (trst == 1) {
+               if (sig_ntrst)
+                       ftdi_set_signal(sig_ntrst, '0');
                else
                        LOG_ERROR("Can't assert TRST: nTRST signal is not defined");
-       } else if (trst && jtag_get_reset_config() & RESET_HAS_TRST &&
-                       cmd->cmd.reset->trst == 0) {
+       } else if (sig_ntrst && jtag_get_reset_config() & RESET_HAS_TRST &&
+                       trst == 0) {
                if (jtag_get_reset_config() & RESET_TRST_OPEN_DRAIN)
-                       ftdi_set_signal(trst, 'z');
+                       ftdi_set_signal(sig_ntrst, 'z');
                else
-                       ftdi_set_signal(trst, '1');
+                       ftdi_set_signal(sig_ntrst, '1');
        }
 
-       struct signal *srst = find_signal_by_name("nSRST");
-       if (cmd->cmd.reset->srst == 1) {
-               if (srst)
-                       ftdi_set_signal(srst, '0');
+       if (srst == 1) {
+               if (sig_nsrst)
+                       ftdi_set_signal(sig_nsrst, '0');
                else
                        LOG_ERROR("Can't assert SRST: nSRST signal is not defined");
-       } else if (srst && jtag_get_reset_config() & RESET_HAS_SRST &&
-                       cmd->cmd.reset->srst == 0) {
+       } else if (sig_nsrst && jtag_get_reset_config() & RESET_HAS_SRST &&
+                       srst == 0) {
                if (jtag_get_reset_config() & RESET_SRST_PUSH_PULL)
-                       ftdi_set_signal(srst, '1');
+                       ftdi_set_signal(sig_nsrst, '1');
                else
-                       ftdi_set_signal(srst, 'z');
+                       ftdi_set_signal(sig_nsrst, 'z');
        }
 
-       LOG_DEBUG_IO("trst: %i, srst: %i",
-               cmd->cmd.reset->trst, cmd->cmd.reset->srst);
+       return mpsse_flush(mpsse_ctx);
 }
 
 static void ftdi_execute_sleep(struct jtag_command *cmd)
@@ -597,9 +591,6 @@ static void ftdi_execute_stableclocks(struct jtag_command *cmd)
 static void ftdi_execute_command(struct jtag_command *cmd)
 {
        switch (cmd->type) {
-               case JTAG_RESET:
-                       ftdi_execute_reset(cmd);
-                       break;
                case JTAG_RUNTEST:
                        ftdi_execute_runtest(cmd);
                        break;
@@ -656,6 +647,11 @@ static int ftdi_initialize(void)
        else
                LOG_DEBUG("ftdi interface using shortest path jtag state transitions");
 
+       if (!ftdi_vid[0] && !ftdi_pid[0]) {
+               LOG_ERROR("Please specify ftdi_vid_pid");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
        for (int i = 0; ftdi_vid[i] || ftdi_pid[i]; i++) {
                mpsse_ctx = mpsse_open(&ftdi_vid[i], &ftdi_pid[i], ftdi_device_desc,
                                ftdi_serial, jtag_usb_get_location(), ftdi_channel);
@@ -1203,14 +1199,6 @@ static void ftdi_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_cl
        ftdi_swd_queue_cmd(cmd, NULL, value, ap_delay_clk);
 }
 
-static int_least32_t ftdi_swd_frequency(int_least32_t hz)
-{
-       if (hz > 0)
-               freq = mpsse_set_frequency(mpsse_ctx, hz);
-
-       return freq;
-}
-
 static int ftdi_swd_switch_seq(enum swd_special_seq seq)
 {
        switch (seq) {
@@ -1239,7 +1227,6 @@ static int ftdi_swd_switch_seq(enum swd_special_seq seq)
 
 static const struct swd_driver ftdi_swd = {
        .init = ftdi_swd_init,
-       .frequency = ftdi_swd_frequency,
        .switch_seq = ftdi_swd_switch_seq,
        .read_reg = ftdi_swd_read_reg,
        .write_reg = ftdi_swd_write_reg,
@@ -1248,17 +1235,23 @@ static const struct swd_driver ftdi_swd = {
 
 static const char * const ftdi_transports[] = { "jtag", "swd", NULL };
 
-struct jtag_interface ftdi_interface = {
-       .name = "ftdi",
+static struct jtag_interface ftdi_interface = {
        .supported = DEBUG_CAP_TMS_SEQ,
-       .commands = ftdi_command_handlers,
+       .execute_queue = ftdi_execute_queue,
+};
+
+struct adapter_driver ftdi_adapter_driver = {
+       .name = "ftdi",
        .transports = ftdi_transports,
-       .swd = &ftdi_swd,
+       .commands = ftdi_command_handlers,
 
        .init = ftdi_initialize,
        .quit = ftdi_quit,
+       .reset = ftdi_reset,
        .speed = ftdi_speed,
-       .speed_div = ftdi_speed_div,
        .khz = ftdi_khz,
-       .execute_queue = ftdi_execute_queue,
+       .speed_div = ftdi_speed_div,
+
+       .jtag_ops = &ftdi_interface,
+       .swd_ops = &ftdi_swd,
 };