소스 검색

FTDI transmit, improve performance for fast output

main
PaulStoffregen 7 년 전
부모
커밋
9840e82db8
3개의 변경된 파일44개의 추가작업 그리고 6개의 파일을 삭제
  1. +2
    -1
      USBHost_t36.h
  2. +1
    -1
      ehci.cpp
  3. +41
    -4
      serial.cpp

+ 2
- 1
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);

+ 1
- 1
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 = ");

+ 41
- 4
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);
}



Loading…
취소
저장