aboutsummaryrefslogtreecommitdiffstats
path: root/ft232r/bitbang.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2010-11-18 22:59:40 +0100
committerHarald Welte <laforge@gnumonks.org>2010-11-18 22:59:40 +0100
commit41f028df960caf7782bce76e8484d453d7b0db6f (patch)
treea11920a837e777dcd7de02536592868a4fe049f1 /ft232r/bitbang.c
parent1a37d4095f8deb41429da9c056012ebbd022a799 (diff)
Import old unfinished FT232R bit-banging code for sim sniffing
This code never really worked due to large sample clock jitter, lost USB messages and the lack of CLK sniffing ability
Diffstat (limited to 'ft232r/bitbang.c')
-rw-r--r--ft232r/bitbang.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/ft232r/bitbang.c b/ft232r/bitbang.c
new file mode 100644
index 0000000..e6b7916
--- /dev/null
+++ b/ft232r/bitbang.c
@@ -0,0 +1,120 @@
+/* This program is distributed under the GPL, version 2 */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <ftdi.h>
+
+#include "soft_uart.h"
+
+static unsigned char last;
+static struct suart_data su;
+
+#define CLK_BIT 0x20
+#define RST_BIT 0x08
+#define IO_BIT 0x02
+
+static void handle_sample(unsigned char c)
+{
+ uint8_t rst = 0, io = 0, clk = 0;
+
+ if (c & RST_BIT)
+ rst = 1;
+
+ if (c & CLK_BIT)
+ clk = 1;
+
+ if (c & IO_BIT)
+ io = 1;
+
+#if 0
+ if ((c & 0xf) != last) {
+ printf("%02x ", c & ~(CLK_BIT|IO_BIT));
+ }
+ last = c;
+#endif
+#if 0
+ if (c & RST_BIT)
+ printf("-");
+ else
+ printf("_");
+#endif
+#if 1
+ if (c & IO_BIT)
+ printf("-");
+ else
+ printf("_");
+#endif
+ //suart_process_sample_bit(&su, clk, rst, io);
+}
+
+#define OVERSAMPLING 4
+
+int main(int argc, char **argv)
+{
+ struct ftdi_context ftdic;
+ int f,i;
+ unsigned char buf[1<<16];
+ //unsigned int sample_rate = 12900 * OVERSAMPLING; /* 192kS/s */
+ unsigned int sample_rate = (1 << 18);
+
+ memset(&su, 0, sizeof(su));
+
+ if (ftdi_init(&ftdic) < 0)
+ {
+ fprintf(stderr, "ftdi_init failed\n");
+ return EXIT_FAILURE;
+ }
+
+ f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
+
+ if (f < 0 && f != -5)
+ {
+ fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
+ exit(-1);
+ }
+
+ printf("ftdi open succeeded: %d\n",f);
+
+ printf("enabling bitbang mode\n");
+ //ftdi_disable_bitbang(&ftdic);
+ //ftdi_set_line_property(&ftdic, 8, 1, EVEN);
+ ftdi_set_bitmode(&ftdic, 0x0, BITMODE_BITBANG);
+ ftdi_read_data_set_chunksize(&ftdic, sizeof(buf));
+ ftdi_set_latency_timer(&ftdic, 255);
+ //ftdi_set_latency_timer(&ftdic, 1);
+ //f = ftdi_set_baudrate(&ftdic, 300000);
+ f = ftdi_set_baudrate(&ftdic, sample_rate/16);
+ if (f < 0) {
+ fprintf(stderr, "error setting baudrate\n");
+ exit(1);
+ }
+
+ su.samplerate = sample_rate;
+ su.recip_etu = sample_rate / OVERSAMPLING;
+ su.num_bits = 8;
+ suart_init(&su);
+
+ while (1) {
+ memset(buf, 0, sizeof(buf));
+ f = ftdi_read_data(&ftdic, buf, sizeof(buf));
+ if (f < 0) {
+ fprintf(stderr,"read failed for 0x%x, error %d (%s)\n",buf[0],f, ftdi_get_error_string(&ftdic));
+ exit(1);
+ }
+ //printf("ftdi returned %u (of %u)\n", f, sizeof(buf));
+ for (i = 0; i < f; i++) {
+ handle_sample(buf[i]);
+ }
+ fflush(stdout);
+ //num_samples += f;
+ }
+
+ printf("\n");
+
+ printf("disabling bitbang mode\n");
+ ftdi_disable_bitbang(&ftdic);
+
+ ftdi_usb_close(&ftdic);
+ ftdi_deinit(&ftdic);
+}