Change in osmo-ccid-firmware[master]: proper card powerup handling

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Hoernchen gerrit-no-reply at lists.osmocom.org
Thu Jul 30 21:23:37 UTC 2020


Hoernchen has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/19473 )


Change subject: proper card powerup handling
......................................................................

proper card powerup handling

Now that the timers work as intended other voltages (that lead to
timeouts) may be used.

Change-Id: I6105ce7f827aaec8ac36b940766fe05d47145edb
---
M ccid_common/ccid_slot_fsm.c
M ccid_common/cuart.h
M sysmoOCTSIM/cuart_driver_asf4_usart_async.c
3 files changed, 36 insertions(+), 8 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/73/19473/1

diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c
index 13d1139..6b5ab6e 100644
--- a/ccid_common/ccid_slot_fsm.c
+++ b/ccid_common/ccid_slot_fsm.c
@@ -77,7 +77,7 @@
 	if (!present) {
 		osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_CARD_REMOVAL, NULL);
 		card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);
-		card_uart_ctrl(ss->cuart, CUART_CTL_POWER, false);
+		card_uart_ctrl(ss->cuart, CUART_CTL_POWER_5V0, false);
 		cs->icc_powered = false;
 		cs->cmd_busy = false;
 	}
@@ -87,15 +87,24 @@
 					const struct ccid_pc_to_rdr_icc_power_on *ipo)
 {
 	struct iso_fsm_slot *ss = ccid_slot2iso_fsm_slot(cs);
+	enum ccid_power_select pwrsel = ipo->bPowerSelect;
+	enum card_uart_ctl cctl;
 
 	ss->seq = ipo->hdr.bSeq;
 	LOGPCS(cs, LOGL_DEBUG, "scheduling power-up\n");
 
+	switch (pwrsel) {
+		case CCID_PWRSEL_5V0: cctl = CUART_CTL_POWER_5V0; break;
+		case CCID_PWRSEL_3V0: cctl = CUART_CTL_POWER_3V0; break;
+		case CCID_PWRSEL_1V8: cctl = CUART_CTL_POWER_1V8; break;
+		default: cctl = CUART_CTL_POWER_5V0;
+	}
+
 	if (! cs->icc_powered) {
 		/* FIXME: do this via a FSM? */
 		card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);
 		osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_RESET_ACT_IND, NULL);
-		card_uart_ctrl(ss->cuart, CUART_CTL_POWER, true);
+		card_uart_ctrl(ss->cuart, cctl, true);
 		osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_POWER_UP_IND, NULL);
 		cs->icc_powered = true;
 		card_uart_ctrl(ss->cuart, CUART_CTL_CLOCK, true);
@@ -166,7 +175,7 @@
 
 		/* perform deactivation */
 		card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);
-		card_uart_ctrl(ss->cuart, CUART_CTL_POWER, false);
+		card_uart_ctrl(ss->cuart, CUART_CTL_POWER_5V0, false);
 		cs->icc_powered = false;
 
 
@@ -285,10 +294,10 @@
 	struct iso_fsm_slot *ss = ccid_slot2iso_fsm_slot(cs);
 
 	if (enable) {
-		card_uart_ctrl(ss->cuart, CUART_CTL_POWER, true);
+		card_uart_ctrl(ss->cuart, CUART_CTL_POWER_5V0, true);
 		cs->icc_powered = true;
 	} else {
-		card_uart_ctrl(ss->cuart, CUART_CTL_POWER, false);
+		card_uart_ctrl(ss->cuart, CUART_CTL_POWER_5V0, false);
 		cs->icc_powered = false;
 	}
 }
diff --git a/ccid_common/cuart.h b/ccid_common/cuart.h
index 1df0c49..6f8ba70 100644
--- a/ccid_common/cuart.h
+++ b/ccid_common/cuart.h
@@ -25,7 +25,9 @@
 	CUART_CTL_RX,		/* enable/disable receiver */
 	CUART_CTL_RX_TIMER_HINT, /* tell cuart approximate number of rx bytes */
 	CUART_CTL_NO_RXTX,		/* enable/disable receiver */
-	CUART_CTL_POWER,	/* enable/disable ICC power */
+	CUART_CTL_POWER_5V0,
+	CUART_CTL_POWER_3V0,
+	CUART_CTL_POWER_1V8,
 	CUART_CTL_CLOCK,	/* enable/disable ICC clock */
 	CUART_CTL_SET_CLOCK_FREQ, /* set ICC clock frequency (hz)*/
 	CUART_CTL_RST,		/* enable/disable ICC reset */
diff --git a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c
index 0e83385..89cd734 100644
--- a/sysmoOCTSIM/cuart_driver_asf4_usart_async.c
+++ b/sysmoOCTSIM/cuart_driver_asf4_usart_async.c
@@ -373,15 +373,32 @@
 		settings.rstin = arg ? true : false;
 		ncn8025_set(cuart->u.asf4.slot_nr, &settings);
 		usart_async_flush_rx_buffer(cuart->u.asf4.usa_pd);
+
+		/* reset everything, card reset resets pps params */
+		if (arg)
+			slot_set_isorate(cuart, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);
+
 		break;
-	case CUART_CTL_POWER:
+
+	case CUART_CTL_POWER_5V0:
+	case CUART_CTL_POWER_3V0:
+	case CUART_CTL_POWER_1V8:
 		/* reset everything */
 		slot_set_isorate(cuart, SIM_CLKDIV_8, ISO7816_3_DEFAULT_FD, ISO7816_3_DEFAULT_DD);
 
+
+		enum ncn8025_sim_voltage v = CUART_CTL_POWER_5V0;
+		switch (ctl) {
+			case CUART_CTL_POWER_5V0: v = SIM_VOLT_5V0; break;
+			case CUART_CTL_POWER_3V0: v = SIM_VOLT_3V0; break;
+			case CUART_CTL_POWER_1V8: v = SIM_VOLT_1V8; break;
+			default: break;
+		}
+
 		ncn8025_get(cuart->u.asf4.slot_nr, &settings);
 		settings.cmdvcc = arg ? true : false;
 		settings.led = arg ? true : false;
-		settings.vsel = SIM_VOLT_5V0;
+		settings.vsel = v;
 		ncn8025_set(cuart->u.asf4.slot_nr, &settings);
 
 		break;

-- 
To view, visit https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/19473
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ccid-firmware
Gerrit-Branch: master
Gerrit-Change-Id: I6105ce7f827aaec8ac36b940766fe05d47145edb
Gerrit-Change-Number: 19473
Gerrit-PatchSet: 1
Gerrit-Owner: Hoernchen <ewild at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20200730/2c9fad62/attachment.htm>


More information about the gerrit-log mailing list