1 // I/O HAL for BSL (FTDI)
2 // Copyright (C) 2012, 2013, 2014, 2016 Pawel Jewstafjew
8 class BSL_IO_FTDI final : public BSL_IO
12 bool bitbang_enabled; // trace bitbang mode state
15 BSL_IO_FTDI(FTDI & ftdi) : ftdi(ftdi), bitbang_enabled(false) {}
17 bool write(const uint8_t * data, unsigned len) override {
18 return (ftdi.write(data, len) == (int)len);
22 bool read(uint8_t * data, unsigned len) override {
26 unsigned left = len - index;
27 int res = ftdi.read(&data[index], left);
42 bool read(uint8_t * data, unsigned len) override {
43 int res = ftdi.read(data, len);
44 return (res == (int)len);
48 void flush() override {
51 while(ftdi.read(&ch, 1) > 0) {}
53 ftdi.purge(FT_PURGE_RX);
57 void set_baud_rate(unsigned baud_rate) override {
60 baud_rate /= 4; // adjust baud_rate to match strange libftdi behaviour
63 assert(ftdi.set_baud_rate(baud_rate));
64 // 8 data bits, Even parity bit, 1 stop bit
65 assert(ftdi.set_serial(8, 'E', 1));
66 assert(ftdi.set_flow_control_off());
74 bool set_resetn(bool v) override {
75 return ftdi.set_dtr(v ? 0 : 1);
77 bool set_test(bool v) override {
78 // TCK = not TEST -> RTS = TEST
79 return ftdi.set_rts(v ? 1 : 0);
86 bool set_resetn(bool v) override {
87 return ftdi.set_dtr(v ? 0 : 1);
89 bool set_test(bool v) override {
90 return ftdi.set_rts(v ? 0 : 1);
98 bool set_resetn(bool v) override {
99 bitbang_enabled = true;
100 // ftdi.set_bit_mode(0x20, FT_BITMODE_CBUS_BITBANG); // RSTn = 0
101 // ftdi.set_bit_mode(0x22, FT_BITMODE_CBUS_BITBANG); // RSTn = 1
102 return ftdi.set_bit_mode((v ? 0x22 : 0x20), FT_BITMODE_CBUS_BITBANG) == FT_OK;
104 bool set_test(bool v) override {
105 // TCK = not TEST -> RTS = TEST
106 return ftdi.set_rts(v ? 1 : 0);