diff --git a/README.md b/README.md index 6ad5302..c10a47c 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,8 @@ openFPGALoader -- a program to flash FPGA --vid arg probe Vendor ID --pid arg probe Product ID --cable-index arg probe index (FTDI and cmsisDAP) + --busdev-num arg select a probe by it bus and device number + (bus_num:device_addr) --ftdi-serial arg FTDI chip serial number --ftdi-channel arg FTDI chip channel number (channels 0-3 map to A-D) diff --git a/src/main.cpp b/src/main.cpp index 8fe91f2..090e032 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -68,6 +68,8 @@ struct arguments { uint16_t vid; uint16_t pid; int16_t cable_index; + int8_t bus_addr; + int8_t device_addr; string ip_adr; uint32_t protect_flash; bool unprotect_flash; @@ -98,8 +100,10 @@ int main(int argc, char **argv) /* command line args. */ struct arguments args = {0, false, false, false, 0, "", "", "-", "", -1, 0, false, "-", false, false, false, false, Device::PRG_NONE, false, - false, false, "", "", "", -1, 0, false, -1, 0, 0, -1, "127.0.0.1", - 0, false, "", false, false, + false, false, "", "", "", -1, 0, false, -1, + /* vid, pid, index bus_addr, device_addr */ + 0, 0, -1, 0, 0, + "127.0.0.1", 0, false, "", false, false, /* xvc server */ false, 3721, "-", "", false, // mcufw conmcu @@ -215,6 +219,9 @@ int main(int argc, char **argv) cable.pid = args.pid; } + cable.bus_addr = args.bus_addr; + cable.device_addr = args.device_addr; + // always set this cable.config.index = args.cable_index; @@ -629,7 +636,7 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p { string freqo; - vector pins; + vector pins, bus_dev_num; bool verbose, quiet; int8_t verbose_level = -2; try { @@ -653,7 +660,8 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p ("vid", "probe Vendor ID", cxxopts::value(args->vid)) ("pid", "probe Product ID", cxxopts::value(args->pid)) ("cable-index", "probe index (FTDI and cmsisDAP)", cxxopts::value(args->cable_index)) - + ("busdev-num", "select a probe by it bus and device number (bus_num:device_addr)", + cxxopts::value>(bus_dev_num)) ("ftdi-serial", "FTDI chip serial number", cxxopts::value(args->ftdi_serial)) ("ftdi-channel", "FTDI chip channel number (channels 0-3 map to A-D)", cxxopts::value(args->ftdi_channel)) #if defined(USE_DEVICE_ARG) @@ -792,6 +800,20 @@ int parse_opt(int argc, char **argv, struct arguments *args, jtag_pins_conf_t *p } } + if (result.count("busdev-num")) { + if (bus_dev_num.size() != 2) { + printError("Error: busdev-num must be xx:yy"); + throw std::exception(); + } + try { + args->bus_addr = static_cast(std::stoi(bus_dev_num[0], nullptr, 0)); + args->device_addr = static_cast(std::stoi(bus_dev_num[1], nullptr, 0)); + } catch (std::exception &e) { + printError("Error: busdev-num invalid format: must be numeric values"); + throw std::exception(); + } + } + if (result.count("pins")) { if (pins.size() != 4) { printError("Error: pin_config need 4 pins");