mode_cardemu: Implement CEMU_USB_MSGT_DT_SET_ATR
This way the host PC can set the ATR of the emulated card
diff --git a/firmware/src_simtrace/mode_cardemu.c b/firmware/src_simtrace/mode_cardemu.c
index 3108cd7..9bf706d 100644
--- a/firmware/src_simtrace/mode_cardemu.c
+++ b/firmware/src_simtrace/mode_cardemu.c
@@ -229,6 +229,7 @@
static void dispatch_usb_command(struct req_ctx *rctx, struct card_handle *ch)
{
struct cardemu_usb_msg_hdr *hdr;
+ struct cardemu_usb_msg_set_atr *atr;
struct llist_head *queue;
hdr = (struct cardemu_usb_msg_hdr *) rctx->data;
@@ -240,6 +241,11 @@
card_emu_have_new_uart_tx(ch);
break;
case CEMU_USB_MSGT_DT_SET_ATR:
+ atr = (struct cardemu_usb_msg_set_atr *) hdr;
+ card_emu_set_atr(ch, atr->atr, hdr->data_len);
+ llist_del(&rctx->list);
+ req_ctx_put(rctx);
+ break;
case CEMU_USB_MSGT_DT_GET_STATS:
case CEMU_USB_MSGT_DT_GET_STATUS:
default:
@@ -252,9 +258,9 @@
* them */
static void process_any_usb_commands(struct llist_head *main_q, struct card_handle *ch)
{
- struct req_ctx *rctx;
+ struct req_ctx *rctx, *tmp;
- llist_for_each_entry(rctx, main_q, list)
+ llist_for_each_entry_safe(rctx, tmp, main_q, list)
dispatch_usb_command(rctx, ch);
}