implement CEMU_USB_MSGT_DT_GET_STATUS
card_emu can now report its current satus upon request.
diff --git a/firmware/src_simtrace/card_emu.c b/firmware/src_simtrace/card_emu.c
index 8e9fef8..b08e919 100644
--- a/firmware/src_simtrace/card_emu.c
+++ b/firmware/src_simtrace/card_emu.c
@@ -822,6 +822,36 @@
}
}
+void card_emu_report_status(struct card_handle *ch)
+{
+ struct req_ctx *rctx;
+ struct cardemu_usb_msg_status *sts;
+
+ rctx = req_ctx_find_get(0, RCTX_S_FREE, RCTX_S_UART_RX_BUSY);
+ if (!rctx)
+ return;
+
+ rctx->tot_len = sizeof(*sts);
+ sts = (struct cardemu_usb_msg_status *)rctx->data;
+ sts->hdr.msg_type = CEMU_USB_MSGT_DO_STATUS;
+ sts->hdr.msg_len = sizeof(*sts);
+ sts->flags = 0;
+ if (ch->vcc_active)
+ sts->flags |= CEMU_STATUS_F_VCC_PRESENT;
+ if (ch->clocked)
+ sts->flags |= CEMU_STATUS_F_CLK_ACTIVE;
+ if (ch->in_reset)
+ sts->flags |= CEMU_STATUS_F_RESET_ACTIVE;
+ /* FIXME: voltage + card insert */
+ sts->fi = ch->fi;
+ sts->di = ch->di;
+ sts->wi = ch->wi;
+ sts->waiting_time = ch->waiting_time;
+
+ llist_add_tail(&rctx->list, &ch->usb_tx_queue);
+ req_ctx_set_state(rctx, RCTX_S_USB_TX_PENDING);
+}
+
/* 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 95d2bae..2b2d3f1 100644
--- a/firmware/src_simtrace/card_emu.h
+++ b/firmware/src_simtrace/card_emu.h
@@ -27,6 +27,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);
+void card_emu_report_status(struct card_handle *ch);
#define ENABLE_TX 0x01
#define ENABLE_RX 0x02
diff --git a/firmware/src_simtrace/cardemu_prot.h b/firmware/src_simtrace/cardemu_prot.h
index 1a8c213..8b781bc 100644
--- a/firmware/src_simtrace/cardemu_prot.h
+++ b/firmware/src_simtrace/cardemu_prot.h
@@ -92,6 +92,7 @@
#define CEMU_STATUS_F_CLK_ACTIVE 0x00000002
#define CEMU_STATUS_F_RCEMU_ACTIVE 0x00000004
#define CEMU_STATUS_F_CARD_INSERT 0x00000008
+#define CEMU_STATUS_F_RESET_ACTIVE 0x00000010
/* CEMU_USB_MSGT_DO_STATUS */
struct cardemu_usb_msg_status {
diff --git a/firmware/src_simtrace/mode_cardemu.c b/firmware/src_simtrace/mode_cardemu.c
index 165c32b..609b1ee 100644
--- a/firmware/src_simtrace/mode_cardemu.c
+++ b/firmware/src_simtrace/mode_cardemu.c
@@ -316,8 +316,10 @@
PIO_Clear(&ci->pin_insert);
req_ctx_put(rctx);
break;
- case CEMU_USB_MSGT_DT_GET_STATS:
case CEMU_USB_MSGT_DT_GET_STATUS:
+ card_emu_report_status(ci->ch);
+ break;
+ case CEMU_USB_MSGT_DT_GET_STATS:
default:
/* FIXME */
req_ctx_put(rctx);