diff options
Diffstat (limited to 'util/switch.c')
-rw-r--r-- | util/switch.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/util/switch.c b/util/switch.c new file mode 100644 index 0000000..2fc0eb6 --- /dev/null +++ b/util/switch.c @@ -0,0 +1,65 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <ftdi.h> + +#define DEV_FE310 1 +#define DEV_ESP32 2 + +void usage(char *p) { + fprintf(stderr, "Usage: %s fe310|esp32\n", p); + exit(1); +} + +int main(int argc, char *argv[]) { + int dev; + int ret; + struct ftdi_context *ftdi; + + if (argc != 2) { + usage(argv[0]); + } + if (strcmp(argv[1], "fe310") == 0) { + dev = DEV_FE310; + } else if (strcmp(argv[1], "esp32") == 0) { + dev = DEV_ESP32; + } else { + usage(argv[0]); + } + + if ((ftdi = ftdi_new()) == 0) { + fprintf(stderr, "ftdi_new failed\n"); + return EXIT_FAILURE; + } + + if ((ret = ftdi_usb_open(ftdi, 0x0403, 0x6015)) < 0) { + fprintf(stderr, "unable to open ftdi device: %d (%s)\n", ret, ftdi_get_error_string(ftdi)); + ftdi_free(ftdi); + return EXIT_FAILURE; + } + + switch (dev) { + case DEV_FE310: { + printf("Switch to fe310\n"); + ret = ftdi_set_bitmode(ftdi, 0x20, BITMODE_CBUS); + break; + } + + case DEV_ESP32: { + printf("Switch to esp32\n"); + ret = ftdi_set_bitmode(ftdi, 0x00, BITMODE_CBUS); + break; + } + } + if (ret < 0) goto ftdi_fin; + + ret = ftdi_usb_close(ftdi); + +ftdi_fin: + if (ret < 0) { + fprintf(stderr, "ERR: %d (%s)\n", ret, ftdi_get_error_string(ftdi)); + } + ftdi_free(ftdi); + + return ret < 0 ? EXIT_FAILURE : EXIT_SUCCESS; +} |