From 9840e82db8b78a3d710e89d51bd0a7fc12b68f43 Mon Sep 17 00:00:00 2001 From: PaulStoffregen Date: Sun, 15 Oct 2017 06:00:53 -0700 Subject: [PATCH] FTDI transmit, improve performance for fast output --- USBHost_t36.h | 3 ++- ehci.cpp | 2 +- serial.cpp | 45 +++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/USBHost_t36.h b/USBHost_t36.h index 816af86..bf48541 100644 --- a/USBHost_t36.h +++ b/USBHost_t36.h @@ -747,7 +747,8 @@ private: class USBSerial: public USBDriver, public Stream { public: - enum { BUFFER_SIZE = 390 }; // must hold at least 6 max size packets, plus 2 extra bytes + // FIXME: need different USBSerial, with bigger buffers for 480 Mbit & faster speed + enum { BUFFER_SIZE = 648 }; // must hold at least 6 max size packets, plus 2 extra bytes USBSerial(USBHost &host) : txtimer(this) { init(); } void begin(uint32_t baud, uint32_t format=0); void end(void); diff --git a/ehci.cpp b/ehci.cpp index 8ce74d8..0c35f19 100644 --- a/ehci.cpp +++ b/ehci.cpp @@ -393,7 +393,7 @@ void USBHost::isr() void USBDriverTimer::start(uint32_t microseconds) { -#ifdef USBHOST_PRINT_DEBUG +#if defined(USBHOST_PRINT_DEBUG) && 0 Serial.print("start_timer, us = "); Serial.print(microseconds); Serial.print(", driver = "); diff --git a/serial.cpp b/serial.cpp index 075c19e..013beb1 100644 --- a/serial.cpp +++ b/serial.cpp @@ -287,13 +287,50 @@ void USBSerial::rx_queue_packets(uint32_t head, uint32_t tail) void USBSerial::tx_data(const Transfer_t *transfer) { - if (transfer->buffer == tx1) { + uint32_t mask; + uint8_t *p = (uint8_t *)transfer->buffer; + if (p == tx1) { println("tx1:"); - txstate &= 0xFE; - } else if (transfer->buffer == tx2) { + mask = 1; + //txstate &= 0xFE; + } else if (p == tx2) { println("tx2:"); - txstate &= 0xFD; + mask = 2; + //txstate &= 0xFD; + } else { + return; // should never happen } + // check how much more data remains in the transmit buffer + uint32_t head = txhead; + uint32_t tail = txtail; + uint32_t count; + if (head >= tail) { + count = head - tail; + } else { + count = txsize + head - tail; + } + uint32_t packetsize = tx2 - tx1; + if (count < packetsize) { + // not enough data in buffer to fill a full packet + txstate &= ~mask; + return; + } + // immediately transmit another full packet, if we have enough data + println("TX:moar data!!!!"); + if (++tail >= txsize) tail = 0; + uint32_t n = txsize - tail; + if (n > packetsize) n = packetsize; + memcpy(p, txbuf + tail, n); + if (n >= packetsize) { + tail += n - 1; + if (tail >= txsize) tail = 0; + } else { + uint32_t len = packetsize - n; + memcpy(p + n, txbuf, len); + tail = len - 1; + } + txtail = tail; + queue_Data_Transfer(txpipe, p, packetsize, this); }