FreeCalypso > hg > fc-usbser-tools
annotate duart28/main.c @ 71:0b37be8b23ca
doc/FTDI-EEPROM-format: document string descriptors
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Sep 2023 22:27:38 +0000 |
parents | f5847be43d35 |
children |
rev | line source |
---|---|
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * Main module for fc-duart28-conf utility. |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <ctype.h> |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <stdio.h> |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <stdlib.h> |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <string.h> |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <strings.h> |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <usb.h> |
29
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
11 #include "../libuwrap/open_close.h" |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 extern struct usb_device *find_duart28_usbdev(); |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
14 extern unsigned usb_presenting_pid; |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
16 oper_show() |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 { |
29
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
18 struct usb_device *dev; |
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
19 usb_dev_handle *usbh; |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
20 int eeconf; |
29
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
21 |
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
22 dev = find_duart28_usbdev(); |
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
23 if (!dev) { |
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
24 fprintf(stderr, "error: no DUART28 adapter found\n"); |
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
25 exit(1); |
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
26 } |
33
df284688d0c8
fc-duart28-conf check-eeprom: same change as in fteeprom-read
Mychaela Falconia <falcon@freecalypso.org>
parents:
31
diff
changeset
|
27 usbh = usb_open(dev); |
df284688d0c8
fc-duart28-conf check-eeprom: same change as in fteeprom-read
Mychaela Falconia <falcon@freecalypso.org>
parents:
31
diff
changeset
|
28 if (!usbh) { |
df284688d0c8
fc-duart28-conf check-eeprom: same change as in fteeprom-read
Mychaela Falconia <falcon@freecalypso.org>
parents:
31
diff
changeset
|
29 fprintf(stderr, "error: usb_open() failed\n"); |
df284688d0c8
fc-duart28-conf check-eeprom: same change as in fteeprom-read
Mychaela Falconia <falcon@freecalypso.org>
parents:
31
diff
changeset
|
30 exit(1); |
df284688d0c8
fc-duart28-conf check-eeprom: same change as in fteeprom-read
Mychaela Falconia <falcon@freecalypso.org>
parents:
31
diff
changeset
|
31 } |
29
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
32 read_eeprom(usbh); |
33
df284688d0c8
fc-duart28-conf check-eeprom: same change as in fteeprom-read
Mychaela Falconia <falcon@freecalypso.org>
parents:
31
diff
changeset
|
33 usb_close(usbh); |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
34 eeconf = analyze_eeprom(); |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
35 if (eeconf == 'C' && usb_presenting_pid != 0x7152) |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
36 printf("Visible USB device has wrong PID for C config" |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
37 " - please replug\n"); |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
38 if (eeconf == 'S' && usb_presenting_pid != 0x6010) |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
39 printf("Visible USB device has wrong PID for S config" |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
40 " - please replug\n"); |
29
a7393d00996a
fc-duart28-conf: implement check-eeprom
Mychaela Falconia <falcon@freecalypso.org>
parents:
27
diff
changeset
|
41 return 0; |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 } |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 oper_program(newconf) |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 { |
31
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
46 struct usb_device *dev; |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
47 usb_dev_handle *usbh; |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
48 int prev; |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
49 |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
50 dev = find_duart28_usbdev(); |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
51 if (!dev) { |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
52 fprintf(stderr, "error: no DUART28 adapter found\n"); |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
53 exit(1); |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
54 } |
40
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
55 usbh = usb_open(dev); |
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
56 if (!usbh) { |
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
57 fprintf(stderr, "error: usb_open() failed\n"); |
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
58 exit(1); |
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
59 } |
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
60 usbwrap_claim_interface(usbh, 0, 1); |
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
61 usbwrap_claim_interface(usbh, 1, 1); |
31
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
62 read_eeprom(usbh); |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
63 prev = analyze_eeprom(); |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
64 if (prev == newconf) { |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
65 printf("EEPROM is already in the right state, nothing to program\n"); |
40
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
66 usb_close(usbh); |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
67 printf("Please replug the adapter to restore normal operation\n"); |
31
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
68 return 0; |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
69 } |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
70 printf("Reprogramming to DUART28%c configuration\n", newconf); |
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
71 update_eeprom(usbh, newconf); |
40
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
72 usb_close(usbh); |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
73 printf("EEPROM changed, replug the adapter to take effect\n"); |
31
530ec3792de8
fc-duart28-conf: implement set command
Mychaela Falconia <falcon@freecalypso.org>
parents:
29
diff
changeset
|
74 return 0; |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 } |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 main(argc, argv) |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 char **argv; |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 { |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
80 if (argc < 2) { |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
81 usage: fprintf(stderr, "usage: %s show or %s set C|S\n", |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
82 argv[0], argv[0]); |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
83 exit(1); |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
84 } |
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
85 if (!strcmp(argv[1], "show")) { |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 if (argc != 2) { |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 fprintf(stderr, |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
88 "error: %s show command takes no arguments\n", |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 argv[0]); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 exit(1); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 } |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
92 return oper_show(); |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 } |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 if (!strcmp(argv[1], "set")) { |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 if (argc != 3) { |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 fprintf(stderr, |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 "error: %s set command takes 1 argument\n", |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 argv[0]); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 exit(1); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 } |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 if (!strcmp(argv[2], "C") || !strcmp(argv[2], "S")) |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 return oper_program(argv[2][0]); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 if (!strcmp(argv[2], "c") || !strcmp(argv[2], "s")) |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 return oper_program(toupper(argv[2][0])); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 fprintf(stderr, "error: %s set argument must be C or S\n", |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 argv[0]); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 exit(1); |
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 } |
39
b9ecfa54fe2b
fc-duart28-conf: replace find and check-eeprom with single show command
Mychaela Falconia <falcon@freecalypso.org>
parents:
33
diff
changeset
|
109 goto usage; |
27
2413a54a1bfc
fc-duart28-conf started
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 } |