aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKévin Redon <kredon@sysmocom.de>2018-07-08 15:49:46 +0200
committerKévin Redon <kredon@sysmocom.de>2018-07-11 22:01:58 +0200
commita2fccba96c144e34cadc7c801fcf3eefc41311e0 (patch)
tree7065c833fc640c05e6485afb2708fd1d05bc49a5
parent411428eb5e6f1187b0323cee8539188f0c5c2b15 (diff)
sniffer: move reset handling from ISR to main loop
-rw-r--r--firmware/libcommon/source/sniffer.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/firmware/libcommon/source/sniffer.c b/firmware/libcommon/source/sniffer.c
index 07bc82d..8262bec 100644
--- a/firmware/libcommon/source/sniffer.c
+++ b/firmware/libcommon/source/sniffer.c
@@ -267,11 +267,9 @@ static void change_state(enum iso7816_3_sniff_state iso_state_new)
case ISO7816_S_RESET:
update_fidi(&sniff_usart, 0x11); /* reset baud rate to default Di/Fi values */
update_wt(10, 1); /* reset WT time-out */
- change_flags |= SNIFF_CHANGE_FLAG_RESET_HOLD; /* set flag and let main loop send it */
break;
case ISO7816_S_WAIT_ATR:
rbuf_reset(&sniff_buffer); /* reset buffer for new communication */
- change_flags |= SNIFF_CHANGE_FLAG_RESET_RELEASE; /* set flag and let main loop send it */
break;
case ISO7816_S_IN_ATR:
atr_i = 0;
@@ -817,13 +815,9 @@ static void Sniffer_reset_isr(const Pin* pPin)
}
/* Update the ISO state according to the reset change */
if (PIO_Get(&pin_rst)) {
- if (ISO7816_S_WAIT_ATR != iso_state) {
- change_state(ISO7816_S_WAIT_ATR);
- }
+ change_flags |= SNIFF_CHANGE_FLAG_RESET_HOLD; /* set flag and let main loop send it */
} else {
- if (ISO7816_S_RESET != iso_state) {
- change_state(ISO7816_S_RESET);
- }
+ change_flags |= SNIFF_CHANGE_FLAG_RESET_RELEASE; /* set flag and let main loop send it */
}
}
@@ -949,6 +943,10 @@ void Sniffer_run(void)
process_any_usb_commands(queue);
*/
+ /* WARNING: the signal data and flags are not synchronized. We have to hope
+ * the processing is fast enough to not land in the wrong state while data
+ * is remaining
+ */
/* Handle sniffed data */
if (!rbuf_is_empty(&sniff_buffer)) { /* use if instead of while to let the main loop restart the watchdog */
uint8_t byte = rbuf_read(&sniff_buffer);
@@ -993,6 +991,16 @@ void Sniffer_run(void)
/* Handle flags */
if (change_flags) { /* WARNING this is not synced with the data buffer handling */
+ if (change_flags & SNIFF_CHANGE_FLAG_RESET_HOLD) {
+ if (ISO7816_S_WAIT_ATR != iso_state) {
+ change_state(ISO7816_S_WAIT_ATR);
+ }
+ }
+ if (change_flags & SNIFF_CHANGE_FLAG_RESET_RELEASE) {
+ if (ISO7816_S_RESET != iso_state) {
+ change_state(ISO7816_S_RESET);
+ }
+ }
if (change_flags & SNIFF_CHANGE_FLAG_TIMEOUT_WT) {
/* Use timeout to detect interrupted data transmission */
switch (iso_state) {