From 20199da02d37a6d284915a27ec12641e79b8781c Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Tue, 1 Jun 2021 20:11:19 +0200 Subject: sim: Add osim_card_{reset,close}() API This is required to reset and close a card under software control after opening it with osim_card_open() Change-Id: Ie9ec66db4d54fdb1331f4ae05ca3ca4274912e9d --- src/sim/reader_pcsc.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/sim/reader_pcsc.c') diff --git a/src/sim/reader_pcsc.c b/src/sim/reader_pcsc.c index 234a9a77..fa867c08 100644 --- a/src/sim/reader_pcsc.c +++ b/src/sim/reader_pcsc.c @@ -156,6 +156,34 @@ end: return NULL; } +static int pcsc_card_reset(struct osim_card_hdl *card, bool cold_reset) +{ + struct pcsc_reader_state *st = card->reader->priv; + LONG rc; + + rc = SCardReconnect(st->hCard, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0, + cold_reset ? SCARD_UNPOWER_CARD : SCARD_RESET_CARD, + &st->dwActiveProtocol); + PCSC_ERROR(rc, "SCardReconnect"); + + return 0; +end: + return -EIO; +} + +static int pcsc_card_close(struct osim_card_hdl *card) +{ + struct pcsc_reader_state *st = card->reader->priv; + LONG rc; + + rc = SCardDisconnect(st->hCard, SCARD_UNPOWER_CARD); + PCSC_ERROR(rc, "SCardDisconnect"); + + return 0; +end: + return -EIO; +} + static int pcsc_transceive(struct osim_reader_hdl *rh, struct msgb *msg) { @@ -179,6 +207,8 @@ const struct osim_reader_ops pcsc_reader_ops = { .name = "PC/SC", .reader_open = pcsc_reader_open, .card_open = pcsc_card_open, + .card_reset = pcsc_card_reset, + .card_close = pcsc_card_close, .transceive = pcsc_transceive, }; -- cgit v1.2.3