# HG changeset patch # User Mychaela Falconia # Date 1694400502 0 # Node ID a94bd400207679d13f7e344bbf4882489d2f8a97 # Parent 5160f67179039df2a233b6c67f3acfe35392d978 fteeprom-prog: implement -d option for interface detach diff -r 5160f6717903 -r a94bd4002076 fteeprom/fteeprom-prog.c --- a/fteeprom/fteeprom-prog.c Mon Sep 11 02:27:11 2023 +0000 +++ b/fteeprom/fteeprom-prog.c Mon Sep 11 02:48:22 2023 +0000 @@ -19,9 +19,52 @@ #include "../libuwrap/open_close.h" #include "../libftmini/eeprom_func.h" +char *device_selector, *input_filename; +int detach_num, ft232r_mode; unsigned eeprom_size; u_short eeprom[256]; +process_cmdline(argc, argv) + char **argv; +{ + int c; + extern int optind; + extern char *optarg; + + while ((c = getopt(argc, argv, "d:r")) != EOF) { + switch (c) { + case 'd': + detach_num = atoi(optarg); + switch (detach_num) { + case 0: + case 1: + case 2: + case 4: + break; + default: + fprintf(stderr, "error: invalid -d argument\n"); + exit(1); + } + continue; + case 'r': + ft232r_mode = 1; + detach_num = 1; + continue; + default: + /* error msg already printed */ + exit(1); + } + } + if (argc < optind + 1 || argc > optind + 2) { + fprintf(stderr, + "usage: %s [options] device-selector [eeprom-image]\n", + argv[0]); + exit(1); + } + device_selector = argv[optind]; + input_filename = argv[optind + 1]; +} + read_eeprom_common(inf, filename_for_errs) FILE *inf; char *filename_for_errs; @@ -83,33 +126,16 @@ main(argc, argv) char **argv; { - char **ap, *devsel; struct usb_device *dev; usb_dev_handle *usbh; - int ft232r_mode = 0; unsigned n; - if (argc < 2) { -usage: fprintf(stderr, - "usage: %s [-r] device-selector [eeprom-image]\n", - argv[0]); - exit(1); - } - ap = argv + 1; - if (!strcmp(*ap, "-r")) { - ft232r_mode = 1; - ap++; - } - if (!*ap) - goto usage; - devsel = *ap++; - if (*ap) { - if (ap[1]) - goto usage; - read_eeprom_from_file(*ap); - } else + process_cmdline(argc, argv); + if (input_filename) + read_eeprom_from_file(input_filename); + else read_eeprom_from_stdin(); - dev = find_usbdev_by_desc_string(devsel); + dev = find_usbdev_by_desc_string(device_selector); if (!dev) { fprintf(stderr, "error: specified USB device not found\n"); exit(1); @@ -119,6 +145,8 @@ fprintf(stderr, "error: usb_open() failed\n"); exit(1); } + if (detach_num) + usbwrap_claim_all_ifs(usbh, detach_num); if (ft232r_mode) ft232r_eeprom_magic(usbh); for (n = 0; n < eeprom_size; n++)