FreeCalypso > hg > fc-usbser-tools
comparison fteeprom/fteeprom-prog.c @ 45:a94bd4002076
fteeprom-prog: implement -d option for interface detach
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 11 Sep 2023 02:48:22 +0000 |
parents | 940cde8a99b6 |
children | ca2250b4833d |
comparison
equal
deleted
inserted
replaced
44:5160f6717903 | 45:a94bd4002076 |
---|---|
17 #include <usb.h> | 17 #include <usb.h> |
18 #include "../libuwrap/find_dev.h" | 18 #include "../libuwrap/find_dev.h" |
19 #include "../libuwrap/open_close.h" | 19 #include "../libuwrap/open_close.h" |
20 #include "../libftmini/eeprom_func.h" | 20 #include "../libftmini/eeprom_func.h" |
21 | 21 |
22 char *device_selector, *input_filename; | |
23 int detach_num, ft232r_mode; | |
22 unsigned eeprom_size; | 24 unsigned eeprom_size; |
23 u_short eeprom[256]; | 25 u_short eeprom[256]; |
26 | |
27 process_cmdline(argc, argv) | |
28 char **argv; | |
29 { | |
30 int c; | |
31 extern int optind; | |
32 extern char *optarg; | |
33 | |
34 while ((c = getopt(argc, argv, "d:r")) != EOF) { | |
35 switch (c) { | |
36 case 'd': | |
37 detach_num = atoi(optarg); | |
38 switch (detach_num) { | |
39 case 0: | |
40 case 1: | |
41 case 2: | |
42 case 4: | |
43 break; | |
44 default: | |
45 fprintf(stderr, "error: invalid -d argument\n"); | |
46 exit(1); | |
47 } | |
48 continue; | |
49 case 'r': | |
50 ft232r_mode = 1; | |
51 detach_num = 1; | |
52 continue; | |
53 default: | |
54 /* error msg already printed */ | |
55 exit(1); | |
56 } | |
57 } | |
58 if (argc < optind + 1 || argc > optind + 2) { | |
59 fprintf(stderr, | |
60 "usage: %s [options] device-selector [eeprom-image]\n", | |
61 argv[0]); | |
62 exit(1); | |
63 } | |
64 device_selector = argv[optind]; | |
65 input_filename = argv[optind + 1]; | |
66 } | |
24 | 67 |
25 read_eeprom_common(inf, filename_for_errs) | 68 read_eeprom_common(inf, filename_for_errs) |
26 FILE *inf; | 69 FILE *inf; |
27 char *filename_for_errs; | 70 char *filename_for_errs; |
28 { | 71 { |
81 } | 124 } |
82 | 125 |
83 main(argc, argv) | 126 main(argc, argv) |
84 char **argv; | 127 char **argv; |
85 { | 128 { |
86 char **ap, *devsel; | |
87 struct usb_device *dev; | 129 struct usb_device *dev; |
88 usb_dev_handle *usbh; | 130 usb_dev_handle *usbh; |
89 int ft232r_mode = 0; | |
90 unsigned n; | 131 unsigned n; |
91 | 132 |
92 if (argc < 2) { | 133 process_cmdline(argc, argv); |
93 usage: fprintf(stderr, | 134 if (input_filename) |
94 "usage: %s [-r] device-selector [eeprom-image]\n", | 135 read_eeprom_from_file(input_filename); |
95 argv[0]); | 136 else |
96 exit(1); | |
97 } | |
98 ap = argv + 1; | |
99 if (!strcmp(*ap, "-r")) { | |
100 ft232r_mode = 1; | |
101 ap++; | |
102 } | |
103 if (!*ap) | |
104 goto usage; | |
105 devsel = *ap++; | |
106 if (*ap) { | |
107 if (ap[1]) | |
108 goto usage; | |
109 read_eeprom_from_file(*ap); | |
110 } else | |
111 read_eeprom_from_stdin(); | 137 read_eeprom_from_stdin(); |
112 dev = find_usbdev_by_desc_string(devsel); | 138 dev = find_usbdev_by_desc_string(device_selector); |
113 if (!dev) { | 139 if (!dev) { |
114 fprintf(stderr, "error: specified USB device not found\n"); | 140 fprintf(stderr, "error: specified USB device not found\n"); |
115 exit(1); | 141 exit(1); |
116 } | 142 } |
117 usbh = usb_open(dev); | 143 usbh = usb_open(dev); |
118 if (!usbh) { | 144 if (!usbh) { |
119 fprintf(stderr, "error: usb_open() failed\n"); | 145 fprintf(stderr, "error: usb_open() failed\n"); |
120 exit(1); | 146 exit(1); |
121 } | 147 } |
148 if (detach_num) | |
149 usbwrap_claim_all_ifs(usbh, detach_num); | |
122 if (ft232r_mode) | 150 if (ft232r_mode) |
123 ft232r_eeprom_magic(usbh); | 151 ft232r_eeprom_magic(usbh); |
124 for (n = 0; n < eeprom_size; n++) | 152 for (n = 0; n < eeprom_size; n++) |
125 ftmini_write_eeprom_loc(usbh, n, eeprom[n]); | 153 ftmini_write_eeprom_loc(usbh, n, eeprom[n]); |
126 usb_close(usbh); | 154 usb_close(usbh); |