diff --git a/src/device.hpp b/src/device.hpp index 7295772..c913402 100644 --- a/src/device.hpp +++ b/src/device.hpp @@ -52,6 +52,8 @@ class Device { virtual int idCode() = 0; virtual void reset(); + virtual bool connectJtagToMCU() {return false;} + protected: Jtag *_jtag; std::string _filename; diff --git a/src/gowin.cpp b/src/gowin.cpp index 5b84762..f49f187 100644 --- a/src/gowin.cpp +++ b/src/gowin.cpp @@ -58,6 +58,7 @@ using namespace std; # define STATUS_FLASH_LOCK (1 << 17) #define EF_PROGRAM 0x71 #define EFLASH_ERASE 0x75 +#define SWITCH_TO_MCU_JTAG 0x7a /* BSCAN spi (external flash) (see below for details) */ /* most common pins def */ @@ -576,6 +577,12 @@ bool Gowin::flashFLASH(uint32_t page, uint8_t *data, int length) return true; } +bool Gowin::connectJtagToMCU() +{ + wr_rd(SWITCH_TO_MCU_JTAG, NULL, 0, NULL, 0); + return true; +} + /* TN653 p. 9 */ bool Gowin::flashSRAM(uint8_t *data, int length) { diff --git a/src/gowin.hpp b/src/gowin.hpp index 2ad9b32..707a081 100644 --- a/src/gowin.hpp +++ b/src/gowin.hpp @@ -26,6 +26,7 @@ class Gowin: public Device, SPIInterface { void reset() override; void program(unsigned int offset, bool unprotect_flash) override; void programFlash(); + bool connectJtagToMCU() override; /* spi interface */ virtual bool protect_flash(uint32_t len) override { diff --git a/src/main.cpp b/src/main.cpp index b4922a9..6b8fa6b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -79,6 +79,7 @@ struct arguments { int port; string interface; string mcufw; + bool conmcu; }; int run_xvc_server(const struct arguments &args, const cable_t &cable, @@ -538,6 +539,13 @@ int main(int argc, char **argv) } } + if (args.conmcu == true) { + fpga->connectJtagToMCU(); + delete(fpga); + delete(jtag); + return EXIT_SUCCESS; + } + /* unprotect SPI flash */ if (args.unprotect_flash && args.bit_file.empty()) { fpga->unprotect_flash(); @@ -716,6 +724,8 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p cxxopts::value(args->port)) ("mcufw", "Microcontroller firmware", cxxopts::value(args->mcufw)) + ("conmcu", "Connect JTAG to MCU", + cxxopts::value(args->conmcu)) ("V,Version", "Print program version"); options.parse_positional({"bitstream"}); @@ -846,7 +856,8 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p !args->protect_flash && !args->unprotect_flash && !args->xvc && - !args->reset) { + !args->reset && + !args->conmcu) { printError("Error: bitfile not specified"); cout << options.help() << endl; throw std::exception();