blob: 5a549bbfbf4373471901dd8458914418c6df0f15 [file] [log] [blame]
diff --git a/src/main.c b/src/main.c
index 81e6e93..972cc92 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <getopt.h>
#include <confuse.h>
#include <ftdi.h>
@@ -90,6 +91,9 @@ int main(int argc, char *argv[])
normal variables
*/
int _read = 0, _erase = 0, _flash = 0;
+ int _vendor = 0x0403, _product = 0x6011;
+ char _serial[128] = {'\0'};
+
unsigned char eeprom_buf[128];
char *filename;
int size_check;
@@ -102,35 +106,68 @@ int main(int argc, char *argv[])
printf("\nFTDI eeprom generator v%s\n", VERSION);
printf ("(c) Intra2net AG <opensource@intra2net.com>\n");
- if (argc != 2 && argc != 3)
+ int longval = 0;
+ struct option long_options[] = {
+ {"read-eeprom", no_argument, &_read, 1},
+ {"erase-eeprom", no_argument, &_erase, 1},
+ {"flash-eeprom", no_argument, &_flash, 1},
+ {"vendor", required_argument, &longval, 'v'},
+ {"product", required_argument, &longval, 'p'},
+ {"serial", required_argument, &longval, 's'},
+ {0, 0, 0, 0}
+ };
+
+ int option_index = 0;
+ char c;
+ while ((c = getopt_long(argc, argv, "v:p:s:",
+ long_options, &option_index)) != -1) {
+ switch (c) {
+ case 'v':
+ _vendor = strtoul(optarg, NULL, 0);
+ break;
+ case 'p':
+ _product = strtoul(optarg, NULL, 0);
+ break;
+ case 's':
+ strcpy(_serial, optarg);
+ break;
+ case 0:
+ switch (longval) {
+ case 'v':
+ _vendor = strtoul(optarg, NULL, 0);
+ break;
+ case 'p':
+ _product = strtoul(optarg, NULL, 0);
+ break;
+ case 's':
+ strcpy(_serial, optarg);
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ if (!_read & !_erase & !_flash)
{
- printf("Syntax: %s [commands] config-file\n", argv[0]);
+ printf("Syntax: %s [switches|command] config-file\n", argv[0]);
printf("Valid commands:\n");
- printf("--read-eeprom Read eeprom and write to -filename- from config-file\n");
- printf("--erase-eeprom Erase eeprom\n");
- printf("--flash-eeprom Flash eeprom\n");
+ printf("--read-eeprom Read eeprom and write to -filename- from config-file\n");
+ printf("--erase-eeprom Erase eeprom\n");
+ printf("--flash-eeprom Flash eeprom\n");
+ printf("--vendor|-v <num> Vendor id to probe for on USB\n");
+ printf("--product|-p <num> Product id to probe for on USB\n");
+ printf("--serial|-s <string> Serial string to override\n");
exit (-1);
}
- if (argc == 3)
- {
- if (strcmp(argv[1], "--read-eeprom") == 0)
- _read = 1;
- if (strcmp(argv[1], "--erase-eeprom") == 0)
- _erase = 1;
- if (strcmp(argv[1], "--flash-eeprom") == 0)
- _flash = 1;
-
- argc_filename = 2;
- }
- else
- {
- argc_filename = 1;
- }
+ argc_filename = optind;
if ((fp = fopen(argv[argc_filename], "r")) == NULL)
{
- printf ("Can't open configuration file\n");
+ printf ("Can't open configuration file %s\n", argv[argc_filename]);
exit (-1);
}
fclose (fp);
@@ -163,14 +200,16 @@ int main(int argc, char *argv[])
eeprom.out_is_isochronous = cfg_getbool(cfg, "out_is_isochronous");
eeprom.suspend_pull_downs = cfg_getbool(cfg, "suspend_pull_downs");
- eeprom.use_serial = cfg_getbool(cfg, "use_serial");
+ eeprom.use_serial = (_serial[0] == '\0') ?
+ cfg_getbool(cfg, "use_serial") : 1;
eeprom.change_usb_version = cfg_getbool(cfg, "change_usb_version");
eeprom.usb_version = cfg_getint(cfg, "usb_version");
eeprom.manufacturer = cfg_getstr(cfg, "manufacturer");
eeprom.product = cfg_getstr(cfg, "product");
- eeprom.serial = cfg_getstr(cfg, "serial");
+ eeprom.serial = (_serial[0] == '\0') ?
+ cfg_getstr(cfg, "serial") : _serial;
eeprom.high_current = cfg_getbool(cfg, "high_current");
eeprom.cbus_function[0] = str_to_cbus(cfg_getstr(cfg, "cbus0"), 13);
eeprom.cbus_function[1] = str_to_cbus(cfg_getstr(cfg, "cbus1"), 13);
@@ -198,11 +237,12 @@ int main(int argc, char *argv[])
}
else
{
- printf("Unable to find FTDI devices under given vendor/product id: 0x%X/0x%X\n", eeprom.vendor_id, eeprom.product_id);
- printf("Error code: %d (%s)\n", i, ftdi_get_error_string(&ftdi));
- printf("Retrying with default FTDI id.\n");
+ printf("Unable to find FTDI devices under given id:0x%02x/0x%02x\n",
+ eeprom.vendor_id, eeprom.product_id);
- i = ftdi_usb_open(&ftdi, 0x0403, 0x6001);
+ printf("Error code: %d (%s)\n", i, ftdi_get_error_string(&ftdi));
+ printf("Retrying with id:0x%02x/0x%02x\n", _vendor, _product);
+ i = ftdi_usb_open(&ftdi, _vendor, _product);
if (i != 0)
{
printf("Error: %s\n", ftdi.error_str);