From ff1606504769c8ec61aaf9f242c45ca8226a1c0e Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 19 Mar 2016 21:59:06 +0100 Subject: [PATCH] implement CEMU_USB_MSGT_DT_GET_STATUS card_emu can now report its current satus upon request. --- firmware/src_simtrace/card_emu.c | 30 ++++++++++++++++++++++++++++ firmware/src_simtrace/card_emu.h | 1 + firmware/src_simtrace/cardemu_prot.h | 1 + firmware/src_simtrace/mode_cardemu.c | 4 +++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/firmware/src_simtrace/card_emu.c b/firmware/src_simtrace/card_emu.c index 8e9fef8c..b08e9192 100644 --- a/firmware/src_simtrace/card_emu.c +++ b/firmware/src_simtrace/card_emu.c @@ -822,6 +822,36 @@ void card_emu_have_new_uart_tx(struct card_handle *ch) } } +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 95d2baef..2b2d3f12 100644 --- a/firmware/src_simtrace/card_emu.h +++ b/firmware/src_simtrace/card_emu.h @@ -27,6 +27,7 @@ int card_emu_set_atr(struct card_handle *ch, const uint8_t *atr, uint8_t len); 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 1a8c213a..8b781bcf 100644 --- a/firmware/src_simtrace/cardemu_prot.h +++ b/firmware/src_simtrace/cardemu_prot.h @@ -92,6 +92,7 @@ struct cardemu_usb_msg_rx_data { #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 165c32bb..609b1ee4 100644 --- a/firmware/src_simtrace/mode_cardemu.c +++ b/firmware/src_simtrace/mode_cardemu.c @@ -316,8 +316,10 @@ static void dispatch_usb_command(struct req_ctx *rctx, struct cardem_inst *ci) 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);