aboutsummaryrefslogtreecommitdiffstats
path: root/src/sim/reader_pcsc.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-06-01 20:11:19 +0200
committerHarald Welte <laforge@osmocom.org>2021-06-01 20:29:17 +0200
commit20199da02d37a6d284915a27ec12641e79b8781c (patch)
tree7685b15446ecdac16f6d7d5cbdad18031bab80bf /src/sim/reader_pcsc.c
parent6c7ac6abcdee2264a725833bd0396b8cc75a7228 (diff)
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
Diffstat (limited to 'src/sim/reader_pcsc.c')
-rw-r--r--src/sim/reader_pcsc.c30
1 files changed, 30 insertions, 0 deletions
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,
};