FreeCalypso > hg > fc-usbser-tools
diff cp2102/update_eeprom.c @ 99:c59011177e2e
cp2102-update-eeprom program written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 28 Sep 2023 05:25:39 +0000 |
parents | cp2102/write_eeprom_main.c@1cacc1ae56f0 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cp2102/update_eeprom.c Thu Sep 28 05:25:39 2023 +0000 @@ -0,0 +1,78 @@ +/* + * This program locates a CP2102 device via libusb, reads its internal EEPROM, + * applies user-requested patches to the EEPROM image, and then reprograms + * the physical EEPROM with the patched version. + */ + +#include <sys/types.h> +#include <string.h> +#include <strings.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <usb.h> +#include "../libuwrap/find_dev.h" +#include "../libuwrap/open_close.h" +#include "cp210x_defs.h" + +extern struct usb_device *find_cp2102_device(); + +u_char eeprom[SIZE_EEPROM]; +char *device_selector, *baud_change; +int no_detach; + +process_cmdline(argc, argv) + char **argv; +{ + int c; + extern int optind; + extern char *optarg; + + while ((c = getopt(argc, argv, "b:d:n")) != EOF) { + switch (c) { + case 'b': + baud_change = optarg; + continue; + case 'd': + device_selector = optarg; + continue; + case 'n': + no_detach = 1; + continue; + default: + usage: + fprintf(stderr, + "usage: %s [hw-options] eeprom-changes\n", + argv[0]); + exit(1); + } + } + if (argc == optind && !baud_change) + goto usage; +} + +main(argc, argv) + char **argv; +{ + struct usb_device *dev; + usb_dev_handle *usbh; + extern int optind; + + process_cmdline(argc, argv); + dev = find_cp2102_device(device_selector); + usbh = usb_open(dev); + if (!usbh) { + fprintf(stderr, "error: usb_open() failed\n"); + exit(1); + } + read_eeprom(usbh); + if (baud_change) + apply_eeprom_patch_baud(baud_change); + for (; optind < argc; optind++) + apply_eeprom_patch_file(argv[optind]); + if (!no_detach) + usbwrap_claim_all_ifs(usbh); + write_eeprom(usbh); + usb_close(usbh); + exit(0); +}