mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-24 17:28:32 +03:00
implement CEMU_USB_MSGT_DT_GET_STATUS
card_emu can now report its current satus upon request.
This commit is contained in:
@@ -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 */
|
/* 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)
|
void card_emu_io_statechg(struct card_handle *ch, enum card_io io, int active)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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_uart_tx_queue(struct card_handle *ch);
|
||||||
struct llist_head *card_emu_get_usb_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_have_new_uart_tx(struct card_handle *ch);
|
||||||
|
void card_emu_report_status(struct card_handle *ch);
|
||||||
|
|
||||||
#define ENABLE_TX 0x01
|
#define ENABLE_TX 0x01
|
||||||
#define ENABLE_RX 0x02
|
#define ENABLE_RX 0x02
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ struct cardemu_usb_msg_rx_data {
|
|||||||
#define CEMU_STATUS_F_CLK_ACTIVE 0x00000002
|
#define CEMU_STATUS_F_CLK_ACTIVE 0x00000002
|
||||||
#define CEMU_STATUS_F_RCEMU_ACTIVE 0x00000004
|
#define CEMU_STATUS_F_RCEMU_ACTIVE 0x00000004
|
||||||
#define CEMU_STATUS_F_CARD_INSERT 0x00000008
|
#define CEMU_STATUS_F_CARD_INSERT 0x00000008
|
||||||
|
#define CEMU_STATUS_F_RESET_ACTIVE 0x00000010
|
||||||
|
|
||||||
/* CEMU_USB_MSGT_DO_STATUS */
|
/* CEMU_USB_MSGT_DO_STATUS */
|
||||||
struct cardemu_usb_msg_status {
|
struct cardemu_usb_msg_status {
|
||||||
|
|||||||
@@ -316,8 +316,10 @@ static void dispatch_usb_command(struct req_ctx *rctx, struct cardem_inst *ci)
|
|||||||
PIO_Clear(&ci->pin_insert);
|
PIO_Clear(&ci->pin_insert);
|
||||||
req_ctx_put(rctx);
|
req_ctx_put(rctx);
|
||||||
break;
|
break;
|
||||||
case CEMU_USB_MSGT_DT_GET_STATS:
|
|
||||||
case CEMU_USB_MSGT_DT_GET_STATUS:
|
case CEMU_USB_MSGT_DT_GET_STATUS:
|
||||||
|
card_emu_report_status(ci->ch);
|
||||||
|
break;
|
||||||
|
case CEMU_USB_MSGT_DT_GET_STATS:
|
||||||
default:
|
default:
|
||||||
/* FIXME */
|
/* FIXME */
|
||||||
req_ctx_put(rctx);
|
req_ctx_put(rctx);
|
||||||
|
|||||||
Reference in New Issue
Block a user