static int ftdi_execute_queue(void) { /* blink, if the current layout has that feature */ struct signal *led = find_signal_by_name("LED"); if (led) ftdi_set_signal(led, '1'); for (struct jtag_command *cmd = jtag_command_queue; cmd; cmd = cmd->next) { /* fill the write buffer with the desired command */ ftdi_execute_command(cmd); } if (led) ftdi_set_signal(led, '0'); int retval = mpsse_flush(mpsse_ctx); if (retval != ERROR_OK) LOG_ERROR("error while flushing MPSSE queue: %d", retval); return retval; }
static void ftdi_execute_reset(struct jtag_command *cmd) { DEBUG_JTAG_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 (trst && cmd->cmd.reset->trst == 1) { ftdi_set_signal(trst, '0'); } else if (trst && cmd->cmd.reset->trst == 0) { if (jtag_get_reset_config() & RESET_TRST_OPEN_DRAIN) ftdi_set_signal(trst, 'z'); else ftdi_set_signal(trst, '1'); } struct signal *srst = find_signal_by_name("nSRST"); if (srst && cmd->cmd.reset->srst == 1) { ftdi_set_signal(srst, '0'); } else if (srst && cmd->cmd.reset->srst == 0) { if (jtag_get_reset_config() & RESET_SRST_PUSH_PULL) ftdi_set_signal(srst, '1'); else ftdi_set_signal(srst, 'z'); } DEBUG_JTAG_IO("trst: %i, srst: %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst); }
static int ftdi_execute_swd_seq(struct jtag_command *cmd) { struct signal *swdoe = find_signal_by_name("SWDOE"); int retval = 0; DEBUG_JTAG_IO("SWD sending raw sequence, length %d bits", cmd->cmd.swd_seq->num_bits); retval |= ftdi_set_signal(swdoe, '1'); retval |= mpsse_clock_data_out(mpsse_ctx, cmd->cmd.swd_seq->bits, 0, cmd->cmd.swd_seq->num_bits, SWD_MODE); return (retval); }