FreeCalypso > hg > fc-usbser-tools
annotate libuwrap/claim_if.c @ 68:5cbde3c80c24
fteeprom-{erase,prog}: detach logic: change to detach by default
As it turns out, detaching all ttyUSB interfaces of a multichannel device
does not require outside knowledge of how many channels there are, as in
our previous -d option design that is being removed here - instead we can
read the bNumInterfaces constant from the USB device's config descriptor
and thus know how many interfaces there are in total. Based on this
discovery, change the design of fteeprom-{erase,prog} as follows:
* remove -d option;
* flip the default to where we detach all interfaces by default;
* add -n option to NOT detach any interfaces.
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Wed, 13 Sep 2023 06:37:03 +0000 |
| parents | 5160f6717903 |
| children |
| rev | line source |
|---|---|
|
12
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
|
44
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
2 * The operation of programming an FTDI EEPROM *can* be done without ever |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
3 * claiming any of the chip's interfaces and without unbinding ttyUSB from |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
4 * any channel, even if we are doing the special magic sequence for FT232R. |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
5 * However, given the identity-altering nature of EEPROM programming it is |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
6 * generally a good idea to claim all interfaces and unbind all ttyUSB |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
7 * devices, and in the case of FT232R the magic sequence breaks normal |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
8 * UART operation. |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
9 * |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
10 * This library module provides building block functions: a function for |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
11 * claiming one interface and a higher-level function claiming all interfaces |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
12 * of a multichannel device. |
|
12
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 */ |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 #include <stdio.h> |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 #include <stdlib.h> |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 #include <usb.h> |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 #include "open_close.h" |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 |
|
40
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
12
diff
changeset
|
20 void usbwrap_claim_interface(usb_dev_handle *usbh, int ifnum, int detach) |
|
12
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 { |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 if (detach) |
|
40
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
12
diff
changeset
|
23 usb_detach_kernel_driver_np(usbh, ifnum); |
|
f5847be43d35
fc-duart28-conf: bump off both ttyUSB devices on set operation
Mychaela Falconia <falcon@freecalypso.org>
parents:
12
diff
changeset
|
24 if (usb_claim_interface(usbh, ifnum) != 0) { |
|
12
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 fprintf(stderr, "error: usb_claim_interface() failed\n"); |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 exit(1); |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 } |
|
80e521d6609c
libuwrap: implement USB device open and close
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 } |
|
44
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
29 |
|
68
5cbde3c80c24
fteeprom-{erase,prog}: detach logic: change to detach by default
Mychaela Falconia <falcon@freecalypso.org>
parents:
44
diff
changeset
|
30 void usbwrap_claim_all_ifs(usb_dev_handle *usbh) |
|
44
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
31 { |
|
68
5cbde3c80c24
fteeprom-{erase,prog}: detach logic: change to detach by default
Mychaela Falconia <falcon@freecalypso.org>
parents:
44
diff
changeset
|
32 struct usb_device *dev = usb_device(usbh); |
|
5cbde3c80c24
fteeprom-{erase,prog}: detach logic: change to detach by default
Mychaela Falconia <falcon@freecalypso.org>
parents:
44
diff
changeset
|
33 unsigned numint = dev->config->bNumInterfaces; |
|
44
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
34 unsigned n; |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
35 |
|
68
5cbde3c80c24
fteeprom-{erase,prog}: detach logic: change to detach by default
Mychaela Falconia <falcon@freecalypso.org>
parents:
44
diff
changeset
|
36 for (n = 0; n < numint; n++) |
|
44
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
37 usbwrap_claim_interface(usbh, n, 1); |
|
5160f6717903
libuwrap: implement function to claim/unbind all interfaces
Mychaela Falconia <falcon@freecalypso.org>
parents:
40
diff
changeset
|
38 } |
