mirror of
https://github.com/RfidResearchGroup/proxmark3.git
synced 2025-08-21 13:53:55 -07:00
Variable length frames, part1: USB Host -> Pm3
This commit is contained in:
parent
0b35dcbe0c
commit
34467b7550
8 changed files with 229 additions and 16 deletions
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue