explicitly inform card_emu once data to transmit has arrived
diff --git a/firmware/src_simtrace/card_emu.c b/firmware/src_simtrace/card_emu.c
index fa028a1..f45bc21 100644
--- a/firmware/src_simtrace/card_emu.c
+++ b/firmware/src_simtrace/card_emu.c
@@ -788,6 +788,23 @@
return rc;
}
+void card_emu_have_new_uart_tx(struct card_handle *ch)
+{
+ switch (ch->state) {
+ case ISO_S_IN_TPDU:
+ switch (ch->tpdu.state) {
+ case TPDU_S_WAIT_TX:
+ case TPDU_S_WAIT_PB:
+ card_emu_uart_enable(ch->uart_chan, ENABLE_TX);
+ break;
+ default:
+ break;
+ }
+ default:
+ break;
+ }
+}
+
/* hardware driver informs us that a card I/O signal has changed */
void card_emu_io_statechg(struct card_handle *ch, enum card_io io, int active)
{
diff --git a/firmware/src_simtrace/card_emu.h b/firmware/src_simtrace/card_emu.h
index eea3478..95d2bae 100644
--- a/firmware/src_simtrace/card_emu.h
+++ b/firmware/src_simtrace/card_emu.h
@@ -26,6 +26,7 @@
struct llist_head *card_emu_get_uart_tx_queue(struct card_handle *ch);
struct llist_head *card_emu_get_usb_tx_queue(struct card_handle *ch);
+void card_emu_have_new_uart_tx(struct card_handle *ch);
#define ENABLE_TX 0x01
#define ENABLE_RX 0x02
diff --git a/firmware/src_simtrace/mode_cardemu.c b/firmware/src_simtrace/mode_cardemu.c
index 5e8332b..9ee31ca 100644
--- a/firmware/src_simtrace/mode_cardemu.c
+++ b/firmware/src_simtrace/mode_cardemu.c
@@ -2,6 +2,7 @@
#include "card_emu.h"
#include "iso7816_fidi.h"
#include "utils.h"
+#include "linuxlist.h"
#define TRACE_ENTRY() TRACE_DEBUG("%s entering\n", __func__)
@@ -207,9 +208,24 @@
#endif
}
+static int llist_count(struct llist_head *head)
+{
+ struct llist_head *list;
+ int i = 0;
+
+ llist_for_each(list, head)
+ i++;
+
+ return i;
+}
+
+static int usb_pending_old = 0;
+
/* main loop function, called repeatedly */
void mode_cardemu_run(void)
{
+ struct llist_head *queue;
+
if (ch1) {
/* drain the ring buffer from UART into card_emu */
while (1) {
@@ -221,9 +237,21 @@
uint8_t byte = rbuf_read(&ch1_rb);
__enable_irq();
card_emu_process_rx_byte(ch1, byte);
+ TRACE_ERROR("Rx%02x\r\n", byte);
}
- usb_refill_to_host(card_emu_get_usb_tx_queue(ch1), PHONE_DATAIN);
- usb_refill_from_host(card_emu_get_uart_tx_queue(ch1), PHONE_DATAOUT);
+
+ queue = card_emu_get_usb_tx_queue(ch1);
+ int usb_pending = llist_count(queue);
+ if (usb_pending != usb_pending_old) {
+// printf("usb_pending=%d\r\n", usb_pending);
+ usb_pending_old = usb_pending;
+ }
+ usb_refill_to_host(queue, PHONE_DATAIN);
+
+ queue = card_emu_get_uart_tx_queue(ch1);
+ usb_refill_from_host(queue, PHONE_DATAOUT);
+ if (llist_count(queue))
+ card_emu_have_new_uart_tx(ch1);
}
#ifdef CARDEMU_SECOND_UART