📄 usb_jtag.patch
字号:
+ if (cur_state != TAP_RTI)+ {+ usb_blaster_end_state(TAP_RTI);+ usb_blaster_state_move();+ }+ + /* execute num_cycles */+ usb_blaster_write(0, 0, 0);+ for (i = 0; i < num_cycles; i++)+ {+ usb_blaster_write(1, 0, 0);+ usb_blaster_write(0, 0, 0);+ }+ + /* finish in end_state */+ usb_blaster_end_state(saved_end_state);+ if (cur_state != end_state)+ usb_blaster_state_move();+}++void usb_blaster_scan(int ir_scan, enum scan_type type, u8 *buffer, int scan_size)+{+ enum tap_state saved_end_state = end_state;+ int bit_cnt;+ + if (ir_scan)+ usb_blaster_end_state(TAP_SI);+ else+ usb_blaster_end_state(TAP_SD);++ usb_blaster_state_move();+ usb_blaster_end_state(saved_end_state);++ for (bit_cnt = 0; bit_cnt < scan_size; bit_cnt++)+ {+ int tms, tdi;++ tms = (bit_cnt==scan_size-1) ? 1 : 0;++ /* if we're just reading the scan, but don't care about the output+ * default to outputting 'low', this also makes valgrind traces more readable,+ * as it removes the dependency on an uninitialised value+ */ ++ if (type != SCAN_IN)+ tdi = (buffer[bit_cnt/8] >> (bit_cnt % 8)) & 0x1;+ else+ tdi = 0;++ if (type == SCAN_OUT) /* Discard input */+ {+ usb_blaster_write(0, tms, tdi);+ usb_blaster_write(1, tms, tdi);+ }+ else+ {+ int retbit;++ usb_blaster_write(0, tms, tdi);+ retbit = usb_blaster_write_read(1, tms, tdi);++ if(retbit)+ buffer[(bit_cnt)/8] |= 1 << ((bit_cnt) % 8);+ else+ buffer[(bit_cnt)/8] &= ~(1 << ((bit_cnt) % 8));+ }+ }+ + /* Exit1 -> Pause */+ usb_blaster_write(0, 0, 0);+ usb_blaster_write(1, 0, 0);+ + if (ir_scan)+ cur_state = TAP_PI;+ else+ cur_state = TAP_PD;+ + if (cur_state != end_state)+ usb_blaster_state_move();+}++void usb_blaster_reset(int trst, int srst)+{+ DEBUG("TODO: usb_blaster_reset(%d,%d) isn't implemented!", trst, srst);+}++int usb_blaster_execute_queue()+{+ jtag_command_t *cmd = jtag_command_queue; /* currently processed command */+ jtag_command_t *first_unsent = cmd; /* next command that has to be sent */+ u8 *buffer;+ int scan_size; /* size of IR or DR scan */+ enum scan_type type;+ int i;+ int predicted_size = 0;+ int require_send = 0;++ usb_blaster_blink();++ while (cmd)+ {+ switch(cmd->type)+ {+ case JTAG_END_STATE:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("end_state: %i", cmd->cmd.end_state->end_state);+#endif+ if (cmd->cmd.end_state->end_state != -1)+ usb_blaster_end_state(cmd->cmd.end_state->end_state);+ break;+ case JTAG_RESET:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("reset trst: %i srst %i", cmd->cmd.reset->trst, cmd->cmd.reset->srst);+#endif+ if (cmd->cmd.reset->trst == 1)+ {+ cur_state = TAP_TLR;+ }+ usb_blaster_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);+ break;+ case JTAG_RUNTEST:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);+#endif+ if (cmd->cmd.runtest->end_state != -1)+ usb_blaster_end_state(cmd->cmd.runtest->end_state);+ usb_blaster_runtest(cmd->cmd.runtest->num_cycles);+ break;+ case JTAG_STATEMOVE:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("statemove end in %i", cmd->cmd.statemove->end_state);+#endif+ if (cmd->cmd.statemove->end_state != -1)+ usb_blaster_end_state(cmd->cmd.statemove->end_state);+ usb_blaster_state_move();+ break;+ case JTAG_PATHMOVE:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);+#endif+ usb_blaster_path_move(cmd->cmd.pathmove);+ break;+ case JTAG_SCAN:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("scan end in %i", cmd->cmd.scan->end_state);+#endif+ if (cmd->cmd.scan->end_state != -1)+ usb_blaster_end_state(cmd->cmd.scan->end_state);+ scan_size = jtag_build_buffer(cmd->cmd.scan, &buffer);+ type = jtag_scan_type(cmd->cmd.scan);+ usb_blaster_scan(cmd->cmd.scan->ir_scan, type, buffer, scan_size);+ if (jtag_read_buffer(buffer, cmd->cmd.scan) != ERROR_OK)+ return ERROR_JTAG_QUEUE_FAILED;+ if (buffer)+ free(buffer);+ break;+ case JTAG_SLEEP:+#ifdef _DEBUG_JTAG_IO_+ DEBUG("sleep", cmd->cmd.sleep->us);+#endif+ jtag_sleep(cmd->cmd.sleep->us);+ break;+ default:+ ERROR("BUG: unknown JTAG command type encountered");+ exit(-1);+ }+ cmd = cmd->next;+ }+ + return ERROR_OK;+}++int usb_blaster_init(void)+{+ u8 latency_timer;+ u8 buf[1];+ int retval;+ u32 bytes_written;+ +#if BUILD_USB_BLASTER_FTD2XX == 1+ FT_STATUS status;+#endif++#if BUILD_USB_BLASTER_FTD2XX == 1+ DEBUG("'usb_blaster' interface using FTD2XX");+#elif BUILD_USB_BLASTER_LIBFTDI == 1+ DEBUG("'usb_blaster' interface using libftdi");+#endif++#if BUILD_USB_BLASTER_FTD2XX == 1+ /* Open by device description */+ if (usb_blaster_device_desc == NULL)+ {+ WARNING("no usb_blaster device description specified, using default 'USB-Blaster'");+ usb_blaster_device_desc = "USB-Blaster";+ }+ +#if IS_WIN32 == 0+ /* Add non-standard Vid/Pid to the linux driver */+ if ((status = FT_SetVIDPID(usb_blaster_vid, usb_blaster_pid)) != FT_OK)+ {+ WARNING("couldn't add %4.4x:%4.4x", usb_blaster_vid, usb_blaster_pid);+ }+#endif++ if ((status = FT_OpenEx(usb_blaster_device_desc, FT_OPEN_BY_DESCRIPTION, &ftdih)) != FT_OK)+ {+ DWORD num_devices;+ + ERROR("unable to open ftdi device: %i", status);+ status = FT_ListDevices(&num_devices, NULL, FT_LIST_NUMBER_ONLY);+ if (status == FT_OK)+ {+ char **desc_array = malloc(sizeof(char*) * (num_devices + 1));+ int i;++ for (i = 0; i < num_devices; i++)+ desc_array[i] = malloc(64);+ desc_array[num_devices] = NULL;++ status = FT_ListDevices(desc_array, &num_devices, FT_LIST_ALL | FT_OPEN_BY_DESCRIPTION);++ if (status == FT_OK)+ {+ ERROR("ListDevices: %d\n", num_devices);+ for (i = 0; i < num_devices; i++)+ ERROR("%i: %s", i, desc_array[i]);+ }+ + for (i = 0; i < num_devices; i++)+ free(desc_array[i]);+ free(desc_array);+ }+ else+ {+ printf("ListDevices: NONE\n");+ }+ return ERROR_JTAG_INIT_FAILED;+ }++ if ((status = FT_SetLatencyTimer(ftdih, 2)) != FT_OK)+ {+ ERROR("unable to set latency timer: %i", status);+ return ERROR_JTAG_INIT_FAILED;+ }+ + if ((status = FT_GetLatencyTimer(ftdih, &latency_timer)) != FT_OK)+ {+ ERROR("unable to get latency timer: %i", status);+ return ERROR_JTAG_INIT_FAILED;+ }+ else+ {+ DEBUG("current latency timer: %i", latency_timer);+ }++ if ((status = FT_SetBitMode(ftdih, 0x00, 0)) != FT_OK)+ {+ ERROR("unable to disable bit i/o mode: %i", status);+ return ERROR_JTAG_INIT_FAILED;+ }+#elif BUILD_USB_BLASTER_LIBFTDI == 1+ if (ftdi_init(&ftdic) < 0)+ return ERROR_JTAG_INIT_FAILED;++ /* context, vendor id, product id */+ if (ftdi_usb_open(&ftdic, usb_blaster_vid, usb_blaster_pid) < 0)+ {+ ERROR("unable to open ftdi device: %s", ftdic.error_str);+ return ERROR_JTAG_INIT_FAILED;+ }++ if (ftdi_usb_reset(&ftdic) < 0)+ {+ ERROR("unable to reset ftdi device");+ return ERROR_JTAG_INIT_FAILED;+ }++ if (ftdi_set_latency_timer(&ftdic, 2) < 0)+ {+ ERROR("unable to set latency timer");+ return ERROR_JTAG_INIT_FAILED;+ }+ + if (ftdi_get_latency_timer(&ftdic, &latency_timer) < 0)+ {+ ERROR("unable to get latency timer");+ return ERROR_JTAG_INIT_FAILED;+ }+ else+ {+ DEBUG("current latency timer: %i", latency_timer);+ }++ ftdi_disable_bitbang(&ftdic);+#endif ++ usb_blaster_speed(jtag_speed);++#if 0+#if BUILD_USB_BLASTER_FTD2XX == 1+ if ((status = FT_Purge(ftdih, FT_PURGE_RX | FT_PURGE_TX)) != FT_OK)+ {+ ERROR("error purging ftd2xx device: %i", status);+ return ERROR_JTAG_INIT_FAILED;+ }+#elif BUILD_USB_BLASTER_LIBFTDI == 1+ if (ftdi_usb_purge_buffers(&ftdic) < 0)+ {+ ERROR("ftdi_purge_buffers: %s", ftdic.error_str);+ return ERROR_JTAG_INIT_FAILED;+ }+#endif +#endif++ return ERROR_OK;+}++void usb_blaster_blink(void)+{+ DEBUG("TODO: usb_blaster_blink() isn't implemented!");+}++int usb_blaster_quit(void)+{+#if BUILD_USB_BLASTER_FTD2XX == 1+ FT_STATUS status;++ status = FT_Close(ftdih);+#elif BUILD_USB_BLASTER_LIBFTDI == 1+ ftdi_usb_close(&ftdic);+ ftdi_deinit(&ftdic);+#endif++ return ERROR_OK;+}++int usb_blaster_handle_device_desc_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)+{+ if (argc == 1)+ {+ usb_blaster_device_desc = strdup(args[0]);+ }+ else+ {+ ERROR("expected exactly one argument to usb_blaster_device_desc <description>");+ }+ + return ERROR_OK;+}++int usb_blaster_handle_vid_pid_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)+{+ if (argc >= 2)+ {+ usb_blaster_vid = strtol(args[0], NULL, 0);+ usb_blaster_pid = strtol(args[1], NULL, 0);+ }+ else+ {+ WARNING("incomplete usb_blaster_vid_pid configuration directive");+ }+ + return ERROR_OK;+}Index: src/jtag/Makefile.am===================================================================--- src/jtag/Makefile.am (.../vendor/openocd) (Revision 49)+++ src/jtag/Makefile.am (.../branches/openocd-usb_jtag) (Revision 49)@@ -35,6 +35,16 @@ endif endif +if USB_BLASTER_LIBFTDI+USBBLASTERFILES = usb_blaster.c+else+if USB_BLASTER_FTD2XX+USBBLASTERFILES = usb_blaster.c+else+USB_BLASTERFILES =+endif+endif+ if AMTJTAGACCEL AMTJTAGACCELFILES = amt_jtagaccel.c else@@ -59,6 +69,6 @@ GW16012FILES = endif -libjtag_a_SOURCES = jtag.c $(BITBANGFILES) $(PARPORTFILES) $(FT2232FILES) $(AMTJTAGACCELFILES) $(EP93XXFILES) $(AT91RM9200FILES) $(GW16012FILES)+libjtag_a_SOURCES = jtag.c $(BITBANGFILES) $(PARPORTFILES) $(FT2232FILES) $(USBBLASTERFILES) $(AMTJTAGACCELFILES) $(EP93XXFILES) $(AT91RM9200FILES) $(GW16012FILES) noinst_HEADERS = bitbang.h jtag.hIndex: src/Makefile.am===================================================================--- src/Makefile.am (.../vendor/openocd) (Revision 49)+++ src/Makefile.am (.../branches/openocd-usb_jtag) (Revision 49)@@ -19,8 +19,12 @@ if FT2232_LIBFTDI FTDI2232LIB = -lftdi else+if USB_BLASTER_LIBFTDI+FTDI2232LIB = -lftdi+else FTDI2232LIB = endif+endif if IS_WIN32 if FTD2XXDIR@@ -35,8 +39,12 @@ if FT2232_FTD2XX FTD2XXLIB = $(FTD2XXLDADD) else+if USB_BLASTER_FTD2XX+FTD2XXLIB = $(FTD2XXLDADD)+else FTD2XXLIB = endif+endif openocd_LDADD = $(top_builddir)/src/xsvf/libxsvf.a \ $(top_builddir)/src/target/libtarget.a $(top_builddir)/src/jtag/libjtag.a \
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -