mirror of
https://gitea.osmocom.org/sim-card/simtrace2.git
synced 2026-03-16 21:28:33 +03:00
cardem: use TC2 as WI and update WT after ATR
Change-Id: I3e51b16d557bc664f87563e1a3dce6642de474d2
This commit is contained in:
@@ -363,11 +363,39 @@ static int tx_byte_atr(struct card_handle *ch)
|
|||||||
TRACE_DEBUG("%u: ATR TX: %02x\n\r", ch->num, byte);
|
TRACE_DEBUG("%u: ATR TX: %02x\n\r", ch->num, byte);
|
||||||
return 1;
|
return 1;
|
||||||
} else { /* The ATR has been completely transmitted */
|
} else { /* The ATR has been completely transmitted */
|
||||||
/* TODO update WI using optional TC2 and then update WT */
|
/* search for TC2 to updated WI */
|
||||||
//ch->wi = ISO7816_3_DEFAULT_WI;
|
ch->wi = ISO7816_3_DEFAULT_WI;
|
||||||
/* update waiting time */
|
if (ch->atr.len >= 2 && ch->atr.atr[1] & 0xf0) { /* Y1 has some data */
|
||||||
//ch->waiting_time = ISO7816_3_INIT_WTIME;
|
uint8_t atr_td1 = 2;
|
||||||
//tc_etu_set_wtime(ch->tc_chan, ch->waiting_time);
|
if (ch->atr.atr[1] & 0x10) { /* TA1 is present */
|
||||||
|
atr_td1++;
|
||||||
|
}
|
||||||
|
if (ch->atr.atr[1] & 0x20) { /* TB1 is present */
|
||||||
|
atr_td1++;
|
||||||
|
}
|
||||||
|
if (ch->atr.atr[1] & 0x40) { /* TC1 is present */
|
||||||
|
atr_td1++;
|
||||||
|
}
|
||||||
|
if (ch->atr.atr[1] & 0x80) { /* TD1 is present */
|
||||||
|
if (ch->atr.len > atr_td1 && ch->atr.atr[atr_td1] & 0xf0) { /* Y2 has some data */
|
||||||
|
uint8_t atr_tc2 = atr_td1+1;
|
||||||
|
if (ch->atr.atr[atr_td1] & 0x10) { /* TA2 is present */
|
||||||
|
atr_tc2++;
|
||||||
|
}
|
||||||
|
if (ch->atr.atr[atr_td1] & 0x20) { /* TB2 is present */
|
||||||
|
atr_tc2++;
|
||||||
|
}
|
||||||
|
if (ch->atr.atr[atr_td1] & 0x40) { /* TC2 is present */
|
||||||
|
if (ch->atr.len > atr_tc2 && ch->atr.atr[atr_tc2]) { /* TC2 encodes WI */
|
||||||
|
ch->wi = ch->atr.atr[atr_tc2]; /* set WI */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* update waiting time (see ISO 7816-3 10.2) */
|
||||||
|
ch->waiting_time = ch->wi * 960 * ch->fi;
|
||||||
|
tc_etu_set_wtime(ch->tc_chan, ch->waiting_time);
|
||||||
/* reset PTS to initial state */
|
/* reset PTS to initial state */
|
||||||
set_pts_state(ch, PTS_S_WAIT_REQ_PTSS);
|
set_pts_state(ch, PTS_S_WAIT_REQ_PTSS);
|
||||||
/* go to next state */
|
/* go to next state */
|
||||||
|
|||||||
Reference in New Issue
Block a user