Description
Source
Call Graph
Start Line: 484
void ISO7816_Decode_ATR(unsigned char *pAtr)
{
unsigned int i;
unsigned int j;
unsigned int y;
unsigned char offset;
TRACE_INFO_WP("ATR: Answer To Reset:\n\r");
TRACE_INFO_WP("TS = 0x%X Initial caracter ",pAtr[0]);
if( pAtr[0] == 0x3B ) {
TRACE_INFO_WP("Direct Convention\n\r");
}
else {
if( pAtr[0] == 0x3F ) {
TRACE_INFO_WP("Inverse Convention\n\r");
}
else {
TRACE_INFO_WP("BAD Convention\n\r");
}
}
TRACE_INFO_WP("T0 = 0x%X Format caracter\n\r",pAtr[1]);
TRACE_INFO_WP(" Number of historical bytes: K = %d\n\r", pAtr[1]&0x0F);
TRACE_INFO_WP(" Presence further interface byte:\n\r");
if( pAtr[1]&0x80 ) {
TRACE_INFO_WP("TA ");
}
if( pAtr[1]&0x40 ) {
TRACE_INFO_WP("TB ");
}
if( pAtr[1]&0x20 ) {
TRACE_INFO_WP("TC ");
}
if( pAtr[1]&0x10 ) {
TRACE_INFO_WP("TD ");
}
if( pAtr[1] != 0 ) {
TRACE_INFO_WP(" present\n\r");
}
i = 2;
y = pAtr[1] & 0xF0;
// Read ATR Ti
offset = 1;
while (y) {
if (y & 0x10) { // TA[i]
TRACE_INFO_WP("TA[%d] = 0x%X ", offset, pAtr[i]);
if( offset == 1 ) {
TRACE_INFO_WP("FI = %d ", (pAtr[i]>>8));
TRACE_INFO_WP("DI = %d", (pAtr[i]&0x0F));
}
TRACE_INFO_WP("\n\r");
i++;
}
if (y & 0x20) { // TB[i]
TRACE_INFO_WP("TB[%d] = 0x%X\n\r", offset, pAtr[i]);
i++;
}
if (y & 0x40) { // TC[i]
TRACE_INFO_WP("TC[%d] = 0x%X ", offset, pAtr[i]);
if( offset == 1 ) {
TRACE_INFO_WP("Extra Guard Time: N = %d", pAtr[i]);
}
TRACE_INFO_WP("\n\r");
i++;
}
if (y & 0x80) { // TD[i]
TRACE_INFO_WP("TD[%d] = 0x%X\n\r", offset, pAtr[i]);
y = pAtr[i++] & 0xF0;
}
else {
y = 0;
}
offset++;
}
// Historical Bytes
TRACE_INFO_WP("Historical bytes:\n\r");
y = pAtr[1] & 0x0F;
for( j=0; j < y; j++ ) {
TRACE_INFO_WP(" 0x%X", pAtr[i]);
if( (pAtr[i] > 0x21) && (pAtr[i] < 0x7D) ) { // ASCII
TRACE_INFO_WP("(%c) ", pAtr[i]);
}
i++;
}
TRACE_INFO_WP("\n\r");
}