summaryrefslogtreecommitdiff
path: root/util/switch.c
diff options
context:
space:
mode:
Diffstat (limited to 'util/switch.c')
-rw-r--r--util/switch.c65
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;
+}