⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_jtag.patch

📁 网上流传的usb_blaster原理图里的CPLD源码,主要是实现usb时序转换成JATG时序输出!
💻 PATCH
📖 第 1 页 / 共 2 页
字号:
+	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 + -