armsrc: put new frame parsing in common for usart (still usart_read_ng to do)

This commit is contained in:
Philippe Teuwen 2019-04-20 01:47:50 +02:00
commit a45238236d
5 changed files with 37 additions and 28 deletions

View file

@ -1562,30 +1562,15 @@ void __attribute__((noreturn)) AppMain(void) {
for (;;) { for (;;) {
WDT_HIT(); WDT_HIT();
// Check if there is a usb packet available // Check if there is a packet available
if (usb_poll_validate_length()) {
PacketCommandNG rx;
if (receive_ng(&rx) == PM3_SUCCESS) {
PacketReceived(&rx);
} else {
Dbprintf("Error in frame reception");
// TODO DOEGOX if error, shall we resync ?
}
}
#ifdef WITH_FPC_HOST
// Check if there is a FPC packet available
// TODO DOEGOX NG packets support here too
PacketCommandNG rx; PacketCommandNG rx;
if (usart_readbuffer((uint8_t *)&rx)) { int16_t ret = receive_ng(&rx);
reply_via_fpc = true; if (ret == PM3_SUCCESS) {
rx.ng = false;
rx.magic = 0;
rx.length = USB_CMD_DATA_SIZE;
rx.crc = 0;
PacketReceived(&rx); PacketReceived(&rx);
} else if (ret != PM3_NODATA) {
Dbprintf("Error in frame reception");
// TODO DOEGOX if error, shall we resync ?
} }
usart_readcheck((uint8_t *)&rx, sizeof(rx));
#endif
// Press button for one second to enter a possible standalone mode // Press button for one second to enter a possible standalone mode
if (BUTTON_HELD(1000) > 0) { if (BUTTON_HELD(1000) > 0) {

View file

@ -135,9 +135,11 @@ int16_t reply_ng(uint16_t cmd, int16_t status, uint8_t *data, size_t len) {
return sendlen; return sendlen;
} }
int16_t receive_ng(PacketCommandNG *rx) { static int16_t receive_ng_internal(PacketCommandNG *rx, uint32_t read_ng(uint8_t *data, size_t len), bool fpc) {
PacketCommandNGRaw rx_raw; PacketCommandNGRaw rx_raw;
size_t bytes = usb_read_ng((uint8_t *)&rx_raw.pre, sizeof(PacketCommandNGPreamble)); size_t bytes = read_ng((uint8_t *)&rx_raw.pre, sizeof(PacketCommandNGPreamble));
if (bytes == 0)
return PM3_NODATA;
if (bytes != sizeof(PacketCommandNGPreamble)) if (bytes != sizeof(PacketCommandNGPreamble))
return PM3_EIO; return PM3_EIO;
rx->magic = rx_raw.pre.magic; rx->magic = rx_raw.pre.magic;
@ -147,12 +149,12 @@ int16_t receive_ng(PacketCommandNG *rx) {
if (rx->length > USB_CMD_DATA_SIZE) if (rx->length > USB_CMD_DATA_SIZE)
return PM3_EOVFLOW; return PM3_EOVFLOW;
// Get the core and variable length payload // Get the core and variable length payload
bytes = usb_read_ng((uint8_t *)&rx_raw.data, rx->length); bytes = read_ng((uint8_t *)&rx_raw.data, rx->length);
if (bytes != rx->length) if (bytes != rx->length)
return PM3_EIO; return PM3_EIO;
memcpy(rx->data.asBytes, rx_raw.data, rx->length); memcpy(rx->data.asBytes, rx_raw.data, rx->length);
// Get the postamble // Get the postamble
bytes = usb_read_ng((uint8_t *)&rx_raw.foopost, sizeof(PacketCommandNGPostamble)); bytes = read_ng((uint8_t *)&rx_raw.foopost, sizeof(PacketCommandNGPostamble));
if (bytes != sizeof(PacketCommandNGPostamble)) if (bytes != sizeof(PacketCommandNGPostamble))
return PM3_EIO; return PM3_EIO;
// Check CRC, accept MAGIC as placeholder // Check CRC, accept MAGIC as placeholder
@ -163,15 +165,15 @@ int16_t receive_ng(PacketCommandNG *rx) {
if ((first << 8) + second != rx->crc) if ((first << 8) + second != rx->crc)
return PM3_EIO; return PM3_EIO;
} }
reply_via_fpc = false; reply_via_fpc = fpc;
rx->ng = true; rx->ng = true;
} else { // Old style command } else { // Old style command
PacketCommandOLD rx_old; PacketCommandOLD rx_old;
memcpy(&rx_old, &rx_raw.pre, sizeof(PacketCommandNGPreamble)); memcpy(&rx_old, &rx_raw.pre, sizeof(PacketCommandNGPreamble));
bytes = usb_read_ng(((uint8_t *)&rx_old) + sizeof(PacketCommandNGPreamble), sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble)); bytes = read_ng(((uint8_t *)&rx_old) + sizeof(PacketCommandNGPreamble), sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble));
if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble)) if (bytes != sizeof(PacketCommandOLD) - sizeof(PacketCommandNGPreamble))
return PM3_EIO; return PM3_EIO;
reply_via_fpc = false; reply_via_fpc = fpc;
rx->ng = false; rx->ng = false;
rx->magic = 0; rx->magic = 0;
rx->crc = 0; rx->crc = 0;
@ -184,3 +186,17 @@ int16_t receive_ng(PacketCommandNG *rx) {
} }
return PM3_SUCCESS; return PM3_SUCCESS;
} }
int16_t receive_ng(PacketCommandNG *rx) {
// Check if there is a packet available
if (usb_poll_validate_length())
return receive_ng_internal(rx, usb_read_ng, false);
#ifdef WITH_FPC_HOST
// Check if there is a FPC packet available
return receive_ng_internal(rx, usart_read_ng, true);
#else
return PM3_NODATA;
#endif
}

View file

@ -100,6 +100,11 @@ inline int16_t usart_readcommand(uint8_t *data) {
return 0; return 0;
} }
uint32_t usart_read_ng(uint8_t *data, size_t len) {
// TODO DOEGOX
return 0;
}
inline bool usart_commandavailable(void) { inline bool usart_commandavailable(void) {
return (pUS1->US_RCR == 0); return (pUS1->US_RCR == 0);
} }

View file

@ -14,6 +14,7 @@ int16_t usart_writebuffer(uint8_t *data, size_t len);
bool usart_dataavailable(void); bool usart_dataavailable(void);
int16_t usart_readcommand(uint8_t *data); int16_t usart_readcommand(uint8_t *data);
void usart_readcheck(uint8_t *data, size_t len); void usart_readcheck(uint8_t *data, size_t len);
uint32_t usart_read_ng(uint8_t *data, size_t len);
bool usart_commandavailable(void); bool usart_commandavailable(void);
#endif #endif

View file

@ -421,6 +421,8 @@ typedef struct {
#define PM3_EMALLOC -12 #define PM3_EMALLOC -12
// File error // File error
#define PM3_EFILE -13 #define PM3_EFILE -13
// No data
#define PM3_NODATA -98
// Quit program // Quit program
#define PM3_EFATAL -99 #define PM3_EFATAL -99