Variable length frames, part1: USB Host -> Pm3

This commit is contained in:
Philippe Teuwen 2019-04-16 10:01:08 +02:00
commit 34467b7550
8 changed files with 229 additions and 16 deletions

View file

@ -31,15 +31,16 @@
*/
#include "cmd.h"
bool use_cmd_ng = false;
#ifdef WITH_FPC_HOST
// "Session" flag, to tell via which interface next msgs should be sent: USB or FPC USART
bool reply_via_fpc = 0;
bool reply_via_fpc = false;
extern void Dbprintf(const char *fmt, ...);
#define Dbprintf_usb(...) {\
reply_via_fpc = 0;\
reply_via_fpc = false;\
Dbprintf(__VA_ARGS__);\
reply_via_fpc = 1;}
reply_via_fpc = true;}
#endif
uint8_t cmd_send(uint64_t cmd, uint64_t arg0, uint64_t arg1, uint64_t arg2, void *data, size_t len) {

View file

@ -646,6 +646,65 @@ uint32_t usb_read(uint8_t *data, size_t len) {
return nbBytesRcv;
}
static uint8_t usb_read_ng_buffer[64];
static size_t usb_read_ng_bufoff=0;
static size_t usb_read_ng_buflen=0;
uint32_t usb_read_ng(uint8_t *data, size_t len) {
if (len == 0) return 0;
uint8_t bank = btReceiveBank;
uint32_t packetSize, nbBytesRcv = 0;
uint32_t time_out = 0;
// take first from local buffer
if ( len <= usb_read_ng_buflen ) {
for (uint32_t i = 0; i < len; i++)
data[nbBytesRcv++] = usb_read_ng_buffer[usb_read_ng_bufoff + i];
usb_read_ng_buflen -= len;
if (usb_read_ng_buflen == 0)
usb_read_ng_bufoff = 0;
else
usb_read_ng_bufoff += len;
return nbBytesRcv;
} else {
for (uint32_t i = 0; i < usb_read_ng_buflen; i++)
data[nbBytesRcv++] = usb_read_ng_buffer[usb_read_ng_bufoff + i];
len -= usb_read_ng_buflen;
usb_read_ng_buflen = 0;
usb_read_ng_bufoff = 0;
}
while (len) {
if (!usb_check()) break;
if ((pUdp->UDP_CSR[AT91C_EP_OUT] & bank)) {
uint32_t available = (pUdp->UDP_CSR[AT91C_EP_OUT] & AT91C_UDP_RXBYTECNT) >> 16;
packetSize = MIN(available, len);
available -= packetSize;
len -= packetSize;
while (packetSize--)
data[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
// fill the local buffer with the remaining bytes
for (uint32_t i = 0; i < available; i++)
usb_read_ng_buffer[i] = pUdp->UDP_FDR[AT91C_EP_OUT];
usb_read_ng_buflen = available;
// flip bank
UDP_CLEAR_EP_FLAGS(AT91C_EP_OUT, bank)
if (bank == AT91C_UDP_RX_DATA_BK0)
bank = AT91C_UDP_RX_DATA_BK1;
else
bank = AT91C_UDP_RX_DATA_BK0;
}
if (time_out++ == 0x1fff) break;
}
btReceiveBank = bank;
return nbBytesRcv;
}
//*----------------------------------------------------------------------------
//* \fn usb_write
//* \brief Send through endpoint 2 (device to host)

View file

@ -48,6 +48,8 @@ bool usb_poll(void);
bool usb_poll_validate_length(void);
uint32_t usb_read(uint8_t *data, size_t len);
uint32_t usb_write(const uint8_t *data, const size_t len);
uint32_t usb_read_ng(uint8_t *data, size_t len);
uint32_t usb_write_ng(const uint8_t *data, const size_t len);
void SetUSBreconnect(int value);
int GetUSBreconnect(void);