diff --git a/README.md b/README.md index efaafe4..562020c 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,7 @@ openFPGALoader -- a program to flash cyclone10 LP FPGA -b, --board=BOARD board name, may be used instead of cable -c, --cable=CABLE jtag interface -d, --device=DEVICE device to use (/dev/ttyUSBx) + --ftdi-channel=CHANNEL FTDI chip channel number (channels 0-3 map to A-D) --detect detect FPGA --freq=FREQ jtag frequency (Hz) -f, --write-flash write bitstream in flash (default: false, only for diff --git a/src/main.cpp b/src/main.cpp index f219362..f5b9a2a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -44,6 +44,7 @@ struct arguments { string bit_file; string device; string cable; + int ftdi_channel; uint32_t freq; string board; bool pin_config; @@ -65,7 +66,7 @@ int main(int argc, char **argv) jtag_pins_conf_t pins_config = {0, 0, 0, 0}; /* command line args. */ - struct arguments args = {false, false, false, 0, "", "-", "-", 6000000, "-", + struct arguments args = {false, false, false, 0, "", "-", "-", -1, 6000000, "-", false, false, false, false, false, true, false}; /* parse arguments */ try { @@ -114,6 +115,16 @@ int main(int argc, char **argv) } cable = select_cable->second; + if (args.ftdi_channel != -1) { + if (cable.type != MODE_FTDI_SERIAL && cable.type != MODE_FTDI_BITBANG){ + printError("Error: FTDI channel param is for FTDI cables."); + return EXIT_FAILURE; + } + + int mapping[] = {INTERFACE_A, INTERFACE_B, INTERFACE_C, INTERFACE_D}; + cable.config.interface = mapping[args.ftdi_channel]; + } + /* jtag base */ Jtag *jtag; try { @@ -249,6 +260,7 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p ("b,board", "board name, may be used instead of cable", cxxopts::value(args->board)) ("c,cable", "jtag interface", cxxopts::value(args->cable)) + ("ftdi-channel", "FTDI chip channel number (channels 0-3 map to A-D)", cxxopts::value(args->ftdi_channel)) #ifdef USE_UDEV ("d,device", "device to use (/dev/ttyUSBx)", cxxopts::value(args->device)) @@ -317,6 +329,13 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p args->freq = static_cast(freq); } + if (result.count("ftdi-channel")) { + if (args->ftdi_channel < 0 || args->ftdi_channel > 3) { + printError("Error: valid FTDI channels are 0-3."); + throw std::exception(); + } + } + if (result.count("pins")) { if (pins.size() != 4) { printError("Error: pin_config need 4 pins");