ISO7816_Decode_ATR
Default mainpageat91libcomponentsiso7816ISO7816_Decode_ATR
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");

}